Доброго дня!
Передо мной стоит задача сделать силами панели Weintek звуковое оповещение при появлении нового события - отказа оборудования - т.е. при появлении нового флага события включить звук и открыть всплывающее окно для квитирования и выключения звуковой сигнализации.
Не использую "журнал событий (аварий)" и его визуальные элементы - т.к. они показывают только события за текущие сутки и при помощи макросов можно листать посуточно - т.е. я не разобрался, как в них показывать список последних 10 событий независимо от их даты.
И хотелось бы квитировать не по одному сообщению, а всю активную группу.
Из контроллера получаю битовую маску отказов (wAlarm_current), в локальных переменных LW определил переменную со значением маски на предыдущем цикле обработки (wAlarm_previous). Так же определил локальную переменную LB (bNoAcknowlege) по взведению которой открывается всплывающее окно для квитирования.
Делаю макрос с периодом вызова 1000 мс (макрос пока не закончен - это черновой вариант с синтаксическими ошибками)
И появляются вопросы:Код:// получение флага добавления сигнала неисправности // формирование прерывистых звуковых сигналов macro_command main() bool new_alarm // флаг появления нового сигнала неисправности bool no_acknowlege // флаг отсутствия квитирования сигнала неисправности unsigned short alarms_current // текущее состояние регистра флагов неисправностей unsigned short alarms_previous // предыдущее состояние регистра флагов неисправностей // получение актуальных данных из ПЛК и глобальных переменных GetData(alarms_current, "PLC", "wAlarm_current", 1) GetData(alarms_previous, "Local_HMI", "wAlarm_previous", 1) GetData(no_acknowlege, "Local_HMI", "bNoAcknowlege", 1) // если добавился новый флаг - установить флаг отсутствия квитирования new_alarm = ((alarms_current & (~alarms_previous)) > 0) if new_alarm then no_acknowlege = 1 end if // если нет квитирования - сформировать звуковую сигнализацию if no_acknowlege then Beep() end if // сохранить состояние в глобальных переменных SetData(no_acknowlege, "Local_HMI", "bNoAcknowlege", 1) // выставление флага отсутствия квитирования SetData(alarms_current, "Local_HMI", "wAlarm_previous", 1) // сохранение текущего регистра флагов неисправности end macro_command
1. Функция GetData/GetDataEx немедленно начинает опрос контроллера по Modbus со всеми недостатками опроса (продолжительность, зависание при обрыве связи). Как избежать лишнего опроса (ведь тег регистра флагов wAlarm_current и так описан в списке тегов и опрашивается)?
2. Если лишнего опроса не избежать, то как наилучшим образом обрабатывать это чтение GetData/GetDataEx, чтобы избежать зависаний внутри макроса и уменьшить время его выполнения?
3. Может быть есть другой способ формирования звуковой сигнализации с открытием всплывающего окна для квитирования всей активной группы событий?




Ответить с цитированием