Это не "ля-ля с картинками", а отладчик, в котором видно, что в основной программе вызывается экземпляр ФБ с IN := false, а внутри экземпляра этого ФБ вход IN имеет значение true в это же самое время!
Это не "ля-ля с картинками", а отладчик, в котором видно, что в основной программе вызывается экземпляр ФБ с IN := false, а внутри экземпляра этого ФБ вход IN имеет значение true в это же самое время!
Такое возможно только если меняли таргеты, большой кусок кода ещё что-то тогда нужно сделать "Очистить всё" и перекомплировать проект и всё станет в норму. Если это делали, то 100% ошибка в коде которую вы не можете найти. Может где-то в другом куске программы присваиваете этому фб на вход IN:=TRUE. Сами же пишете что первый раз переписали ФБ и стало норм. Не совсем понятное для меня использование Case и таймеров внутри условий(что тоже нужно делать аккуратно).
Согласен с Валенком тоже используем большое количество ФБ с указателями и без. И никогда не было проблем с распределением памяти только собственные ошибки.
Пунктом "Очистить все" действительно, я не пользуюсь (даже не знаю, что он делает). Всегда делаю "Компилировать все".
Все изменения команды на вход делаются выше по коду. Потом один раз вызывается этот ФБ.
Мне тоже непонятно ваше высказывание. Пришла команда отработать цилиндру - включить таймер, надо считать время работы цилиндра.
А CASE и IF вообще братья-близнецы. CASE только намного лучше читается.
Непонятная мне необходимость в указателях! А зачем они вам?
Это точно. Ошибку не нашел.![]()
Последний раз редактировалось Евгений Пашигоров; 31.03.2021 в 10:39.
Чтобы можно было оперировать не целиком данными, а указателями на них, но это достаточно сложное для понимания колдунство. Утрированный пример таков: есть два человека в отеле, которые хотят поговорить (обменяться данными), и можно их друг с другом свести лицом к лицу т.е. доставить целиком человека из одного номера в другой, материально переместить, и есть телефонистка, которая может просто соединить телефонное гнездо первого человека с телефонным гнездом второго человека, и произойдёт передача данных от одного человека к другому. Указатели используются для достижения полиморфизма, когда вам, грубо говоря, не важен сам человек, а важен человек в том номере, с которым соединит телефонистка, а будет там мужчина, женщина или ребёнок не так принципиально, утрировано как-то так.
Частный случай использования указателей, как принципиального способа структурирования данных - это массивы.
И тогда ваша запись вида:
превращается в:Код:PROGRAM temperature_ctrl VAR pwm1chan, pwm2chan, pwm3chan, pwm4chan, pwm5chan, pwm6chan, pwm7chan, pwm8chan: PWM_B; END_VAR
А конструкция вида:Код:pwmchan: array[1..8] of PWM_B;
(Превращается в:Код:*формируем код устройства*) ... panel_error1 := BOOL_TO_INT(cmd_l_mould_forw OR cmd_l_mould_back OR cmd_l_mould_open OR cmd_l_mould_close) * 1 + (*левая форма*) BOOL_TO_INT(cmd_r_mould_forw OR cmd_r_mould_back OR cmd_r_mould_open OR cmd_r_mould_close) * 2 + (*правая форма*) BOOL_TO_INT(cmd_screw_rising OR cmd_screw_lower) * 4 +... (*шнек*) ...
т.е. не целиком числовые значения перемещать, переммножать и суммировать в переменные, а работать напрямую с битами.Код:panel_error1.0:=cmd_l_mould_forw OR cmd_l_mould_back OR cmd_l_mould_open OR cmd_l_mould_close; panel_error1.1:=cmd_r_mould_forw OR cmd_r_mould_back OR cmd_r_mould_open OR cmd_r_mould_close; ...
Последний раз редактировалось Parovoz; 01.04.2021 в 06:50.
Да, лааааадно. Чё серьёзно? Не может быть...
Thanks, cap.
Речь шла о самом принципе использования указателей, а не о "POINTER TO"
Автор то массивами не пользуется, а также булевыми функциями через раз, привык всё на пальцах считать количественным исчислением, что 3 - это не первые два бита истинные, а только 1+2, а вы ему тут про указатели адресные и динамическое выделение памяти...
Последний раз редактировалось Parovoz; 01.04.2021 в 08:33.
Ещё как превращается, потому что, что сверху, что снизу один и тот же результат произведённый разными способами.
Только в вашем случае вы превращаете булевые значения в целочисленные, используя степени числа 2 согласно номерам битов в слове, а затем суммируете чтобы получить итоговое значение, а в моем я сразу пишу эти биты в переменную согласно номерам этих битов. Результат один и тот же только действий, что для вас, что для контроллера меньше.
Последний раз редактировалось Parovoz; 01.04.2021 в 20:49.
1) Полностью очищает папку с проектом и при следующей компиляции происходит полная "сборка проекта" с нуля - онлайн изменения при этом невозможны. Пару раз встречалась такая ситуация. Если у вас не было ошибок в коде 100% должно было бы помочь.
2) Про таймеры встречал что-то наподобие такого кода и потом люди удивлялись почему выход на таймере выдаёт TRUE. (Там было нечто похожее только IF'ов было больше человек потерялся).
VAR
x: BOOL:=TRUE;
tTON: TON;
END_VAR
IF x THEN
tTON(IN:=x, PT:=T#10s);
x:=FALSE;
END_IF
tTON();
3) Про Case по мне так не очень читабельно получилось - но тут дело каждого.
4) При опросе устройств с Modbus, нестандартными протоколами приходит ответ, который зачастую нужно разбирать и переставлять байты чтобы получить значение. Можно передавать указатель на структуру в которой хранятся нужные данные для ФБ и т.д. Уменьшает количество кода и вероятнее скорость обработки данных, но это лишь моё предположение)