TIA Hilfe bei Verständnis der Schleife in AWL

batindeko

Level-2
Beiträge
104
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
//Digitale Ausgänge ansteuern
// Pro Zyklus werden 8 Ausgaenge angesteuert

//Bytestzähler 1 bis 13 Bytes x 8 = 104  BH (Begleitheizungsregler)

L "BH_Regler_DB".Byteszähler
+  1
T "BH_Regler_DB".Byteszähler
L  13
<=I
SPB weit
L  1
T "BH_Regler_DB".Byteszähler
weit: NOP 0

L  "BH_Regler_DB".Stellenwertzähler ["BH_Regler_DB".Byteszähler]
+  1
T "BH_Regler_DB".Stellenwertzähler ["BH_Regler_DB".Byteszähler]
L  100
SPB m001
L  0
T  "BH_Regler_DB".Stellenwertzähler ["BH_Regler_DB".Byteszähler]
m001: NOP 0


L  "BH_Regler_DB".Byteszähler
L  1
-I
L  8
*I
T #Bytenummer_x_8

L  1
T  #Bitnummer_output


loop: NOP 0
L  #Bytenummer_x_8
L   #Bitnummer_output
+I
T  #Regler_Nr_Temp

O(
L  #Bitnummer_output
+ 1
T  #Bitnummer_output
L  9
>I
)
O(
L  #Regler_Nr_Temp
L  100                              max 100 Regler
>I
)
BEB                               // Byte angesteuert!!

L  "BH_Regler_DB".Regler_Begleitheizung[#Regler_Nr_Temp].BH_Regler.Stellwert_Integer
L  "BH_Regler_DB".Stellenwertzähler["BH_Regler_DB".Byteszähler]
>I
= "BH_Regler_Outputarray"."Output_BH[1..100]"[#Regler_Nr_Temp]

SPA  loop

Hallo liebe Freunde,
ich möchte dieses AWL-Programm in SCL umschreiben. Es handelt sich um die Ansteuerung der digitalen Ausgänge. Jeder digitaler Ausgang steuert ein SSRelais.
Im Moment verstehe ich den Ablauf des Programms in loop Schleife nicht. Aus meiner sicht werden die Variable #Regler_Nr_Temp und "BH_Regler_DB".Bytezähler nicht inkrementiert.
 
Willst Du diesen "faule-Programmierer-Code" nicht besser ganz wegwerfen?
Frage mal Deinen Kunde, was der davon hält. Ich kenne einige Firmen (einschließlich uns), wo indirekte Adressierung von Eingängen und Ausgängen verboten ist.
 
Irgendwo gibts vermutlich auch noch 100 Regler dazu? Da hat sich wohl jemand gedacht, 100 Regler pro Zyklus sind zu viel...
Regler_Nr_Temp wird am Beginn der Schleife inkrementiert und der Bytezähler ganz am Anfang von Deinem Code...
M.M. fehlt vorm SPB m001 noch nen <=I ???

Also ich würd mir für die neue SPS auch was anderes überlegen. Vielleicht kann die auch 100 Regler + 100 PWM-Bausteine in einem Weckalarmzyklus? Was wird das denn für eine SPS und gibts die Regler überhaupt?

So ganz hab ich noch nicht verstanden, was das Konstrukt machen soll, vor allem das hier:
Code:
L  "BH_Regler_DB".Regler_Begleitheizung[#Regler_Nr_Temp].BH_Regler.Stellwert_Integer
L  "BH_Regler_DB".Stellenwertzähler["BH_Regler_DB".Byteszähler]
>I
= "BH_Regler_Outputarray"."Output_BH[1..100]"[#Regler_Nr_Temp]

Wahrscheinlich soll das sowas wie ne verkappte PWM Ansteuerung sein.
 
Zuletzt bearbeitet:
Da SPS-Programm soll auf eine 1500 Steuerung laufen. Für die Regelung wird eine PI-Regelung genutzt. Der Stellwert wird über PWM angesteuert. Deshalb denke ich wurde dieses Code-Teil geschrieben wo die digitale Ausgänge von 0 auf 24 V geschaltet werden und über eine SSR-Relais die Regelstrecke die notwendige Leistung weitergeben.
Im Programm die erste Stelle wo die Zahl 100 steht oben entspricht die 100% Leistung.
Die zweite Stelle wo die 100 steht befindet sich in der Schleife und steht für die max. Regleranzahl.
Wenn ich es nun richtig verstanden habe, werden nacheindander die digitale Ausgaänge der jeweiligen Regler ein bzw. ausgeschaltet.
 
Irgendwo gibts vermutlich auch noch 100 Regler dazu? Da hat sich wohl jemand gedacht, 100 Regler pro Zyklus sind zu viel...
Regler_Nr_Temp wird am Beginn der Schleife inkrementiert und der Bytezähler ganz am Anfang von Deinem Code...
M.M. fehlt vorm SPB m001 noch nen <=I ???

Also ich würd mir für die neue SPS auch was anderes überlegen. Vielleicht kann die auch 100 Regler + 100 PWM-Bausteine in einem Weckalarmzyklus? Was wird das denn für eine SPS und gibts die Regler überhaupt?

So ganz hab ich noch nicht verstanden, was das Konstrukt machen soll, vor allem das hier:
Code:
L  "BH_Regler_DB".Regler_Begleitheizung[#Regler_Nr_Temp].BH_Regler.Stellwert_Integer
L  "BH_Regler_DB".Stellenwertzähler["BH_Regler_DB".Byteszähler]
>I
= "BH_Regler_Outputarray"."Output_BH[1..100]"[#Regler_Nr_Temp]

Wahrscheinlich soll das sowas wie ne verkappte PWM Ansteuerung sein.
genau.
Code:
L  "BH_Regler_DB".Regler_Begleitheizung[#Regler_Nr_Temp].BH_Regler.Stellwert_Integer  //der errechnete aus dem PID-Algorithmus Stellwert

L  "BH_Regler_DB".Stellenwertzähler["BH_Regler_DB".Byteszähler]            // eine gebastelte Array aus vordefinierte Stellwerte(z.B 10 bis 90)

>I

= "BH_Regler_Outputarray"."Output_BH[1..100]"[#Regler_Nr_Temp]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Stellwertzähler zählt halt alle 13 Zyklen um 1 hoch, und falls dann der jeweilige Reglerstellausgang größer als der jeweilige Stellwertzähler, dann Begleitheizung EIN.
Alle 1300 Zyklen fängt der Stellwertzähler wieder bei 0 an. Die Periodendauer des PWM Signals ist also 1300 * Zykluszeit. Ich geh mal davon aus, das ganze wird in nem Weckalarm aufgerufen.
 
Zuletzt bearbeitet:
gibt es eine elegantere Lösung als eine Schleife??
Naja, einen einzelnen kleinen PWM-Baustein schreiben und den 100 mal direkt mit dem Reglerausgang und dem Ausgang für die Begleitheizung beschalten. Oder gleich nen PI-Regler mit PWM-Ausgang nehmen.

Warum willst Du das überhaupt in SCL umschreiben? Ist doch eh schon AWL Code für ne 1500er? Fehlen halt nur ein par Kommentare und die eine Codezeile.
Wird am Ende wirklich ein DO-Output-Array beschrieben oder wird das später nochmal an die wirklichen DOs angebunden? Einzelne Ausgänge nur alle par Zyklen zu setzen fänd ich persönlich jetzt nicht so schön.
Was ich an dem Code blöde finde ist, dass man die PWM-Periodendauer nicht wirklich einstellen/einsehen kann und halt zu wenig kommentiert, was das ganze soll. Aber vielleicht steht ja im Netzwerkkommentar oder Bausteinkommentar noch mehr...

Also den Code 1:1 in SCL umzuschreiben machts nicht wirklich schöner!
 
Zuletzt bearbeitet:
Naja, einen einzelnen kleinen PWM-Baustein schreiben und den 100 mal direkt mit dem Reglerausgang und dem Ausgang für die Begleitheizung beschalten
wo finde ich beispiele für PWM-Baustein
Wird am Ende wirklich ein DO-Output-Array beschrieben oder wird das später nochmal an die wirklichen DOs angebunden? Einzelne Ausgänge nur alle par Zyklen zu setzen fänd ich persönlich jetzt nicht so schön.
Ja die DO-Array Output wird am ende beschrieben aber nur ein paar einzelne pro zyklus werden gesetzt
Was ich an dem Code blöde finde ist, dass man die PWM-Periodendauer nicht wirklich einstellen/einsehen kann und halt zu wenig kommentiert, was das ganze soll. Aber vielleicht steht ja im Netzwerkkommentar oder Bausteinkommentar noch mehr...
ich weiss nur dass es 10s ist aber wie du sagt wo das getan wurde ist mir auch ein rätsel
Also den Code 1:1 in SCL umzuschreiben machts nicht wirklich schöner!
ich möchte den Teil anders schreiben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Stellwertzähler zählt halt alle 13 Zyklen um 1 hoch, und falls dann der jeweilige Reglerstellausgang größer als der jeweilige Stellwertzähler, dann Begleitheizung EIN.
Alle 1300 Zyklen fängt der Stellwertzähler wieder bei 0 an. Die Periodendauer des PWM Signals ist also 1300 * Zykluszeit. Ich geh mal davon aus, das ganze wird in nem Weckalarm aufgerufen.
das ganze wird in einem OB-Weckalarm aufgerufen.
eine Frage von welche Zyklen meinst du hier verstehe ich nicht? SPS-Zykluszeit etwa?
 
das ganze wird in einem OB-Weckalarm aufgerufen.
eine Frage von welche Zyklen meinst du hier verstehe ich nicht? SPS-Zykluszeit etwa?
Dein Code wird dann im WeckalarmOB-Zyklus ausgeführt. Der macht nicht jedes mal das gleiche, sondern liest/beschreibt in jedem Aufruf andere Variablen...

Zum Beispiel die Variable "BH_Regler_DB".Stellenwertzähler[7] wird bei jedem dreizehnten Aufruf des Codes um 1 erhöht. Wenn sie bei 100 ist, wird sie wieder auf 0 gesetzt... also nach 1300 Aufrufen ...
 
Zuletzt bearbeitet:
Schau Dir mal den TCONT_CP an...
Das Technologieobjekt TCONT_CP stellt einen kontinuierlichen Temperaturregler mit
Pulsgenerator zur Verfügung.

oder den PID_Compact...
Über eine Pulsweitenmodulation wird der Wert am Ausgangsparameter Output in eine
Impulsfolge transformiert, die am Ausgangsparameter Output_PWM ausgegeben wird.

was für eine 1500er hast Du denn? Ob die 100 Bausteinaufrufe verkraftet, weiss ich nicht, evtl. in zeitversetze Weckalarme einbauen...

ansonsten nen PWM-Baustein selber schreiben, sind vielleicht 10 Zeilen...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber 100 von dieser PID Compact zu benutzen ist zu viel Aufwand
was für eine 1500er hast Du denn?
CPU 1516-3 PN/DP
PWM-Baustein selber schreiben
ich würde ein FC schreiben
mit folgende Input und Output
Input
Stellwert_Int: INT;
Periodendauer: TIME;

Output
PWM_Signal: BOOL;

Aber mir fehlt noch gedanklich den Zusammenhang zwischen den Stellwert_Int und der PWM_Signal. Vielleicht fehlt noch was ...
 
Standard FB für 1 Reglerkreis erstellen.
Wenn das 100 Regler sind, dann die FB 100 mal aufrufen mit je ein Instanz.
Jede Regler muss mit EA befuttert werden. Das passiert am einfachsten mit normalen Parameter Eingänge und Ausgänge auf die FB.
Keine Schleifen. Und keine Multi-Instanz, wenn da kein bestimmte Grund dafür ist.
Obwohl man denkt dass es ist effizienter mit eine Schleife, dann ist die Code ohne Schleife viel einfacher zu verstehen und für die Fehlersuche.
Wenn die FB erstellt ist, tippt man in ein paar Stunden die 100 Instanze ein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber 100 von dieser PID Compact zu benutzen ist zu viel Aufwand
Dafür fallen ja die 100 jetzt schon vorhandenen Regler weg.. die 1516 sollte 100 Regler eigentlich packen...
Aber mir fehlt noch gedanklich den Zusammenhang zwischen den Stellwert_Int und der PWM_Signal.
Steht doch alles in dem anderen Thread oder bei Wikipedia

Der Hintergrund, warum wir hier auf dem PID_Compact oder TCONT_CP rumreiten ist eben genau, dass viele Leute bei dem Ursprungscode nicht durchblicken...
 
Zuletzt bearbeitet:
Zurück
Oben