B&R Typecast ??

Lazarus™

Level-2
Beiträge
434
Reaktionspunkte
52
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein Bitarray (32-bit) und möchte wissen, ob eines dieser Bits gesetzt ist.
Ich wollte aber nicht so gerne alle Bits durchgehen, sondern über Typecasting abfragen ob das UDINT <> 0 ist.
Leider bin ich mal wieder zu doof etwas rauszufinden ;-)
Hat jemand von Euch einen Tip ???

So sehen die Arrays aus:

Code:
VAR
    Gruppe_1 : ARRAY[0..31] OF BOOL := [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    Gruppe_2 : ARRAY[0..31] OF BOOL := [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    Gruppe_3 : ARRAY[0..31] OF BOOL := [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    Meldungen : ARRAY[0..31] OF BOOL := [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    Sammelalarm : BOOL := FALSE;
    Sammelmeldung : BOOL := FALSE;
END_VAR


Danke schon mal ...
 
Zuletzt bearbeitet:
PACK und UNPACK

Meiner Meinung nach ist ein CAST nicht zulässig, da nirgendwo die Norm vorschreibt, wie die Bits gespeichert werden MÜSSEN. Man kann zwar wissen, dass sie so oder so abgelegt sind aber das kann sich bei der nächsten Software Version des Compilers schon geändert haben.

Deshalb nutze ich die PACK und UNPACK Funktionalitäten und speichere alles in Worten oder Bytes.

Z.B.

IF (theImage.bSSIOk = FALSE) THEN
bSSIEr := PACK (
B0 := stEqualWord01.bEqu,
B1 := stEqualWord02.bEqu,
B2 := stEqualWord03.bEqu,
B3 := stEqualWord04.bEqu,
B4 := stEqualWord09.bEqu,
B5 := stEqualWord10.bEqu,
B6 := stEqualWord11.bEqu,
B7 := theSSIFlag); (* from extern CHK_SSI PRG *)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch boolsche Werte werden byteweise im Speicher abgelegt. Bei einem 32 Bitarray kommen also 32 Byte respektive 16 Wörter zusammen.
Die Größe der Arrays erlaubt es aber durchaus, dass Du es in einer Schleife durchläufst. Das hat den Vorteil, dass Du weißt ob eines der Elemente 0 oder 1 ist und vor allem welches. Wenn das Element nicht interessiert, sondern nur ob ein oder mehrere Elemente ungleich 0 sind kann man sich die Adresse nehmen und den Speicherbereich auf 0 prüfen. Stichwort memcmp().

Gruß
 
Ich danke Euch für die Antworten. Nun habe ich mich doch entschlossen das mit einer einfachen Schleife durchzueiern :ROFLMAO:
Trotzdem vielen Dank :D

Gruß
Lazarus™
 
Servus zusammen,

ich bin etwas spät, aber trotzdem.

Im Initblock z.B.
memset(ADR(FeldLow),0,SIZEOF(FeldLow))


Im cyclic:
Sammelalarm=BOOL(memcmp(ADR(Gruppe_1),ADR(FeldLow),SIZEOF(Gruppe_1)))

FeldLow sollte vom gleichen Typ sein wie etwa Gruppe_1

Grüße
 
Zurück
Oben