Всех приветствую.

Проблема с управлением устройств через битовую маску. Что-то делаю не так и не пойму что.

Есть два параметра - входной и выходной параметры 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;
Что я делаю не так, подскажите как правильно должна быть выстроена структура и алгоритм.