Я свой метод уже упоминал. Надо изучить язык ST(FBD) и писать на Си
пользуясь той же парадигмой. Например, вот так я вызываю регулятор в главном цикле {//регулятор печи П11
P11.PRegul=Eeprom.PRegul_P11;//Пропорциональный коэф 0.1%/ГрС
P11.IRegulP=Eeprom.IRegulP_P11;//Интегральный коэф 0.001%/(ГрС*Сек)
P11.DRegul=Eeprom.DRegul_P11;//Дифферинциальный коэффициент 0.1%*Сек/ГрС
P11.HeatSet=Eeprom.HeatSet_P11;//Уставка нагревателя %
P11.TempSet=Eeprom.TempSet_P11;//уставка температуры 0.1ГрС
P11.Temp=TP11;//текущая температура 0.1ГрС
P11.TempPorog=Eeprom.TempPorog_P11;//ограничение ошибки интегрального звена
P11.TempPorogZn=Eeprom.TempPorogZn_P11;// Зона нечувствительности диф. звена 0.1ГрС
P11.Heat1Temp=Eeprom.Heat1Temp_P11;//значение температуры 0.1ГрС для ограничения нагревателя
P11.Heat1=Eeprom.Heat1_P11;//значение ограничения нагревателя
P11.Heat2Temp=Eeprom.Heat2Temp_P11;//значение температуры 0.1ГрС для ограничения нагревателя
P11.Heat2=Eeprom.Heat2_P11;//значение ограничения нагревателя
P11.d100=OutDat100Hz;//датчик 100Гц
P11.ErrIn=ErrDat100Hz||(MBErrTP11)||(SostTP11);//ошибка внешняя
P11.En=RegSost.EnP11;//включить
P11.LenOhibPointer=Eeprom.LenOhibPointer_P11;//Интервал дифференцирования
TermodatMain(&P11);
Eeprom.LenOhibPointer_P11=P11.LenOhibPointer;//Интервал дифференцирования
UprP11=P11.Out;//выход управления твердотельным реле
RegSost.ErrP11=P11.Err;//ошибка выход
RegSost.EnP11=P11.En;//включить
}
https://www.codesys.ru/docs/st_c.pdf