Array of Struct in einem FB nutzen

bone666

Level-1
Beiträge
72
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
habe mal wieder zwei Fragen -.-

1. Frage

Ich habe ein Array of Struct
Code:
arr_Spannung:    ARRAY[1..1] OF str_Spannung;
str_Spannung besteht aus
Code:
rl_Spannung1: REAL;
rl_Spannung2: REAL;
rl_Spannung3: REAL;
und anstatt die Werte wie folgt zuzuweisen

arr_Spannung[1].rl_Spannung1:=230.0;
|| .rl_Spannung2:=240.0;
|| .rl_Spannung3:=235.0;

würde ich es gerne in einer Schleife oder so machen. Ist das möglich?
Ein "normales" Array of INT z.B. kann ich ja einfach beim Instanzieren schon füllen
arr1: ARRAY[1..3] OF INT :=1,5,9;


2. Frage

Ich nutze hier mal das Beispiel aus Frage 1.
Ich habe einen FB

Code:
FUNCTION_BLOCK FB_MELDUNG
VAR_INPUT
    rl_Spannung:    REAL;
END_VAR
VAR_OUTPUT
    x_Meldung:    BOOL;
    st_Meldung:    STRING;
END_VAR
---------------------------------
IF rl_Spannung > 240 THEN
    x_Meldung:=FALSE;
    st_Meldung:='Spannung zu hoch!';
ELSE
    x_Meldung:=TRUE;
END_IF
Nun meine Frage, wie kann ich mit dem Array aus Frage 1 diesen FB aufrufen ohne für
jede Spannung einen eigenen Aufruf zu schreiben?
Also nicht so
Code:
PLC_PRG

VAR
    Meldung: FB_MELDUNG;
    arr_Spannung:    ARRAY[1..1] OF str_Spannung;  (*Aus Frage 1*)
    x_Var  : BOOL;
    st_Var : STRING;
END_VAR
-----------------------------------
Meldung(rl_Spannung:=arr_Spannung[1].rl_Spannung1);
x_Var:=Meldung.x_Meldung;
st_Var:=Meldung.st_Meldung;
Nun würde ich das selbe für .rl_Spannung2 und .rl_Spannung 3 schreiben -.-
So ist das aber ziehmlich bescheiden, finde ich. Deshalb eben die Frage ob
man das auch mit einer Schleife oder wie auch immer anders lösen kann?

MfG

Bone
 
1. Ich denke mal nein, das geht dann so nicht. Du müßtest aus der Struct dann auch ein Array machen, aber dann verlierst du die schöne Symbolik. Ist halt immer so das Problem zwischen praktischer Verwendung und guter Lesbarkeit.

2. Was du in deinem FB machst, dafür braucht es keinen FB, dafür nimm einen FC. Sollte eber auch mit dem FB gehen, ist aber unnötig.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe ein Array of Struct
Code:
arr_Spannung:    ARRAY[1..1] OF str_Spannung;
str_Spannung besteht aus
Code:
rl_Spannung1: REAL;
rl_Spannung2: REAL;
rl_Spannung3: REAL;
Das könntest Du ändern zu:
Code:
rl_Spannung: ARRAY[1..3] OF REAL;

Dann kannst Du indiziert auf rl_Spannung[1], rl_Spannung[2], rl_Spannung[3] zugreifen:
Code:
FOR i:=1 TO 3 DO
  Meldung(rl_Spannung:=arr_Spannung[1].rl_Spannung[i]);
...

Harald
 
@ Ralle:
Erstmal Danke für die schnelle Antwort.
Zu 1: Um die Übersicht besser behalten zu können lasse ich den Spannungen ihre einzelnen Namen. Also sitze ich in der von dir angesprochenen Zwickmühle.
Zu 2: Ich habe bis jetzt noch nicht mit Functions gearbeitet, habe jedoch gelesen, dass die nur einen Wert zurück geben. Ich brauche aber mindestens 2.

@PN/DP:
Danke für deine Antwort. Ich habe das Beispiel wohl etwas dumm gewählt. In Realität heißen die Spannungen z.B. SpannungTrafoL1/L2/L3/N/L1L2/L2L3/L3L1, deshalb fällt dein Vorschlag, aus den Bezeichnern ein Array zu machen, raus. Trotzdem danke ;)


Ich werde also nun einfach für alles einen einzelnen Aufruf schreiben und einzeln Werte zu weisen.

MfG

Bone
 
Ja, FC haben einen Rückgabewert, aber den kann man intern fest beschalten und zur Ausgabe auch die Out benutzen, das geht wie bei den FB auch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu 1:

Forschleife ist doch immer noch möglich. Klar könnte man sich das auch noch schöner wünschen, aber schlecht ist es doch nicht, oder.

Code:
For i := 1 TO 2500 DO
   arr_Spannung[i].rl_Spannung1 := 230;
   arr_Spannung[i].rl_Spannung2 := 240;
   arr_Spannung[i].rl_Spannung3 := 250;
END_FOR
 
Zurück
Oben