Step 7 SCL: Eingänge mit For-Schleife in Struct ablegen

britz

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

nach längerem googeln habe ich leider immer noch keine Lösung:

Folgendes Problem:

Var_Input

user1 : BYTE;
user2 : BYTE;
user3 : BYTE;
user4 : BYTE;
user5 : BYTE;
....
usw.

End_Var

Var

Rob : Array[1..16] of Struct
user: BYTE;
End_Struct;

End_Var


so hier will ich meine Eingänge in das Struct eintragen

For i:= 1 to 16 by 1 do

rob.user :=
user+i+

End For

gibt es eine Möglichkeit dieses hier mit user+i+ angedeutet umzusetzen ?
Kann man vielleicht einen String in einen Variablenaufruf konvertieren oder ähnliches ? sowas wie "eval()" gibts aber nur bei Matlab

ansonsten bleibt mir halt nur noch

rob[1].user := user1
rob[2].user := user2
...
usw.

Vielen Dank im Vorraus




 
Einfache Lösung: Wenn Du die Baustein-Eingänge indiziert (z.B. als Array) ansprechen willst, dann mußt Du sie auch als Array oder String übergeben.

Was für eine SPS willst Du mit welcher SCL-Version programmieren?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich ein Array als Eingang übergeben will muss ich es auch anderswo "zusammenbauen" das versuche ich zu vermeiden alle Informationen sollten direkt an dem einem Baustein anliegen er soll universal und möglichst einfach in verschiedene Anlagen eingebunden werden können. Der Anwender soll nur die Eingänge aus verschiedenen DB's heraus beschalten

Ich nutze S7-400, SCL V5.3 + SP6 + Upd2
 
Du könntest außerhalb Deines Bausteins die DB-Variablen in ein Struct mit den User-Variablen kopieren und dieses Struct an Deinen Baustein (FB) als IN übergeben und im Baustein eine AT-Sicht als BYTE-Array auf das Struct legen. Dann kannst Du die Struct-Variablen im Baustein als Array ansprechen.

Nachtrag: Man kann auch die DB-Werte direkt in die IN-Struktur schreiben (MyInstance.In_Userstruct.user1) und den IN-Parameter unbeschaltet lassen:
Code:
"MyInstance".In_Userstruct.user1 := "DB1".user;
"MyInstance".In_Userstruct.user2 := "DB2".user;
...
"MyInstance" (
  In_Userstruct:=
)



Bei nur 16 Variablen würde ich aber wegen der Übersichtlichkeit die 16 Variablen übergeben und im Baustein einzeln in das Array kopieren:
rob[1].user := user1
rob[2].user := user2
...

Harald
 
Zuletzt bearbeitet:
im Baustein eine AT-Sicht als BYTE-Array auf das Struct legen.
Code:
FUNCTION_BLOCK FBxxx
VAR_INPUT
  In_UserStruct : STRUCT
    user1 : BYTE;
    user2 : BYTE;
...
    user16 : BYTE;
  END_STRUCT;
  In_UserArray AT In_UserStruct : ARRAY [1..16] OF BYTE ;
END_VAR
...

  FOR i := 1 TO 16 DO
    Rob[i].user := In_UserArray[i];
  END_FOR;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

vielen Dank für deine schnelle und ausführliche Antwort ich werde dann doch die einfachere Lösung verwenden:

rob[1].user := user1
rob[2].user := user2
....

Ich dachte mir vielleicht gibt es eine elegante Lösung innerhalb des FB's fürs nächste mal bin ich schlauer !
 
Zurück
Oben