Доброго дня!

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