косвенная адресация

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
panf
Posts: 27
Joined: Sat May 30, 2015 3:44 pm

косвенная адресация

Post by panf »

нужно сделать пересылку данных из одной ДБ в другую, через заданное время, не получается настроить "как нужно" счетчик 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
Schtiel
Site Admin
Posts: 1122
Joined: Wed Sep 06, 2006 12:03 pm
Location: CIS

Post by Schtiel »

Marrenoloth
Posts: 62
Joined: Tue Dec 22, 2009 12:45 am
Location: Москва

Re: косвенная адресация

Post by Marrenoloth »

Ну вы явно забыли инкремент (или декремент, не знаю как вам удобнее) на #Num_temp_loop забыли. Еще вопрос на счет инкремента адреса в P#4.0 - вы уверенны, что у вас DB будет кратен 4 байтам? Может, лучше по 2 прибавлять?
Ну и помянуть для проформы, что AR2 и DINO надо сохранять, а потом восстанавливать, иначе, при работе с FB есть шанс получить по лбу своей же косвенной адресацией. :)
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: косвенная адресация

Post by Rex2701 »

Декремент счётчика и проверку на ноль выполняет сам оператор LOOP.
А AR'ы таки да - оба надо сохранять в начале и восстанавливать в конце.
Непонятна в целом причина этого секса в гамаке стоя. Что мешает использовать SFC20 MOVBLK?
panf
Posts: 27
Joined: Sat May 30, 2015 3:44 pm

Re: косвенная адресация

Post by panf »

смысл передать не всю 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-ами сталкиваюсь первый раз, и потом они пригодятся т.к это только "скелет" программы, так бы косвенную через память написал и не мучался. Подскажите ребятки!
panf
Posts: 27
Joined: Sat May 30, 2015 3:44 pm

Re: косвенная адресация

Post by panf »

"при работе с FB", мне попадались FC а переменные засовывали в TEMP, я понял будем разбираться как " сохранять, а потом восстанавливать"
Marrenoloth
Posts: 62
Joined: Tue Dec 22, 2009 12:45 am
Location: Москва

Re: косвенная адресация

Post by Marrenoloth »

Rex2701, спасибо, не знал. Просто всегда использую JCN по интересным мне условиям. :)

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

Ну и значение DINO в дополнение к AR1/AR2 тоже надо обязательно сохранять и восстанавливать после "косвенной адресации". А то, в лучшем случае, есть шанс попасть в несуществующую память, но это всяко лучше, чем попасть в левую область и всё там порушить.
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: косвенная адресация

Post by Rex2701 »

Ваш блок - это FC или FB?
Если FC, то есть подозрение, что контроллеру не нравится обращение к InstanceDB (L DID...), которая существует только у FB.
panf
Posts: 27
Joined: Sat May 30, 2015 3:44 pm

Re: косвенная адресация

Post by panf »

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.
Marrenoloth
Posts: 62
Joined: Tue Dec 22, 2009 12:45 am
Location: Москва

Re: косвенная адресация

Post by Marrenoloth »

Spoiler
Show

Code: Select all

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. Сам редактор сильно больно умный - меняет.
Marrenoloth и Rex2701 вы можете прислать листинг с AR1/2 при условии соблюдения требований отправленного сообщения
Это написать за вас ваш код? О.о
Если FC, то есть подозрение, что контроллеру не нравится обращение к InstanceDB (L DID...), которая существует только у FB.
Не возникало проблем никогда. Контроллер априори имеет DI, DB, AR1 и AR2. И его мало волнует какой блок программист пишет. Вообще, чертовски похоже, что, с технической точки зрения, разделение FB|FC больше формальное для возможности обозвать статические переменные памяти DI человеческими именами.
panf
Posts: 27
Joined: Sat May 30, 2015 3:44 pm

Re: косвенная адресация

Post by panf »

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

Re: косвенная адресация

Post by panf »

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

Re: косвенная адресация

Post by Marrenoloth »

panf wrote:знакомые специалисты при слове AR-ры делают квадратные глаза и мямлят про "пиши попроще код", так и получается спросить не у кого, безнадега, и первый блин комом, может дальше будет по проще...
Тут могу только порекомендовать писать какие-то системные функции для упрощения основного технологического кода. Т.е. написали один раз, что важно, максимально вылизали от косяков, потом годами тиражируете решение. А то, при интеграции этой радости в большое количество подпрограмм, сами-то не вспомните через пару месяцев что этим всем сказать хотели. А уж представители заказчика вас поминать будут регулярно. Зачем вам эта порча кармы и людям и себе? Проще написать, например, клапан, который вот точно работает, когда ему дают вкл. И точно отлавливает ошибки. Всё, как он там внутри работает с третьего проекта вы уже не вспомните потому, что не надо и голова у вас будет думать не что он делает при включении, а когда его включать. А вот если вы такие конструкции в описание техпроцесса включите, то вот тут-то и начнутся проблемы.
Oleg_Shonin
Posts: 6
Joined: Sun Nov 06, 2016 10:54 am

Re: косвенная адресация

Post by Oleg_Shonin »

Извените за глупый вопрос, ноя не смог разобраться с записью в блоке. Гуру, если не сложно подскажите, как это работает

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

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 не учавствует!! Подскажите?
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: косвенная адресация

Post by Rex2701 »

Сначала AR1 выставляют на полученный указатель, а затем

Code: Select all

L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
LAR1
его переписывают на нужные данные. И все дальнейшие инструкции, где есть AR1 - работают уже данными от указателя.
Возможно это хвост от старого кода, потому что в для приведённого отрывка сохранение во временную переменную действительно бесполезно.
Если только i_Pointer не находится где-то среди LD0...LD8.
Oleg_Shonin
Posts: 6
Joined: Sun Nov 06, 2016 10:54 am

Re: косвенная адресация

Post by Oleg_Shonin »

Rex2701, спасибо за пояснение, но странное то, что если убрать этот поинтер, то ничего не работает..
Я уже взмок, в попытках понять это.. Может есть смысл как-то подругому спрасить, например подшить исходный файл, дабы не пропустить чего нить?
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: косвенная адресация

Post by Rex2701 »

Покажи область TEMP для блока, чтобы видеть адрес #i_Pointer.
Oleg_Shonin
Posts: 6
Joined: Sun Nov 06, 2016 10:54 am

Re: косвенная адресация

Post by Oleg_Shonin »

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



нужно загонять во временную переменную дабы
Oleg_Shonin
Posts: 6
Joined: Sun Nov 06, 2016 10:54 am

Re: косвенная адресация

Post by Oleg_Shonin »

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

Re: косвенная адресация

Post by Oleg_Shonin »

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

Короче, как бы необходима эта запись, вот только за чем?
Oleg_Shonin
Posts: 6
Joined: Sun Nov 06, 2016 10:54 am

Re: косвенная адресация

Post by Oleg_Shonin »

Всем спасибо, разобрался - на картинке пояснение (h)
Для доступа адресного регистра к данным...

Image
Sharapov72
Posts: 13
Joined: Tue Nov 29, 2016 1:34 pm
Location: germany

Re: косвенная адресация

Post by Sharapov72 »

Приветствую!
Помогите начинающему разобраться...
Есть задание:
Когда на входе 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 в данном случае?