Перезапустить, одно устройство 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;