Обработка алармов и сообщений
Автор |
Повідомлення |
Повідомлення створено: 29. 11. 2012 [09:38]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"pentagon128" wrote:
...
anShow1.alarm="0|Open Scada|звонок|0x04|alarm";
...
Я Вам уже ранее говорил, что такая запись атрибута не корректна в принципе!
"pentagon128" wrote:
1. Как грамотно достучаться до свойств (атрибутов) виджетов из кода обработчика событий родительской формы (мнемосхемы).
Читаем документацию: http://wiki.oscada.org/Doc/VCAEngine#h668-12 , опять.
"pentagon128" wrote:
2. Не хватает рабочего примерчика установки свойства (атрибута) alarm виджета с проигрыванием банального wav файла, по нажатию кнопки например.
Почти ничем не отличается от синтеза речи, что есть в БыстромСтарте и ДемоБД.
"pentagon128" wrote:
3. Или как альтернатива, на уровне Сбор данных\модуль\логический уровень\контроллер\параметр
можно использовать шаблон генерирующий вызов внешней команды sox-a play с указанием файла в одну строку. Только синтаксис и функция неизвестны мне. Api Open Scada просмотрел, возможность вызов команды оболочки интерпритатора командной строки Linux не нашёл.
Документацию по прежнему не читаем и даже гуглить не пытаемся: http://wiki.oscada.org/Doc/OpisanieProgrammy#h920-6
От того, что Вы так считаете ничего не изменится если делать сами ничего не будете.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 29. 11. 2012 [16:31]
|
pentagon128
Руслан Кучерявый
Автор теми
Зареєстрован(а) с: 15.11.2011
Повідомлення: 102
|
"roman" wrote:
Я Вам уже ранее говорил, что такая запись атрибута не корректна в принципе!
Знаю. Пример искал примера ненаходил.
Спасибо за ссылку!
Перечитал.
Вижу только использование "3.10.1. API пользовательского программирования"
Судя по примеру
//Добавить новый виджет на основе виджета текстового примитива
nw = this.wdgAdd("nw", "Новый виджет", "/wlb_originals/wdg_Text");
nw.attrSet("geomX", 50).attrSet("geomY", 50);
доступ к атрибутам виджетов возможен через вызов метода attrSet который в свою очередь должен быть прописан в коде конструктора объекта виджета (в исходниках)
При этом в режиме исполнения может ли оказаться что экземпляр объекта напрямую будет недоступен и надо перебирать коллекцию объектов или получать ссылку вызовом функции string? Буду проверять. Примера то нет. Пример выше является вызовом конструктора
виджета nw используя метод wdgAdd объекта this
*******************************************
"roman" wrote:
"pentagon128" wrote:
1. Как грамотно достучаться до свойств (атрибутов) виджетов из кода обработчика событий родительской формы (мнемосхемы).
Читаем документацию: http://wiki.oscada.org/Doc/VCAEngine#h668-12
Вижу только использование "3.10.1. API пользовательского программирования"
нужно ли в режиме исполнения получать ссылку на виджет используя вызов:
string link(string attr, bool prm = false)
или будет работать прямая ссылка вызовом метода виджета attrSet?
И синтаксис вызова attrSet мне непонятен. Т.е. пишем в коде Java
id_виджета.attrSet("имя атрибута", значение)
-где id_виджета это индетификатор виджета string;
-"имя атрибута", значение видно из примера выше
или в начале получать ссылку через string link(string attr, bool prm = false)
В Visual Studio Net например во время исполнения получать ссылку на вложенный экземпляр класса, тем более динамический создаваемый внутри другого класса приходиться перебором коллекции объектов, прямая ссылка по имени недопустима. Синтаксис в MSDN расписан очень хорошо и примеров масса...Но что говорить...фирма то немаленькая Microsoft и человеческого ресурса много....
Т.е. примера нехватает...элементарного, многие спасибо скажут.
"roman" wrote:
Почти ничем не отличается от синтеза речи, что есть в БыстромСтарте и ДемоБД.
Перечитывал. Многие с этого сайта не могут запустить синтез речи в Open Scada. Это сложнее, и на мой взгляд лишнее. Я например упёрся в то - что нет под Open Suse доступного RPM пакета установки ru_tts. Те пакеты которые брал с ALT Linux имеют множественные зависимости (требуют другие пакеты), разрешить конфликты не получилось. Вижу выход - собрать RPM самому из исходников ru_tts но пока руки недошли. В этом плане пример с проигрыванием банального wav файла по нажатию кнопки намного легче и ценнее. Оператору -
гораздо приятнее слышать живой звук, например приятный женский :). На Visual Studio Net мне одной строчки кода достаточно для этого. На Trace Mode Adastra сделала тайну великую из озвучки, пользователи голову ломают на форуме, пример не выкладывают, дали только после письма...с 3-й попытки...в общем эта фирма оправдывает название Ad.....
Читаем и пытаемся...Спасибо за ссылку - буду пробовать...Как оказалось я искал в справочной документации PDF по файлу APIOpenSCADA.pdf Указанная информация там по данной функции API отсутствует, а тут где вы указали 5. Общесистемное API пользовательского программирования(аналог openscada.pdf) Действительно есть...как то раскидано получается по разным документам поэтому и не нашёл...
5.2. Система (SYS)
Функции объекта:
string system( string cmd, bool noPipe = false); — осуществляет вызов консольных команд <cmd> ОС
"roman" wrote:
От того, что Вы так считаете ничего не изменится если делать сами ничего не будете.
Это я знаю. По другому называется - информация прокрученная через опыт становиться знанием, и уходит в душу очками (баллами). Ради этого и живём. Другое дело - маленький рабочий практический пример из 1-й двух строчек кода от разработчика бывает ценнее чем пространные беседы о непонимании или непрочтении. Можно ведь упереться в элементарную ошибку синтаксиса Java (отладчика то нет) - и торчать на месте. Код получается рабочий с n-цатой попытки. Право на ошибку имеют все - это один из законов вселенной.
|
Повідомлення створено: 29. 11. 2012 [18:45]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"pentagon128" wrote:
"roman" wrote:
Я Вам уже ранее говорил, что такая запись атрибута не корректна в принципе!
Знаю. Пример искал примера ненаходил.
Спасибо за ссылку!
Перечитал.
Вижу только использование "3.10.1. API пользовательского программирования"
Совсем у Вас плохо со чтением получается:
Если в колонке "Обработка" стоит true, то в вычислительной процедуре становится доступной переменная {идентификатор виджета}_{идентификатор строки}, например cw_value.
"pentagon128" wrote:
доступ к атрибутам виджетов возможен через вызов метода attrSet который в свою очередь должен быть прописан в коде конструктора объекта виджета (в исходниках)
При этом в режиме исполнения может ли оказаться что экземпляр объекта напрямую будет недоступен и надо перебирать коллекцию объектов или получать ссылку вызовом функции string? Буду проверять. Примера то нет. Пример выше является вызовом конструктора
виджета nw используя метод wdgAdd объекта this
Какие ещё конструкторы! Объект "this" доступен в СВУ, т.е. в виджетах, всегда, примеров, в ДемоБД опять не смотрим!
Что в API Вам не понятно для меня вообще загадка:
Объект "Виджет" (this)
TCntrNodeObj ownerSess( ) — получить объект сеанса данного виджета.
TCntrNodeObj ownerPage( ) — получить объект родительской страницы данного виджета.
TCntrNodeObj ownerWdg(bool base = false) — получить родительский виджет данного виджета. При указании <base> будет возвращены и объекты страниц.
TCntrNodeObj wdgAdd(string wid, string wname, string parent) — добавление виджета <wid> с именем <wname> на основе библиотечного виджета <parent>.
//Добавить новый виджет на основе виджета текстового примитива
nw = this.wdgAdd("nw", "Новый виджет", "/wlb_originals/wdg_Text");
nw.attrSet("geomX", 50).attrSet("geomY", 50);
Всё остальное ни о чём, пропускаю.
Кроме того напоминаю, что Вы используете открытый проект, где Вам никто ничего не должен, а документация пишется из соображения разумной достаточности, в виду ограниченности ресурсов, и без вознаграджения за работу! И не нужно тут в пример приводить никоим боком не имеющие отношения к предмету фреймворки. Если считаете, что напишите документацию лучше, то пишите, а потом мы ешё посмотрим пройдёт ли она вообще через мои требования и критерии.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 29. 11. 2012 [20:22]
|
pentagon128
Руслан Кучерявый
Автор теми
Зареєстрован(а) с: 15.11.2011
Повідомлення: 102
|
"roman" wrote:
Совсем у Вас плохо со чтением получается:
Если в колонке "Обработка" стоит true, то в вычислительной процедуре становится доступной переменная {идентификатор виджета}_{идентификатор строки}, например cw_value.
Спасибо! Буду пробовать ещё. API ведь обычно используется для внешнего кода и библиотек, а нужно делать во внутреннем коде системы. До этого пробовал...не прокатывало. Разделитель ставил знак подчёркивания _ (что считаю некорректно и вносит путаницу в код). Обычно точка . применяется. а знак _ заменяет пробел. И флаг исполнения ставил...не работало. Буду гонять опять. Демо примеры смотрел. Там в окнах свойств мнемосхем поле обработка почти везде пустое и ссылок на свойства (атрибуты) вложенных виджетов не видел (что конечно не означает что их нет по иерархии виджетов вниз).
"roman" wrote:
Какие ещё конструкторы! Объект "this" доступен в СВУ, т.е. в виджетах, всегда, примеров, в ДемоБД опять не смотрим!
Конструктором объекта называется код создающий объект. Есть несколько видов конструкторов, в Net например и нетолько в NET, в любых продвинутых языках программирования. Это логическая конструкция не привязанная к конкретному языку программирования, что в Си что в VB код схож и понятен (те языки с которыми я работал). Далее потом на этот созданный экземпляр объекта надо правильно ссылаться (от одного объекта можно наследовать целую кучу объектов - коллекцию). Т.е. синтаксис важен. ДемоБД на предмет использования this ещё несмотрел. Планирую завтра.
"roman" wrote:
Что в API Вам не понятно для меня вообще загадка:
Логика функций понятна. Непонятно как ссылаться на экземпляр создаваемого объекта в коде на Java, т.е. синтаксис. С этим я думаю со временем разберусь. Просто неудобно работать с языком программирования где нет отладчика и невидно - зацепилась ли символьная ссылка на объект. Поясню подробнее....в Visual Studio например, за подобным блоком кода просто ставил точку прерывания, потом при исполнении и останове в точке прерывания в дереве объектов находил нужный объект класса и видно сразу - произошло связывание объектов (ссылки на объект виджета грубо говоря) или нет. Там еще модель усложняется....раннее или позднее связывание, ньюансы всякие. Тут в JavaCalc у меня такой возможности нет вообще. Отсюда проблемы.
"roman" wrote:
Всё остальное ни о чём, пропускаю.
Кроме того напоминаю, что Вы используете открытый проект, где Вам никто ничего не должен, а документация пишется из соображения понятности самим разработчикам, которые однако пишут её для Вас не получая за это вознаграджения! И не нужно тут в пример приводит никоим боком не имеющие отношения к предмету фреймворки. Если считаете, что напишите документацию лучше, то пишите, а потом мы ешё посмотрим пройдёт ли она вообще через мои требования и критерии.
Это в уме держу постоянно и стараюсь ценить Ваше время. До уровня написания техдокументации по Open Scada ещё надо дорости. Заметьте - тему молча просмотрело 274 человека. И что - у всех реализована звуковая сигнализация? Сомневаюсь. Потому что вопросы похожие в 2-х 3-х темах поднимались...одинаковые частично кто-то что то решил...дошёл...молодец. Документацию нужно всегда разбавлять практическим кодом. Сухая документация будет сложна для понимания большинством - по части синтаксиса. Люди то разные, понимают немного по разному. Обратная сторона медали отсутствия кратких примеров - рост элементарных вопросов в форум, которых бы небыло если бы примеры были. Мне например стало понятно только сейчас как более менее правильно реализовать звук при событиях в Open Scada. А опыт программирования имеется хороший. По Модбасу например я ни одного вопроса не задал, потому что тема там большая и примеров много. При этом повторюсь - считаю все эти все существующие варианты реализации сигнализации - костыли, инкапсуляция если и есть - то только у разработчика в голове и тех кто в теме, а по факту всё размазано. Лучше будет сделать единый модуль контроллера сигнализации (в терминах Open Scada) а не размазывать обработку сигнализации и событий по всему проекту (шаблоны и контроллеры логического уровня, виджеты). Понятно что это переделка концепции и нежелательна для разработчика, а вот простые пользователи могут только спасибо сказать, т.е. имеется определённый конфликт интересов. Моя позиция ближе к разработчику, т.к. простым пользователем не являюсь. Тут действительно есть варианты. Или заказываю услугу (вернее контора где я тружусь) или буду изучать исходники в QT_v4_7_4 на данный предмет когда руки дойдут. Техзадание на эту работу составить тоже могу. Пока острой необходимости нет ибо полноценная сигнализация в существующих проектах реализована на уровне железа (контроллера TREI-5B-05) и скада играет второстепенную роль.
P.S. Роман, ещё раз Спасибо за поддержку! Куда копать дальше теперь ясно.
|
Повідомлення створено: 30. 11. 2012 [18:07]
|
pentagon128
Руслан Кучерявый
Автор теми
Зареєстрован(а) с: 15.11.2011
Повідомлення: 102
|
Прикладываю рабочий пример регистрации событий в БД изменения дискретных тегов и контроля вещественных Float32 тегов по границам. Теги опрашиваются по Modbus с контроллера. При получении соответствующего тега с логикой="неисправность есть" производиться однократное проигрывание соответствующего wav файла (звуковые файлы надо готовить самостоятельно и ложить в соответствующюю папку) и запись сообщения в БД. Виджеты никакие не задействованы. В визуализаторе используя виджет документа доступен просмотр записей в БД. Пока всё...сделано на скорую руку...
Качать отсюда:
http://rghost.ru/41913981
[Повідомлення редагувалось 4 раз(ів), останній раз 02.12.2012 в 06:10.]
|
Повідомлення створено: 19. 05. 2014 [12:02]
|
irplanet
Евгений Калмыков
Зареєстрован(а) с: 26.04.2013
Повідомлення: 16
|
Похожая ситуация.
Регистрирую текущую аварию: SYS.message("pvaNoConnKontar",-6, vAdrKot+ "Нет связи с контроллером Контар");
Всё нормально, в архивах она появляется, а протоколе тоже. Но после перезапуска скады, из протокола пропадает. В архиве сообщений она числится. Получается, с отрицательным значением, признаком текущей аварии, не сохранить?
И заодно спрошу, можно сквитировать отдельную аварию из виджета "протокол"? Протокол можно раскрашивать в разные цвета построчно?
|
Повідомлення створено: 19. 05. 2014 [12:58]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"irplanet" wrote:
Похожая ситуация.
На что похожая?
"irplanet" wrote:
Регистрирую текущую аварию: SYS.message("pvaNoConnKontar",-6, vAdrKot+ "Нет связи с контроллером Контар");
Всё нормально, в архивах она появляется, а протоколе тоже. Но после перезапуска скады, из протокола пропадает.
В архиве сообщений она числится. Получается, с отрицательным значением, признаком текущей аварии, не сохранить?
Чего должна? Протокол (отрицательный уровень) это текущие нарушения из таблицы нарушений, а не из архива. Следовательно если нет значит не поставили при загрузке.
"irplanet" wrote:
И заодно спрошу, можно сквитировать отдельную аварию из виджета "протокол"?
Исходно сам протокол ничего не квитирует, как и не генерирует. Однако если в контекстном меню добавить нужные пункты и обработать их то можно, хотя тут ещё смотря что Вы себе имеете в виду под квитированием.
"irplanet" wrote:
Протокол можно раскрашивать в разные цвета построчно?
Только согласно свойств сообщения.
Произвольно это уже примитив "Документ" или вид "Таблица" примитива "Элемент формы".
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 19. 05. 2014 [13:09]
|
irplanet
Евгений Калмыков
Зареєстрован(а) с: 26.04.2013
Повідомлення: 16
|
Протокол (отрицательный уровень) это текущие нарушения из таблицы нарушений, а не из архива. Следовательно если нет значит не поставили при загрузке.
Да, я понимаю. После перезапуска скады текущие нарушения из таблицы нарушений, которые отображаются в протоколе, пропадают. Как их сохранять? Или надо заново генерировать?
|
Повідомлення створено: 19. 05. 2014 [13:35]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"irplanet" wrote:
Протокол (отрицательный уровень) это текущие нарушения из таблицы нарушений, а не из архива. Следовательно если нет значит не поставили при загрузке.
Да, я понимаю. После перезапуска скады текущие нарушения из таблицы нарушений, которые отображаются в протоколе, пропадают. Как их сохранять? Или надо заново генерировать?
Не понимаете!
Алармы не сохраняются, они динамичны и отражают текущее состояние системы, а значит если после запуска система не установила алармов исходя из значений параметров и текущего состояния оборудования то их нет.
P.S. Однако если они очищаются сами (реально там уровень инвертируется) при работе то это досадная ошибка, которую только что обнаружил.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 19. 05. 2014 [13:52]
|
irplanet
Евгений Калмыков
Зареєстрован(а) с: 26.04.2013
Повідомлення: 16
|
В библиотеке шаблонов есть атрибут аварии pvaNoConnKontar и признак того, что авария уже приходила OpvaNoConnKontar.
if ((OpvaNoConnKontar=="0")&(pvaNoConnKontar=="1")) {OpvaNoConnKontar="1"; this.nodePrev().alarmSet((this.nodePrev().name()) + ": Нет связи с контроллером Контар", -7, SHIFR);};
if ((OpvaNoConnKontar=="1")&(pvaNoConnKontar=="0")) {OpvaNoConnKontar="0"; this.nodePrev().alarmSet((this.nodePrev().name()) + ": Ушла авария: Нет связи с контроллером Контар", 1, SHIFR);};
Если авария есть, появляется запись в протоколе. Но после перезапуска скады протокол чист. Ведь скада считает что и авария есть, и раньше была. И условия не срабатывают. Но и постоянно фиксировать эту аварию (OpvaNoConnKontar=="1")&(pvaNoConnKontar=="1") тоже не вариант. Подскажите, как лучше сделать в данной ситуации. Спасибо.
|
|
|