TIA Software für Ausgleich von Ventilspiel

Zuviel Werbung?
-> Hier kostenlos registrieren
Für die Interessierten hier mal die Code-Version, mit der ich an den Start gegangen bin. Vermutlich werden wir noch ein paar Anpassungen vornehmen, wie beispielsweise, dass bei Eingangswerten < 0,2 der Ausgangswert fest auf 0 gesetzt wird, um ein Offenstehen durch Offset zu verhindern.

Code:
FUNCTION "FC_BadValves" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      setpointFromPID : Real;
   END_VAR

   VAR_OUTPUT
      setpointToValve : Real;
   END_VAR

   VAR_IN_OUT
      data : "typeBacklashCompensation";
   END_VAR

   VAR_TEMP
      tempOutput : Real;
      tempDirDef : Bool;
   END_VAR

   VAR CONSTANT
      DIR_OPENING : Int := 1;
      DIR_INIT : Int := 0;
      DIR_CLOSING : Int := -1;
   END_VAR


BEGIN
    REGION Header
        // FC_BadValves
        // Stellwertanpassung für Umkehrlosekompensation
    END_REGION
    
    REGION Initialize
        
        // Init last value
        IF NOT #data.init THEN
            #data.lastExtreme := #setpointFromPID;
            #data.initialDir := #DIR_INIT;
            #data.init := TRUE;
        END_IF;
        
        // Init direction
        IF TRUE
            AND (#data.initialDir <> #DIR_OPENING)
            AND (#data.initialDir <> #DIR_CLOSING)
        THEN
            IF (#setpointFromPID - #data.lastExtreme > #data.config.deadband) THEN
                #data.initialDir := #DIR_OPENING;
                #data.currentDir := #DIR_OPENING;
            ELSIF (#data.lastExtreme - #setpointFromPID > #data.config.deadband) THEN
                #data.initialDir := #DIR_CLOSING;
                #data.currentDir := #DIR_CLOSING;
            END_IF;
        END_IF;
        
        // Init temps
        #tempOutput := #setpointFromPID; // move input to output
        #tempDirDef := (#data.initialDir = #DIR_OPENING) OR (#data.initialDir = #DIR_CLOSING); // Check, if initial direction is defined
    END_REGION
    
    REGION Code
        
        // Check if valve is closing or opening
        CASE #data.currentDir OF
            #DIR_CLOSING: // Valve is currently closing
                
                // track minimum
                IF (#setpointFromPID < #data.lastExtreme) THEN
                    #data.lastExtreme := #setpointFromPID;
                END_IF;
                
                // If input is greater than minimum + deadband, detect change in direction
                IF (#setpointFromPID > #data.lastExtreme + #data.config.deadband) THEN
                    #data.currentDir := #DIR_OPENING;
                    #data.lastExtreme := #setpointFromPID;
                END_IF;
                
            #DIR_OPENING:  // Valve is currently opening
                
                // track maximum
                IF (#setpointFromPID > #data.lastExtreme) THEN
                    #data.lastExtreme := #setpointFromPID;
                END_IF;
                
                // If input is less than minimum - deadband, detect change in direction
                IF (#setpointFromPID < #data.lastExtreme - #data.config.deadband) THEN
                    #data.currentDir := #DIR_CLOSING;
                    #data.lastExtreme := #setpointFromPID;
                END_IF;
                
            ELSE  // do nothing, if current direction is undefined
                ;
        END_CASE;
        
        // Check if offset is to be added
        IF TRUE
            AND #tempDirDef
            AND #data.currentDir <> #data.initialDir
        THEN
            // If offset is to be added
            IF #data.initialDir = #DIR_OPENING THEN
                // And initial direction was opening
                #tempOutput := #setpointFromPID - #data.config.offset;
            ELSIF #data.initialDir = #DIR_CLOSING THEN
                // And initial direction was closing
                #tempOutput := #setpointFromPID + #data.config.offset;
            END_IF;
        END_IF;
        
    END_REGION
    
    REGION Outputs
        
        #setpointToValve := #tempOutput;
        
    END_REGION
END_FUNCTION
 
Hast du mal geprueft welchen Stellgrad du hast im eingeschwungenen Zustand?
Ich habe naemlich gesehen das oft Ventile falsch ausgelegt werden.Das heisst bei Durchflussreglungen als Bsp. muss das Ventil einen bestimmten Widerstand zum gesamten Rohrsystem darstellen.(Ventilauthoritaet).
Wenn der Widerstands-Wert zu klein ist kannst du gar nicht regeln weil ueber dem Ventil gar kein Druckabfall ist.Ist er zu gross kriegst du die Menge nicht durch und vernichtes viel Energie.
Aus der Praxis etwa 1,2 bar Druckabfall ueber dem Ventil bei Nenndurchfluss.
Zudem kommt noch in der Verfahrenstechnik der stark nichtlineare Rohrwiderstand dazu.Das heisst dieser Druckabfall schankt ueber dem Ventil.
Das Ganze ist nicht einfach.Hat man dann noch hoehenunterschiede verschieben sich diese Kennlinien durch den statischen Gegendruck und es wird noch komplizierter.Das sind natuerlich keine in Stein gemeisseln Werte, aber so kenne ich die aus der Praxis.
Ist die Ventilauthoritaet klein muss man mit einer gleich prozentigen Kennlinie arbeiten.Das heisst das Ventil hat groessere Stellgradaenderungen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Kleinanlagen ist ja die Wahrscheinlichkeit so stark daneben zu liegen nicht so gross.Das Bsp. war bei 200m³/h.
und dieser Anlagenkonstellation.Das komplizierte ist man muss mit absoluten druecken rechnen.
Es ist wirklich kompliziert, ohne Hilfsprogramm fast unmoeglich.
1774531411509.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eher nicht.Ich wollte das nicht fuer viele Ventile machen, weil man da teure Programme kaufen muss und beherrschen.so 10K.
Ich habe das amit Excel und einem kostenlosen Hilfsprogramm Druck.exe und einem Ventilberechnunsbuch mal nachvollzogen.Grauslig.
Sosehen die Kennlinien aus die man konstruieren muss.

1774532875968.png
 
Und hier die Excel Datei.Wie gesagt das ist nur eine bestimmte Applikation.
Ich schreibe das nur, weil vielen nicht klar ist was man da Alles falsch machen kann.Auch wenn man Verfahrenstechniker ist.
Die alten Hasen so mit 30 Jahren Berufserfahrung sehen die Werte.Ich nicht.Aber selbst die koennen massiv daneben lkiegen wei alles stark nichtlinear ist.

1774533388554.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das stimmt.Man braucht extrem viel Erfahrung, man muss es wirklich abschaetzen koennen.
Jeder bloede Rohrbogen oder Hoehenunterschied veraendert die Druecke.
Man kann aber auch nicht einfach ueberdimensionieren, dann hat man keine Regelbarkeit mehr.
 
Zurück
Oben