Задержки в срабатывании правил (wb rules)

Добрый день, меня зовут Александр!
В качестве инженера занимаюсь разработкой робототехнических решений в пищевой промышленности.

Пробуем ваши контроллеры в нашем образце по автоматизации распределения заготовок. Возникли некоторые трудности в процессе использования WB.
Проблемы связаны с задержками в срабатывании правил (wb rules) и отправкой сообщений по modbus tcp. Более детальное описание прилагаю ниже, буду благодарен за компетентную помощь от разработчиков данного устройства и инженеров.

В системе применяются:
-WB-MIO 6шт
-WBIO-DI 6шт
-WBIO-DO 6шт
-EPR60- драйвера шаговых двигателей, которые управляются по modbus tcp

  1. Задача синхронизации двух шаговиков с драйвером EPR60
    При задании параметров по modbus tcp из правила на два разных девайса возникала задержка т.е. один начинал ехать раньше другого на обозримое количество времени 0.5-1с
    Задание состояло из двух этапов - передаются несколько регистров конфигурации движения и потом выставляется 1 байт начала движения
    При последовательном задании - сначала один драйвер, потом другой появилась проблема рассинхронизации.

Важно заметить, что была произведена оптимизация poll interval для всех регистров устройства modbus tcp (важные регистры с меньшим интервалом)

Решили проблему тем что параметры устройства задаем заранее, а потом - также последовательно отправляем только регистры начала движения.
Задержка осталась перед началом движения но рассинхронизация стала заметно меньше.

ПРЕДПОЛОЖЕНИЕ: Первое предположение - работа очередей в софте WB, которая вызывает задержки в отправку сообщений по modbus.
ВОПРОС: Подскажите, если это предположение верное, как контролировать такты отправки сообщений в modbus (и их порядок) и как уменьшить задержку в работе очередей от правила до драйвера modbus?

  1. Задержка срабатывания правил
    Установили датчики подключенные через WBIO-DI, по срабатыванию которых должен останавливаться двигатель.
    Использовали конструкцию вида:
    defineRule( “”, {
    when: function() {
    return dev[device][SENSOR_NAME] == true
    },
    then: function() {
    dev[device_EPR60][COM_REGISTER] = 1 //stop motor
    }
    }
    });

Задержка составляла порядка 2-3 секунд, при этом через веб-интерфейс в ручную на запись значений в регистр система не реагировала, приходилось полностью выключать питание.

Проблема повторялась с некоторой периодичностью.
Т.е. правило срабатывало, но через несколько раз могло опять зависнуть все.

ПРЕДПОЛОЖЕНИЕ: Если задержки возникают не сразу а при накоплении, возможно забивается кэш какой то
Удалили data.db и mosquito.db
Как не странно это помогло!
При работе одного драйвера и нескольких модулей ввода вывода
НО! при подключении большего количества драйверов и модулей выполняющих ту же функцию задержки вновь появились!
ВОПРОС:
Сейчас нашим “костылем” является удаление data.db и mosquito.db
Настройка poll interval устройств modbus не приводит к успеху.
Существует ли решение данной проблемы и возможна ли оптимизация очереди MQTT через которую работает софт WB либо оптимизация написания правил для их корректной бесперебойной работы.

ДОП ВОПРОСЫ:

  1. возможен ли контроль такта срабатывания правил (как такт цикла работы ПЛК чтобы гарантировать время срабатывания правила)
  2. есть ли ограничения на количество правил

Спасибо! Буду благодарен за содержательный ответ!

Я бы описал чуть по другому. Использование when: function() тут совершено избыточно.

defineRule( "", {
whenChanged: device+"/"+SENSOR_NAME,
	then: function(newValue, devName, cellName) {
  		if (newValue){
			dev[device_EPR60][COM_REGISTER] = 1 //stop motor
  		}
	}
});

А что за запись “вручную”? Тут немного непонятно.

Команды записи в порт отправляются немедленно, без задержек. То есть в очередь не становятся вообще, заканчивается текущая операция с шиной - и сразу отправляются.
poll_interval применяется только для опроса, то есть чтения состояния регистров.

Поменяйте в /etc/mosquitto/mosquitto.conf
persistence true
на

persistence false

И перезапустите mosquitto (лучше контроллер)

Нет, нету.

На странице Devices в Веб-интерфейсе, отображается подключенное устройство EPR60 с используемыми регистрами, предварительно инициализированные в разделе Configs. Перезаписываем значение регистра отвечающего за остановку двигателя не программно обращаясь к нему, а вручную меняем значение регистра (type: “value”) на необходимое для остановки.
Так как правило на остановку из-за задержки не срабатывало, и на изменение значение регистра “вручную” система не реагировала, отключали питание.

Каким способом, я про это спрашиваю. Запись в MQTT? Если да - то в какой топик? Или переключением в веб-интерфейсе?

Переключением в веб-интерфейсе

В таком случае тут не работают правила, совсем. wb-mqtt-serial работает сразу с брокером. А можете воспроизвести с включенным Debug для wb-mqtt-serial?

Вы имеете ввиду Enable debug или просмотр системных логов?


Есть ли подобное отключение для data.db или база данных будет автоматически создаваться и заполняться?

https://wirenboard.com/wiki/Wb-mqtt-serial_driver#Включение_отладки

Довольно нечасто вижу желание отключить историю. Но можно ведь просто отключить запуск сервиса, этого достаточно.

Хорошо, спасибо.
Протестируем, дадим ответ