Цитата Сообщение от Oleg77 Посмотреть сообщение
Проект здесь.

Код:
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 на наличие ошибок.

В чём тут проблема ?
Какая прошивка?
Если залить максимально простой проект, почти пустой.
Будет ли зависать ПЛК?

Желательно целиком выложить файл проекта .pro