Indirekte Adressierung in SCL

Atlas

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

mit TIA11 und einer S7-1200 möchte ich in einem in SCL erstellten FC dynamisch Eingänge über eine Schleife in einen Array schreiben.
Das soll vom Prinzip her so aussehen:

Code:
FOR #k := 0 TO 13 BY 1 DO
 // "DB".DI[] und "DB".AI[] sind jeweils als Array in einem DB definiert.

 "DB".DI[#k] := %E[k];
 "DB".AI[#k] := %EW[k];

END_FOR;


Gibt es hierzu Ideen wie das in SCL umgesetzt werden kann?
 
Es wäre vielleicht hilfreich wenn du die Variablentypen jeweils benennen könntest.
Code:
FOR #k := 0 TO 13 BY 1 DO
 // "DB".DI[] und "DB".AI[] sind jeweils als Array in einem DB definiert.

 "DB".DI[#k] := %E[k];  // welchen Typ hat DI, was soll E sein ? direkt der binäre Eingang ? Dann E[k,BitNummer].
 "DB".AI[#k] := %EW[k];  // welchen Typ hat AI ? WORD ?

END_FOR;
Hattest du dazu auch schon mal einen Blick in die Step7-Hilfe geworfen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin mir nicht sicher ob ich Deine Frage richtig verstehe, denn du hast diese doch schon selbst beantwortet...

Ich kenne keine anderen Datentypen als WORD (AI) und BOOL (DI) für direkte Eingänge.

Im übrigen ist das gezeigte Codebeispiel nur eine Prinzipdarstellung (da ich die benötigte Syntax nicht kenne). Selbstverständlich müsste die Adressierung eines Einganges mit %E0.0, %E0.1, ... erfolgen. Aber das funktioniert nur bei einer statischen Anweisung. Meine Frage ist nach wie vor wie ich anstelle der statischen Anweisung das Ganze in einer Schleife realisieren kann.


"E[k,BitNummer]" wird wohl nicht funktionieren...
 
Ich denke nun selbst eine Lösung gefunden zu haben:


Code:
#i := 0;
#k := 0;

FOR #i := 0 TO 15 BY 1 DO

  IF (#i MOD 8 = 0) AND (#i > 0) THEN
    #k := #k+1;
  END_IF;

  "DB".DI[#i] := PEEK_BOOL(area:=16#81, dbNumber:=0, byteOffset:=#k, bitOffset:=#i);

END_FOR;


Für die Analogwerte heisst das Zauberwort "PEEK_WORD()".
 
Hm also ich kenne weder TIA11, noch diesen PEEK_BOOL-Befehl aber was Lupo geschrieben hat, stimmt schon!

Normalerweise werden in SCL Eingänge folgendermaßen angesprochen:

Bitweise : E[Byte,Bit] z.B. E 9.5 = E[9,5]
Byteweise: EB[Byte] z.B. EB 18 = EB[18]
Wordweise: EW[Word] z.B. EW 60 = EW[60]
DWordweise: ED[Dword] z.B. ED4 = ED[4]

Die Zahlen in den eckigen Klammern können durch Indexvariablen vom Typ INT oder DINT ersetzt werden.
Um also bei deinem Beispiel zu bleiben .... du müsstest dir für die Bits ebenfalls noch eine kleine Schleife bilden. Dann funktioniert das auf jeden Fall. Liegen die einzulesenden Eingänge denn direkt hintereinander???

mfg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir scheinen in gewisser Weise alle Recht zu haben..

Dein Vorschlag mit "E[9,5]" funktioniert in SCL bei Step7 5.5, aber nicht im SCL TIA11.
In TIA11 muss mit dem genannten PEEK_BOOL-Befehl gearbeitet werden.
 
Hallo,

ich möchte in Step 7 v5.5 SCL Eingänge mit einer Schleife auf einen DB zuweisen.
Dabei möchte ich die Eingänge symbolisch und mit einem Index über eine Schleife ansprechen.
Leider fehlt mir dazu der Syntax.

Code:
FOR i := 1 TO 6 BY 1 DO

"DB_Ladegeraete".Ladegeraet[i].Eingang.DI_1 :=  "ET200pro_01_LG_01_DI_1";  // i=1: E11.0     i=2: E11.4     i=3: E12.0    .....
"DB_Ladegeraete".Ladegeraet[i].Eingang.DI_2 :=  "ET200pro_01_LG_01_DI_2";  // i=1: E11.1     i=2: E11.5     i=3: E12.1    .....
"DB_Ladegeraete".Ladegeraet[i].Eingang.DI_3 :=  "ET200pro_01_LG_01_DI_3";  // i=1: E11.2     i=2: E11.6     i=3: E12.2    .....

END_FOR;

Hapern tut es an der Symbolischen bezeichnung der Eingänge, an welcher Stelle wird der Index "i" eingebaut damit hier jeweils "LG_0" daraus wird.
Es handelt sich um Bits.

Habt ihr da eine Idee?

Danke & MFG
michstein
 
Zuletzt bearbeitet:
Symbolnamen zur Laufzeit zusammenbasteln geht nicht.
Du müßtest die Eingänge als Array deklarieren oder indiziert auf die Absolutadressen zugreifen:
Code:
"DB_Ladegeraete".Ladegeraet[i].Eingang.DI_1 :=  EX[i, 0] ;

Harald
 
Zuletzt bearbeitet:
Zurück
Oben