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

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
kolya_asu
Posts: 19
Joined: Tue Dec 23, 2014 1:02 pm

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

Post by kolya_asu »

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

Code: Select all

//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
Особенно интересует последняя часть кода:

Code: Select all

//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
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 »

Адекватно в SCL это не перевести, там такие тонкости невозможны.
Выглядит как пародия на BLKMOV, для переброски 60 слов из одной DB в другую.
А что объявлено в IN, OUT и TEMP блока?
sania
Site Admin
Posts: 1387
Joined: Sat Aug 13, 2005 6:15 am

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

Post by sania »

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

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

1200 может и не потянуть... зависит от кол-ва рецептов.. там ограниченная энергонезависимая память..
kolya_asu
Posts: 19
Joined: Tue Dec 23, 2014 1:02 pm

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

Post by kolya_asu »

Rex2701 wrote: Fri Sep 30, 2022 2:03 pm Адекватно в SCL это не перевести, там такие тонкости невозможны.
Выглядит как пародия на BLKMOV, для переброски 60 слов из одной DB в другую.
А что объявлено в IN, OUT и TEMP блока?
Вот фото:
https://drive.google.com/file/d/1W3B66W ... sp=sharing
https://drive.google.com/file/d/1gKUesB ... sp=sharing
kolya_asu
Posts: 19
Joined: Tue Dec 23, 2014 1:02 pm

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

Post by kolya_asu »

sania wrote: Fri Sep 30, 2022 6:53 pm вместо регистров можно использовать меркеры памяти динт. а конструкции типа 2.0 менять на число : 2.0 = 2х8 =16
Sania, а можете объяснить коротко о данном методе, как это делается?
#NumerPakiA можно было просто умножить на 60 байт (60х8) и не делать цикл...
Не получиться, смотрите внешн.структуру функции:
https://drive.google.com/file/d/1Lq4RfJ ... sp=sharing
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 »

Code: Select all

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
Site Admin
Posts: 1387
Joined: Sat Aug 13, 2005 6:15 am

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

Post by sania »

код как выше использует динт
только
AR1 := AR1 + 2
надо +16 делать
а +60 надо +480
регистр использует байтовый доступ, а динт битовый
kolya_asu
Posts: 19
Joined: Tue Dec 23, 2014 1:02 pm

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

Post by kolya_asu »

Rex2701, Sania, спасибо Вам за помощь, думаю, что должно заработать как надо. Проверю, отпишусь.
sania
Site Admin
Posts: 1387
Joined: Sat Aug 13, 2005 6:15 am

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

Post by sania »

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

Code: Select all

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
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 »

Ничего там не надо делать.
Документация SCL гласит, что индексный доступ к блоку данных использует индекс как байтовый адрес. Для битового доступа используется второй индекс. Поэтому ничего доумножать на 8 не надо.
https://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
Site Admin
Posts: 1387
Joined: Sat Aug 13, 2005 6:15 am

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

Post by sania »

да, всегда есть место для учёбы
я относился к scl как к stl .
ошибочка вышла, сори..
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 »

sania wrote: Sat Oct 01, 2022 7:21 amпо мне, вот так проще:
Такой код даже не скомпилируется.
Во-первых, в SCL "решётка" перед переменными не ставится, даже перед внутренними.
Во-вторых, про +16 и +480 уже сказано выше. Тут во время исполнения просто получим выход за границы блока и вызов соотвествующего OB. Если его не будет - значит STOP.
В-третьих, была задача повторить код как есть. Поэтому оставим использование первого цикла вместо умножения NumerPakiA на совести автора сего кода. Потому что там ещё и AR1 зачем-то дважды обнуляется в начале.

И вообще код небезопасный.
Если NumerPakiA будет равен 0, то первый цикл отработает 65535 раз, прежде чем BuferProg станет равен 0 и сработает условие на выход. В AR1 накопится указатель в какую-то дикую даль, что тоже триггернет программное исключение выхода за границы.
Last edited by Rex2701 on Sat Oct 01, 2022 7:49 am, edited 2 times in total.
sania
Site Admin
Posts: 1387
Joined: Sat Aug 13, 2005 6:15 am

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

Post by sania »

ну про про +16 и +480 уже и не спорю
с # прое..ал
поправил...
как я говорил выше, по мне проще без фора
первое обнуление AR1 какое-то левое, второе правильнее будет
CoMod
Site Admin
Posts: 3992
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia

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

Post by CoMod »

Примеры работы с одномерными массивами. 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
Posts: 19
Joined: Tue Dec 23, 2014 1:02 pm

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

Post by kolya_asu »

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

Code: Select all

	"ParTor1"  (BlockDB_A)	 // это ARRAY[1..30]
	"DaneTor1"(BlockDB_В) 	// это ДБшка  с которой работает программа
		 (NumerPakiА)	// это поле выбора номера программы на ОП, 
		 		//т.е. выбор одной из программы, данные которой хранятся в СООТВЕТСТВ. массиве
		 		// При устнов. "1" на входе (PZapis) копирует данные
Вот скрин: https://drive.google.com/file/d/1ty2xAf ... sp=sharing
sania
Site Admin
Posts: 1387
Joined: Sat Aug 13, 2005 6:15 am

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

Post by sania »

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

Code: Select all

IF PZapis THEN
"DaneTor1".desination := "ParTor1".program[NumerPakiA];
PZapis := FALSE;
END_IF;