Written on: 17. 02. 2018 [11:32]
|
rainproof
Виктор Иванов
Topic creator
registered since: 02.02.2018
Posts: 32
|
Как сгенерировать одно сообщение по событию нажатия кнопки - разобрался.
Но нужно сгенерировать только одно сообщение при изменении атрибута виджета (клапан открылся) - не могу понять.
Когда прописываю так -
if(this["Kl_1"].attr("st_open")){
SYS.messNote("OP:",this.ownerSess().user()+"::Состояние Клапана 1::Открыт");
}
- сообщение записывается в журнал, но много раз.
Для кнопки в демопроекте это реализовано с помощью цикла.
Как реализовать в данном случае?
Уточню немного:
Весь код я расположил в окне ввода кода страницы этой мнемосхемы.
(Событие по кнопке программа отрабатывает и генерит сообщение в журнал действий оператора)
На мнемосхеме есть кнопка "Открыть"(формирует команду на открытие), и есть виджет шарового клапана.
В журнале действий оператора должно отобразится сообщение о том, что оператор нажал кнопку, и после этого сообщения - сообщение о том, что клапан по факту открылся (параметр клапана st_open == true).
Т.е. - как заставить изменение параметра st_open виджета Kl_1 - сгенерировать сообщение - SYS.messNote("OP:",this.ownerSess().user()+"::Команда Клапан 1::Открыт"); ?
читаю в мануале
пользовательские события (префикс: usr_) генерируются пользователем в процедурах обсчёта виджетов;
т.е. - я могу создать свое пользовательское событие типа usr_st_open, и уже его использовать в том же алгоритме, который обрабатывает нажатие кнопки? но как и где создать эту карту пользовательских событий?
в коде виджета шарового клапана есть польз.события (usr_open например). Но с чем они связаны и где созданы?
[This article was edited 4 times, at last 18.02.2018 at 13:01.]
|
Written on: 18. 02. 2018 [17:29]
|
rainproof
Виктор Иванов
Topic creator
registered since: 02.02.2018
Posts: 32
|
Вобщем помучался немного, и сделал.
if (f_start) {
var st_open_vlv1 = false;
var st_close_vlv1 = false;
}
//Обработка нажатий кнопок
var ev_wrk = ev_rez = "";
for(off = 0; (ev_wrk=event.parse(0,"\n",off)).length; )
{
if (ev_wrk == "ws_BtPress:/btNalivAvtoCistern") {
SYS.messNote("OP:",this.ownerSess().user()+"::Команда выбора Резервуаров::Резервуар 1 включен");
}
else if (ev_wrk == "ws_BtRelease:/btNalivAvtoCistern") SYS.messNote("OP:",this.ownerSess().user()+"::Команда выбора Резервуаров::Резервуар 1 отключен");
}else {
ev_rez+=ev_wrk+"\n";
}
var event = ev_rez;
//Обработка состояний атрибутов виджетов клапанов
if (this["Kl_1"].attr("st_open")==true) {
if (st_open_vlv1 == false){
SYS.messNote("OP:",this.ownerSess().user()+"::Состояние Клапана 1::Открыт");
st_open_vlv1 = true;
}
}
if (this["Kl_1"].attr("st_open")==false) {
st_open_vlv1 = false;
}
if (this["Kl_1"].attr("st_close")==true) {
if (st_close_vlv1 == false){
SYS.messNote("OP:",this.ownerSess().user()+"::Состояние Клапана 1::Закрыт");
st_close_vlv1 = true;
}
}
if (this["Kl_1"].attr("st_close")==false) {
st_close_vlv1 = false;
}
[This article was edited 1 times, at last 18.02.2018 at 17:34.]
|
Written on: 19. 02. 2018 [10:09]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
А вот теперь осталось осознать, что:
- эта задача решается на логическом уровне источника данных;
- следовательно в библиотеках шаблонов есть тому много примеров;
- системы реального времени характерны особенностями циклического программирования;
- это всё описано в документации, а значит нужно просто её читать и изучать примеры перед обращением на форум.
Learn, learn and learn better than work, work and work.
|
Written on: 19. 02. 2018 [10:42]
|
rainproof
Виктор Иванов
Topic creator
registered since: 02.02.2018
Posts: 32
|
- эта задача решается на логическом уровне источника данных;
буду читать и изучать дальше.
пару недель только занимаюсь этим проектом, и пару недель как увидел openscada.
|