Как перевести часть кода с STL в SCL (обращение к адресам ПЛК через регистры АR1 и АR2)
-
-
29.09.2022 #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=sharingkolya_asu Сентябрь 30, 2022 8:43
sania:Fri Сентябрь 30, 2022 6:53 pmвместо регистров можно использовать меркеры памяти динт. а конструкции типа 2.0 менять на число : 2.0 = 2х8 =16Sania, а можете объяснить коротко о данном методе, как это делается?
#NumerPakiA можно было просто умножить на 60 байт (60х8) и не делать цикл…Не получиться, смотрите внешн.структуру функции:
drive.google.com/file/d/1Lq4RfJ … sp=sharingRex2701 Сентябрь 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=8kolya_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,
-
- Вы должны войти в систему, чтобы ответить в этой теме.