hier ist der ganze Codeteil:
Code:
// Sollwert einlesen
UN "OPC-DB"."ZB_Betriebszustand BZ1"// Begrenzung "min" bei BZ1 0°C, bei BZ2,3 170°C
SPB nn1
L "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
L 0.0 // 0.0°C im BZ1
>=R
SPB nn2
T "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
SPA nn2
nn1: NOP 0
L "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
L 170.0 // 170.0°C im BZ2, BZ3
>=R
ON #Datensatz.BH_Regler."Regler aktiv"//Bit: aktueller Regler aktiv
SPB nn2
T "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
nn2: NOP 0
L "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
L 400.0 // max 400.0°C
<R
SPB nn3
T "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
nn3: NOP 0
UN #Datensatz.BH_Regler."Regler aktiv"
O "OPC-DB"."ZB_Betriebszustand BZ1"
SPB SWOK
// O(
L "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
L 150.0 // 150.0°C
>=R
// )
SPB SWOK
L 149.0 // SW -->149.0°C
T "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
// SET
S "OPC-DB".ZB_BH_SW_Fehlerbit_BZ3
SWOK: NOP 0
L "OPC-DB"."Sollwerte_BH_01-125"[#"Regler-Nr"]
T #Datensatz.BH_Regler.Sollwert
Der obige Code bereitet mir KopfGrimmen.
Genauer gesagt der
Abschnitt von Lable nn3: bis hin zum Lable SWOK:.
Ich vermute mal, dass diese Passage auf "die Schnelle" nachgestrickt wurde.
Die drei überflüssigen ProgrammZeilen 'O(', ')' und 'SET' habe ich mir erlaubt, auszukommentieren.
Hier wird der SollWert nach unten auf 149.0 °C begrenzt.
Ähnliches wurde zuvor im Programm - abhängig von den beiden Zuständen 'BZ1' und 'ReglerAktiv' - bereits mehrfach gemacht, aber die Art und Weise, WIE es hier gemacht wird, ist eine andere und mir in diesem Fall unerklärlich.
Warum werden Werte < 150.0 auf den Wert 149.0 festgenagelt?
Warum nicht Werte < 149.0 auf den Wert 149.0?
Soll damit eine Hystere geschaffen werden?
Diese ProgrammPassage tut irgendwie mehr, als nur den SollWert nach unten zu begrenzen. Aber was genau ist damit beabsichtigt?
Oder ist das gar nicht beabsichtigt und nur versehentlich so programmiert?
Habe ich gerade geschrieben "Diese ProgrammPassage tut irgendwie mehr, als nur den SollWert nach unten zu begrenzen"?
Tut sie doch gar nicht! Sie tur gar nix!
Diese ProgrammPassage ist nämlich total wirkungslos!
So, wie sie programmiert ist, wird sie nur dann nicht übersprungen und könnte theoretisch etwas ausrichten, wenn ...
- der Regler aktiv ist ...
UND ...
- der BetriebsZustand BZ1 NICHT gegeben ist.
Genau bei dieser Konstellation (ReglerAktiv UND BZ1 nicht gegeben) wird aber bereits am Anfang des Programms der Sollwert auf minimal 170.0 festgenagelt.
Was soll also damit bewirkt werden, den SollWert mit dem Wert 150.0 zu vergleichen, wenn er doch sowieso nicht kleiner als 170.0 werden kann???
Shame on me, denn aufgefallen ist mir dies erst, als ich eine Tabelle angelegt habe, in der ich darstellen wollte, welche Minimal- und welche MaximalWerte bei welcher Kombination der Zustände 'ReglerAktiv' und 'BZ1' benutzt werden.
Code:
Begrenzung nach oben immer wirksam : maxVal := 400.0
Begrenzung nach unten abhängig von BZ1 und ReglerAktiv:
| /ReglerAktiv | ReglerAktiv
-----+------------------+----------------
/BZ1 | minVal := -999.9 | minVal := 170.0
| |
| | minVal := 149.0
| | BZ3err := TRUE
-----+------------------+----------------
BZ1 | minVal := 0.0 | minVal := 0.0
Stört euch bitte nicht daran, dass ich bei dem Fall "weder 'ReglerAktiv' noch 'BZ1' " eingetragen habe "minVal := -999.9"!
In diesem Fall ist laut AWL-Programm keine Begrenzung des SollWertes nach unten vorgesehen und genau das wollte ich damit zum Ausdruck bringen. Natürlich hätte ich stattdessen "minVal := -273.15" schreiben können.
Wozu die obige Tabelle? Ich wollte auf eine Lösung so etwa in dieser Form hinaus:
Code:
IF BZ1 THEN
minVal := 0.0 ;
ELSIF NOT ReglerAktiv THEN // (ab hier: BZ1 = FALSE)
minVal := -999.9 ; // beabsichtigt: KEINE Begrenzung nach unten !
ELSIF Sollwerte_BH_01-125 < 150.0 THEN
minVal := 149.0 ;
ZB_BH_SW_Fehlerbit_BZ3 := TRUE ;
ELSE
minVal := 170.0 ;
END_IF ;
Sollwerte_BH_01-125 := LIMIT(minVal, Sollwerte_BH_01-125 , 400.0) ;
Datensatz.BH_Regler.Sollwert := Sollwerte_BH_01-125 ;
Oder noch "schöner", wenn man jetzt noch die wirkungslose RätselPassage aus der AWL-Vorlage einfach ignoriert:
Code:
IF BZ1 THEN
minVal := 0.0 ;
ELSIF NOT ReglerAktiv THEN // (ab hier: BZ1 = FALSE)
minVal := -999.9 ; // beabsichtigt: KEINE Begrenzung nach unten !
ELSE
minVal := 170.0 ;
END_IF ;
Sollwerte_BH_01-125 := LIMIT(minVal, Sollwerte_BH_01-125 , 400.0) ;
Datensatz.BH_Regler.Sollwert := Sollwerte_BH_01-125 ;
Nur so als Anregung. Z.B. für diejenigen, die dies auch noch in FUP umwandeln möchten.