Вот проблема
Если Number_Flowers_Gate[i] равен нулю (а он изначально равен нулю) или Gate_ON[i] выключен (а он выключен) у нас тупо не выполняется операция Remaining := Remaining - 1; и получаем бесконечный цикл.Код:WHILE Remaining > 0 DO FOR i := 1 TO 5 DO IF (Remaining > 0) AND (Number_Flowers_Gate[i] > 0 AND Gate_ON[i] = TRUE) THEN Corr_Array[i] := Corr_Array[i] + 1; Remaining := Remaining - 1; END_IF; END_FOR; END_WHILE;
При запуске ПР в первом цикле действительно всё нули.
Но он же не должен был смотреть всё что между THEN и END_IF (см. скрин)!? Этот бесконечный цикл вообще не должен был даже начать выполняться.
В общем, пока прикрутил костыль, попробую загрузить потестировать. Но ощущение неполноценности остаётся >_<
Снимок.JPG
Бесконечный цикл будет только в одном случае: когда Remaining > 0 и ни в одной итерации не выполняется условие (Number_Flowers_Gate[i] > 0 AND Gate_ON[i] = TRUE). Намбе флаверсы ваши приходят извне, за сим наши полномочия всё, ищите дальше сами
У вас при запуске срабатывает триггер R_TRIG_Switch_To_r6(I := Switch_Flowers_Set = FALSE); // Момент переключения стрелки на робот 6
Соответственно, выполняется это
и далееКод:// В момент переключения стрелки на робот 6 IF R_TRIG_Switch_To_r6.Q = TRUE THEN // Подсчёт корретировки (общее количество) Corr_To_r6_Total := udint_to_real(11) - udint_to_real(Counter_Output_r6); // Сброс подсчитанных цветов Counter_Output_r6 := 0; END_IF;
Т.е., Corr_Total ваш равен не нулю, а 11Код:IF Switch_Flowers_Set = FALSE THEN Corr_Total := Corr_To_r6_Total; ELSE Corr_Total := Corr_To_r7_Total; END_IF;
Господа, доброго времени! Подтолкните в правильном направлении, есть сетевой бит который записывает мастер панель ип320, его нужно сбрасывать в ПР200 по условию
Последний раз редактировалось valdik; 01.11.2025 в 15:33.
На скрине сброс 3 бита (можно любой из 16) в регистре по условию 1 Сброс 3 бита.jpg бит должен быть один в регистре.
Только ИП320 сама биты не может ставить, можно только руками.
Последний раз редактировалось kondor3000; 01.11.2025 в 15:54.
изображение_2025-11-01_195830881.png
Целочисленные логические в ST пока не завезли, но можно так (сброс бита номер 0):
Код:function ResetBit: udint; var_input I : udint; R : bool; end_var if R then I.0 := FALSE; end_if ResetBit := I; end_function
Мне кажется, можно сделать более универсальное решение, в смысле, чтобы было возможно писать любое значения выбранного бита(не только сбрасывать в "0"), короче, я это вижу примерно как-то так:
WR_B_1.png
WR_B_2.png
WR_B.owle
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Т.к. одной командой, обычно, не ограничивается, то обрабатываю сразу всё слово управления от вышестоящей системы или панели.
Сразу принял, что от вышестоящей системы поступают только импульсные команды - действующие только один машинный цикл. Поэтому пришлось разработать макросы, обрабатывающие одиночные (записать моточасы) и парные переключающие (включить и выключить режим) команды.
На рисунке - выделение команд из принятого слова управления и фрагмент макроса (ФБ), выделяющего отдельные биты. Видно, что сразу после выделения бит всё принятое слово управления обнуляется целиком. Там ещё присутствует ограничение в получении команд на время инициализации при включении питания.
cmd_01.jpg
cmd_02.jpg
На рисунке обработка одиночной команды - записать значения моточасов - применение на холсте и содержимое макроса обработчика от двух источников (т.к. для ПР205 команда может быть получена и от панели и от встроенной панели)
это незаконченный проект и содержит небольшую недоработку - к выходу макроса Cmd_HMI_SCR_ нужно подключить переменную от встроенной панели для её автоматического сброса после обработки
cmd_03.jpg
cmd_04.jpg
Последний раз редактировалось FPavel; 02.11.2025 в 07:55.