Konvertierung dez in hex für CAN-Nachricht

johannl
2011-01-27
2011-01-31
  • johannl - 2011-01-27

    Hallo zusammen,

    ich baue gerade einen CAN-Bus mit einer ifm-Steuerung auf, welche mit CoDeSys programmiert wird.
    Die Steuerung soll über den Baustein CAN1_TRANSMIT einem Slave einen inkrementellen Positionswert (Bsp dez1000) senden.
    Der Eingang "Data" des Funktionsblocks möchte einen Array of Byte mit zwei Einträgen. In diesem Fall 16#03 und 16#E8.
    Kann mir jemand sagen wie ich am elegantesten aus meinen dezimalen 1000 einen Array mit den entsprechenden hex-Einträgen bekomme?
    Im zweiten Schritt sollen auch negative Dezimalzahlen als 16bit 2er Komplement gesendet werden.

    Gruß Johann

     
  • Rolf-Geisler - 2011-01-27

    Hallo Johann,
    http://www.geisler-controls.de im Downloadbereich nach der Bibliothek BinUtils (steht unter der GNU, kannst Du auch beruflich verwenden). Darin gibt es die Funktionen ExtractByte_W zum Auslesen eines einzelnen Bytes aus einer WORD-Variablen bzw. ExtractByte_DW (dito für DWORDs). Die Ergebnisse kannst Du in das Array eintragen, welches der Sendebaustein erwartet.
    Negative Werte gehen auch, da das Vorzeichenbit im höheren Byte steckt. Es kommt beim Auspacken automatisch mit.
    Gruss Rolf

     
  • johannl - 2011-01-28

    Hallo Rolf,

    zunächst einmal vielen Dank für deine Antwort!
    Die Funktion erfüllt ihren Zweck bei positiven Zahlen sehr gut.
    Mit den negativen hab ich allerdings noch ein Problem:

    Mein Slave erwartet seine Sollposition im Bereich von etwa -4000 bis 4000 Inkrementen in 16Bit 2er-Komplement Darstellung.
    Meine Steuerung errechnet diese Sollposition aus ihren Eingangsdaten. Da hier negative Werte auftreten hab ich als Variablentyp INT statt WORD gewählt.
    Für die Übertragung meines negativen Werts als 2er-Komplement muss ich doch alle Bits des positiven Werts invertieren und 1 addieren, oder geht dies auch einfacher?

    Gruß Johann

     
  • Rolf-Geisler - 2011-01-28

    Hallo Johann,
    schön dass es für positive Werte funktioniert. Funktioniert auch für negative Werte, auch mit INT; INT_TO_WORD kann man auch weglassen.
    Hab's mal getestet :

    PROGRAM PLC_PRG
    VAR
      Vorgabe : INT;
      Byte0   : BYTE;
      Byte1   : BYTE;
    END_VAR
    Byte0 := ExtractByte_W (Vorgabe, 0);
    Byte1 := ExtractByte_W (Vorgabe, 1);
    

    Das Vorzeichenbit für negative Werte steckt hier als Bit7 in Byte1.
    Kannst Du im Simulationsmodus überprüfen, gib einfach der einen positiven oder negativen Wert. Das Zweierkomplement entsteht automatisch. Kannnst Du sehen, wenn Du 1 oder -1 vorgibst.
    Die gestern von mir vorgeschlagene Konvertierung INT_TO_WORD macht nichts anderes, als der Variablen ein anderes Format zu geben, am Wert selbst ändert sich dabei nichts. ExtractByte_W akzeptiert aber auch INT als Eingabe, da INT und WORD wertkompatibel zueinander sind.
    Wie gesagt, habe ich im Simulationsmodus getestet. Sollte auf einer realen Steuerung also genau so gehen.
    Gruss Rolf

     
  • johannl - 2011-01-31

    Hallo Rolf,

    es funktioniert, vielen Dank für deine Hilfe!

    Gruß Johann

     

Log in to post a comment.