Пока есть одно основательное замечание... PLC_PRG не надо использовать как место для свалки кода.
Создавайте по программе/ФБ для каждой задачи/подзадачи. А вот уже эти программы и вызывайте из PLC_PRG типа myProg(); Если в подпрограмме необходимо задать параметры (VAR_INPUT) то собсно myProg(Param1,Param2...). Только не забывайте, что локальные переменные программы не зависят от того кто и зачем ее вызвал. Программы есть только 1 экземпляр. Если есть несколько независимых паралельных процессов (например обработка аварий), то лучше пользоваться функциональными блоками.
Например, инициализация. Создайте PLC_INIT и там разберитесь с предстартовой подготовкой, а ее замените строкой PLC_INIT().
IF NOT starting THEN - так вы сами себя запутываете. Инициализируйте ее в TRUE и скидывайте
![Улыбающийся :)](https://simple-scada.com/forum/Smileys/default/smiley.gif)
Два регулятора в одном блоке - некрасиво смотрятся. 2 отдельных програмки позволят нагляднее понять что и когда вы делаете. Например ваш DECODE_FLOAT выполняется 2 раза. А если блоков будет 30? Потому интереснее было бы сотворить ФБ У которого были бы входящие и выходящие параметры, которые уже и расписать по нужным переменным.
Тут мы вспоминаем о структуре данных. В DataTypes определить структуры для входов и выходов из ПИД регулятора, создать структуру пид-регулятор с входами-выходами, создать струкруру регулятор с обозначенным в ней ФБ пид-регулятора и структурой пид-регулятор. Создать структуру регуляторы из массива структур регулятор...
Теперь, мы можем, например, создать прогу- "управление", там запустить в цикле фб нужных пид регуляторов, передав ему в VAR_IN_OUT всю структуру входов/выходов.
Дальше мы навсегда забываем о существовании данных блоков и программ. Просто меняем переменные в структурах, зависимо от того чего хотим добиться уже в совсем других программах.
ton2(in:=TRUE,pt:=t#1000ms); - очень плохая привычка....
ton1: TON :=(PT:=t#1s);
ton2: TON :=(PT:=t#1s);
Избавит вас от указания PT каждый раз.
Вместо ton2(in:=TRUE,pt:=t#1000ms); просто ton2.IN:=TRUE;
и в самом конце - ton2();
Зачем такие сложности? Пока вы не вызовете ФБ, никакие изменения в его вн. переменные роли не играют. Исполняется ФБ раз за цикл, посему к-во его вызовов не изменит факта работы, а путаницу внести может. Например тот же таймер надо сбросить для рестарта. Сброс-установка In двумя вызовами в одном цикле, сброса НЕ произведет, а принять решение о остановке таймера могут и несколько независимых событий.
Сори что сумбурно, просто тут надо на пальцах показывать.
![Улыбающийся :)](https://simple-scada.com/forum/Smileys/default/smiley.gif)
По вашему конкретному проекту точечно не помогу т.к. не имею ни таргетов, ни либ от вашего ПЛК
![Улыбающийся :)](https://simple-scada.com/forum/Smileys/default/smiley.gif)