Управление устройствами через битовую маску
Всех приветствую.
Проблема с управлением устройств через битовую маску. Что-то делаю не так и не пойму что.
Есть два параметра - входной и выходной параметры SYSTEM_WORD_PARAM.
Допустим, что на входе 16 состояний работы устройств и на выходе 16 команд управления, то есть WORD = 2 байта = 16 битов.
По входным состояниям битов вопросов нет - я их "распаковываю" через ST.
А вот по выходным параметрам что-то неправильно выстраиваю.
Значит на экран добавил 16 кнопок нефиксируемых (вкл/откл). Поставил галку на "использовать входящую связь только для отображения". Привязал входной бит состояния.
На событие нажатия этой кнопки привязал выдачу импульса на 500ms и все кнопки проходит через этот алгоритм, но при нажатии иногда вроде бы работает нормально, а иногда не работает:
Код:
VAR
firstScan: BOOL := TRUE;
systemInitialized: BOOL := FALSE;
initCounter: INT := 0; // Счетчик для задержки инициализации
prevState_0: BOOL := FALSE;
.
.
.
prevState_15: BOOL := FALSE;
END_VAR
VAR_TEMP
needUpdate: BOOL;
END_VAR
// Основной алгоритм
needUpdate := FALSE;
tempWord.Value := inputWord.Value;
tempWord.SourceTime := inputWord.SourceTime;
tempWord.StatusCode := inputWord.StatusCode;
// Бит 0
IF (state_0.Value = TRUE) AND (prevState_0 = FALSE) THEN
tempWord.Value.0 := NOT inputWord.Value.0;
needUpdate := TRUE;
END_IF;
prevState_0 := state_0.Value;
.
.
.
// Бит 15
IF (state_15.Value = TRUE) AND (prevState_15 = FALSE) THEN
tempWord.Value.15 := NOT inputWord.Value.15;
needUpdate := TRUE;
END_IF;
prevState_15 := state_15.Value;
// Записываем результат только если были изменения
IF needUpdate THEN
outputWord.Value := tempWord.Value;
outputWord.SourceTime := tempWord.SourceTime;
outputWord.StatusCode := tempWord.StatusCode;
END_IF;
// Отложенная инициализация после полной загрузки системы
IF firstScan THEN
initCounter := initCounter + 1;
// Ждем несколько циклов (например, 3) для полной инициализации
IF initCounter >= 3 THEN
// Проверяем, что inputWord содержит актуальные данные
IF inputWord.Value <> 0 OR inputWord.StatusCode <> 0 THEN
outputWord.Value := inputWord.Value;
outputWord.SourceTime := inputWord.SourceTime;
outputWord.StatusCode := inputWord.StatusCode;
systemInitialized := TRUE;
firstScan := FALSE;
END_IF;
END_IF;
END_IF;
Что я делаю не так, подскажите как правильно должна быть выстроена структура и алгоритм.