OL_2.11.369.0
А куда всё исчезло?
Или этого уже давно ничего нет?
изображение_2025-10-13_220704669.png
Добрый день. Периодически приходится возвращаться к ротации насосов на ST. Используя программы ротации на функциональных блоках ST глубокоуважаемого пользователя kondor3000 опять столкнулся с проблемами. В симуляторе все замечательно работает, при заливке в ПР200-24.4, да и в ПР200-24.8 программы ротации, ротация через раз, как работать с этим? Версию использую старую, версия 2.10.367.0. Как победить, уж слишком хороши программы ротации на ST, но почему тогда в симуляторах все работает, а в железе кругом баги? Можно, конечно, сделать ротацию на простых блоках, но очень много места программа занимает.Запасной 3 редактируемый .owle
вот что ИИ-ассистент говорит:
1) Критично: Вы используете массивы размером [0..3] (4 элемента), но насосы нумеруются от 1 до 3. Индекс 0 не используется, но может быть ошибочно задействован, особенно при арифметике с индексами (j := Sel_1(i>num, i, i-num)).
При этом закомментированы 4–5 насосы, но логика частично все равно поддерживает 5, что создаёт путаницу
2) Ошибки в логике выбора основного насоса. Если все насосы в аварии, то nonorm = num, и цикл не выполнится → main останется в аварийном состоянии.
Позже используется boiler[j] := TRUE только если NOT alarm[j], но если нет исправных насосов, то run = 0, и ничего не запускается — это ОК.
НО: затем есть блок:main=0 — некорректное состояние, так как насосы нумеруются с 1 до 3.Код:if main=0 and ET<=PT1 and not Q then Main:=Min3_1(T1_,T2_,T3_); end_if
Min3_1(...) возвращает номер насоса? Но если main=0, это ошибка логики
3) Проблемы с таймером и управлением PT1, ET, Q
❌ Нарушена логика управления таймером TON
TON(In:=In or ET=PT1, PT:=PT1, Pause:=Pauz, ET=>ET, Q=>Q);
Условие In or ET=PT1 приведёт к зацикливанию: как только ET = PT1, In снова становится TRUE, и таймер запускается снова мгновенно.
Это приведёт к непредсказуемому поведению: Q может быть TRUE один скан, потом снова FALSE, и т.д.
Поведение не соответствует стандартному TON (обычно In — внешнее условие, а не зависящее от внутреннего состояния таймера).
4) Проблемы с обработкой Res (сброс)
Res устанавливается в true внутри FB, но также является входной переменной.
Это нарушение контракта: входные переменные не должны изменяться внутри FB.
Поведение будет непредсказуемым, если Res используется вне FB.
6) Неявная инициализация и побочные эффекты
amount := amount; // бессмысленная строка
if run>3 then run:=0; end_if // странная защита
if run>3 then run:=0 — если насосов 3, run не может быть >3. Это лишняя проверка или признак ошибки логики выше.
КРИТИЧЕСКАЯ ОШИБКА:
Вы интерпретируете PT как часы, но преобразуете в миллисекунды как будто это минуты.
PT = 5 → PT1 = 5 * 60000 = 300 000 мс = 5 минут, а не 5 часов!
не знаю насколько прав искусственный интеллект, но выглядит убедительно
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Я в ST ничего не делал и не смогу сделать, не изучал. К сожалению, все что связано с ST, приходится использовать чужие разработки и необходимый функционал доделывать на фб. Проекты kondora3000 по ротации очень удобны, но там есть нюансы, я не понимаю, почему чистый проект по той же ротации работает, но как только начинаешь не изменяя функцию (функциональный блок ST) вносить дополнительные блоки, то все ломается? Тут человек целый ИИ для анализа ошибок в программе использовал, но я программу не трогал, только к скаченной добавил функциональные блоки и тут такой букет ошибок, откуда?
Иногда, чтобы ускорить разработку, многие нюансы не учитываются, основываясь не предположении, что входные сигналы будут поступать в систему в строго определенном порядке. В результате, если порядок иной (за счёт добавления новых функций) можно нарваться на "подводный камень".
Для решения таких проблем есть 2 выхода:
- Полный (тщательный и глубокий) анализ чужого кода на предмет выявления этих "подводных камней" с целью их обхода.
- Полностью самостоятельная разработка с целью создания собственных "подводных камней", но о которых Вы будете уже знать.
Я всегда выбираю 2-й путь, т.к. 1-й в итоге всегда приводит ко 2-му.
Если у Вас есть большое желание создать свой собственный продукт, то я готов Вам помочь, при условии, если Вы чётко распишите ТЗ.
Вы можете сделать скрин в онлайн отладке, когда не работает блок?
Проблема скорее всего в переменной Main, если она слетит, блок не будет работать.
С экрана она не задаётся, то есть пока не досчитает таймер, переключения не будет. А слетать может, если нет защиты от помех при переключении насосов.