PDA

Просмотр полной версии : Неустойчивое соединение ПЛК323 мастер - СПК107 слейв.



N.Vladimir
26.08.2019, 19:02
Проблема:
Неустойчивое соединение ПЛК323 мастер - СПК107 слейв. От мастера (16(0x10)) приходят в слейв pBuffer, COM_Service,- нормально. Из pBuffer в мастер (3(0x03)) иногда приходят данные с задержкой в несколько минут, иногда нет.
Контроллеры:
ПЛК323: мастер; (v.3.947); (Версия: 3.5.0.40); Port4 - 14 device (DI, DO) - нормально в работе, на нём же СПК107 (Версия: 3.5.2.0) - периодически мигает красным (шина не запущена); Port5 - 10 device (AO,AI) - нормально в работе; через библиотеку MB_TCP_Slave - нормально в работе; Port6 - зарезервирован под ASCII.
СПК107: слейв; (v.5.472); (Версия: 3.5.4.26); через библиотеку COM_Service (3.5.4.2) вроде в работе в буфер отправляет, принимает. Стандартный Modbus_Slave не работает, никакой версии почему-то?!
Что делал. Проект в разработке:
м1) До этого работал ПЛК323 Modbus_Slave (3.4.0.0) - СПК107 Com_Serice (3.1.0). Работал вяло, устойчиво.
* Нужно было преодолеть ограничение 40 переменных на ПЛК323 Modbus_Slave. Нажатия на СПК107 плохо срабатывали, соединение не устойчивое, но работало.
*-- Предпринял усилия улучшить конфигурацию, преодолеть ограничение 40 переменных, чёткость touch.
* Переменные в Visu из GVL - это нормально? Поставил VISU_TASK (Интервал t#200ms, приоритет 15), что такое Восприимчивость(1) из конфигурации СПК? . Как ещё улучшить чёткость touch СПК107?
* Чёткость touch СПК107 улучшилась, но видимо можно лучше. Возвратить к устойчивому варианту не удалось. Где-то ошибка.
м2) Программа. Опрос в ПЛК323 Modbus_Slave, Обработка в СПК107 COM_Service разбиты на шаги, проверку ошибок. Алгоритм выполняется.
м3) Добавлял задержки в программу опроса, обработки. Нет результата. Мастер не получает данные, либо с неприемлемой задержкой. От мастера в слейв данные поступают можно сказать нормально, если бы не периодические (2 мин.) потери соединения. Где-то ошибка.
м4) После отключения СПК, иногда ПЛК323 Modbus_Slave теряет соединение. Находиться в состоянии "шина не запущена" (красный), не восстанавливается. Добавил код, но похоже он не восстанавливает Modbus_Slave:


//----------------------------------------------------------------
// Перезапуск соединения, задержка TON1, счётчик ошибок CTU1
//----------------------------------------------------------------
IF Modbus_Slave_COM_Port_SPK107_Adr51_Touch5.xError THEN
TON1(IN:= NOT TON1.Q, PT:= T#60S, Q=> , ET=> );
IF TON1.Q THEN
TON2(IN:= NOT TON2.Q, PT:= T#5S, Q=> , ET=> );
IF TON2.Q THEN
Modbus_Slave_COM_Port_SPK107_Adr51_Touch5.xReset := TRUE;
END_IF;

CTU1 (
CU:= Modbus_Slave_COM_Port_SPK107_Adr51_Touch5.xReset,
RESET:= ,
PV:= ,
Q=> ,
CV=> wCurrentCounterValue
);
Modbus_Slave_COM_Port_SPK107_Adr51_Touch5.xReset := FALSE;

END_IF;
ELSE
Modbus_Slave_COM_Port_SPK107_Adr51_Touch5.xReset := FALSE;
END_IF;
Можно ли программно восстановить Modbus_Slave_COM_Port у СПК107?

N.Vladimir
27.08.2019, 09:57
возможно не на тот форум Вы обратились, Вам к Гудвину надо в Изумрудный город.
Есть же документ https://ftp.owen.ru/index.html/CoDeSys3/11_Documentation/01_SPK/SPK_Modbus_v.1.1.pdf обработка ошибок с реконнектом там описана, зачем отсебятину то писать, полурабочий код

Спасибо, увидел. При возникновении ошибки в Modbus_Slave_COM_Port.. надо Modbus_Master_COM_Port.xResetComPort активировать на один цикл. Видел же, но не использовал прямо приведенный пример "СПК Настройка обмена по Modbus Руководство для начинающих и продвинутых пользователей". Это надо будет перезагрузить более 20 устройств или более. Корректен ли такой подход? Возможно надо будет остановить процесс для других устройств на линии. Это новый дополнительный код.
У устройства Modbus_Slave_COM_Port_""..."" есть выход <.xReset >. Такой метод не применим для одного слейв устройства на линии? А полурабочий код, это одна из обвязок на скорую руку, но проверка на ошибку нужна. Когда, чего зависнет, из-за чего, это сложно выяснять, писать лог, общаться по телефону, искать виновных. Не критически важный объект, простая перезагрузка нормально.
Поэтому, спрашиваю у более опытных коллег как правильно делать. Заранее благодарю за ответы, участие.

N.Vladimir
27.08.2019, 12:51
Перезапустить, одно устройство 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;