Проект здесь.
Код:
PROGRAM InitComPort
VAR
COM_SERVICE1: COM_SERVICE;
END_VAR
IF ComPortState = 0 THEN
Settings.Port:= 0; (*RS-485*)
Settings.dwBaudRate:=9600; (*speed*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=2;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
COM_SERVICE1(Enable:=(ComPortState=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
ComPortState:= 2;
END_IF
----------------------------------------------------------------------------------------
PROGRAM GetMDVV
VAR
GetModbus: MB_RD_HOLD_REGS;
TimeOut: TIME:= T#50ms;
Buffer: ARRAY[0..255] OF BYTE;
EndGetStored: BOOL;
ErrorStored: BYTE;
DataSize: WORD;
GetReq: BOOL:= TRUE;
HavePause:TON;
END_VAR
F ComPortState = 2 THEN
GetModbus(
Enable:= GetReq,
Mode:= MB_RTU,
DevAddr:= 8, (*Адрес*)
FirstAddr:= 15,(*Регистр*)
Quantity:= 1,(*Количество регистров*)
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
GetReq:= FALSE;
IF GetModbus.Complete THEN
EndGetStored:= TRUE;
(* EndSendStored:= TRUE; *)
ErrorStored:= GetModbus.Exception;
END_IF(*END_IF*)
HavePause(IN:= EndGetStored,PT:=T#50ms);
(* HavePause(IN:= EndSendStored,PT:=T#50ms);*)
IF HavePause.Q THEN
(* IF HavePause.Q THEN *)
GetReq:= TRUE;
EndGetStored:= FALSE;
(* EndSendStored:= FALSE;*)
END_IF
END_IF
Проект состоит из двух блоков. Один для открытия и настройки порта RS-485. Другой для запроса данных из регистра 15 амперметра с адресом 8. Пример рабочий, но у нас никак не хочет работать. Пробовали разные варианты. Даже объединяли в один блок. Результат один : зависание и перезагрузка. Запросы и ответы все идут как бы нормально. Мониторинг пакетов проводили программой MODSIM32 в режиме Show traffic.
[008][003][000][015][000][001][180][144] - это запрос
[008] - адрес амперметра
[003] - код функции чтения регистра
[000][015] - первый регистр для чтения (0FH)
[000][001] - количество регистров
[180][144] - контрольная сумма
[008][003][002][000][000][100][069] - это ответ
[008] - адрес амперметра
[003] - код функции чтения регистра
[002] - количество байт
[000][000] - данные
[100][069] - контрольная сумма
Опять писк и перезагрузка. Последний пакет [008][003][002][000][000][100][069].
Пишет код ошибки в ПЛК - 3,
Произошла перезагрузка сторожевым таймером, обусловленная зависанием.
Проверить программу CoDeSys на наличие ошибок.
В чём тут проблема ?