TIA AWL Code in FUP umschreiben

batindeko

Level-2
Beiträge
104
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an Alle,
ich möchte folgende awl code in FUP umschreiben.
Im Anhang habe ich es in FUP umgeschrieben aber bin ich mir nicht sicher ob es so richtig ist.
Code:
nn1: nop 0
L Sollwert_BH_01-125[#"Regler-Nr"]
L 170.0
>=R
ON   Datensatz.Regler."Regler aktiv"
SPB nn2
T Sollwert_BH_01-125[#"Regler-Nr"]
 

Anhänge

  • snipcode.PNG
    snipcode.PNG
    8,3 KB · Aufrufe: 108
Zuletzt bearbeitet:
Die Transferanweisung fehlt in deiner FUP Lösung aber noch oder übersehe ich die? Hier muss man nämlich ein wenig nachdenken, was überhaupt kopiert werden soll und das ist bei der FUP Lösung nicht direkt ersichtlich.

Wenn du weißt, was hier kopiert werden soll, kannst du auch auf den Sprung verzichten, der war nur in AWL nötig, weil ein T Befehl nicht bedingt ausgeführt werden kann.
 
Aber so richtig schön ist das aber nicht.
Besser. über die Funktion des Codes nachdenken und dann so in FUP schreiben, dass es paßt.
Man kommt in FUP i.d.R komplett ohne Sprünge aus.
Obiger AWL-Code kopiert 170. 0 in Sollwert_BH_01-125[#"Regler-Nr"], aber der FUP-Code tut dies nicht!

Ich würde das so umsetzen:
Achtung, der vergleich ist "herumgedreht"
Bildschirmfoto 2022-11-17 um 11.31.54.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um die AWL Code zu verstehen braucht man auch was passiert nach die Transfer Befehl und auch was passiert bei das Sprungmarke m002.
Man kan vermuten, aber besser ist zeige die ganze Code.
Z.B. wenn die Sollwert weniger als 170 ist, dann wird die Transfer Befehl durchgeführt. Wenn nicht, was denn ?
 
Im Anhang habe ich es in FUP umgeschrieben aber bin ich mir nicht sicher ob es so richtig ist.
Das ist nicht korrekt (falscher Sprungzielname) und außerdem fehlt noch der MOVE von 170.0 nach Sollwert_BH_01-125[#"Regler-Nr"]

Für welche CPU soll der Code in FUP umgesetzt werden?

Wie Ralle schon schrieb, man muß den Sinn des gesamten Codes verstehen und dann sinngemäß in FUP neu schreiben. 1:1 umsetzen dieses AWL-Codes geht nicht, weil indirekte Adressierung/variable Adressierung von Array-Elementen in FUP bei S7-300/400 nicht geht und bei S7-1x00 vermutlich anders funktioniert als hier gewollt.

Harald
 
hier ist der ganze Codeteil:
im Anhang der FUP Code. Ich weiß es gibt noch verbesserungsbedarf
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
 

Anhänge

  • FUP UMSCHREIBUNG.pdf
    162,8 KB · Aufrufe: 12
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann es sein, das Sprungmarke nn2 i 5ten Zeile ist falsch. Es sollte nn1 sein ?
Und die Code in Beitrag #1 ist unterschiedlich zu den letzten Beitrag.
Tippst du die Code hier rein ?
Du weist doch dass du die Code in STEP7 markieren und kopieren kann, und dann hier direkt einfügen ?
Damit werden Tippfehler vermeidet, und unsere Zeit wird nicht mit unnötige Verwirrung verschwendet (!).

edit: So wie die AWL code in Beitrag #8 ist wird die Code zwischen nn1 und nn2 nie ausgeführt.
 
Zuletzt bearbeitet:
Wie schon geschrieben, mit etwas Nachdenken bekommt man das Ganze ohne Sprünge hin, was der Beobachtbarkeit online viel zuträglicher wäre und evtl. sogar alles in ein Netzwerk (zumindest in weniger).
 
Kann es sein, das Sprungmarke nn2 i 5ten Zeile ist falsch. Es sollte nn1 sein ?
Und die Code in Beitrag #1 ist unterschiedlich zu den letzten Beitrag.
Tippst du die Code hier rein ?
Du weist doch dass du die Code in STEP7 markieren und kopieren kann, und dann hier direkt einfügen ?
Damit werden Tippfehler vermeidet, und unsere Zeit wird nicht mit unnötige Verwirrung verschwendet (!).

edit: So wie die AWL code in Beitrag #8 ist wird die Code zwischen nn1 und nn2 nie ausgeführt.
kannst du erläutern was nicht zwischen nn1 und nn2 nie ausgeführt wird
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In Zeile 5 wird durch das SPB nn2 bedingt nach nn2 gesprungen.
In Zeile 7 wird durch das SPA nn2 unbedingt nach nn2 gesprungen.
Somit wird die Code von diese Stelle bis nn2 nie ausgeführt.

edit: Ist falsch. Wie UDP und PN/DP bemerkt, in Zeile 2 wird nach nn1 gesprungen.
 
Zuletzt bearbeitet:
@Jesper: Man kann in Zeile 2 zu nn1 springen.

@OP: Bevor du den Code Zeile für Zeile von AWL nach FUP umprogrammierst, versuch dir Gedanken zu machen, was hier eigentlich passieren soll. Zettel und Stift und einen Programmablaufplan zeichnen und danach das FUP-Programm umsetzen ist sicherlich viel hilfreicher, als diese Sprungorgien auf Teufel komm raus beizubehalten. Der spätere Anwender wird es dir danken.
 
Vermutlich hat Jesper die zweite Zeile SPB nn1 in Deinem AWL-Code übersehen.

@batindeko
Der Code ist anscheinend für eine S7-1500 CPU? Die Frage hast Du noch nicht beantwortet.

Wie kann man neuen Programmcode für eine S7-1500 in AWL programmieren?
Und dann soll den Mist jemand in FUP umsetzen, der sich mit AWL nicht gut auskennt...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In Zeile 5 wird durch das SPB nn2 bedingt nach nn2 gesprungen.
In Zeile 7 wird durch das SPA nn2 unbedingt nach nn2 gesprungen.
Somit wird die Code von diese Stelle bis nn2 nie ausgeführt.
es stimmt so
aber es hängt vom Betriebszustand BZ1 ab sobald "OPC-DB"."ZB_Betriebszustand BZ1" aktiviert wird wird diese Stelle zwischen nn1 und nn2 ausgeführt.
 
Vermutlich hat Jesper die zweite Zeile SPB nn1 in Deinem AWL-Code übersehen.

@batindeko
Der Code ist anscheinend für eine S7-1500 CPU? Die Frage hast Du noch nicht beantwortet.

Wie kann man neuen Programmcode für eine S7-1500 in AWL programmieren?
Und dann soll den Mist jemand in FUP umsetzen, der sich mit AWL nicht gut auskennt...

Harald
ja der code ist s7-1500 CPU Gedacht
 
@Jesper: Man kann in Zeile 2 zu nn1 springen.

@OP: Bevor du den Code Zeile für Zeile von AWL nach FUP umprogrammierst, versuch dir Gedanken zu machen, was hier eigentlich passieren soll. Zettel und Stift und einen Programmablaufplan zeichnen und danach das FUP-Programm umsetzen ist sicherlich viel hilfreicher, als diese Sprungorgien auf Teufel komm raus beizubehalten. Der spätere Anwender wird es dir danken.
(y)
 
Dann nochmal überleg dir erstmal genau was das Programm hier eigentlich tun soll. Am besten zerlegst du das Ganze in die Schritte, die das Programm auch macht und schreibst das Ganze nieder (am besten schriftlich) und danach machst du dir über die Programmierung Gedanken. So rum wird dann auch ein Schuh draus ;)
 
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? :unsure:

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.
 
Zurück
Oben