Indirekte Adressierung in SCL

Atlas

Well-known member
Beiträge
65
Punkte Reaktionen
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?
 

Lupo

Well-known member
Beiträge
338
Punkte Reaktionen
27
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 ?
 
OP
A

Atlas

Well-known member
Beiträge
65
Punkte Reaktionen
0
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...
 
OP
A

Atlas

Well-known member
Beiträge
65
Punkte Reaktionen
0
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()".
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
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
 
OP
A

Atlas

Well-known member
Beiträge
65
Punkte Reaktionen
0
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.
 

mystone

Well-known member
Beiträge
111
Punkte Reaktionen
19
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:

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
17.595
Punkte Reaktionen
5.172
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:
Oben