TIA Vergleich von Werten im Format REAL

uweschwarz

Level-2
Beiträge
332
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe irgendwie einen Knoten im Kopf. Ich versuche folgenden Code zum laufen zu bringen.
Alle Variablen sind vom Typ REAL bzw. Bool

Code:
IF #statIstwert <> #statSollwert THEN
    //Rampe steigend
    //
    IF #statIstwert < #statSollwert AND #instRTrig_Takt.Q AND #Start THEN
        #statStellwert := #statStellwert + #Rampe;
    END_IF;
    
    //Rampe fallend
    //
    IF #statIstwert > #statSollwert AND #instRTrig_Takt.Q AND #Start THEN
        #statStellwert := #statStellwert - #Rampe;
    END_IF;
    
    //Ausgang schreiben
    //
    #Stellwert := #statStellwert;
    
END_IF;

Der Stellwert toggelt nach Erreichen des Stellwertes. Wenn der Istwert z.B. 0.0 ist und der Sollwert 0.2, dann wird bis 0,2 korrekt hochgerampt und danach toggelt der Stellwert immer zwischen 0,1 und 0,2.

Wo ist mein Denkfehler?

Würde mich freuen von euch zu hören.

Herzliche Grüße
Uwe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es fehlt einen Toleranz. Einen Bereich innerhalb welches die Stellwert erlaubt ist zu bleiben ohne Änderung.
Wegen diese Zeile
Code:
IF #statIstwert <> #statSollwert THEN
wird den #Rampe Wert immer addiert oder subtrahiert.
Nur wenn #statIstwert und #statSollwert genau gleich sind wird dies übersprungen.
Probier mit
Code:
IF #instRTrig_Takt.Q AND #Start THEN

    IF #statIstwert < (#statSollwert - #Toleranz) THEN
        #statStellwert := #statStellwert + #Rampe;
    ELSIF #statIstwert > (#statSollwert + #Toleranz) THEN
        #statStellwert := #statStellwert - #Rampe;
    END_IF;
  
END_IF;

NB. #Toleranz muss grösser sein als #Rampe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Toleranz klingt gut.
Nebenbei, 2 Realzahlen auf Gleichheit oder Ungleichheit zu prüfen funktioniert aber auch grundsätzlich nicht. Klassischer Anfängerfehler ;)
Realzahlen unterscheiden sich immer irgendwie in der letzten Kommastelle und selbst sowas 2.0/1000.0 ist manchmal ungleich 0.002 Durch Rundungsfehler bei der Realberechnung...
 
Zuletzt bearbeitet:
Es fehlt einen Toleranz. Einen Bereich innerhalb welches die Stellwert erlaubt ist zu bleiben ohne Änderung.
Wegen diese Zeile
Code:
IF #statIstwert <> #statSollwert THEN
wird den #Rampe Wert immer addiert oder subtrahiert.
Nur wenn #statIstwert und #statSollwert genau gleich sind wird dies übersprungen.
Probier mit
Code:
IF #instRTrig_Takt.Q AND #Start THEN

    IF #statIstwert < (#statSollwert - #Toleranz) THEN
        #statStellwert := #statStellwert + #Rampe;
    ELSIF #statIstwert > (#statSollwert + #Toleranz) THEN
        #statStellwert := #statStellwert - #Rampe;
    END_IF;
 
END_IF;

NB. #Toleranz muss grösser sein als #Rampe
wenn das ganze nen Stellsignal 0...100% wäre, würd ich noch zusätzlich sowas einbauen wie:
Wenn Stellwert kleiner Toleranz dann Stellwert gleich 0.0 sowie wenn Stellwert größer 100.0-Toleranz dann Stellwert gleich 100.0
...

bzw. hinter dem ELSIF einfach noch nen ELSE mit Stellwert := Sollwert;
 
Zuletzt bearbeitet:
NB. #Toleranz muss grösser sein als #Rampe
Warum muss die Toleranz größer sein als die Rampe?
Toleranz bezieht sich ja auf den Soll- und Istwert (welcher z.B. Temperatur in °C sein kann),
wohingegen die Rampe sich rein nur auf den Stellwert bezieht (welcher z.B. als Wert von 0-100% definiert ist).


Wenn Stellwert kleiner Toleranz
Ebenso ergeben die Abfragen "Stellwert kleiner Toleranz" usw. hier meiner Meinung nach keinen Sinn, wenn man verschiedene Einheiten miteinander vergleicht.

Dies würde alles nur dann stimmen, wenn der Stellwert gleichzeitig die Einheit des Sollwertes wäre.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn der Rampenwert klein genug ist, kann man sich diese "Toleranz" sparen. Lass doch den Wert geringfügig pendeln wie er will, wen stört das? Ab gewissen Dimensionsunterschieden bricht die Addition ohnehin auch ab. Btw könnte man bausteinintern auch mit LReal rechnen.
 
Dies würde alles nur dann stimmen, wenn der Stellwert gleichzeitig die Einheit des Sollwertes wäre.
ja, mann weiss ja nicht genau, was der TE überhaupt machen will. Jesper und ich beziehen uns auf einen reinen "Rampenbaustein"

Falls der TE sowas wie nen eigenen "Rampenreglerbaustein" bauen will, müsste er konkret erklären, was er warum machen will.

Toggelnde Stellsignale sind immer ärgerlich, da daurch irgend eine Mechanik belastet wird und u.U. auch unnötig Daten zum Leitsystem oder Archiv gehen. Aber gut, lassen wir mal die Kirche im Dorf ;)

Ansonsten würd ich Regler und Rampe (Sollwertrampe, Stellsignalrampe?) nicht vermischen. Aber gut, oft braucht mann eine Rampe auch garnicht, wenn mann nen (PI) Regler ordentlich (langsam) einstellt... Aber ja, die Kirche ;)
 
Wenn der Rampenwert klein genug ist, kann man sich diese "Toleranz" sparen.
ja, wenn man den Rampenwert verkleinert muss auch die Abtastzeit kleiner werden. Da kennen wir die Rahmenbedingungen des TE nicht und auch nicht, ob toggelndes Stellsignal ein Problem ist.

Ich würd immer noch sagen, nen ordentlichen PI-Regler hernehmen und nur im Notfall ne ordentliche Sollwertrampe oder Stellsignalrampe dazu.

schonwieder die Kirche 😂
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Vorschlag von @JesperMP in #6 sollte das Problem von @uweschwarz soweit recht pragmatisch erschlagen.

Zum Thema REAL-Werte vergleichen und..
würde ich der Vollständigkeit halber noch auf die etwas aktuellere LGF-Bibliothek
verweisen, Bausteine:
- LGF_CompareReal
- LGF_CompareLRealByPrecision
- Alle Bausteine im Abschnitt "Technology operations" (LimitRateOfChange & Ramp)

Gleitkommazahlen auf Gleichheit zu Vergleichen kann durchaus seine Tücken haben (✿◠‿◠)
 
Guten Morgen und vielen Dank für die rege Beteiligung.
Zu den Fragen/Unklarheiten:

Wir haben hier ein Bürckert Regelventil DN25, welches vollkommen falsch (viel zu groß) ausgelegt wurde. Das führt dazu, dass jetzt der erforderliche Stellbereich des Ventils bei 0-2% liegt. Unter diesen Voraussetzungen ist ein PID-Regler o.ä. aus meiner Sicht nicht sinnvoll. Natürlich haben wir trotzdem versucht mit einen PID-Regler den Volumenstrom zu regeln. Ich nutze die LBP V2.6 mit dem PID Regelbaustein, der wiederum den PID Compact V2 nutzt.
Wir haben KP auf 0,1, TN auf 0,5 und TV auf 0,0 gestellt. Der erforderliche Durchfluss stellt sich bei einer Ventilstellung von ca. 1% ein. Dann stellt der Regler permanent den Stellwert nach. Leider habe ich keine Einstellung für eine Totzone o.ä. bei diesem Regler gefunden, so dass ich z.B. eine zulässige Regeldifferenz einstellen kann.

Es gibt eine Prozesssituation in der es möglicherweise hilft, wenn dem Ventil ein fest eingestellter Stellwert in % vorgegeben wird, welcher dann in kleinen Schritten angefahren werden soll. Zum Beispiel soll das Ventil aus einer Stellung 3% mit einer Schrittweite von 0,1 auf 1% gefahren werden.

Im Moment ist unklar, ob das prozesstechnisch überhaupt Sinn macht (ich bin Team 'macht keinen Sinn'). Wir werden das herausfinden.

Der Code von JesperMP funktioniert tadellos. Vielen Dank nochmal. Als du es schriebst, fiel mir dann auch ein, dass da ja was mit den REAL-Werten war :-). Ich habe den Code noch ein wenig an die Gegebenheiten hier angepasst.
Code:
//Initialisieren
//
#instRTrig_Reset(CLK := #Reset);
IF #instRTrig_Reset.Q THEN
    #statStellwert := 0;
END_IF;

//Werte kopieren
#statIstwert := #Istwert;
#statSollwert := #Sollwert;

//Toleranz berechnen
//
#statToleranz := 0.01;

//Start
//
#instRTrigStart(CLK := #Start);
 IF #instRTrigStart.Q THEN
     #statStellwert := #statIstwert;
 END_IF;

//Flanke Takt
//
#instRTrig_Takt(CLK:=#Takt);

//Stellwert berechnen
//
IF #statIstwert < (#statSollwert - #statToleranz) AND #instRTrig_Takt.Q AND #Start THEN
    //Rampe steigend
        #statStellwert := #statStellwert + #Rampe;
    ELSIF #statIstwert > (#statSollwert + #statToleranz) AND #instRTrig_Takt.Q AND #Start THEN
        //Rampe fallend
        #statStellwert := #statStellwert - #Rampe;
    END_IF;
    
    //Ausgang schreiben
    //
    #Stellwert := #statStellwert;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habs mir mal so angewöhnt (auch um nicht umdenken zu müssen was kleinere/größere/negative Werte bedeuten):

ABS(#statIstwert - #statSollwert) <= #statToleranz //Innerhalb Toleranz
ABS(#statIstwert - #statSollwert) > #statToleranz //Außerhalb Toleranz
 
Warum muss die Toleranz größer sein als die Rampe?
Toggelnde Stellsignale sind immer ärgerlich, da daurch irgend eine Mechanik belastet wird und u.U. auch unnötig Daten zum Leitsystem oder Archiv gehen.
Genau.

So einen "Rampen-Regler" wäre noch primitiver als einen pure P oder PI-Regler.
Auch wenn man einen P/(I)-Regler einsetzt, hat man oft einen Toleranz-Band um unnötige Regelaktionen zu vermeiden.

Ich nutze die LBP V2.6 mit dem PID Regelbaustein, der wiederum den PID Compact V2 nutzt.
[..] Leider habe ich keine Einstellung für eine Totzone o.ä. bei diesem Regler gefunden, so dass ich z.B. eine zulässige Regeldifferenz einstellen kann.
Welche Name hat den PID Baustein ? Edit: Es steht ja "PID Compact V2".
 
Zuletzt bearbeitet:
Vielleicht ist das Problem was ganz anders.
Wir haben hier ein Bürckert Regelventil DN25, welches vollkommen falsch (viel zu groß) ausgelegt wurde
Die Variabel den man regeln will ist vermutlich Durchflussmenge oder eine andere Prozessvariabel. Die Ventilstellung ist die Ausgang von die Regler für die Durchflussmenge.
So einen Ventil hat typisch einen sehr nicht-liniäre Kennlinie. Damit ändert die Regelung von die Hauptprozessvariabel sich abhänhig von die Ventilstellung. Wenn die Ventil dazu zu gross dimensioniert ist, dann wird es noch schwieriger. Wenn die Ventil nah zu den geschlossene Stellung ist, dann ergeibt eine kleine Änderung in die Stellung eine grossen Sprung in die Durchflussmenge.
Gibt es in die Regelung einen Glied für die Ventil-Kennlinie Kompensation ?
 
Zurück
Oben