Добрый вечер!
Не могу разобраться с бибкой modbus master, есть моменты, которые я не понимаю. В описании к библиотеке написано следующее: "в PLC Configuration должны быть подключены библиотеки SisLibCom, Modbus, ComService.", но я CDS 3.5 нет библиотеки SisLibCom, а есть SysCom. Я решил, что это опечатка и добавил SysCom.
Соответственно
Код:
Settings:COMSETTINGS;(* настройки последовательного порта *)
com_num: PORTS:=0; (*0 - RS-485, 1 - RS-232*)
у меня изменилось на
Код:
Settings :COM_Settings; (* настройки последовательного порта *)
com_num :COM_Ports:=SYS_COMPORT2; (*SYS_COMPORT2 - COM1/RS-485, SYS_COMPORT3 - COM2/RS-232*)
и в программе:
Код:
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=115200; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Изменилось на
Код:
IF port_opened=0 THEN
Settings.sPort:=com_num; (*номер COM-порта*)
Settings.ulBaudrate:=SYS_BR_115200; (*скорость*)
Settings.byParity:=SYS_NOPARITY;
Settings.ulTimeout:=SYS_NOWAIT;
Settings.byStopBits:=SYS_ONESTOPBIT;
Settings.ulBufferSize:=0;
END_IF
com_serv(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF com_serv.ready THEN
port_opened:=2;
END_IF
Затем я начинаю пытаться опрашивать устройство:
Код:
IF port_opened=2 THEN (*Удачно проинициализировали*)
blink_read_pr(in:= port_opened=2, t_on:= T#500MS, t_off:= T#10MS, out=> );
get2_modbus(
Enable:= (blink_read_pr.out AND err=0),
Mode:= MB_ASCII,
DevAddr:= 1,
FirstAddr:= 512,
Quantity:= 46,
ComHandle:= Settings.sPort,
TimeOut:= TimeOut,
Buffer:= buffer,
Complete=> cmpl,
Exception=> err,
ByteCnt=> DataSize);
(*если установлен признак завершения операции, то *)
IF cmpl THEN
// IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
pPR200rd:=ADR(buffer);
buf_pr_rd:= pPR200rd^; //:=buf_pr_rd;
size_br:=SIZEOF(pPR200rd);
in_bits:=pPR200rd^.pr_bits;
in_pr_comm_test:=pPR200rd^.pr_comm_test;
END_IF
END_IF
При этом ByteCnt всегда равен 17, но size_br равен 4 и in_bits равен одному и тому же числу, сколько бы регистров я не опрашивал, хоть 1, хоть 5,10. С учётом того, что постоянно проскакивает ошибка err=255, я делаю вывод, что связи нет и пробую COM_Ports равным SYS_COMPORT1, SYS_COMPORT3, SYS_COMPORT4. Но результат в итоге один и тот же. Что я делаю не так?
P.S. забыл добавить, что через конфигурацию данные получаю, т.е. связь между устройствами есть.