Einfache Pitch-Regelung mit CoDeSys

Dr_Heisenberg

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SPS-Freunde,

nun habe ich in meinem Elektrotechnik-Studium zum ersten Mal mit SPS-Programmierung zu tun und hänge direkt fest.
Es geht in Rahmen eines studentischen Projekts darum, eine technische Betriebsführung für eine etwas ältere 50-kW-Windenergieanlage auf eine FESTO CECX, also mit CoDeSys, zu programmieren. Dabei ist mir vorgegeben, nur FUP und AWL zu nutzen.

Ich bin mit der Programmierung nun schon ziemlich weit, hänge jedoch an einer Sache fest: Die Anlage besitzt die Möglichkeit, über einen Hydraulik-Zylinder den Rotorblatt-Winkel zu verstellen. Ich muss also eine Pitch-Regelung implementieren, das bekomme ich jedoch leider überhaupt nicht hin.

Ich habe mir gedacht, dass die Rotorblätter bei einer bestimmten Rotordrehzahl in den Wind gedreht werden (bspw. 15 U/min), dann bis zur Nenndrehzahl konstant im Wind bleiben und dann im Nennbetrieb (bspw. 65-75U/min Rotordrehzahl) der Rotorblattwinkel geregelt wird, um die Rotordrehzahl einigermaßen konstant zu halten. Beim Überschreiten einer bestimmten Drehzahl werden sie dann aus dem Wind gedreht.

Das einfache in- und aus dem Wind drehen ist überhaupt kein Problem. Das, was mir Probleme bereitet, weil ich überhaupt nicht weiß wie ich es mit CoDeSys umsetzen könnte, ist die Regelung im Nennbetrieb. Als Eingänge an der SPS habe ich dafür u.a. die Rotordrehzahl, den aktuellen Rotorblattwinkel und die Windgeschwindigkeit, als Ausgänge einmal "Blätter in den Wind" und einmal "Blätter aus dem Wind". Die Rotorbeschleunigung steht als Eingang nicht zur Verfügung. Wie ließe sich denn damit nun eine einfache Pitch-Regelung programmieren? Ich komme einfach nicht weiter.

Ich würde mich freuen, wenn hier vielleicht jemand ein paar Ideen oder Anregungen für die Implementierung hat. Das soll auch keine hochkomplexe Regelung werden, sondern lediglich eine einfache Umsetzung, die das Prinzip einer Pitch-Regelung aufgreift und veranschaulicht.

Vielen Dank und viele Grüße,
Nils
 
Hast du wirklich eine Pitch-Regelung? Also kannst du die Blätter von 0° bis 90° auf beliebige Position verstellen?
Deinen Angaben nach ist es eine Stall-Anlage, so dass du die Blätter nur auf zwei feste Positionen eingestellt werden können!

Der Begriff Pitch-Regelung wird vielfach in Artikeln und Veröffentlichungen im Internet besprochen. Ein einfacher Ansatz wäre die Verwendung eines PI-Reglers. Der Eingang wäre dann Nenndrehzahl minus Istdrehzahl, als Ausgang dann z.B. den Verstellwinkel. Such einfach mal mit einer der üblichen Suchmaschinen nach "Wind Turbine Pitch Control" und/oder "VSPR" was für Variable Speed Pitch Regulated steht. Natürlich unter der Bedingung das du wirklich eine Pitch-Regelung benötigst.
 
Zuletzt bearbeitet:
Hast du wirklich eine Pitch-Regelung? Also kannst du die Blätter von 0° bis 90° auf beliebige Position verstellen?
Deinen Angaben nach ist es eine Stall-Anlage, so dass du die Blätter nur auf zwei feste Positionen eingestellt werden können!

Hallo Neals,

ja, ich habe die Möglichkeit, jeden beliebigen Winkel einzustellen (und dieser steht mir auch als analoger Eingang zur Verfügung). Die Verstellung erfolgt hydraulisch, indem ich über die SPS die Hydraulikventile für jeweils eine Drehrichtung ansteuere.
Setze ich also bspw. den Ausgang "Flügel in den Wind", wird das entsprechende Hydraulikventil geöffnet und die Flügel eben für eine bestimmte Zeit oder bis zu einem bestimmten Ereignis o.ä. in den Wind gedreht.

Vielen Dank schon einmal für deine Antwort, ich werde mich mal auf die Suche begeben.

Meiner Meinung nach ist diese Vorgabe, AWL zu nutzen, reichlich antiquiert. Diese Programmiersprache wird aussterben. ST wäre die sinnvollere Variante, erst recht im Studium.

Das sehe ich ganz genauso. Es ist allerdings auch keine muss- sondern eher eine sollte-besser-Vorgabe. Für Umsetzungsmöglichkeiten in ST bin ich also ebenso dankbar! Hätte ich erwähnen sollen, sorry.


Viele Grüße,
Nils
 
Zuletzt bearbeitet:
Hallo Neals,

ja, ich habe die Möglichkeit, jeden beliebigen Winkel einzustellen (und dieser steht mir auch als analoger Eingang zur Verfügung). Die Verstellung erfolgt hydraulisch, indem ich über die SPS die Hydraulikventile für jeweils eine Drehrichtung ansteuere.
Setze ich also bspw. den Ausgang "Flügel in den Wind", wird das entsprechende Hydraulikventil geöffnet und die Flügel eben für eine bestimmte Zeit oder bis zu einem bestimmten Ereignis o.ä. in den Wind gedreht.

Vielen Dank schon einmal für deine Antwort, ich werde mich mal auf die Suche begeben.

Hier findest du ein paar Grundlagen erklärt: www.intechopen.com/books/wind-turbines/control-system-design

Soweit ich das verstehe, hast du also zwei digitale Ausgänge:
Code:
bPitchFeather AT %Q* : BOOL; // pitch to feather position (90°)
bPitchZero AT %Q*: BOOL; // pitch to zero position (0°)

Als Feedback erhältst du mehrere analoge Signale:
Code:
fRotorSpeed AT %I* : REAL; // [r/m] rotor speed actual
fPitchPosition AT %I*: REAL; // [°] pitch position actual (0..90°)
fWindSpeed AT %I* : REAL; // [m/s] wind speed actual

Als Parameter wären folgende Variablen nötig:
Code:
fPitchPositionZero : REAL := 0.0; // [°] minimum pitch position at zero position
fPitchPositionFeather : REAL := 90.0; // [°] maximum pitch position at feather position
fRotorSpeedNominal : REAL := 16.0; // [r/m] nominal rotor speed

Die Verwendung eines PD-Reglers wäre möglich. Ein Integraler-Anteil ist nicht notwendig, da das Pitch-System ein Integrator darstellt.
Code:
VAR
   fbPID : FB_PID;
END_VAR

fbPID(
  fError := fRotorSpeedNominal - fRotorSpeed,
  fKp := 1.0,  // proportional gain
  fTn := 0.0, // integral part ignored
  fTv := 0.1, // derivative gain
  fTd := 1.0); // derivative damping

Hier müssten die Parameter natürlich an die dynamik des Rotors angepasst werden. Auf Basis des Ausgang könnten nun die Ventile geschaltet werden. Ich verwende +/- 1.0 als Hysterese um den Reglerausgang zum Schalten.
Code:
bPitchZero := fbPID.fCtrlOutput > +1.0; // actual speed below nominal => pitch zero (into the wind)
bPitchFeather := fbPID.fCtrlOutput < -1.0; // actual speed above nominal => pitch feather (out of wind)

Natürlich müssen die Endlagen vom Pitch-System überprüft werden und dementsprechend die Ausgänge blockiert:
Code:
IF fPitchPosition <= fPitchPositionZero THEN
   bPitchZero := FALSE;
ELSE
  bPitchZero := fbPID.fCtrlOutput > +1.0; // actual speed below nominal => pitch zero (into the wind)
END_IF

IF fPitchPosition >= fPitchPositionFeather THEN
  bPitchFeater := FALSE;
ELSE
  bPitchFeather := fbPID.fCtrlOutput < -1.0; // actual speed above nominal => pitch feather (out of wind)
END_IF

Der gesamte Code diehnt als Sample und wurde nicht getestet!

Bedenke außerdem, das du bei irgendeinem Fehler der Anlage, sei es elektrisch oder mechanisch, die Anlage abgeschaltet werden muss. Das Abschalten und Stoppen der Anlage passiert hauptsächlich über den Pitch, da dieser die Rotordrehzahl beeinflusst. Somit muss bei Fehler immer das Pitch-System in die Endlage fahren um den Rotor zu stoppen. Dies wird häufig Emergency Feather o.ä. genannt.
Code:
IF bFault AND fPitchPosition >= fPitchPositionFeather THEN
  bPitchFeather := TRUE;
  bPitchZero := FALSE;
END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wow - vielen Dank! Das sieht sehr gut aus. Ich werde mal versuchen, dieses Konzept in FUP zu implementieren, auch wenn das wohl nicht besönders schön ist.

Ein Abschalten der Anlage habe ich bedacht und auch schon teilweise implementiert, sodass die Flügel bei Störungen aus dem Wind gedreht werden. Die Anlage verfügt aber auch über eine Rotorbremse, die beim Durchgehen des Generators oder hohen Schwingungen in der Gondel über eine Feder ausgelöst wird und den Rotor in wenigen Sekunden zum stehen bringen sollte.

Ganz vielen Dank und viele Grüße,
Nils
 
Um den Kommentar von trinitaucher zu unterstreichen: Mach' Dich nicht unglücklich mit KOP/FUP/AWL. Ich habe selbst jahrelang S7 programmiert und war selbst eingefleischter AWL-Verfechter. Aber in der Codesys-Welt sind ST und CFC die Sprachen der Wahl. Die Editoren sind deutlich besser umgesetzt als die für die vorgenannten Sprachen.

Wer für eine Codesys-basierte Steuerung die Vorgabe FUP oder AWL macht, hat möglicherweise zu wenig Erfahrung mit der Programmierumgebung.

Insofern - ich würde das ausführliche Beispiel von Neals oben so als Basis nehmen und in ST damit weiterarbeiten.

Grüße,
mattsches
 
Hallo,

einfachste Möglichkeit das Thema "AWL, FUP, CFC" vom Tisch zu bekommen die Kernfunktionen in einer Bibliothek zu verstecken. Keiner fragt mit welcher Sprache diese erstellt wurden. Dann die Lib einbinden und in CFC oder was auch immer verwenden.

Thema vom Tisch.

Grüße
excelite
 
Zurück
Oben