# PID Regelung mit Codesys und Wago



## T1000 (22 September 2018)

Guten Abend, 

Ich habe vor mit einem Heitzelement Metallgehäuse auf eine bestimmte Temperatur zu erwärmen und auf dieser Temperatur zu halten. Ich verwende eine Wago 750-881 mit einer PT 100 Eingangsklemme, dazu verwende ich die Wago Building_HVAC_01 lib. . Ich benutze den Baustein Fb_Control_PID_Adv.
Mein Problem: das Heitzelement wird mit einem Halbleiter Schütz angesteuert, das heißt nur ein oder aus. Der Baustein Fb_Control_PID_Adv gibt als Regelgrößen allerdings ein analoges REAL Signal aus. Ich habe versucht einfach mit REAL_TO_BOOl mein Schütz anzusteuern, geht zwar anfangs aber der Regler schalt das Schütz bei erreichen des soll werde nicht ab. Frage: wie bekomme ich das Schütz am besten angesteuert.?


----------



## wolfi-sps (22 September 2018)

Hallo T1000,

schau dir mall den Baustein FbPWM an - mit dem steure ich meine FBH Ventile an. Das sollte gehen.

Wolfgang


----------



## Heinileini (24 September 2018)

T1000 schrieb:


> Der Baustein Fb_Control_PID_Adv gibt als Regelgrößen allerdings ein analoges REAL Signal aus.


Auf die Gefahr hin, Dein Weltbild zu zerstören: RealGrössen sind digital!



> Ich habe versucht einfach mit REAL_TO_BOOl mein Schütz anzusteuern, geht zwar anfangs aber ...


Hierzu habe ich im WWW gefunden:
NOTE: The function converts strictly in accordance with IEC rules. Since this function has been realized as a generic function, there will also be a few illogical conversions, e.g. REAL_TO_BOOL. 
When converting to BOOL, BYTE, WORD, the least significant bits of the input value are transferred to the output. A runtime error message is not given and ENO remains 1.

D.h. "der Vollständigkeit halber" sind auch diejenigen Umwandlungen realisiert, die mehr oder weniger "sinnfrei" sind. Das gilt insbesondere für die Wandlung von REAL in BOOL.
Immerhin hätten die Wandlungen aus einem GanzzahlFormat den Sinn, dass das Ergebnis angibt, ob die Zahl ungeradzahlig ist.
Ob sich jemand für niederwertigste Bit der Mantisse einer RealZahl interessieren könnte, wage ich eher zu bezweifeln.
Du bist also darauf hereingefallen, dass REAL_TO_BOOL zwar formal von REAL in BOOL wandelt, aber dennoch nicht annähernd das leistet, was Du erhofft hattest.

Gruss, Heinileini


----------



## weißnix_ (26 September 2018)

Du kannst einen fertigen PWM-Baustein nehmen oder machst es "zu Fuß".

Die Reglerausgangsgröße skalierst Du wegen der Übersichtlichkeit auf 0...100%.
Dann wählst Du die Reglerzykluszeit entsprechend der Anwendung - sagen wir mal 10 Sekunden (thermische Trägheit usw.).
Als letztes rechnest Du die 100% Reglerausgangsgröße auf die Zykluszeit um - 100% sollten also den Beispielsweise 10s entsprechen.

Diesen Wert nimmst Du einfach als Einschaltzeit der Heizung per TOF.
Also Zeitwert setzen, der Zyklusbeginn triggert den TOF und der Regler bestimmt die Zeit.Fertig.

Im Ergebnis hast Du im gewälten Beispiel bei Reglerausgang 10% 1 s Heizung an und 9 sekunden Heizung aus.
Bei 40% entsprechend 4s an und 6s aus. Bei 100% Hast Du Dauersignal.

Das ganze lässt sich schön in einen Baustein packen, der zyklisch alle 10s aufgerufen wird. Arbeitest Du mit festen Zykluszeiten im Programm kannst Du einfach alle x Programmzyklen den Regler aufrufen. Hast Du variable Zykluszeiten nimmst Du entweder eine separate Task (meine allerletzte Wahl!) oder rufst den Baustein zeitgesteuert auf.

Bei SSR-Ausgängen kannst Du auch kürzere Reglerzyklen verwenden aber das ist dennoch nicht immer sinnvoll weil das System in jedem Fall eine thermische Trägheit aufweist.


----------



## Heinileini (26 September 2018)

weißnix_ schrieb:


> Im Ergebnis hast Du im gewäHlten Beispiel bei Reglerausgang 10% 1 s Heizung an und 9 sekunden Heizung aus.
> Bei 40% entsprechend 4s an und 6s aus. Bei 100% Hast Du Dauersignal.
> 
> Das ganze lässt sich schön in einen Baustein packen, der zyklisch alle 10s aufgerufen wird.


Das betrifft aber nur das Starten des TOF. Auf den Ausgang muss TOF.Q schon sehr viel öfter umgeschaufelt werden.

Hat schonmal jemand erwähnt, dass auch HalbleiterRelais nicht in beliebig kurzen Abständen geschaltet werden sollten? 10 s sollten problemlos sein, aber vorsichtshalber DatenBlatt konsultieren!


----------



## StructuredTrash (27 September 2018)

Heinileini schrieb:


> Hierzu habe ich im WWW gefunden:
> NOTE: The function converts strictly in accordance with IEC rules. Since this function has been realized as a generic function, there will also be a few illogical conversions, e.g. REAL_TO_BOOL.
> When converting to BOOL, BYTE, WORD, the least significant bits of the input value are transferred to the output. A runtime error message is not given and ENO remains 1



Das ist aber jetzt nicht aus einer Codesys-Doku, sondern irgendwas allgemeineres, oder?
Codesys weicht schon mal ein wenig von der Norm ab, wenn es allzu sinnfrei wird. Die "Zahlenwert_to_Bool"-Konvertierungen geben bei Codesys "Zahlenwert<>0" zurück.
Bei einem Real-Wert bringt das natürlich trotzdem nicht viel, denn wann ist der schon mal genau 0.


----------



## Heinileini (27 September 2018)

Moin Structured,
vielleicht ist es etwas spezielleres als CodeSys. Ich hab's in einem 2-seitigen pdf-Fetzen bei Schneider gefunden:
http://www2.schneider-electric.com/...ve/FAQS/198000/FA198861/en_US/REAL_TO_INT.pdf


----------

