//Программно-аппаратный ватчдог. Циклически с периодом time включает на полпериода выход output //и на полпериода его отключает. //Предназначен на вход реле, которое при остановке этих сигналов в любом состоянии отреагирует и просигнализирует зависание var WatchDog = function (name,interval, output) { {//конструктор первичные установки var RN = name;//"WatchDog"; //ВНЕСТИ ССЫЛКУ НА ВИРТ ДЕВАЙ title var SC = "start"; // имя переключателя - старта правила //dev[RN + "/" + "time"] = 1000;// из-за "фичи" wb, сюда можно внести стартовое значение по умолчанию. Потом закомментить. var logPreff = RN + ":"; this.StartStateWD = dev[RN + "/" + SC]; //свойство, показываеющее текущее состояние объекта WD - включено или нет var OUTPUT = output; if (OUTPUT == undefined) {OUTPUT = "wb-gpio/V_OUT"};//dev["wb-gpio"]["V_OUT"]}; var INTERVAL = interval; if (INTERVAL == undefined || INTERVAL == 0) { log(logPreff + "присваиваю INTERVAL значение " + dev[RN + "/" + "time"]); INTERVAL = (dev[RN + "/" + "time"])/1; } else { dev[RN + "/" + "time"] = INTERVAL; } ; //var SygnalIntervalID; // ID интервала циклической команды на output //var SygnalOFFTimeoutID; // ID таймаута - половины периода, на которое выход отключается }////конструктор первичные установки //создаем вирт устройство defineVirtualDevice(RN, { title: RN, cells: { start: { type: "switch", value: false }, sygnal: { type: "text", value: dev[OUTPUT] }, time: { type: "text", value: INTERVAL }, output: { type: "text", value: OUTPUT } } }); // запуск в работу по событию - включению в интерфейсе. this.main = function (){ var self = this; var timer_blink_name = RN + "_blink"; defineRule(RN,{ asSoonAs: function(){ return dev[RN + "/" + SC] == true; }, then:function(){ startTicker(timer_blink_name, INTERVAL); timers[timer_blink_name].name = timer_blink_name; log(logPreff + "Запущен таймер мигания выходом для " + OUTPUT); } }); defineRule(RN + "_change_output",{ when: function(){return timers[timer_blink_name].firing;}, then: function(){ dev[OUTPUT] = !dev[OUTPUT]; dev[RN + "/" + "sygnal"] = dev[OUTPUT]; //log(logPreff + "Состояние " + OUTPUT + " изменено на " + dev[OUTPUT]); } }); defineRule(RN + "_stop",{ asSoonAs: function(){ return dev[RN + "/" + SC] == false; }, then:function(){ timers[timer_blink_name].stop(); log(logPreff + "Таймер работы остановлен"); } }); } }; var WD = new WatchDog("WatchDog",1000,"wb-gpio/V_OUT"); WD.main();