Перезапустить, одно устройство Modbus_Slave_COM_Port_ в Modbus_Master_COM_Port возможно, не перезапуская весь Modbus_Master_COM_Port.xResetComPort.
Ошибка одного устройства Modbus_Slave_COM_Port_.xError появляется спустя где-то минуту после потери соединения.
Вот код:
TYPE CLIENTSTATE :
(
STARTCLIENT := 0,
SENDCLIENT := 1,
RECIEVECLIENT := 2,
ERRORCLIENT := 3
);
END_TYPE
//----------------------------------------------------------------
// Обработка одного устройства Modbus_Slave_COM_Port
//----------------------------------------------------------------
//----------------------------------------------------------------
// Обработка ошибки одного устройства Modbus_Slave_COM_Port.xError
//----------------------------------------------------------------
CASE CLIENTSTATE1 OF
STARTCLIENT :
Modbus_Slave_COM_Port_.xReset := FALSE;
IF Modbus_Slave_COM_Port_.xError THEN
CLIENTSTATE1:= ERRORCLIENT;
ELSE
CLIENTSTATE1:= SENDCLIENT;
END_IF;
SENDCLIENT:
//----------------------------------------------------------------
// SEND
//----------------------------------------------------------------
actChannelWriteSpk(); // Send
IF Modbus_Slave_COM_Port_.xError THEN
CLIENTSTATE1:= ERRORCLIENT;
ELSE
CLIENTSTATE1:= RECIEVECLIENT;
END_IF;
RECIEVECLIENT:
//----------------------------------------------------------------
// RECIEVE
//----------------------------------------------------------------
actChannelReadSpk(); // Recieve
IF Modbus_Slave_COM_Port_.xError THEN
CLIENTSTATE1:= ERRORCLIENT;
ELSE
CLIENTSTATE1:= SENDCLIENT;
END_IF;
ERRORCLIENT:
//----------------------------------------------------------------
// Перезапуск соединения, задержка TON1, счётчик ошибок CTU1, счётчик перезапусков CTU2,
//----------------------------------------------------------------
CTU1 (
CU:= Modbus_Slave_COM_Port_.xError,
RESET:= ,
PV:= ,
Q=> ,
CV=> wCurrentCounterValuexError
);
IF Modbus_Slave_COM_Port_.xError THEN
TON1(IN:= NOT TON1.Q, PT:= T#60S, Q=> , ET=> );
IF TON1.Q THEN
Modbus_Slave_COM_Port_.xReset := TRUE;
END_IF;
CTU2 (
CU:= Modbus_Slave_COM_Port_.xReset,
RESET:= ,
PV:= ,
Q=> ,
CV=> wCurrentCounterValuexReset
);
ELSE
Modbus_Slave_COM_Port_.xReset := FALSE;
END_IF;




Ответить с цитированием
