plcforum.uz.ua

International PLC Forum
It is currently Tue Nov 21, 2017 4:59 pm

All times are UTC + 3 hours


Forum rules


Please click here to view the forum rules



Post new topic Reply to topic  [ 22 posts ] 
Author Message
PostPosted: Sat Aug 20, 2016 2:08 pm 

Joined: Sat May 30, 2015 6:44 pm
Posts: 27
нужно сделать пересылку данных из одной ДБ в другую, через заданное время, не получается настроить "как нужно" счетчик LOOP.. В голову лезет только переделать все на обычный счетчик и привязать к нему AR1/2. Подскажите пожалуйста ребята...Вроде задачка простая, но не один час сижу. И еще вопрос могу ли я на не открытую ДБ пересылать данные например:
L DBD [AR1,P#0.0]
T Dd44.DBD0 ????//пробовал так SF загарается(
//косвенную адресацию только познаю не ругайтесь пжл.

///////////////////////////////////////////////////
L #DB_1
T #Num_DB_Gas
OPN DB [#Num_DB_Gas]

L #db_2
T #numdb_2
OPN DI [#numdb_2]

L #ADDR_AR1
SLD 3
LAR1

L #ADDR_AR2
SLD 3
LAR2

L #Num_Loop
next: T #Num_temp_loop

L DBD [AR1,P#0.0]
T DID [AR2,P#0.0]

+AR1 P#4.0
+AR2 P#4.0

L #Num_temp_loop
LOOP next


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 20, 2016 6:38 pm 
Site Admin

Joined: Wed Sep 06, 2006 3:03 pm
Posts: 1091
Location: CIS
viewtopic.php?p=40136#p40136
viewtopic.php?f=1&t=14350


Top
 Profile  
 
PostPosted: Mon Aug 22, 2016 8:03 am 

Joined: Tue Dec 22, 2009 3:45 am
Posts: 62
Location: Москва
Ну вы явно забыли инкремент (или декремент, не знаю как вам удобнее) на #Num_temp_loop забыли. Еще вопрос на счет инкремента адреса в P#4.0 - вы уверенны, что у вас DB будет кратен 4 байтам? Может, лучше по 2 прибавлять?
Ну и помянуть для проформы, что AR2 и DINO надо сохранять, а потом восстанавливать, иначе, при работе с FB есть шанс получить по лбу своей же косвенной адресацией. :)


Top
 Profile  
 
PostPosted: Wed Aug 24, 2016 8:25 pm 

Joined: Wed Oct 13, 2010 11:44 am
Posts: 162
Location: Russian Federation
Декремент счётчика и проверку на ноль выполняет сам оператор LOOP.
А AR'ы таки да - оба надо сохранять в начале и восстанавливать в конце.
Непонятна в целом причина этого секса в гамаке стоя. Что мешает использовать SFC20 MOVBLK?


Top
 Profile  
 
PostPosted: Thu Aug 25, 2016 6:03 pm 

Joined: Sat May 30, 2015 6:44 pm
Posts: 27
смысл передать не всю DB а по 2 адреса с каждого массива через определенное время, фиксированным адресам например: DB500.DBD0 и DB500.DBD4
DB 1 имеет два: имя1 ARRAY [1..256]REAL и имя2 ARRAY [1..256]REAL
через 4 байта нужно передавать т.к REAL

"А AR'ы таки да - оба надо сохранять в начале и восстанавливать в конце." вот с этим та я и гадаю(
LOOP вырезал , формирование нового адреса сделал и работать только хочет половина...
//первая передача идет
L DBD [AR1,P#0.0]
T DB500.DBD0
//а вот нижняя не хочет
L DBD [AR2,P#0.0]
DB500.DBD4
Извращался как мог, все по "0", с AR-ами сталкиваюсь первый раз, и потом они пригодятся т.к это только "скелет" программы, так бы косвенную через память написал и не мучался. Подскажите ребятки!


Top
 Profile  
 
PostPosted: Thu Aug 25, 2016 6:08 pm 

Joined: Sat May 30, 2015 6:44 pm
Posts: 27
"при работе с FB", мне попадались FC а переменные засовывали в TEMP, я понял будем разбираться как " сохранять, а потом восстанавливать"


Top
 Profile  
 
PostPosted: Fri Aug 26, 2016 2:03 pm 

Joined: Tue Dec 22, 2009 3:45 am
Posts: 62
Location: Москва
Rex2701, спасибо, не знал. Просто всегда использую JCN по интересным мне условиям. :)

panf, давайте играть в телепатов дальше. Сама #Num_Loop у вас, часом, не TEMP переменная? Дальше, какие значения она принимает и откуда? Может, вы туда засылаете 1 вместо 2, например?

Ну и значение DINO в дополнение к AR1/AR2 тоже надо обязательно сохранять и восстанавливать после "косвенной адресации". А то, в лучшем случае, есть шанс попасть в несуществующую память, но это всяко лучше, чем попасть в левую область и всё там порушить.


Top
 Profile  
 
PostPosted: Fri Aug 26, 2016 6:22 pm 

Joined: Wed Oct 13, 2010 11:44 am
Posts: 162
Location: Russian Federation
Ваш блок - это FC или FB?
Если FC, то есть подозрение, что контроллеру не нравится обращение к InstanceDB (L DID...), которая существует только у FB.


Top
 Profile  
 
PostPosted: Fri Aug 26, 2016 11:08 pm 

Joined: Sat May 30, 2015 6:44 pm
Posts: 27
Marrenoloth и Rex2701 вы можете прислать листинг с AR1/2 при условии соблюдения требований отправленного сообщения в Чт авг 25, 2016 6:03 pm ? хотелось бы увидеть Вашу точку зрения на данную задачу.

По коду комментирую:
"panf, давайте играть в телепатов дальше. Сама #Num_Loop у вас, часом, не TEMP переменная? Дальше, какие значения она принимает и откуда? Может, вы туда засылаете 1 вместо 2, например?"

#Num_Loop мы отбрасываем я же говорил что LOOP вырезал т.к цикл идет по таймеру предачи, соответсвенно #Num_Loop не имеет смысла использовать в него забивалось количество циклов и уменьшалось с помощью LOOP на 1 в ACCU-1L. она и должна быть TEMP т.к хронятся только во время обработки блока, и восстановливаем в конце чтоб не терялись.

Че та как то либо я не понимаю Вас либо Вы меня:) Напишите свои коды с комментариями все сразу прояснится для меня, только в STL.


Top
 Profile  
 
PostPosted: Sat Aug 27, 2016 8:41 am 

Joined: Tue Dec 22, 2009 3:45 am
Posts: 62
Location: Москва
Code:
FUNCTION_BLOCK "Class_VisuCfg_Before"
TITLE =
AUTHOR : Marr
FAMILY : Visu
NAME : VisuCfg
VERSION : 0.1


VAR
  me : "UDT_Class_VisuCfg";   
END_VAR
VAR_TEMP
  tmp : "UDT_Class_VisuCfg";   
  AR1_tmp : DWORD ;   
  AR2_tmp : DWORD ;   
  DBNO_tmp : INT ;   
  DINO_tmp : INT ;   
  Byte_Count : DWORD ;   
END_VAR
BEGIN
NETWORK
TITLE =Проверка на новый элемент

      A(    ;
      L     #me.SwapDB_Old;
      L     #me.SwapDB;
      <>I   ;
      )     ;
      O(    ;
      L     0;
      <=I   ;
      )     ;
      O(    ;
      L     #me.TargetDB_Old;
      L     #me.TargetDB;
      <>I   ;
      O(    ;
      L     0;
      <=I   ;
      )     ;
      )     ;
      O(    ;
      L     #me.TargetItemNo_Old;
      L     #me.TargetItemNo;
      <>I   ;
      O(    ;
      L     0;
      <I    ;
      )     ;
      )     ;
      S     #me.ValueChangedOnVisu;

      A     #me.ValueChangedOnVisu;

      L     S5T#3S; // Preset 3 seconds into ACCU 1.
      SD    T     10; // Start On-Delay Timer

      A     T     10;
      S     #me.ValueOkOnVisu;

      A     #me.ValueOkOnVisu;
      JCN   new2;
      L     #me.SwapDB;
      T     #me.SwapDB_Old;
      L     #me.TargetDB;
      T     #me.TargetDB_Old;
      L     #me.TargetItemNo;
      T     #me.TargetItemNo_Old;
      R     #me.ValueOkOnVisu;
      R     #me.ValueChangedOnVisu;
      BEC   ;
new2: NOP   0;
      A     #me.ValueChangedOnVisu;
      O     #me.ValueOkOnVisu;
      BEC   ;




NETWORK
TITLE =Сохраняем регистры и открытые DB

      TAR1  #AR1_tmp;
      TAR2  #AR2_tmp;
      L     DBNO;
      T     #DBNO_tmp;
      L     DINO;
      T     #DINO_tmp;

NETWORK
TITLE =Загружаем параметры в памямять

      L     #me.SwapDB;
      T     #tmp.SwapDB;
      L     #me.TargetDB;
      T     #tmp.TargetDB;
      L     #me.TargetItemNo;
      T     #tmp.TargetItemNo;
      L     #me.TargetItemLenght;
      T     #tmp.TargetItemLenght;
NETWORK
TITLE =Цикл копирования

      L     0;
      T     #Byte_Count;

      L     #tmp.TargetItemNo;
      L     1;
      -I    ;
      L     #tmp.TargetItemLenght;
      *D    ;
      SLD   3;
      L     P#DBX 0.0;
      +D    ;
      LAR1  ;
      OPN   DB [#tmp.TargetDB];

      LAR2  P##me;
      OPN   DI [#tmp.SwapDB];

main: L     W [AR2,P#0.0];
      T     W [AR1,P#0.0];
      +AR1  P#2.0;
      +AR2  P#2.0;
      L     #Byte_Count;
      L     2;
      +D    ;
      T     #Byte_Count;
      L     #tmp.TargetItemLenght;
      >=D   ;
      JCN   main;
NETWORK
TITLE =Возвращаем регистры и открытые DB

      LAR1  #AR1_tmp;
      LAR2  #AR2_tmp;
      OPN   DB [#DBNO_tmp];
      OPN   DI [#DINO_tmp];
END_FUNCTION_BLOCK

Моя точка зрения на пересылки данных. Первый нетворк можно не смотреть - он проверяет необходимость копирования в принципе. А вот остальные как раз и производят копирование любого объема данных из произвольного места произвольной DB в swap-DB, начиная с ее начала.
LAR2 P##me; - это, по факту, загрузить P#DIX0.0. Сам редактор сильно больно умный - меняет.

Quote:
Marrenoloth и Rex2701 вы можете прислать листинг с AR1/2 при условии соблюдения требований отправленного сообщения
Это написать за вас ваш код? О.о

Quote:
Если FC, то есть подозрение, что контроллеру не нравится обращение к InstanceDB (L DID...), которая существует только у FB.
Не возникало проблем никогда. Контроллер априори имеет DI, DB, AR1 и AR2. И его мало волнует какой блок программист пишет. Вообще, чертовски похоже, что, с технической точки зрения, разделение FB|FC больше формальное для возможности обозвать статические переменные памяти DI человеческими именами.

Top
 Profile  
 
PostPosted: Sun Aug 28, 2016 6:38 am 

Joined: Sat May 30, 2015 6:44 pm
Posts: 27
Спасибо за код Marrenoloth!Вы указывали на мои ошибки, но вся проблема та и была, в том что я не знал как их исправить или грамотно донести до Вас( Извините за дерзость (oo) пол кода та было у меня, а вот в некоторые Ваши строчки придется вникать...


Top
 Profile  
 
PostPosted: Sun Aug 28, 2016 6:58 am 

Joined: Sat May 30, 2015 6:44 pm
Posts: 27
знакомые специалисты при слове AR-ры делают квадратные глаза и мямлят про "пиши попроще код", так и получается спросить не у кого, безнадега, и первый блин комом, может дальше будет по проще...


Top
 Profile  
 
PostPosted: Sun Aug 28, 2016 10:09 am 

Joined: Tue Dec 22, 2009 3:45 am
Posts: 62
Location: Москва
panf wrote:
знакомые специалисты при слове AR-ры делают квадратные глаза и мямлят про "пиши попроще код", так и получается спросить не у кого, безнадега, и первый блин комом, может дальше будет по проще...

Тут могу только порекомендовать писать какие-то системные функции для упрощения основного технологического кода. Т.е. написали один раз, что важно, максимально вылизали от косяков, потом годами тиражируете решение. А то, при интеграции этой радости в большое количество подпрограмм, сами-то не вспомните через пару месяцев что этим всем сказать хотели. А уж представители заказчика вас поминать будут регулярно. Зачем вам эта порча кармы и людям и себе? Проще написать, например, клапан, который вот точно работает, когда ему дают вкл. И точно отлавливает ошибки. Всё, как он там внутри работает с третьего проекта вы уже не вспомните потому, что не надо и голова у вас будет думать не что он делает при включении, а когда его включать. А вот если вы такие конструкции в описание техпроцесса включите, то вот тут-то и начнутся проблемы.


Top
 Profile  
 
PostPosted: Mon Nov 07, 2016 7:09 pm 

Joined: Sun Nov 06, 2016 1:54 pm
Posts: 6
Извените за глупый вопрос, ноя не смог разобраться с записью в блоке. Гуру, если не сложно подскажите, как это работает

Итак первая запись:

L P##CM // Any datapointer for CM

LAR1
L W [AR1,P#4.0]
T #i_DB // Number of DB

L D [AR1,P#6.0]
T #i_Pointer // Pointer for data

LAR1

OPN DB [#i_DB]
L D [AR1,P#0.0] // Data transfer to Local Area
T LD 0
L D [AR1,P#4.0] // Data transfer to Local Area
T LD 4
L D [AR1,P#8.0] // Data transfer to Local Area
T LD 8

И в конце запись такая:
OPN DB [#i_DB]
L LD 0
T D [AR1,P#0.0] // Data transfer back to DB Area
L LD 4
T D [AR1,P#4.0] // Data transfer back to DB Area
L LD 8
T D [AR1,P#8.0] // Data transfer back to DB Area
Собственно вопрос в записи, где

L W [AR1,P#4.0]
T #i_DB // Здесь загружается из внешней DB первое слово (их там 4 подряд), а до этотго с адресса 0.0 по 3.7 записаны биты

L D [AR1,P#6.0]
T #i_Pointer // зачем эта запись? Нигде далее i_Pointer не учавствует!! Подскажите?


Top
 Profile  
 
PostPosted: Tue Nov 08, 2016 6:51 pm 

Joined: Wed Oct 13, 2010 11:44 am
Posts: 162
Location: Russian Federation
Сначала AR1 выставляют на полученный указатель, а затем
Code:
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
LAR1

его переписывают на нужные данные. И все дальнейшие инструкции, где есть AR1 - работают уже данными от указателя.
Возможно это хвост от старого кода, потому что в для приведённого отрывка сохранение во временную переменную действительно бесполезно.
Если только i_Pointer не находится где-то среди LD0...LD8.


Top
 Profile  
 
PostPosted: Tue Nov 08, 2016 8:27 pm 

Joined: Sun Nov 06, 2016 1:54 pm
Posts: 6
Rex2701, спасибо за пояснение, но странное то, что если убрать этот поинтер, то ничего не работает..
Я уже взмок, в попытках понять это.. Может есть смысл как-то подругому спрасить, например подшить исходный файл, дабы не пропустить чего нить?


Top
 Profile  
 
PostPosted: Wed Nov 09, 2016 1:33 am 

Joined: Wed Oct 13, 2010 11:44 am
Posts: 162
Location: Russian Federation
Покажи область TEMP для блока, чтобы видеть адрес #i_Pointer.


Top
 Profile  
 
PostPosted: Wed Nov 09, 2016 7:57 pm 

Joined: Sun Nov 06, 2016 1:54 pm
Posts: 6
Rex2701, что я все понял, а может и нет.

Так как переменная СМ является в формате ANY, то следовательно в 4 байте лежит номер ДБэшки, которую необходимо потом открыть, то есть с записью вида
L P##CM // Any datapointer for CM

LAR1
L W [AR1,P#4.0]
T #i_DB // Number of DB
уже понятно, так как в #i_DB загоняется номер DB.

и затем открываем необходимую DB
OPN DB [#i_DB]

Немного полистав формат ANY, я пришел к выводу, что данные из ДБэшки лежат в 6 и 8 слове. Я так понимаю, что запись в низу нужна для того, что бы при прерывании контроллера инфа оставалась во временной переменной FC, которая не имеет своей ДБ.
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data



нужно загонять во временную переменную дабы


Top
 Profile  
 
PostPosted: Wed Nov 09, 2016 8:18 pm 

Joined: Sun Nov 06, 2016 1:54 pm
Posts: 6
а тут скрин ТЕМРа
Image


Top
 Profile  
 
PostPosted: Wed Nov 09, 2016 8:52 pm 

Joined: Sun Nov 06, 2016 1:54 pm
Posts: 6
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data

Короче, как бы необходима эта запись, вот только за чем?


Top
 Profile  
 
PostPosted: Wed Nov 09, 2016 10:39 pm 

Joined: Sun Nov 06, 2016 1:54 pm
Posts: 6
Всем спасибо, разобрался - на картинке пояснение (h)
Для доступа адресного регистра к данным...

Image


Top
 Profile  
 
PostPosted: Sun Oct 22, 2017 2:33 pm 

Joined: Tue Nov 29, 2016 4:34 pm
Posts: 13
Location: germany
Приветствую!
Помогите начинающему разобраться...
Есть задание:
Когда на входе E0.0 "1", в блок DB1 (ARRAY(1..100) INT)записываются числа от 1 до 100.
Когда на входах E0.0 и E0.1 "1", то эти же числа записываются в тот же блок DB, но в обратном порядке, то есть от 100 до 1.
Вот реализация в симатике (используется блок FC ):

U E 0.0
SPBN M001
L 100
loop: T MW 0 // Schleifenzähler
SLW 4 // Pointer in Verdoppelung da INT
L P#2.0 // möglich auch:L 16 (nicht 2!)
-D // 2 Byte von Pointer abziehen
T MD 2 // Vermittler, enthält die DB-Adresse
U E 0.1
SPBN M002
L P#198.0 // Adresse "umdrehen"
L MD 2 // hoher Schleifenzähler = niedrige Adresse
-D // niedriger Schleifenzähler = hohe Adresse
T MD 2
M002: AUF DB 1 Вот в этом и проблема! -
ОШИБКА СИНТАКСИСА

L MW 0 // aktueller Wert des Schleifenzählers (100 ... 0)
T DBW [MD 2] // im DB an die entsprechende Adresse speichern
L MW 0
LOOP loop
M001: BE


В обычном SIMATIC Step7 всё хорошо получилось, а вот в TIA v.14 в AWL (STL) не получается - говорит "Ошибка синтаксиса"
Помогите разобраться -как открыть блок DB в данном случае?


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 22 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: Google [Bot] and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  
Powered by International PLCforum® Forum Software © PLCforum
Mobile version