Einseitiger Regler für Codesys

milli13

Level-1
Beiträge
35
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
ich bin leider mal wieder auf ein Problem gestoßen, was für mich als Anfänger, nicht gerade einfach zu lösen ist.
Und zwar programmiere ich ausschließlich in FUP. Was ich benötige ist ein Regler, der sich einem Wert annähert, sobald der Wert überschritten ist aber nicht in die andere Richtung regelt.
Als Beispiel:
Ich habe einen Wasserhahn, bei dem ich einen Öffnungsgrad zwischen 0-100% einstellen kann. Ich möchte einen festen Volumenstrom von 15 l/min einstellen. Im Idealfall hätte ich gerne einen Regler, der jede Sekunde den Öffnungsgrad um 1% erhöht, dann den Volumenstrom kontrolliert und merkt: Nicht erreicht, nächste Sekunde wieder weiter öffnen. Wenn bei 55% Öffnung jetzt ein Volumenstrom von 15,5 l/min getroffen wird, soll dieser Wert einfach behalten werden und nicht verringert werden. In meinem realen Prozess habe ich nämlich eine Hysterese, wodurch das Runterregeln nur noch mehr Chaos verursacht.
Mir wäre sehr geholfen, wenn mir jemand grob einen Tipp geben könnte auf welche Bausteine ich mich konzentrieren sollte. Ich habe schon überlegt ob ich das irgendwie mit einem Pulsgeber und dem Execute-Block (If/Else Anwendung reinschreiben) lösen kann. Aber ich vermute, dass der Execute Block dabei jedes mal wieder von 0 anfangen würde..

Vielen Dank schon mal für eure erneute Hilfe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vermutlich könnte das helfen, vielen Dank. Es wäre mir aber tatsächlich lieber wenn ich mich nur von einer Seite dem Wert nähern würde. Die Reglerabweichung ist da jetzt auch nicht riesig. Es geht vermutlich nur um 2 bis 3 % die nachgeregelt werden müssen. Es dürfte beispielsweise auch direkt ein Wert von 40% angefahren werden und erst anschließend soll jede Sekunde der Wert kontrolliert und der Öffnungsgrad weiter geöffnet werden. Dadurch würde sich die Zeit natürlich deutlich verkürzen
 
Ja genau, das beschreibt es ganz gut. Trotzdem fehlen mir die Ideen wie ich das als Baustein realisieren kann. Ich habe mir jetzt eine zusätzliche .lib von Wago heruntergeladen. Da gibt einen Limitregler... Der erlaubt mir mich einem Wert zu nähern und aufzuhören wenn der Wert erreicht wird. Da werden aber die COnfigParameter über ein Struct eingefügt..Wenn ich in meine Variablen das Struct rein schreibe läuft gar nichts mehr :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Im Idealfall hätte ich gerne einen Regler, der jede Sekunde den Öffnungsgrad um 1% erhöht, dann den Volumenstrom kontrolliert und merkt: Nicht erreicht, nächste Sekunde wieder weiter öffnen. Wenn bei 55% Öffnung jetzt ein Volumenstrom von 15,5 l/min getroffen wird, soll dieser Wert einfach behalten werden und nicht verringert werden.
In diesen zwei Sätzen hast Du doch schon die Vorgehensweise so beschrieben, dass Du sie in ein Programm umsetzen kannst.
Allerdings wäre mein Tipp, die Reihenfolge umzudrehen.
Alle Sekunde
- zuerst prüfen, ob der tatsächliche VolumenStrom den angestrebten schon erreicht oder überschritten hat und
- dann erst - abhängig vom PrüfErgebnis - auf den Öffnungsgrad 1 draufaddieren oder nichts tun.

Ob Du nun am Anfang mit dem Wert 0% oder 40% oder ?% beginnst, das kannst Du ja immer noch überlegen und nachträglich anpassen.
Auch solltest Du etwas vorsehen, um diese "Regelung" (vorübergehend) totzulegen, damit zwischendurch der VolumenStrom auch mal gestoppt werden kann.

PS:
Du denkst viel zu kompliziert, wenn Du nach "passenden" Bausteinen suchst, die Du dann noch komplizierter an Deine Wünsche anpassen willst.
Was Du brauchst, sind einige wenige GrundFunktionen
- ein SekundenTakt und eine FlankenErkennung, damit Du alle Sekunde nur 1 Zyklus lang Deine Mimik aktivierst
- ein Vergleich zweier ZahlenWerte
- eine UND-Verknüfung (FlankenImpuls UND RegelungAktiv UND VergleichsErgebnis)
- Addition von 1 auf eine Variable
 
Zuletzt bearbeitet:
Ja das kann eventuell wirklich mein Problem sein. Ich suche gerne nach vollständigen Bausteinen und frage mich dann häufig wofür ich diese ganzen Variablen die dort verwendetet werden überhaupt gebraucht werden :D Ich war schon wieder fast der Meinung,dass ich einen PID Regler benötige.. Ich danke dir Heinileini. Ich hoffe das bekomme ich so auch umgesetzt:)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also es kann am Wetter liegen aber ich komme glaube ich bei einem simplen Problem nicht weiter. Ich habe mir jetzt den Puls erzeugt, den Vergleich zwischen den beiden Volumenströmen erstellt und den Regler angeschaltet. Diese 3 Blöcke verbinde ich alle mit einem AND damit ich jede Sekunde, in der der Wert noch zu klein ist und der Regler angeschaltet ist, ein positives Signal am Ausgang vom AND bekomme. Die Addition bekomme ich aber irgendwie nicht vernünftig damit verbunden. Ich kann das positive Ausgangssignal ja nicht damit verbinden. Ich vermute es gibt eine ganz einfache Logik dahinter aber ich glaube eine solche Kombination musste ich noch nicht erstellen
 
Ich vermute es gibt eine ganz einfache Logik dahinter aber ich glaube eine solche Kombination musste ich noch nicht erstellen
Ich vermute, Du meinst dahinter:
- ein SekundenTakt und eine FlankenErkennung, damit Du alle Sekunde nur 1 Zyklus lang Deine Mimik aktivierst
Wie sieht denn Dein SekundenSignal aus? Abwechselnd eine halbe Sekunde lang auf low und dann eine halbe Sekunde lang auf high?
Das wäre genau der Fall für eine "FlankenErkennung". Einen Impuls zu bilden, der nur einen einzigen Zyklus lang auf high geht, wenn ein Signal von 0 auf 1 wechselt (positive Flanke) oder wenn es von 1 auf 0 wechselt (negative Flanke).
Dafür gibt es "Vorgefertigtes", aber das will ich Dir erstmal verschweigen. Das muss man erstmal selbst "zu Fuss" programmiert haben, um das einfache Prinzip zu verstehen und nie wieder zu vergessen!
Also, für eine positive Flanke:
ImpulsBeiPositiverFlanke := aktuellerZustandDesSignals AND NOT alterZustandDesSignals
alterZustandDesSignals := aktuellerZustandDesSignals
Dazu musst Du für das Abspeichern des alten Zustandes eine Variable haben, die ihren Zustand bis zum nächsten Zyklus beibehält (also keine temporäre Variable benutzen!) und auch nicht anderweitig noch benutzt wird.
Hilft Dir das weiter?
 
Also ich habe allgemein noch die Variablen speichern müssen. Da bin ich vermutlich absolut nicht fit drin. Ich glaube da erklärt sich mir auch gleich mein nächstes Problem. Damit der neue Öffnungsgrad gespeichert wird muss ich diesen vermutlich auch für jeden ZYklus zwischenspeichern? Ich glaube da kommt noch einiges an Arbeit auf mich zu :D
 
Nüchtern betrachtet ;), hättest Du Dir eines der beiden internal flags sparen können, da Du von nur 1 EingangsSignal den vorherigen Zustand merken musst.
Code:
ImpulsPosFlanke := SignalAktuell AND NOT SignalAlt;
ImpulsNegFlanke := NOT SigalAktuell AND SignalAlt;
SignalAlt := SignalAktuell;
wobei SignalAlt das besagte flag ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Toll, Heinileini, Ehre, wem Ehre gebührt.
Danke für die Blümchen! Dir gebührt immerhin die Ehre, eine eigene Lösung für das Problemchen gefunden zu haben. Das weiss ich sehr zu schätzen und ich meine das keineswegs ironisch.
Ich gehöre ebenfalls zu den alten Eseln - so alt, dass ich durch die Gegebenheiten in S5 total auf "Wir müssen sparen, koste es, was es wolle!" getrimmt bin. ;)
 
Jaja, die 'Schmiermerker', LIR, TIR, FB172:Korg, CPU928B, da kommen Erinnerungen an die alten Zeiten hoch. Bosch CL500, damals schon 1ms Zykluszeit für 1000 Befehle! Unglaublich, wie schnell die Jährchen vergehen... :-)
 
Zurück
Oben