тут надо на алгоритм восстановления связи смотреть.
Вид для печати
я сделал такую конструкцию
С ней зависать перестало совсем. Если пропадает связь, то восстанавливается, бывает не с первой попытки, но восстанавливается. Тут у меня 2 ком порта задействованы сразу, можно раздельно прописать.Код 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
Не понимаю, что значит экспортный.
Modbus_Master_COM_Port - это название ком порта, я оставил, что выдает по умолчанию.
Modbus_Master_COM_Port_1 - второй ком порт.
а4,а5 и так далее - так называются у меня блоки расширения (слейвы).
restart_STEP - просто int, больше как в этом куске кода нигде не используется.
a4_error_count - int, считает ошибки, больше как в этом куске кода нигде не используется.
TON_restart - функциональный блок TON, больше нигде не используется.
Вот картинка с деревом проекта, может так будет понятнее.
Вложение 24659
В СПК1хх в случае проблем с обменом рекомендуется производить закрытие порта. Это недокументированная фича. В случае закрытия порта весь внутренний буфер приема очищается. Таким образом это положительным образом в некоторых ситуациях влияет на обмен.
Весь порядок действий слизал где-то с форума. Паузы наобум, насколько можно меньше не экспериментировал. Я вообще по этому алгоритму аварийное отключение определял. Если блоки не отвечают, значит на них нет питания. Как только питание появлялось обратно, связь восстанавливалась, иногда раза с пятого, иногда сразу.