Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Zugriff auf Bit eines Bytes

humphrey
2008-06-26
2008-07-07
  • humphrey - 2008-06-26

    Hallo,

    ich stehe vorm folgenden Problem:

    Ich möchte bestimmte Informationen bzw. Meldungen vom Motormanagement abfragen und auf 3.Bit des 6. Bytes zugreifen und dann in eine Variable schreiben. Der Code soll folgendermaßen aussehen:

    IF Id_lst[iJ1939_EDC].Data[6] = 1 THEN
       water_in_fuel := TRUE;
    ELSE
       water_in_fuel := FALSE;
    END_IF
    

    Was muss im oberen Code verändert werden damit auf Bit 4-3 des 6. Bytes zugegriffen wird, wenn das Motormanagement "water in fuel" signalisiert?

    Im Anhang ist ein Ausschnitt der Motorzpezifikationen.

    Ich danke für jede Hilfe.

    IMG: EDC_final.JPG

     
  • bonatus - 2008-06-26

    Hallo,

    im Byte 6 stehen die Statusinformationen.

    Das Byte 6 besteht aus den im unteren Bild aufgeschlüsselten Informationen. Das Bit 3 und 4 sind für das "WATER IN FUEL" vorgesehen.

    Ich würde den Befehl nehmen:

    IF EXTRACT(Byte6,3)=1 AND EXTRACT(Byte6,4)=0 THEN

    water_in_fuel := TRUE;

    END_IF

    IF EXTRACT(Byte6,3)=0 AND EXTRACT(Byte6,4)=0 THEN

    water_in_fuel := FALSE;

    END_IF

    gruß bonatus

     
  • Tobi - 2008-06-26

    Hallo,

    ich meine, es würde auch schon über

    IF (Id_lst[iJ1939_EDC].Data[6].3 = 1)AND(IF Id_lst[iJ1939_EDC].Data[6].4 = 0) THEN
    ...
    

    gehen - wäre noch einen tick einfacher.

    Müssteste mal testen.

    Gruß

     
  • Uwe - 2008-06-27

    Noch nen Vorschlag ganz ohne IF

    water_in_fuel := Id_lst[iJ1939_EDC].Data[6].3 AND NOT Id_lst[iJ1939_EDC].Data[6].4;

     
  • Tobi - 2008-06-27

    ...Uwe hat gewonnen!

     
  • humphrey - 2008-06-27

    Hallo an die schnellen Helfer,

    vielen Dank für Euere Vorschläge. Ich werde es nach dem WE umsetzen

    und sobald ich es getestet habe, werde ich mich wieder melden.

    Schönes WE

    Humphrey

     
  • Rolf-Geisler - 2008-06-30

    Hallo,

    noch ein Tipp: Auf http://www.geisler-controls.de

    Water_In_Fuel := ExtractBit_B (Id_lst[iJ1939_EDC].Data[6], 3) 
                     AND NOT ExtractBit_B (Id_lst[iJ1939_EDC].Data[6], 4);
    

    Der Vorteil gegenüber den Vorschlägen von Uwe und Tobi ist, dass die Sache auch z.B. auf einer S7 als SCL läuft (die Konstrukte wie "Id_lst[iJ1939_EDC].Data[6].3" nicht unterstützt.

    In der OSCAT gibt es sicher auch eine passende Funktion.

    Gruss Rolf

     
  • Belacqua - 2008-07-07

    noch kürzer gehts so:

    Water_In_Fuel := ((Id_lst[iJ1939_EDC].Data[6] AND 16#04) = 16#04);

     
  • Belacqua - 2008-07-07

    Korrektur:

    Water_In_Fuel := ((Id_lst[iJ1939_EDC].Data[6] AND 16#06) = 16#04);

     

Log in to post a comment.