Если есть возможность, отправьте архив проекта на e.kislov@owen.ru
Вид для печати
Если есть возможность, отправьте архив проекта на e.kislov@owen.ru
Продолжу свою тему другим вопросом....
Мой проект состоит из СПК107, МВ110-8A -2 шт,МВ110-2АС, МУ110-8Р, МВ110-16ДН, МУ110-6У, МВ110-224.2АС, частотник ПЧВ101
Все каналы всех модулей опрашиваются посредством "RISING EDGE".
Терминаторы подключены с каждой стороны, длина сети не более 2 метров - все на столе собрано
Запустил программу - ВСЕ ОК, опрос модулей идет.
Решил по экспериментировать с сетью - откинул коннектор (с RS-485) от СОМ-порта СПК, появились запрограммированные мною ошибки по связи- все OK.
Подключил коннектор обратно - все модули с частотником "подхватились", все нормально - связь восстановилась.
Передернул опять коннектор - опрос не возобновляется, еще раз передернул опрос восстановился и т.д. То есть СОМ-порт не виснет, а связь не восставливается каждый раз когда подключен сетевой кабель....
Когда с подключенным коннектором опрос не восстановился наблюдал такую ситуацию: значки модулей в дереве проекта(CODESyS) - красные треугольники - типа не находит модулей, но по светодиодам модулей видно опрос идет и светодиод "авария не загорается"(настроен сетевой Тайм-аут). Сигнал xError показывает, что связи нет.
Продолжил эксперимент и выяснил, что вся проблема в частотнике - без подключенного частотника с модулями стабильно (100%) восстанавливается связь. Как только подключаю к частотнику сеть (даже без его опроса) - связь падает со всеми модулями, или не падает (как повезет). Промерял осциллографом сигналы в сети - вроде импульсы без помех - прямоугольные.
Подскажите пожалуйста как эту проблему решить......
Заранее СПС!!!
Заметил, что переменная .xAllSlavesOk не совсем правильно отображает состояние слейвов. Переменная тру, но фактически в кодесисе присутствуют восклицательные знаки. Заменил эту переменную на NOT(.xError or .xError и так далее) вместо .xAllSlavesOk и работать стало без перебоев в сети (ну то есть, если перебои появлялись, то связь восстанавливалась в соответствии с написанным алгоритмом).
я сделал такую конструкцию
С ней зависать перестало совсем. Если пропадает связь, то восстанавливается, бывает не с первой попытки, но восстанавливается. Тут у меня 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хх в случае проблем с обменом рекомендуется производить закрытие порта. Это недокументированная фича. В случае закрытия порта весь внутренний буфер приема очищается. Таким образом это положительным образом в некоторых ситуациях влияет на обмен.
Весь порядок действий слизал где-то с форума. Паузы наобум, насколько можно меньше не экспериментировал. Я вообще по этому алгоритму аварийное отключение определял. Если блоки не отвечают, значит на них нет питания. Как только питание появлялось обратно, связь восстанавливалась, иногда раза с пятого, иногда сразу.