AT - nicht auf ARRAY möglich?

Münchnerjunge

Level-1
Beiträge
314
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Community,

ich habe eine, für den geübten Codesys Nutzer sicherlich einfach Frage:

Ist folgender Code in ST möglich:
Code:
VAR_GLOBAL
DATENPAKET : ARRAY[0..100] OF INT;

Meldung_1   AT   DATENPAKET[0].X1 : BOOL;
Meldung_2   AT   DATENPAKET[0].X2 : BOOL;
Meldung_3   AT   DATENPAKET[0].X3 : BOOL;
Meldung_4   AT   DATENPAKET[0].X4 : BOOL;
Meldung_5   AT   DATENPAKET[0].X5 : BOOL;
Meldung_6   AT   DATENPAKET[0].X6 : BOOL;
[...]

END_VAR

Und wenn nein, wie kann ich das sonst einfach gestalten? Ich möchte ungern mittels ADR oder einzelnen := Rangierungen in dem Code die ganzen Meldungen anlegen.

Vielen Dank im Voraus!
 
Jetzt mal dumm gefragt, wo ist der Mehraufwand oder Vorteil von deinem Vorschlag gegenüber der Zuweisung mit := ???
Wenn ich in deinem Code das AT durch := ersetze kommt die gleiche Zeilenzahl raus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sicher ist das möglich, aber schön ist anders, oder? Vielleicht bin ich zu verwöhnt, aber in meinen Augen ist das eine stümperhafte Umsetzung einfacher Funktionen.

Mir geht es ja darum die Deklaration der Variablen möglichst von dem Code zu trennen.

Warum kann ich ein AT auf Merker und Eingänge legen, aber nicht auf einen deklarierten Struct? (Sinn?)
 
Du kannst einen AT auch auf einen Struct legen - aber eben auf den ganzen Struct und nicht auf ein Element darin.
Deine neue Sicht interpretiert dann den Struct halt auf die neue Weise ...

Gruß
Larry
 
Hallo,
hier vorab ein Code, wie ich es jetzt auf die schnelle gelöst hätte.

Code:
VAR CONSTANT
 iLaenge : INT := 100;
END_VAR
VAR
 BDatenpaket : ARRAY[1..iLaenge] OF INT; 
 bMeldung : ARRAY[1..16*iLaenge] OF BOOL;
 iCounter : INT := 0;
END_VAR

FOR iCounter := 1 TO iLaenge DO
 bMeldung[iCounter*16 -15] := BDatenpaket[iCounter].0;
 bMeldung[iCounter*16 -14] := BDatenpaket[iCounter].1;
 bMeldung[iCounter*16 -13] := BDatenpaket[iCounter].2;
 bMeldung[iCounter*16 -12] := BDatenpaket[iCounter].3;
 bMeldung[iCounter*16 -11] := BDatenpaket[iCounter].4;
 bMeldung[iCounter*16 -10] := BDatenpaket[iCounter].5;
 bMeldung[iCounter*16 -9]  := BDatenpaket[iCounter].6;
 bMeldung[iCounter*16 -8]  := BDatenpaket[iCounter].7;
 bMeldung[iCounter*16 -7]  := BDatenpaket[iCounter].8;
 bMeldung[iCounter*16 -6]  := BDatenpaket[iCounter].9;
 bMeldung[iCounter*16 -5]  := BDatenpaket[iCounter].10;
 bMeldung[iCounter*16 -4]  := BDatenpaket[iCounter].11;
 bMeldung[iCounter*16 -3]  := BDatenpaket[iCounter].12;
 bMeldung[iCounter*16 -2]  := BDatenpaket[iCounter].13;
 bMeldung[iCounter*16 -1]  := BDatenpaket[iCounter].14;
 bMeldung[iCounter*16]    := BDatenpaket[iCounter].15;
END_FOR

Da Sie den Integer wahrscheinlich befüllen und die Meldungen daraus generieren wollen, habe ich die Meldungen in eine For-Schleife gepackt. Ich hoffe es ist selbsterklärend soweit.. Die 16 ergibt sich aus den der Größe des Int (16Bit).
Codesys gibt keine Fehlermeldung beim Compilieren, getestet habe ich es aber noch nicht.

Grüße
 
Mal ganz abgesehen von diesen codetechnischen Feinheiten war ich bisher der Meinung, AT dient ausschließlich der Zuweisung einer Variablen zu einer physikalischen Adresse.
 
Zurück
Oben