FB58 Regler

M-Arens

Level-1
Beiträge
108
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

cih beschäftige mich gerade mit dem Reglerbaustein FB58. Ich habe im Siemens Handbuch gesehen, das es dazu ein Beispiel Projekt gibt. Ich habe mien Step7 leider ohne Beispiel-Projekte installiert. Kann mir einer von euch sagen wo ich das Projekt her bekommen kann, oder muss mein Step7 nochmal drüber bügeln?
Danke!
 
Ich denke wenn du Step7 nochmals Benutzerdefiniert installierst müsste man auswählen können ob die Beispiele installiert werden sollen.

mfg Erick
 
Zuviel Werbung?
-> Hier kostenlos registrieren
War mir zu kompliziert das Ding.

Also nehme ich einen selbstgestrickten, namens EASY_PID.
Bisher noch keine Probleme damit gehabt, aber auch noch keine komplexen Regelungen damit realisiert.

Code:
FUNCTION EASY_PID : REAL
TITLE = 'EASY_PID'
VAR_INPUT
    X : REAL;
    KP : REAL;
    KI : REAL;
    KD : REAL;
    LIM_H : REAL;
    LIM_L : REAL;
    SUP_LEV : REAL;
    On : BOOL;
END_VAR
VAR_IN_OUT
    LetztZeit : TIME;
    Xsum : REAL;
    Xalt : REAL;
END_VAR
    
VAR_TEMP
    YP : REAL;
    YI : REAL;
    YD : REAL;
    Ta : REAL;
    Y : REAL;
    tOn : BOOL;
END_VAR
    
BEGIN
    tOn := On;
    
    IF ABS(X) < SUP_LEV THEN
        tOn := FALSE;
    END_IF;        
    Ta := DINT_TO_REAL( Zeitdiff(LetztZeit :=  LetztZeit)) / 1000;  // in Sekunden
     
    IF tOn THEN
        Xsum := Xsum + X * KI * Ta;
    ELSE
        Xsum := 0.0;
    END_IF;
    YP := X * KP;
    YI := Xsum;
    YD := KD * (X - Xalt)/Ta;
    
    IF tOn THEN
        Y := YP + YI + YD;
    ELSE
        Y := 0.0;
    END_IF;
    
    IF Y >= LIM_H THEN
        Y := LIM_H;
        IF KI <> 0 THEN  
            Xsum := LIM_H - YP; 
        ELSE
            Xsum := 0;
        END_IF;
        OK := TRUE;
    ELSIF Y <= LIM_L THEN
        Y := LIM_L;
        IF KI <> 0 THEN 
            Xsum := LIM_L - YP; 
        ELSE
            Xsum := 0;
        END_IF;
        OK := TRUE;
    ELSE
        OK := FALSE;
    END_IF;
    EASY_PID := Y;    
    Xalt := X;

END_FUNCTION

Und hier der Zeitdiff-Baustein:

Code:
FUNCTION FC 162 : DINT
TITLE =
VERSION : 0.0

VAR_IN_OUT
  LetztZeit : TIME ; 
END_VAR
VAR_TEMP
  Zeit : TIME ; 
END_VAR
BEGIN
NETWORK
TITLE =Zeitscheibe ermitteln
      CALL SFC   64 (
           RET_VAL                  := #Zeit);
      L     #Zeit; 
      L     #LetztZeit; 
      -D    ; 
      T     #RET_VAL; 
      L     #LetztZeit; 
      L     #Zeit; 
      >D    ; 
      SPBN  zmkw; 
      L     #LetztZeit; 
      L     DW#16#7FFFFFFF; 
      -D    ; 
zmkw: T     #LetztZeit; 
END_FUNCTION

Anbei noch der zugrundeliegende Artikel, der mich auf die Idee brachte.
 

Anhänge

  • __www.rn-wissen.de_index.php_Regelungstechnik.pdf
    402,4 KB · Aufrufe: 108
Zurück
Oben