Здравствуйте.
Возможно данный вопрос уже поднимался на форме, но я что-то ни как не могу найти подходящий ответ.
Задача такая:
К ПЛК110 подключен 3G-роутер посредством которого должна осуществляется связь по Modbus-TCP с удаленным компьютером. На компьютере установлена самописная программа, которая работает в режиме Modbus-slave.
К программе планируется подключить с несколько десятков устройств. Для того чтобы разгрузить программу и канал 3G хотелось бы сделать так, чтоб контроллеры писали в Modbus-slave групповыми запросами.
Групповой запрос в ПЛК110 в Universal Modbus Device реализуется через переменные STRING.
Вопрос следующий:
Как упаковать переменные в STRING?
Пытался решить следующим способом:
--------------------------------------------------------------
VAR
str1: STRING[8];
str2: STRING[44];
str3: STRING[36];
ptr1: POINTER TO ARRAY[0..7] OF BYTE;
ptr2: POINTER TO ARRAY[0..21] OF INT;
ptr3: POINTER TO ARRAY[0..17] OF INT;
END_VAR
ptr1:=ADR(str1);
ptr2:=ADR(str2);
ptr3:=ADR(str3);
ptr1^[0].0 := parametr11;
ptr1^[0].1 := parametr12;
ptr1^[0].2 := parametr13;
ptr1^[0].3 := parametr14;
ptr1^[0].4 := parametr15;
ptr1^[0].5 := parametr16;
ptr1^[0].6 := parametr17;
ptr1^[0].7 := parametr18;
и так далее для строки str1
(parametr11...parametr18 - переменные типа BOOL)
ptr2^[0] := parametr21;
ptr2^[1] := parametr22;
и так далее для строки str2
(parametr21, parametr22 - переменные типа INT)
ptr3^[0] := REAL_TO_INT(parametr31 * 100);
ptr3^[1] := REAL_TO_INT(parametr32 * 100);
и так далее для строки str3
(paremetr31,parametr32 - переменные типа REAL)
modbus_group1 := str1;
modbus_group2 := str2;
modbus_group3 := str3;
(modbus_group1,modbus_group2,modbus_group3- переменные типа STRING Universal Modbus Device)
--------------------------------------------------------------
После заливки такого кода программа зависает, через некоторое время перезагружается контроллер (наверно watchdog срабатывает)
Что не так в коде? И может какое другое решение есть?
Подскажите пожалуйста.