Flags in Byte mit Enum Verknüpfen

knautschkissen

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Könnt ihr mir bitte auf die Sprünge helfen.
Ich habe einige Status Bytes über Canbus eingelesen. Darin sind jedem Bit ein warning bzw. error Flag zugeordnet. Ich habe mir ein Enum erstellt in dem die Flags beschrieben sind.
Code:
TYPE Status_Word :(
 encoder:=0,
 hv_input:=1,
 igbt_errors:=2,
 motor_temp:=3,
 fc_temp:=4,
 control:=5,
 communication:=6,
 others:=7);
END_TYPE

Ich stehe aber auf dem schlauch, wie ich die einzelnen Bits jetzt den Enums zuordne...
Code:
Error: Status_Word;
Warning: Status_Word;
errorRecived:BYTE;
warningRecived:BYTE;


Ich weiß dass ich soetwas vor einigen jahren schonmal in python gemacht habe. Ich steige jetzt aber erst wieder in die Programmierung ein weil ich die letzten jahre mit E Konstruktion beschäfigt wurde... In diesem Fall nutze ich Codesys 2.3.
 
Naja. Wenn die Bits jeweils einem Flag zugeordnet sind kannst du es nicht als Enum definieren da z.B. der Wert 0x3 dann ja zwei Flags beinhaltet.


Da CoDeSys 2.3 keine BIT-Definition kennt würde ich persönlich am Anfang des PLC Codes mir über ein paar Zeilen die Flags herauslesen.
Also z.B.
encoderFlag:= Error AND 02#0000_0001;
hav_input := Error AND 02#0000_0010;


Guga

 
Wenn ich es richtig verstehe, sollen die Enum-Werte die Bitpositionen darstellen. Dann darf die Error-Variable aber nicht vom Enum-Typ sein, sondern ein BYTE oder WORD. Dann würde z. B.
Code:
Motor_temp_flag:=(shr(Error,Status_Word.Motor_temp) and 1)>0;
oder
Code:
Motor_temp_flag:=(Error and shl(1,Status_Word.Motor_temp))>0;
funktionieren.

Ich habe so was allerdings in TwinCat2 anders gemacht. Sollte auch mit Codesys gehen.
Statt Enums habe ich Konstanten definiert.
Code:
VAR_GLOBAL CONSTANT
 Error_encoder:USINT:=0;
 Error_hv_input::USINT:=1;
 Error_igbt_errors:USINT:=2;
(* usw. *) 
END_VAR
Dann bei den Compileroptionen "Konstanten ersetzen" angehakt.
Dann kann man auf die Bits der Variablen direkt mit den Konstanten zugreifen, z. B. "Error.Error_HV_Inpt" statt "Error.1".
 
Vielen Dank für die Anstöße:) Ich wird mal schaun dass ich die umgesetzt bekomme. Ziel ist, wenn Errors oder Warnungen empfangen werden ich die als Klartext im GUI lesen kann und nicht erst nachschauen muss was war den bit 3 nochmal...^^ aber auch nicht für jedes Status Byte je 8 Variablen anlegen usw^^ wird irgendwann unübersichtlich wenn da in hunderten Zeilen nur ein paar Flags ausgewertet werden.
 
Zurück
Oben