Предназначение системы. ПЛК опрашивает 20 модулей МК110 (разного типа). В принципе их количество может варьироваться, главное быстро изменить код программы. Поэтому выбран для хранения массив, т.е. ПЛК держит всю информацию в массиве, где строчка содержит информацию об одном МК110 и производит операции управления вне зависимости от команд ModBus (Master). Другими словами ПЛК осуществляет местное управление, а ModBus (Master) удаленное. Конечно существует вопрос приоритета команд, но это здесь не требуется. Т.е. Сигнал управления (запись регистра выхода) на МК110 может прийти от:
1) самого ПЛК
2)с внешнего устройства ModBus (Master)
Вот для осуществления последнего варианта (управление и передачи состояния) как раз и хотелось бы из цикла обратиться и записать значение регистра ModBus (slave). Например
VAR_GLOBAL
In_0 AT%QW9.1.0:WORD;
In_1 AT%QW9.2.0:WORD;
In_2 AT%QW9.3.0:WORD;
…
In_19 AT%QW9.19.0:WORD;
END_VAR
FUNCTION Byte2_to_Word : WORD; (*объединяет два байта в WORD *)
программа:
FOR i:=0 TO 19 DO (*массив c 20 строчками, содержащий регистры МК110*)
Massiv[i, 0]:=…; (*запись в массив прочитанного регистра входа МК110*)
Massiv[i, 1]:=…; (*запись в массив прочитанного регистра выхода МК110*)
CASE i OF
0: In_0:= Byte2_to_Word (Massiv[0, 0], (Massiv[0, 1]); (*Regist_MK110_N1*)
1: In_1:= Byte2_to_Word (Massiv[1, 0], (Massiv[1, 1]); (*Regist_MK110_N2*)
2: In_2:= Byte2_to_Word (Massiv[2, 0], (Massiv[2, 1]); (*Regist_MK110_N3*)
…
19: In_19:= Byte2_to_Word (Massiv[19, 0], (Massiv[19, 1]); (*Regist_MK110_N20*)
END_CASE
END_FOR
Вот хотелось бы без Case обойтись. Предполагается, что объявленные переменные ModBus (slave) будут располагаться в памяти контроллера последовательно и без пропусков. Надо попробовать указатели ADR() применить, но я в них не силен. Пока думаю в цикле надо вместо Case:
p:= ADR(In_0)+I; (*i-индекс массива, [Byte]*)
p1:=p+1; (*адрес следующего байта *)
А как, зная адрес, записать значение по этому адресу? Я прав:
p^:= Massiv[I, 0]; (*первый байт WORD*)
p1^:= Massiv[I, 1]; (*втрой байтWORD*)
Почему «попахивает индусским кодом?». Можете предложить более рациональную логику программы?




Ответить с цитированием