Automation Studio : PID Regler

sschultewolter

Level-1
Beiträge
54
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich stehe gerade wieder bei AS auf dem Schlauch.

Ich benötige einen PID-Regler für eine Leistungsreglung eines Brenners.
Gegeben sind mir Ist-Wert -> actValue, Soll-Wert -> setValue. Der Brenner soll von 0-100% Prozent fahren. Gibt es hierfür eine einfachere Methode (Keine Zweipunktregelung). Der Brenner wird über den Analog Output mittel 0..10V angesteuert.



Code:
PROGRAM _INIT

(* Init variables *)
setValue      := 1000;
start         := FALSE;
tuningRequest := LCPID_TUNE_REQU_OFF;


(* Parameters for PID tuning *)
LCPIDTune_0.Y_min          := 0;
LCPIDTune_0.Y_max          := 32767;
LCPIDTune_0.Y0             := 6300;
LCPIDTune_0.Y1             := 11300;
LCPIDTune_0.X0             := 250;
LCPIDTune_0.X_min          := -10000;
LCPIDTune_0.X_max          := 10000;
LCPIDTune_0.P_manualAdjust := 0;
LCPIDTune_0.I_manualAdjust := 0;
LCPIDTune_0.D_manualAdjust := 0;
LCPIDTune_0.pAddPar        := ADR(addParameter);
LCPIDTune_0.pOptions_osc   := ADR(oscOptions);
LCPIDTune_0.pOptions_step  := ADR(stepOptions);


(* Parameters for PID controller *)
LCPID_0.A        := 0;
LCPID_0.Y_man    := 100;
LCPID_0.Y_fbk    := 100;
LCPID_0.hold_I   := FALSE;
LCPID_0.out_mode := LCPID_OUT_MODE_AUTO;


(* Parameters for extruder simulation model *)
extruderLCRSimModExt.enable   := 1;
extruderLCRSimModExt.Tt_h     := 900000;	(* microseconds *)
extruderLCRSimModExt.Tt_c     := 500000;	(* microseconds *)
extruderLCRSimModExt.k_h      := 39;
extruderLCRSimModExt.k_c      := 0.012;
extruderLCRSimModExt.PT2_T1   := 5.0;
extruderLCRSimModExt.PT2_T2   := 12.5;
extruderLCRSimModExt.Temp_amb := 250;
extruderLCRSimModExt.Temp_c   := 250;
extruderLCRSimModExt.Alpha_c  := 0.0;




END_PROGRAM




PROGRAM _CYCLIC


(* Time base counter *)
baseLCCounter();
(* PID tuning *)
LCPIDTune_0.enable   := start;
LCPIDTune_0.okToStep := LCPIDTune_0.rdyToStep;
LCPIDTune_0.request  := tuningRequest;
LCPIDTune_0.basetime := baseLCCounter.mscnt;
LCPIDTune_0();			(* LCPIDTune function block call *)
IF LCPIDTune_0.state = LCPID_TUNE_STATE_FINISHED THEN
  tuningRequest := LCPID_TUNE_REQU_OFF;
END_IF
  
(* PID controller *)
LCPID_0.enable   := start;
LCPID_0.ident    := LCPIDTune_0.ident; (* ident of PIDTune -> provides parameters (Kp, Tn, Tv, ...) *)
LCPID_0.W        := setValue;
LCPID_0.X        := actValue;
LCPID_0.basetime := baseLCCounter.mscnt;
LCPID_0();			(* LCPID function block call *)
manipulatedVar := LCPID_0.Y;
(* Extruder simulation model *)
extruderLCRSimModExt.Alpha_h := INT_TO_REAL(manipulatedVar) / 327.67;
extruderLCRSimModExt();		(* LCRSimModExt function block call *)
actValue := REAL_TO_INT(extruderLCRSimModExt.y);


END_PROGRAM
 
Kam bis jetzt noch nicht in die Verlegenheit mit den Regelalgo. von B&R zu spielen, aber kann es sein das du den falschen Baustein verwendest? Probier mal LCRTempPID() aus, afaik sollte das der PID-Regler für Temp. sein.

edit: Bzw. guck mal unter LoopConr -LCRTempTune() in der Hilfe nach.[h=1][/h]
 
Der sieht wie folgt aus

Code:
PROGRAM _INIT(* init program *)
(* Init variables *)
setTemp := 50.0;
tuningRequest := 0;
(* Parameters for PID controller *)
tempContLCRSlimPID.enable := TRUE;
(* Parameters for extruder simulation model *)
extruderLCRSimModExt.enable   := TRUE;
extruderLCRSimModExt.Tt_h     := 900000;	(* microseconds *)
extruderLCRSimModExt.Tt_c     := 500000;	(* microseconds *)
extruderLCRSimModExt.k_h      := 3.9;
extruderLCRSimModExt.k_c      := 0.012;
extruderLCRSimModExt.PT2_T1   := 5.0;
extruderLCRSimModExt.PT2_T2   := 12.5;
extruderLCRSimModExt.Temp_amb := 25.0;
extruderLCRSimModExt.Temp_c   := 25.0;
extruderLCRSimModExt.Alpha_c  := 0.0;


END_PROGRAM




PROGRAM _CYCLIC
(* cyclic program *)(* PID controller *)tempContLCRSlimPID.W       := setTemp;
tempContLCRSlimPID.X       := actTemp;
tempContLCRSlimPID.request := tuningRequest;
tempContLCRSlimPID.pPar    := ADR(contPara);
tempContLCRSlimPID();		(* LCRSlimPID function block call *)
manipulatedVar := tempContLCRSlimPID.Y;(* Extruder simulation model *)
extruderLCRSimModExt.Alpha_h := manipulatedVar;
extruderLCRSimModExt();		(* LCRSimModExt function block call *)
actTemp:= extruderLCRSimModExt.y;
END_PROGRAM

In der Simulation schwingt sich actTemp automatisch hoch. Sprich es kommt zum Abgleich mit setTemp. Dabei ändere ich den Ist-Wert überhaupt nicht.
 
Normalerweise gehe ich folgendermaßen vor.
1.) tuningRequest setzen z.B.: 1 --> Schwingversuch wird durchgeführt
2.) warten bis Tuning fertig. --> tempContLCRSlimPID.PIDTune_inst.state wird 0
3.) tuningRequest setzen 4: --> die ermittelten Parameter aus Autotuning werden in Reglerparameter übertragen
4.) tuniingRequest rücksetzen 0: --> Regler ist betriebsbereit

Probier diese Vorgehensweise mal aus.
Dann sollte der Regler schon einmal anständig regeln. ;)
 
Hallo,

Ich hätte nur die Frage beim einschalten des Reglers.
Also wenn ich einen warmstart mache und Start auf True setze
wird der ausgang gesetzt??

Also um gleich etwas zu erklären, ich habe eine MSR -Anlage mit zwei tanks.
Es geht darum ein niveau im ersten Tank zu halten. Es funktioniert zwar aber
mich wundert es das am anfang er meine Elektro-pneumatischen glieder nicht auffährt.
Deswegen verstehe ich es nicht das er sich die parameter ausrechnen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich kenne die Problematik und es gibt eine sehr einfache Lösung.
Leider erklärt die AS- Hilfe nicht, dass der PID nach einem Warm- oder Kaltstart seine Tuningparameter wieder verliert.

Das Vorgehen:

PID wie beschrieben konfigurieren.
An "request" Variable anschließen (UDINT)
An "pPar" Zeiger auf Strukturvariable.
Nach abgeschlossenem Tuning die Parameter in angeschlossene Struktur auslesen (request 4).
Werte notieren.
Zu globale Variablen springen.
"request" Variable auf Constant setzen. Value 3
Strukturvariable auf Constant setzen. Value: ausgelesene Werte eintragen.

Somit liest der PID kontinuierlich seine Parameter aus der angeschlossenen Struktur und regelt nach diesen.
Ein Rücksetzen von "request" auf 0 ist nicht erforderlich.

Die Einstellungen bleiben nun auch nach einem Warm- oder Kaltstart erhalten.;)
 
Zurück
Oben