[Weintek] Сформировать звуковую сигнализацию на события в ПЛК
Доброго дня!
Передо мной стоит задача сделать силами панели 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. Может быть есть другой способ формирования звуковой сигнализации с открытием всплывающего окна для квитирования всей активной группы событий?