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


Ответить с цитированием
