Добрый день.
На мой взгляд, описанная в первом посте проблема имеет следующую причину: переменная PLC_PRG.clk_btn_2 привязана к свойству кнопки Нажатие.
Т.е. эта переменная имеет значение TRUE, пока кнопка нажата. С учетом человеческой скорости реакции - даже однократное "быстрое" нажатие фиксирует кнопку как минимум на 100 мс.
За это время успевает пройти 10 циклов MainTask.
В первом из них всё нормально, но при этом выполняются строки:
Код:
IF clk_btn_2 THEN
...
num_sel_13 := 0;
...
num_sel_12 := 0;
...
num_sel_18 := 0;
END_IF
И из-за этого во втором цикле при попадании в этот IF происходит:
Код:
app_13[0] := TRUE;
app_12[0] := TRUE;
app_18[0] := TRUE;
Но эти массивы нумеруются с 1, и при обращении к элементу с индексом 0 происходит "порча" памяти:
Код:
// Порядок объявления массивов: app18, app12, app13
app_13[0] := TRUE; // фактически записываем TRUE в app_12[2]
app_12[0] := TRUE; // фактически записываем TRUE в app_18[8]
app_18[0] := TRUE; // что-то еще перезаписываем, но сейчас это не так интересно
Т.к. app_18[8] и app_12[2] становятся в TRUE, то соответствующие inact_18[8] и inact_12[2] тоже устанавливаются в TRUE.
Этим и объясняется наблюдаемая картина.
Устранить проблему достаточно просто - нужно clk_btn_2 пропустить через детектор фронта (R_TRIG или F_TRIG), и уже по срабатыванию его выхода однократно исполнять рассмотренный IF.
P.S. - еще есть проблема в этом фрагменте:
Код:
IF flag_13[num_sel_13] AND flag_18[num_sel_18] AND flag_12[num_sel_12] THEN
btn_2 := TRUE;
ELSE
btn_2 := FALSE;
END_IF
Он выполняется вне каких-либо условий каждый цикл ПЛК, но при этом в момент запуска приложения и вплоть до начала манипуляций в визуализации переменные num_sel_13, num_sel_18 и num_sel_12 имеют значение 0 - а flag-массивы нумеруются с 1.
P.P.S. - весь код можно существенно упростить, отказавшись от большинства (если не всех) циклов.