Обновление выхода ПИД когда нет изменений

Добрый день.

Использую встроенный в wb-scenarios ПИД регулятор. Но у него есть особенность, что если при следующем цикле выход ПИД регулятора не меняется, то он не обновляет выходной топик. whenChanged и trackmqtt не отрабатывают. Но иногда надо отрабатывать каждый цикл ПИД регулятора, даже когда выход его не меняется. Использовать setTimeout или setInterval не хочется, это усложняет код и могут быть причиной потенциальных сбоев.

Есть ли какой-нибудь способ ловить каждый цикл ПИД регулятора? Или можно добавить в следующие релизы эту опцию в ПИД регулятор.

Добрый день.

Да, контрол output_power (он же Мощность) в виртуальном устройстве сценария обновляется на каждом цикле, и wb-rules публикует его в MQTT даже без изменения.

Передам предложение разработчикам. Напишите, пожалуйста, для чего нужна обработка каждого цикла, это поможет сформулировать запрос.

Сейчас проверил на своем контроллере и подписался на топик мощность /output_power, не обновляет, ни whenChanged ни trackmqtt. ПИД стоит на 0, а мне надо, чтобы каждый цикл расчета ПИД приходило обновление (ловил как-то цикл сам).

Дело в том, что при использовании ПИД мне необходимо воздействие ПИД использовать с ограничением по времени, например ПИД выдал 100%, я трехходовой клапан подкрутил не на все 120 секунд его хода, а на 10 сек, потом, через 20 секунд цикла ПИД выдает все те же 100% и мне надо это уловить и дальше клапан открыть на 10 сек.

Доброго дня! Нужна проверка на стенде, как проверю - дам знать в этой теме

Добрый день. Еще есть запрос на ПИД с инверсным выходом (для охлаждения) или универсальный ПИД с выходом от -100% до 100%.

Добрый день.

Проверьте «Состояние» в виртуальном устройстве сценария. Если сценарий выключен или сам отключился из-за ошибки датчика или актуатора, расчёт не идёт и мощность стоит на 0.

Для вашей задачи есть путь без зависимости от публикаций сценария, cron-правило с тем же периодом, что и интервал пересчёта ПИД. Его запускает сам движок правил, таймерами вручную управлять не надо:

var PID_DEV = 'wbsc_valve_ctrl'; // имя виртуального устройства сценария

defineRule('valve_by_pid_cycle', {
  when: cron('@every 20s'), // период как у «Интервала пересчёта ПИД»
  then: function () {
    if (!dev[PID_DEV + '/rule_enabled']) return; // сценарий выключен
    var pidOutput = dev[PID_DEV + '/output_power']; // выход ПИД, 0-100 %
    // ваша логика импульса на клапан
  },
});

Новое значение ПИД правило увидит с задержкой до одного периода, для клапана с ходом 120 секунд это некритично.

Сейчас регулятор однонаправленный, выход ограничен 0-100 %, а обратное поведение актуатора только переворачивает шкалу, не направление. Пропорциональное охлаждение пока не сделать. Передам разработчикам идею

Доброго дня! У вас еще остались вопросы по теме?

Добрый день.

Вопросов нет. Буду ждать, когда обновится ПИД.

Спасибо!