Добрый день!
Уточните, пожалуйста, как сделать, чтобы подсчет импульсов на модуле 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"
Описано в документации
К сожалению перенастроить модуль на инвертированное срабатывание не получится.
Входы WB-MCM8 работают по принципу «сухой контакт» - замыкание входа на землю ignd вызывает срабатывание входа. Т.е. значение передается в момент замыкания.
К сожалению нет много опыта написания в JS возможно что то из нашего примера слежения за контролом, либо массив топиков.
Спасибо за помощь. Теперь вижу в документации как за несколькими топиками сразу следить
whenChanged: ["wb-mcm8_221/Input 1", "wb-mcm8_221/Input 1 counter"]
Ну и если “кнопки” нормально замкнутые - то можно переделать систему наоборот.
То есть притянуть входы WB-MCM8 на iGnd резисторами, например на 5кОм.
А кнопки соединяют входы с +24, например.
При нажатии кнопки - цепь размыкается, вход оказывается соединенным с iGnd. При отпускании - наоборот.
Интересное решение. Спасибо. Буду иметь ввиду. Пока отслеживаем сразу двух топиков в одном правиле удалось решить проблему.