TIA Schleife mit Symbolischer Adressierung

dotti

Level-1
Beiträge
7
Reaktionspunkte
0
Hallo Zusammen,

ist es möglich so etwas in eine Schelife zu packen in AWL oder SCL?

LG

Klaus


Code:
     CALL  #I_WaZy[1]
         ZyZ   :="RMU_Kom_SchND".ZyZ
         ZyZGw :="RMU_Kom_SchND".BB_01.ZyZGW
         WaZy  :="RMU_Kom_WaZy".BB_01

     CALL  #I_WaZy[2]
         ZyZ   :="RMU_Kom_SchND".ZyZ
         ZyZGw :="RMU_Kom_SchND".BB_02.ZyZGW
         WaZy  :="RMU_Kom_WaZy".BB_02

     CALL  #I_WaZy[3]
         ZyZ   :="RMU_Kom_SchND".ZyZ
         ZyZGw :="RMU_Kom_SchND".BB_03.ZyZGW
         WaZy  :="RMU_Kom_WaZy".BB_03
 
ist es möglich so etwas in eine Schelife zu packen in AWL oder SCL?
Ja, z.B. so:
Code:
FOR #i := 0 TO 2 BY 1  DO
    #I_WaZy[#i + 1](
         ZyZ   := "RMU_Kom_SchND".ZyZ,
         ZyZGw := MUX(K := #i, IN0 := "RMU_Kom_SchND".BB_01.ZyZGW, IN1 := "RMU_Kom_SchND".BB_02.ZyZGW, IN2 := "RMU_Kom_SchND".BB_03.ZyZGW),
         WaZy  := MUX(K := #i, IN0 := "RMU_Kom_WaZy".BB_01,        IN1 := "RMU_Kom_WaZy".BB_02,        IN2 := "RMU_Kom_WaZy".BB_03));
END_FOR;
Besser wäre aber, auch RMU_Kom_SchND".BB[xx].ZyZGW und "RMU_Kom_WaZy".BB[xx] noch als Arrays anzulegen. Dann braucht's die Muxxe nicht.
;)


PS:
Kann sein, dass die MUX-Auswahl auch noch mit IN0 anfangen muss. Da gibt sicher die Hilfe Auskunft.

PPS:
Ist so. Hab' daher den Code oben noch korrigiert
 
Zuletzt bearbeitet:
Code:
     CALL  #I_WaZy[1]
         ZyZ   :="RMU_Kom_SchND".ZyZ
         ZyZGw :="RMU_Kom_SchND".BB_01.ZyZGW
         WaZy  :="RMU_Kom_WaZy".BB_01

     CALL  #I_WaZy[2]
         ZyZ   :="RMU_Kom_SchND".ZyZ
         ZyZGw :="RMU_Kom_SchND".BB_02.ZyZGW
         WaZy  :="RMU_Kom_WaZy".BB_02

     CALL  #I_WaZy[3]
         ZyZ   :="RMU_Kom_SchND".ZyZ
         ZyZGw :="RMU_Kom_SchND".BB_03.ZyZGW
         WaZy  :="RMU_Kom_WaZy".BB_03

Ja, z.B. so:
Code:
FOR #i := 0 TO 2 BY 1  DO
    #I_WaZy[#i + 1](
         ZyZ   := "RMU_Kom_SchND".ZyZ,
         ZyZGw := MUX(K := #i, IN0 := "RMU_Kom_SchND".BB_01.ZyZGW, IN1 := "RMU_Kom_SchND".BB_02.ZyZGW, IN2 := "RMU_Kom_SchND".BB_03.ZyZGW),
         WaZy  := MUX(K := #i, IN0 := "RMU_Kom_WaZy".BB_01,        IN1 := "RMU_Kom_WaZy".BB_02,        IN2 := "RMU_Kom_WaZy".BB_03));
END_FOR;

naja, da finde ich die erste Variante eigentlich "schöner" vor allem aber übersichtlicher, selbst wenn man das 100 mal machen müsste ;)

In AWL kommts drauf an, für welche SPS. Bei der 300er gibts diese variable Indizierung nicht. Bei ner 1500er schon.

Bei der 300er würds dann nicht symbolisch gehen, sondern nur absolut mit Pointern...

Gruß.
 
Besser wäre aber, auch RMU_Kom_SchND".BB[xx].ZyZGW und "RMU_Kom_WaZy".BB[xx] noch als Arrays anzulegen. Dann braucht's die Muxxe nicht.

Super Danke, werd ich gleich testen :-)

Mit AWL und ohne Arrays bei den zuzuweisenden Variablen sehe ich das auch so.

naja, auch in SCL würd ich das mit den Muxen nicht machen, zumal es für die 3 Aufrufe überhaupt keinen Sinn macht... Da musst ja nach 3 Jahren selbst 5min überlegen, warum Du das damals gemacht hast. Und nein, ich würds nicht "gleich testen" ;)
 
naja, auch in SCL würd ich das mit den Muxen nicht machen, zumal es für die 3 Aufrufe überhaupt keinen Sinn macht... Da musst ja nach 3 Jahren selbst 5min überlegen, warum Du das damals gemacht hast. Und nein, ich würds nicht "gleich testen" ;)
Das hatte ich mit den Arrays gemeint, weil die Muxxe noch unflexibel sind, wenn man beim Array of FB jetzt z.B. 4 Member benötigt..

Und ja, eine Schleife macht nur Sinn, wenn die "3" Aufrufe variabel sein sollen und nicht nur der Programmierer zu bequem zum 3x Tippen ist (und selbst das sieht hier bei der Schleife auch nach mehr aus).



Aber die ursprüngliche Frage war ja, ob "möglich" und nicht ob "sollte man".
;)
 
Zuletzt bearbeitet:
Hi,

ich habt natürlich recht, mit "Mux" wird es zwar etwas weniger Code aber nicht viel.
Ich bräuchte eigentlich etwas wie String zusammen basteln.

Ich muss das leider nicht nur 3 mal aufrufen sondern ca. 500x und das kostet unmengen vom Programmspeicher.
Und eine größere SPS kommt aus Kostengründen nicht in Frage.
Ich hab schon einiges auf Arrays umgebaut, so konnte ich schon 20% Speicher einsparen.

Jedoch muss ich dann immer an sehr vielen Stellen (SPS, WinCC u.s.w.) die Variablen anpassen was unmengen an Arbeit macht.

Ich habe leider noch kein Projektweites Suchen und Ersetzen gefunden in TIA 15.1

So wie es ausschaut werde ich jedoch da nicht drum rum kommen.
Ich werde vermutlich doch alles auf Arrays umbauen müssen.

Danke für eure Tipps.

LG

Klaus
 
Mit den Arrays sowie Konstante(n) für die Grenze(n) wäre es wirklich variabel:
Code:
VAR
   #I_WaZy : ARRAY["ArrayMin".."ArrayMax"] of "MyFB"   // Die anderen Arrays im DB in gleicher Weise
VAR_END

FOR #i := "ArrayMin" TO "ArrayMax" BY 1  DO
    #I_WaZy[#i](
         ZyZ   := "RMU_Kom_SchND".ZyZ,
         ZyZGw := "RMU_Kom_SchND".BB[#i].ZyZGW,
         WaZy  := "RMU_Kom_WaZy".BB[#i]);
END_FOR;
 
Ich muss das leider nicht nur 3 mal aufrufen sondern ca. 500x und das kostet unmengen vom Programmspeicher.
Und eine größere SPS kommt aus Kostengründen nicht in Frage.
Ich hab schon einiges auf Arrays umgebaut, so konnte ich schon 20% Speicher einsparen.

Jedoch muss ich dann immer an sehr vielen Stellen (SPS, WinCC u.s.w.) die Variablen anpassen was unmengen an Arbeit macht.

Ich habe leider noch kein Projektweites Suchen und Ersetzen gefunden in TIA 15.1

So wie es ausschaut werde ich jedoch da nicht drum rum kommen.
Ich werde vermutlich doch alles auf Arrays umbauen müssen.

Naja, sicherlich sind Arrays die richtige Variante...

Aber, Arbeitszeit kostet auch Geld, vor allem die Fehlersuche, wenn beim Umstricken der kompletten Software hier und da was schief geht... Also was ist das denn für eine CPU, ne nächstgrößere kostet ja in der Regel nicht die Unmengen an Geld, zumindest wenn man die alte wo anders weiterverwenden könnte.

Ansonsten kannst halt noch absolut mit Pointern arbeiten, wenns halt nicht symbolisch sein muss...

Gruß.

PS: Du könntest auch die Bestands-DBs in DBs mit Arrays umkopieren und dann damit arbeiten, falls das geht...

Gruß.
 
Zuletzt bearbeitet:
Zurück
Oben