NOM0200. Циклический опрос modbus slave устройств

Модератор: SaniOK

NOM0200. Циклический опрос modbus slave устройств

Сообщение wolka » 26 фев 2017, 16:59

Добрый день
Пытаюсь реализовать циклическую запись/чтение slave modbus устройств с коммуникационного модуля NOM0200 таким образом, что бы после выполнения команды (удачной или неудачной) контроллер переходил к вызову следующего ус-ва. Не могу понять, как реализовать механизм перехода.
Команда READ_VAR содержит структуру Management Parameters в первом слове которой нулевой бит это бит активизации команды чтения. После удачного выполнения команды он сбрасывается (проверял - работает).
Во втором слове структуры байты Communication & Operation reports после завершения команды возвращают диагностику операции. В удачном случае нули. В случае неудачного выполнения команды (например по тайм-ауту) диагностика отлична от нуля.
Но бит активизации в случае неудачного выполнения почему-то не сбрасывается, остается в "1" и контроллер постоянно долбит запросы по одному адресу.
Поскольку ни команда не сбрасывается, ни диагностика ничего не возвращает, то я не могу перейти к следующему шагу.
Есть ли у кого-нибудь опыт подобной реализации поочередного опроса устройств?

Мой пример реализации, увы пока нерабочий

Изображение
wolka
 
Сообщений: 46
Зарегистрирован: 01 дек 2016, 20:37
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение Огородников Сергей » 26 фев 2017, 17:39

Добрый день!

В вопросе не совсем понятно: циклический опрос УСТРОЙСТВ или УСТРОЙСТВА нужен, но, тем не менее, есть способ решить эту проблему.

1. Делаем очередь - в любом варианте, какой ближе (инкремент числа, сдвиг бита, граф в SFC и т.д.)
2. С каждым шагом связана одна операция Modbus.
3. Переход между шагами - задний фронт бита активности ИЛИ срабатывания таймера операции.
А с настройкой времени таймера поиграйтесь вживую - 300, 500 мс или сколько получится для гарантированного опроса.

С уважением,
СВ
Огородников Сергей
Центр обучения Schneider Electric
Огородников Сергей
 
Сообщений: 137
Зарегистрирован: 29 июн 2013, 02:25
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 4

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение san » 26 фев 2017, 20:27

1) в параметрах GEST (2-е слово, если начиная с 0, в Вашем случае mbpara1[2]) нужно поставить тайм-аут, например 10 (1 с)
2) пользуйтесь функцией CANCEL для скидывания связи, если шо не так
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение wolka » 26 фев 2017, 22:08

Огородников Сергей писал(а):1. Делаем очередь.
3. Переход между шагами - задний фронт бита активности ИЛИ срабатывания таймера операции.
В том то и дело, что в случае неудачной операции (например превышение таймаута) бит активности не сбрасывается :(
Диагностика с номером ошибки 16#01, возвращается только когда я принудительно "вырубаю" этот бит активности.
Огородников Сергей писал(а):А с настройкой времени таймера поиграйтесь вживую - 300, 500 мс или сколько получится для гарантированного опроса.
Таймер операции я выставил (во 3-м слове) Management Parameters - 10, т.е. 1сек.
san писал(а): 2. пользуйтесь функцией CANCEL для скидывания связи, если шо не так
А как программе понять, что все пошло "не так"? :)
Неужели нет возможности после отправки запроса диагностировать его результат, например превышение таймаута, без сброса бита активности вручную?

Есть тут одна идея :idea: Раз этот мерзавец, контроллер т.е., безостановочно долбит запросы на нехороший адрес, то при попытке второго запроса включать CANCEL на этот запрос, после чего последовательность перейдет к следущему.
wolka
 
Сообщений: 46
Зарегистрирован: 01 дек 2016, 20:37
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение san » 26 фев 2017, 22:16

Есть таймаут на функцию, его и надо выставить во 2-м слове, иначе можно ждать вечно.
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение wolka » 27 фев 2017, 09:12

san писал(а):Есть таймаут на функцию, его и надо выставить во 2-м слове, иначе можно ждать вечно.

Таймаут я поставил - 10, т.е. 1сек
Но счетчик обращений в старшем байте 0-го слова постоянно увеличивается (на картинке он сейчас 66). Идут сетевые запросы и бит активности не сбрасывается при явном превышении таймаута.
Изображение
Что то тут не то!!! Но что :?:
:roll:
wolka
 
Сообщений: 46
Зарегистрирован: 01 дек 2016, 20:37
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение san » 27 фев 2017, 10:09

Если счетчик увеличивается, значит сбрасывается. У Вас же условие чтоб функция опять запускалась, вот Вы и видите только 1. Можете проверить, поставить условие - если 0 то инкрементировать какую-то переменную.
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение wolka » 27 фев 2017, 12:33

san писал(а):Если счетчик увеличивается, значит сбрасывается. У Вас же условие чтоб функция опять запускалась, вот Вы и видите только 1. Можете проверить, поставить условие - если 0 то инкрементировать какую-то переменную.

Так я именно так и делал. Если бит активности сбрасывается в ноль mb_para1[0].0, то выключается вызов команды_1 и включается вызов команды_2. Почему тут задний фронт бита не работает?

Изображение

P.S.
Попробую поразмыслить альтернативно.
А может быть так, что бит активности сбрасывается (во время выполнения команды) не после очередного обращения к команде READ_VAR в машинном цикле, а ранее? Тогда может оказаться так, что к моменту очередного обращения к команде READ_VAR бит активности будет уже сброшен и команда вновь будет запущена в работу :idea: И нижестоящая цепочка со сбросом вызова команды_1 оказывается бесполезной.
Но все эти размышления от лукавого. Надо потом проверить на живом контроллере.
Что скажете коллеги?
wolka
 
Сообщений: 46
Зарегистрирован: 01 дек 2016, 20:37
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение san » 27 фев 2017, 15:20

Функция READ_VAR работает асинхронно. Для того чтобы биты скидывались и возвращался результат ее вызывать не надо. По этому бит активности и стоит в условии вызова: вызываем функцию только тогда, когда предыдущий вызов обработан.
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: NOM0200. Циклический опрос modbus slave устройств

Сообщение wolka » 28 фев 2017, 14:28

Нашел, исправил, заработало :!: Команду READ_VAR я вызываю передним фронтом стартового импульса mb_strt
wolka
 
Сообщений: 46
Зарегистрирован: 01 дек 2016, 20:37
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

След.

Вернуться в Высокоуровневые системы автоматизации - M340, M580, Premium, Quantum и Unity

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1