По просьбе наших посетителей, данный материал перенесен с сайта plc4good.org.ua, в связи с полной его потерей. Всё возражения принимаются через форму обратной связи.
plc4good.org.ua/view_post.php?id=247
Приведенный код, позволяет обнаружить факт выполнения программы не на реальном контроллере, а в среде симулятора S7-PLCSIM.
Код работоспособен на семействе S7-300,400
Способ основан на том, что при чтении серийного номера CPU, в PLCSIM, вместо номера возвращается строка пробелов.
Исходный код.
FUNCTION_BLOCK FB1
TITLE =‘PLCSIM_CHECK’
VAR_OUTPUT
RUN_IN_PLCSIM : BOOL,
END_VAR
VAR
RDSYSST : STRUCT
RET_WERT : INT ,
REQ : BOOL ,
BUSY : BOOL ,
SZL_HEADER : STRUCT
LENTHDR : WORD ,
N_DR : WORD ,
END_STRUCT ,
SZL_11C_5 : STRUCT
index : WORD ,
serialn : ARRAY [0 .. 23 ] OF CHAR ,
res : ARRAY [1 .. 4 ] OF WORD ,
END_STRUCT ,
END_STRUCT ,
CPU_DATA : STRUCT
Index : WORD ,
CPUIdent : ARRAY [1 .. 34 ] OF BYTE ,
Reserved : WORD ,
MajorVersion : WORD ,
MinorVersion_1 : BYTE ,
MinorVersion_2 : BYTE ,
END_STRUCT ,
BEGIN
RDSYSST.RET_WERT:=RDSYSST( // SFC51 Module identification
REQ := true
,SZL_ID := W#16#11C // W#16#011C: a single identification data record
,INDEX := W#16#5 // W#16#0005: Serial number of the module
,BUSY := RDSYSST.BUSY
,SZL_HEADER := RDSYSST.SZL_HEADER
,DR := CPU_DATA
),
RUN_IN_PLCSIM:=CPU_DATA.CPUIdent[1]:=B#16#0,
END_FUNCTION_BLOCK
Пример вызова блока.
Результат выполнения в симуляторе.
Результат выполнения в контроллере.
Область применения:
сложно сказать :),
как возможные варианты – небольшое усложнение анализа программы или автоматическое переключение на программную модель объекта управления при отладке на симуляторе.
Комментарии к материалу
Добавлен: snh Дата: 2015-10-19
Уважаемый, полученные данные д.б. сложены в CPU data а это 34 байта, а у вас 20, в структуре SZL_11C_5 будут только 0 т.к. в неё ничего не копируется. Хотя мож лыжи не едут…
Добавлен: komatic Дата: 2015-10-25
Ваша правда, проверил на реальном контроллере поправил статью, спасибо за замечание
Оцените статью!