WB-MCM8. Счетчик

Добрый день!
Уточните, пожалуйста, как сделать, чтобы подсчет импульсов на модуле WB-MCM8 происходил при размыкании контакта, а не замыкании?

Добрый день.

Придётся написать виртуальное устройство которое будет подсчитывать только в момент размыкания.
Переработал одно из наших примеров правил под вас.
Только поменяйте var inputChannel = "wb-mcm8_221/Input 1"; // Топик дискретного входа на свой.

// --- Виртуальное устройство для отображения количества импульсов с кнопкой сброса ---
defineVirtualDevice("pulse_counter", {
  title: "Pulse counter",
  cells: {
    impulses: {
      type: "value",
      value: 0      
    },
    reset: {
      type: "pushbutton"
    }
  }
});

// --- Логика подсчета импульсов ---
var impulseCount = 0;  // Счетчик импульсов
var lastInputState = 1; // Последнее состояние входа
var inputChannel = "wb-mcm8_221/Input 1"; // Топик дискретного входа

// Обработка импульсов: с 1 на 0
defineRule("count_impulses", {
  whenChanged: inputChannel,  // Правило срабатывает при любом изменении на дискретном входе, с 1 на 0 
  then: function (newValue) {
    if (lastInputState == 1 && newValue == 0) {  // Проверка фронта импульса с 1 на 0
      impulseCount += 1;                         // Счетчик импульсов  
      dev["pulse_counter"]["impulses"] = impulseCount;  // Отображение импульсов в виртуальном устройстве
    }
    lastInputState = newValue;  // Сохранение значения фронта импульса, используется в условии выше
  }
});

// Обработка кнопки сброса
defineRule("reset_counter", {
  whenChanged: "pulse_counter/reset",
  then: function () {
    impulseCount = 0;  // Сброс счетчика
    dev["pulse_counter"]["impulses"] = impulseCount;
  }
});

Спасибо, проверю, но думаю не совсем то что мне нужно.
У меня нормально замкнутая система из большого количества кнопок.

И я уже пробовал работать с

whenChanged: "wb-mcm8_221/Input 1"

Контроллер WIRENBOARD не успевает отлавливать изменения на этом входе, так как импульсы очень короткие, и видимо они проходят между интервалами опроса модулей WB-MCM8. Поэтому решил в правилах использовать

whenChanged: "wb-mcm8_221/Input 1 counter"

потому что измененный счетчик хранится в модуле WB-MCM8 и при следующем опросе устройства контроллер WIRENBOARD видит изменение счетчика, но тут я обнаружил другую проблему. В случае долгих разрывов счетчик изменяется только в момент восстановления соединения и, как следствие, счетчик изменяется не сразу, а по прошествии какого-то времени. А в случае полного разрыва я вообще не увижу изменение счетчика. Поэтому мне нужно решение именно на стороне модуля WB-MCM8, а не с помощью правил логику менять.

По поводу правил wb-rules:
можно ли в одном правиле за изменением сразу двух топиков следить? Это бы решило мою проблему.
Типа такого что-то:

whenChanged: "wb-mcm8_221/Input 1" || "wb-mcm8_221/Input 1 counter"

Описано в документации

2 лайка

К сожалению перенастроить модуль на инвертированное срабатывание не получится.
Входы WB-MCM8 работают по принципу «сухой контакт» - замыкание входа на землю ignd вызывает срабатывание входа. Т.е. значение передается в момент замыкания.

К сожалению нет много опыта написания в JS возможно что то из нашего примера слежения за контролом, либо массив топиков.

1 лайк

Спасибо за помощь. Теперь вижу в документации как за несколькими топиками сразу следить
whenChanged: ["wb-mcm8_221/Input 1", "wb-mcm8_221/Input 1 counter"]

Ну и если “кнопки” нормально замкнутые - то можно переделать систему наоборот.
То есть притянуть входы WB-MCM8 на iGnd резисторами, например на 5кОм.
А кнопки соединяют входы с +24, например.
При нажатии кнопки - цепь размыкается, вход оказывается соединенным с iGnd. При отпускании - наоборот.

2 лайка

Интересное решение. Спасибо. Буду иметь ввиду. Пока отслеживаем сразу двух топиков в одном правиле удалось решить проблему.