Цитата Сообщение от KAPITOSHKARU Посмотреть сообщение
при активности данного экрана включаем триггеры опросов тех переменных которые опрашиваются по триггерам.
При не активности триггеры выключаем.
Я это делаю без информации об активном экране/фрейме. Все обращения к регистрам слейва обёрнуты в функцию read_reg(). В этой функции формируется список переменных, которые нужно запросить у слейва (или у слейвов). В отдельной задаче, которая выполняет обмен со слейвами, данный списк используется по назначению.

// Регистр шины MODBUS.
TYPE mb_reg :
STRUCT
vis: WORD; // Значение для визуализации; новые значения
// (те, которые вводит оператор) заносятся сюда же.
save: WORD; // полученное от слейва значение
END_STRUCT
END_TYPE
// Путём сравнения полей vis и save (в функции find_changed_val) будем определять
// изменние значения в регистре MODBUS для последующей передачи его слейву.
Список требуемых регистров слейва:
VAR_GLOBAL CONSTANT
ring_size: WORD := 100;
END_VAR

VAR_GLOBAL
arr: ARRAY [0..ring_size-1] OF WORD;
head_idx: WORD := 0;
tail_idx: WORD := 0;
END_VAR
FUNCTION ring_isIn : BOOL
VAR_INPUT
val: WORD;
END_VAR
VAR
test_idx: WORD;
ret_val: BOOL;
END_VAR

test_idx := ring.head_idx;
ret_val := FALSE;

WHILE ( NOT ret_val AND (test_idx <> ring.tail_idx) ) DO
IF ( ring.arr[test_idx] = val ) THEN
ret_val := TRUE;
ELSE
// test_idx := next_idx( test_idx );
IF ( test_idx = ring_size - 1 ) THEN //test_idx := next_idx( test_idx );
test_idx := 0;
ELSE
test_idx := test_idx + 1;
END_IF
END_IF
END_WHILE

ring_isIn := ret_val;
FUNCTION read_reg : word
VAR_INPUT
idx: WORD;
END_VAR

IF ( NOT ring_isIn(idx) ) THEN
ring_put( idx );
END_IF

read_reg := mb.regs[idx].vis;
При формировании телеграмм для слейва индексы регистров забираю из кольца во временный буфер и запрашиваю те регистры, индексы которых оказались в буфере. После опроса всех таких регистров цикл повторяю.

В высоконагруженной системе это будет не лучшее решение, но у меня СПК используется только как панелька, поэтому такое решение меня устраивает.

Илья