УкраїнськаEnglishmRussian
Вход/Новый
В теме много сообщений

Обработка алармов и сообщений


Автор Сообщение
Сообщение создано: 21. 11. 2012 [13:04]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
Шаблоны обработки вешественных и дискретных переменных с отслеживанием изменений и выдачей системного сообщения для отображения виджетами и в протокол написал. Увязал с текущим проектом - работает. Код шаблона обработки дискретного сигнала написал такой:
***************************************************************************************************************

if(f_start)//1-й запуск
{
last=in;//приравниваем входное значение предыдущего цикла значению текущего цикла
//делаем проверку
if(in==norma)
{
//Сообщение если in=NORMA
f_err="0:"+DESCR+":"+MESSAGE_IN_EQ_NORMA;
this.nodePrev().alarmSet((NAME.length?NAME:SHIFR)+": "+DESCR+": "+MESSAGE_IN_EQ_NORMA, 1, SHIFR);
}
else
{
//Сообщение если in!=NORMA
f_err="1:"+DESCR+":"+MESSAGE_IN_NOT_NORMA;
this.nodePrev().alarmSet((NAME.length?NAME:SHIFR)+": "+DESCR+": "+MESSAGE_IN_NOT_NORMA, -5, SHIFR);
}
}

//начало
if(in!=last)//отслеживаем изменение входного значения
{
if(in==norma)
{
//Сообщение если in=NORMA
f_err="0:"+DESCR+":"+MESSAGE_IN_EQ_NORMA;
this.nodePrev().alarmSet((NAME.length?NAME:SHIFR)+": "+DESCR+": "+MESSAGE_IN_EQ_NORMA, 1, SHIFR);
}
else
{
//Сообщение если in!=NORMA
f_err="1:"+DESCR+":"+MESSAGE_IN_NOT_NORMA;
this.nodePrev().alarmSet((NAME.length?NAME:SHIFR)+": "+DESCR+": "+MESSAGE_IN_NOT_NORMA, -5, SHIFR);
}
last=in;//запоминаем изменённое значение входной величины
}
else
{
//ничего не делаем
}


*************************************************************************************************
Теперь выясняется что при перезапуске сервера - протокол уходит в "космос" (не сохраняется в БД). Возникает вопрос...как организовать запись протокола сообщений в БД с последующим отображением? Существующее решение с вызовом функции .alarmSet, как я догадываюсь - пишет поток сообщений в массив в оперативной памяти. Или теперь в шаблоны прописывать "костыли" прикручивающие записи в БД? Прошу подсказать направление поиска... Также прошу эту тему убрать из запроса функций и услуг, и переименовать в "обработка алармов и сообщений" и переместить в "Разработку" для правильности...
Вложенный файл

2012-11-21_184755.png (Тип файла: image/png, Размер: 93.92 килобайт) — 973 загрузок
Сообщение создано: 21. 11. 2012 [13:20]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"pentagon128" wrote:

Теперь выясняется что при перезапуске сервера - протокол уходит в "космос" (не сохраняется в БД). Возникает вопрос...как организовать запись протокола сообщений в БД с последующим отображением? Существующее решение с вызовом функции .alarmSet, как я догадываюсь - пишет поток сообщений в массив в оперативной памяти. Или теперь в шаблоны прописывать "костыли" прикручивающие записи в БД? Прошу подсказать направление поиска...

Если внимательно почитать про функцию .alarmSet() то будет видно, что при установке нарушения (level<0) оно фиксируется в буфере активных нарушений, а так-же помещаются в буфер сообщений. Снятие нарушения (level >=0) соответственно убирает его из буфера активных нарушений и опять-же помещает в буфер сообщений. Соответственно нужно сохранять буфер сообщений чем занимается архиватор сообщений, который и настраивайте: http://wiki.oscada.org/Doc/OpisanieProgrammy#h827-7

Learn, learn and learn better than work, work and work.
Сообщение создано: 21. 11. 2012 [15:52]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
Это я пробовал несколько раз, не работает, и подраздел "Архивы" документации перечитывал несколько раз. В документации работа с архивами значений освещена хорошо и всё работает нормально, а вот настройка и подключение архивов сообщений неосвещена. И в тестовых двух проектах бойлера и ALKGS в одном из проектов подключена недоступная MYSQL база. Т.е. демо проекты не реализуют запись сообщений в линкуемую БД. Пробовал пошагово как написано в документации подраздел "Архивы". Снял копии экранов (прилагаю) http://rghost.ru/41715382 . У меня в проекте подключена SQLite БД ARH.db в неё пишу архиваторами 1s_data и 10s_data значения переменных. Создаю 1s_message архиватор сообщений. На экранах видно - что сообщения промелькивают в буфере (оперативная память) - но архиватор их не записывает в БД , видно по пустым записям и дате последней записи 1970 года. Опыт работы с БД имею большой, приходилось работать и с БД MySQL и SQL SERVER администрировать. Гдето-косяк. Таблицы БД просмотрел, таблицы с записями нет. И имя я её не знаю (таблица которая должна быть создана под сообщения). Просьба расписать пример подключения 1s_message к БД SQLite например, аналогично 1s_data пошагово. На каком то шаге - сбой получается. На каком - непонятно.

[Сообщение редактировалось 1 раз(а), в последний раз 21.11.2012 в 15:57.]
Сообщение создано: 21. 11. 2012 [16:21]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
Удалось разобраться. В настройках 1s_message в поле "Категория сообщений" нужно указать *
Сообщение создано: 21. 11. 2012 [16:27]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"pentagon128" wrote:

Это я пробовал несколько раз, не работает, и подраздел "Архивы" документации перечитывал несколько раз. В документации работа с архивами значений освещена хорошо и всё работает нормально, а вот настройка и подключение архивов сообщений неосвещена. И в тестовых двух проектах бойлера и ALKGS в одном из проектов подключена недоступная MYSQL база. Т.е. демо проекты не реализуют запись сообщений в линкуемую БД.

Вот беру этот самый архиватор (sub_Archive/mod_DBArch/mess_test), меняю БД на "SQLite.exp" (предварительно SQLite.exp включил), включаю и данные сразу туда пошли. Смотрю в БД "SQLite.exp", а там появилась таблица с сообщениями архиватора "test" DBAMsg_test, какие тут ещё примеры нужны?

"pentagon128" wrote:

Создаю 1s_message архиватор сообщений.

Зачем "1s" в префиксе?

"pentagon128" wrote:

На экранах видно - что сообщения промелькивают в буфере (оперативная память) - но архиватор их не записывает в БД , видно по пустым записям и дате последней записи 1970 года.

У меня всё записывает.

Learn, learn and learn better than work, work and work.
Сообщение создано: 21. 11. 2012 [16:40]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
Спасибо большое Роман за помощь и поддержку! :D Всё заработало как надо! Пазл сложился. 1s в прёфиксе это так...традиция Венгерской системы именования переменых, иногда пользуюсь.
Сообщение создано: 21. 11. 2012 [17:41]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"pentagon128" wrote:

Спасибо большое Роман за помощь и поддержку! :D Всё заработало как надо! Пазл сложился. 1s в прёфиксе это так...традиция Венгерской системы именования переменых, иногда пользуюсь.

Пожалуйста!
Только именование объектов OpenSCADA с цифры может вылезти боком если захочется адресоваться к нему из скрипта, хотя обход этому есть, но непонятки могут возникнуть.
И шаблон отбора сообщений для архиватора нарушений лучше не ставить в "*", а несколько конкретизировать типа "al*", что-бы исключить "завал" архива ненужными сообщениями и замедление доступа к нему.

Learn, learn and learn better than work, work and work.
Сообщение создано: 22. 11. 2012 [14:11]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
"roman" wrote:

Пожалуйста!
Только именование объектов OpenSCADA с цифры может вылезти боком если захочется адресоваться к нему из скрипта, хотя обход этому есть, но непонятки могут возникнуть.
И шаблон отбора сообщений для архиватора нарушений лучше не ставить в "*", а несколько конкретизировать типа "al*", что-бы исключить "завал" архива ненужными сообщениями и замедление доступа к нему.


Спасибо за информацию! С проблемой адресации объектов из скриптов я уже сталкивался, поэтому объекты визуализации именую так id_по_умолчанию_моё_описание_тега_или_виджета естественно на английском (1s_message - конечно исключение). Исходя из заполняемости архивов сделал расчёт и ограничил текстовый архив 10 сутками, архив значений 3-мя сутками. Учитывая что вещественных будут писаться всего 4 сигнала (на 1-м этапе внедрения проекта подключено 4 датчика газоанализатора) получается 7 Мб в сутки, 21 Мб за трое суток. Это немного. На диске свободно 424 мБ. Процессор АРМ-а оператора AthlonXP1700+ справляется. На виртуальной машине и на физической всё гоняется нормально. Как положено проведены комплексные испытания на площадке поставщика/изготовителя (наша площадка), оформлен акт, шкаф с контроллером и датчики отправлены Заказчику. Как пусконаладку сделаю, проведём приёмосдаточные испытания со сдачей в опытную а затем в промышленную эксплуатацию, статью по внедрению планирую написать обязательно :D.

[Сообщение редактировалось 1 раз(а), в последний раз 22.11.2012 в 14:14.]
Сообщение создано: 26. 11. 2012 [08:44]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"pentagon128" wrote:

Как пусконаладку сделаю, проведём приёмосдаточные испытания со сдачей в опытную а затем в промышленную эксплуатацию, статью по внедрению планирую написать обязательно :D.

OK, ждём.

Learn, learn and learn better than work, work and work.
Сообщение создано: 29. 11. 2012 [08:18]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
Появились вопросы озвучивания события. Относится к теме алармов.

На странице мнемосхемы размещаю виджет кнопку id=FormEl_button и виджет отображения аналогового значения id=anShow1, текстовый виджет надпись id=Text1
Далее в обработчике событий страницы на вкладке обработка размещаю код:
JAVASCRIPT
using Special.FLibSYS;
 
//> Events process
ev_cur = ev_rez = "";
off=0;
while(true)
{
  ev_cur = strParse(event,0,"\n",off);
  if(ev_cur == "") break;
  else if(ev_cur == "ws_BtPress:/FormEl_button")
{
Text1.text="123";
anShow1.alarm="0|Open Scada|звонок|0x04|alarm";
}
}
event = ev_rez;


если использовать атрибуты и размещать их вместо кода:
JAVASCRIPT
Text1.text="123";
anShow1.alarm="0|Open Scada|звонок|0x04|alarm";


то аналогичный код на другой страницы работает и атрибуты меняет. А вышеприведённый код не работает. И текст не меняет и звука нет. Атрибуту text выставлена галочка "обрабатывать"
Согласно UI.VCAEngine.pdf стр. 17 виджеты имеют текстовый атрибут alarm. Примеров доступных нет. Тестовые доступные примеры - генерация звука отсутствует.
в БД проекта в ресурсы id=alarm подключил wav файл alarm.wav со звуком гудка. В консоли (терминале) Linux Suse команда sox-a:
play -q alarm.wav работает без проблем.

Прошу помочь:
1. Как грамотно достучаться до свойств (атрибутов) виджетов из кода обработчика событий родительской формы (мнемосхемы).
2. Не хватает рабочего примерчика установки свойства (атрибута) alarm виджета с проигрыванием банального wav файла, по нажатию кнопки например.
3. Или как альтернатива, на уровне Сбор данных\модуль\логический уровень\контроллер\параметр
можно использовать шаблон генерирующий вызов внешней команды sox-a play с указанием файла в одну строку. Только синтаксис и функция неизвестны мне. Api Open Scada просмотрел, возможность вызов команды оболочки интерпритатора командной строки Linux не нашёл.

Open Scada использую v0.8.0LTS версия 4

Тему звукового сопровождения событий http://oscada.org/ru/forum/posts//zvukovoe_soprovozhdenie_sobytii//2/
читал. Вопрос до конца не освещён. Считаю освещённым вопрос только тогда - когда в конце темы приложен рабочий пример или кусок кода.



6591