я сделал такую конструкцию
Код HTML:
CASE restart_STEP OF
0: IF a2.xError OR a3.xError OR a4.xError OR a5.xError OR A6.xError OR A7.xError OR A8.xError OR A9.xError THEN
a4_error_count:=a4_error_count+1;
IF a4_error_count>5 THEN
restart_STEP:=restart_STEP+1;
END_IF
ELSE
a4_error_count:=0;
END_IF
1: Modbus_Master_COM_Port.xStop:=TRUE;
Modbus_Master_COM_Port_1.xStop:=TRUE;
TON_restart(IN:=TRUE,PT:=T#200MS);
IF TON_restart.Q THEN
a4.xReset:=TRUE;
a7.xReset:=TRUE;
a2.xReset:=TRUE;
a3.xReset:=TRUE;
a5.xReset:=TRUE;
a6.xReset:=TRUE;
a8.xReset:=TRUE;
a9.xReset:=TRUE;
TON_restart(IN:=FALSE);
restart_STEP:=restart_STEP+1;
END_IF
2: TON_restart(IN:=TRUE,PT:=T#200MS);
IF TON_restart.Q THEN
a4.xReset:=FALSE;
a7.xReset:=FALSE;
a2.xReset:=FALSE;
a3.xReset:=FALSE;
a5.xReset:=FALSE;
a6.xReset:=FALSE;
a8.xReset:=FALSE;
a9.xReset:=FALSE;
TON_restart(IN:=FALSE);
restart_STEP:=restart_STEP+1;
END_IF
3: TON_restart(IN:=TRUE,PT:=T#200MS);
IF TON_restart.Q THEN
Modbus_Master_COM_Port.xResetComPort:=TRUE;
Modbus_Master_COM_Port_1.xResetComPort:=TRUE;
TON_restart(IN:=FALSE);
restart_STEP:=restart_STEP+1;
END_IF
4: TON_restart(IN:=TRUE,PT:=T#200MS);
IF TON_restart.Q THEN
Modbus_Master_COM_Port.xResetComPort:=FALSE;
Modbus_Master_COM_Port_1.xResetComPort:=FALSE;
TON_restart(IN:=FALSE);
restart_STEP:=restart_STEP+1;
END_IF
5: TON_restart(IN:=TRUE,PT:=T#200MS);
IF TON_restart.Q THEN
Modbus_Master_COM_Port.xStop:=FALSE;
Modbus_Master_COM_Port_1.xStop:=FALSE;
TON_restart(IN:=FALSE);
restart_STEP:=restart_STEP+1;
END_IF
6: TON_restart(IN:=TRUE,PT:=T#200MS);
IF TON_restart.Q THEN
TON_restart(IN:=FALSE);
restart_STEP:=0;
END_IF
END_CASE
С ней зависать перестало совсем. Если пропадает связь, то восстанавливается, бывает не с первой попытки, но восстанавливается. Тут у меня 2 ком порта задействованы сразу, можно раздельно прописать.