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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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 :
PROGRAMPLC_PRGVARÂ Vorgabe:INT;Â Byte0Â Â :BYTE;Â Byte1Â Â :BYTE;END_VARByte0:=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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
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
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
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 :
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
Hallo Rolf,
es funktioniert, vielen Dank für deine Hilfe!
Gruß Johann