Здравствуйте, уважаемые коллеги!
У меня возникли трудности по получению данных по ModbusTCP от 2-х вторичников расходомеров Симаг 12 на Modicon M340 (процессор BMXP342020). В gest пишет 16#0007 Problem in sending to the destination или Addressing error.
Самое интересное, что было проверено по OPC (insat) все данные получаются, только интересно что надо либо получать float, либо считывать сразу по два байта если читать в int, например Input registers 0 и 1, 2 и 3 и т.д. Так же было перекинуто на SerialPort контроллера и проверено, данные получались, но правда не на все запросы прилетали ответы от симагов.
Пояснения:
192.168.1.4 - это Moxa Mgate MB3180, на неё по RS485 подключаются Симаг 12.
Настройки:
Port1 RTU Slave
Serial Baundrate 19200, parity none, Stop bit 1, Interface RS485 2-wire
Modbus routing по умолчанию 001-254
Initial delay 0ms
Response timeout 1000ms
Ethernet_1 - сетка на контроллере, IP 192.168.1.2, маска 255.255.255.0, шлюз 192.168.1.1.
Прикладываю фото значений Gest, а так же руководство по Симаг 12.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Текст программы:
IF NOT FLOW_01_GEST[0].0 and timer1=0 then
FLOW_01_GEST[2]:=10;
(*Чтение данных_расходомер 1*)
READ_VAR (ADR := ADDM('Ethernet_1{192.168.1.4}33')(*11 - адрес устройства modbus rtu*),
OBJ := '%IW'(*параметр адреса modbus (Input registers)*),
NUM := 0(*Начальный адрес чтения*),
NB := 6(*Длина адреса*),
GEST := FLOW_01_GEST(*Следящий массив*),
RECP => FLOW_01_DATA(*Массив данных, минимум 2 значения*));
timer1:=1;
ELSE IF FLOW_01_GEST[0].0 and timer1=0 then timer1:=1; END_IF;
END_IF;
IF NOT FLOW_02_GEST[0].0 and timer1=1 then
FLOW_02_GEST[2]:=10;
(*Чтение данных_расходомер 2*)
READ_VAR (ADR := ADDM('Ethernet_1{192.168.1.4}34')(*11 - адрес устройства modbus rtu*),
OBJ := '%IW'(*параметр адреса modbus (Input registers)*),
NUM := 0(*Начальный адрес чтения*),
NB := 6(*Длина адреса*),
GEST := FLOW_02_GEST(*Следящий массив*),
RECP => FLOW_02_DATA(*Массив данных, минимум 2 значения*));
timer1:=0; (*Конец опроса, обнуляем timer*)
ELSE IF FLOW_02_GEST[0].0 and timer1=1 then timer1:=0; END_IF;
END_IF;