Как перевести часть кода с STL в SCL (обращение к адресам ПЛК через регистры АR1 и АR2)

    • #93861
      Николай
      Ключник

      kolya_asu Сентябрь 30, 2022 11:25

      Добрый день. Нуждаюсь в помощи знатоков языков STL и SCL. Мне с языком SCL не приходилось раньше работать совсем. А сейчас с переходом на S7-1200е, столкнулся с проблемами. В общем понимаю, что надо как-то потихоньку осваивать данный язык. Но сейчас нужна помощь, как можно реализовать обращение к адресам ПЛК через регистры АR1 и АR2 в S7-1200? Вот данный код с ПЛК S7-400:

      Код:

      //Zapis 60 sіуw z Bloku A do B z offsetem 0.0 A #PZapis JNB NIC L 0 LAR1 L P#0.0 LAR1 L 1 T #BuforProg //Petelka do ustawienia sie na pozycji RP: L #BuforProg L #NumerPakiA ==I JC RO L P#60.0 +AR1 L 1 L #BuforProg +I T #BuforProg JU RP RO: L P#0.0 LAR2 L 1 T #BuforParam //Wpisujemy z A do B RR: OPN #BlokDB_A L DBW [AR1,P#0.0] OPN #BlokDB_B T DBW [AR2,P#0.0] L #BuforParam L 30 ==I JC OK L P#2.0 +AR1 +AR2 L #BuforParam L 1 +I T #BuforParam JU RR OK: R #PZapis SET CLR NIC: NOP 0 

      Особенно интересует последняя часть кода:

      Код:

      //Wpisujemy z A do B RR: OPN #BlokDB_A L DBW [AR1,P#0.0] OPN #BlokDB_B T DBW [AR2,P#0.0] L #BuforParam L 30 ==I JC OK L P#2.0 +AR1 +AR2 L #BuforParam L 1 +I T #BuforParam JU RR OK: R #PZapis SET CLR NIC: NOP 0 

      Помогите пожалуйста, кто чем может, буду рад даже какому-нибудь примеру обращения к адресам ПЛК через регистры АR1 и АR2 с использованием указателя #P.

      Rex2701 Сентябрь 30, 2022 2:03

      Адекватно в SCL это не перевести, там такие тонкости невозможны.
      Выглядит как пародия на BLKMOV, для переброски 60 слов из одной DB в другую.
      А что объявлено в IN, OUT и TEMP блока?

      sania Сентябрь 30, 2022 6:53

      вместо регистров можно использовать меркеры памяти динт. а конструкции типа 2.0 менять на число : 2.0 = 2х8 =16
      это хрень похоже ищет заданную запись массива из 60 байт и записывает её в другую дбшку
      что-то типа рецептов в плк…
      #NumerPakiA можно было просто умножить на 60 байт (60х8) и не делать цикл…
      1200 может и не потянуть… зависит от кол-ва рецептов.. там ограниченная энергонезависимая память..

      kolya_asu Сентябрь 30, 2022 8:19

      Rex2701:

      Fri Сентябрь 30, 2022 2:03 pm

      Адекватно в SCL это не перевести, там такие тонкости невозможны.
      Выглядит как пародия на BLKMOV, для переброски 60 слов из одной DB в другую.
      А что объявлено в IN, OUT и TEMP блока?

      Вот фото:
      drive.google.com/file/d/1W3B66W … sp=sharing
      drive.google.com/file/d/1gKUesB … sp=sharing

      kolya_asu Сентябрь 30, 2022 8:43

      sania:

      Fri Сентябрь 30, 2022 6:53 pm

      вместо регистров можно использовать меркеры памяти динт. а конструкции типа 2.0 менять на число : 2.0 = 2х8 =16

      Sania, а можете объяснить коротко о данном методе, как это делается?

      #NumerPakiA можно было просто умножить на 60 байт (60х8) и не делать цикл…

      Не получиться, смотрите внешн.структуру функции:
      drive.google.com/file/d/1Lq4RfJ … sp=sharing

      Rex2701 Сентябрь 30, 2022 8:59

      Код:

      IF PZapis THEN AR1 := 0, FOR BuforProg := 1 TO NumerPakiA DO AR1 := AR1 + 60, END_FOR, AR2 := 0, FOR BuforParam := 1 TO 30 DO BlokDB_B.DBW[AR2] := BlokDB_A.DBW[AR1], AR1 := AR1 + 2, AR2 := AR2 + 2, END_FOR, PZapis := FALSE, END_IF,

      sania Октябрь 01, 2022 5:56

      код как выше использует динт
      только
      AR1 := AR1 + 2
      надо +16 делать
      а +60 надо +480
      регистр использует байтовый доступ, а динт битовый

      kolya_asu Октябрь 01, 2022 6:47

      Rex2701, Sania, спасибо Вам за помощь, думаю, что должно заработать как надо. Проверю, отпишусь.

      sania Октябрь 01, 2022 7:21

      по мне, вот так проще:

      Код:

      IF PZapis THEN AR1 := NumerPakiA * 60, // no FOR instruction AR2 := 0, FOR BuforParam := 1 TO 30 DO BlokDB_B.DBW[AR2] := BlokDB_A.DBW[AR1], AR1 := AR1 + 2, AR2 := AR2 + 2, END_FOR, PZapis := FALSE, END_IF,

      AR1 & AR2 temporary DINT

      Rex2701 Октябрь 01, 2022 7:25

      Ничего там не надо делать.
      Документация SCL гласит, что индексный доступ к блоку данных использует индекс как байтовый адрес. Для битового доступа используется второй индекс. Поэтому ничего доумножать на 8 не надо.
      cache.industry.siemens.com/dl/f … /SCL_e.pdf – глава 10.3.3

      • When accessing data of the types BYTE, WORD or DWORD, you must use one index only. The index is interpreted as a byte address. The extent of the access is specified by the size prefix.
      • When accessing data of the type BOOL, you must use two indexes. The first index specifies the byte address, the second index the bit position within the byte.
      • Each index must be an arithmetic expression of the data type INT (0 – 32767).

      sania Октябрь 01, 2022 7:39

      да, всегда есть место для учёбы
      я относился к scl как к stl .
      ошибочка вышла, сори..

      Rex2701 Октябрь 01, 2022 7:40

      sania:

      Sat Октябрь 01, 2022 7:21 am

      по мне, вот так проще:

      Такой код даже не скомпилируется.
      Во-первых, в SCL ‘решётка’ перед переменными не ставится, даже перед внутренними.
      Во-вторых, про +16 и +480 уже сказано выше. Тут во время исполнения просто получим выход за границы блока и вызов соотвествующего OB. Если его не будет – значит STOP.
      В-третьих, была задача повторить код как есть. Поэтому оставим использование первого цикла вместо умножения NumerPakiA на совести автора сего кода. Потому что там ещё и AR1 зачем-то дважды обнуляется в начале.
      И вообще код небезопасный.
      Если NumerPakiA будет равен 0, то первый цикл отработает 65535 раз, прежде чем BuferProg станет равен 0 и сработает условие на выход. В AR1 накопится указатель в какую-то дикую даль, что тоже триггернет программное исключение выхода за границы.

      Last edited by Rex2701 on Sat Октябрь 01, 2022 7:49 am, edited 2 times in total.

      sania Октябрь 01, 2022 7:42

      ну про про +16 и +480 уже и не спорю
      с # прое..ал
      поправил…
      как я говорил выше, по мне проще без фора
      первое обнуление AR1 какое-то левое, второе правильнее будет

      CoMod Октябрь 01, 2022 2:51

      Примеры работы с одномерными массивами. Siemens SCL.
      http://www.plc4good.org.ua/view_post.php?id=155
      Методики перевода Siemens STL-SCL
      http://www.plc4good.org.ua/index.php?sub=2&page=8

      kolya_asu Октябрь 01, 2022 10:19

      Внесу немного ясности…

      Код:

       'ParTor1' (BlockDB_A) // это ARRAY[1..30] 'DaneTor1'(BlockDB_В) // это ДБшка с которой работает программа (NumerPakiА) // это поле выбора номера программы на ОП, //т.е. выбор одной из программы, данные которой хранятся в СООТВЕТСТВ. массиве // При устнов. '1' на входе (PZapis) копирует данные 

      Вот скрин:drive.google.com/file/d/1ty2xAf … sp=sharing

      sania Sun Октябрь 02, 2022 2:54

      тогда совсем просто
      создаёшь udt ‘program’
      в DaneTor1 ставится 1 udt-шка ‘program’ с названием , например, desination
      в ParTor1 аррей 1..30 udt ‘program’
      ну и в проге:

      Код:

      IF PZapis THEN 'DaneTor1'.desination := 'ParTor1'.program[NumerPakiA], PZapis := FALSE, END_IF,

Viewing 0 reply threads
  • Вы должны войти в систему, чтобы ответить в этой теме.
Интepecнoe нa фopумe:
Авторизация
*
*
Регистрация
*
*
*
Генерация пароля
×