Вместо всего этого...
Код:
IF i <= Limit_Reg THEN
i := LIMIT(0, i + REAL_TO_INT(TIME_TO_REAL(TIME() - PrevScanTimestamp) * Speed_Reg * (BOOL_TO_REAL(btn_up) - BOOL_TO_REAL(btn_dn))), Limit_Reg);
AO7 := ARR[i];
ELSIF (i=0 AND btn_dn) THEN
AO7 := ARR[0];
ELSE
AO7 := ARR[i];
END_IF
PrevScanTimestamp := TIME();
Надо писать так:
Код:
i := LIMIT(0, i + REAL_TO_INT(TIME_TO_REAL(TIME() - PrevScanTimestamp) * Speed_Reg * (BOOL_TO_REAL(btn_up) - BOOL_TO_REAL(btn_dn))), Limit_Reg);
AO7 := ARR[i];
PrevScanTimestamp := TIME();
Остальной код ничего не делает. Если вы не нажимаете ни одну кнопку, второе слагаемое будет нулём и i будет постоянным. Когда вы упрётесь в Limit_reg или в нуль, i всё равно не выпрыгнет за пределы, т.к. там функция LIMIT. Попробуйте исправленный вариант и сообщите результаты.