Programmierhilfe: Bytes managen mit ST

Lufti

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hab hier eine Frage, die für euch alte Hasen wahrscheinlich einfach zu beantworten ist:

ich habe 2 Bytes (little endian), die ich gerne zusammenführen will (also sagen wir mal 2E und C9 -> zu C92E) und anschließend als signed Integer auswerten will (d.h. C92E -> zu -14034).
Ist wahrscheinlich nur eine Funktion mit einer Zeile, aber ich kenne diese leider nicht.

Würde mich freuen wenn mir jemand helfen kann!

Grüße
 
Die Lösung kann man auch mit etwas Phantasie finden:
Du nimmst das H-Byte, wandelst es in ein Word und verschiebst es an die oberen 8 Bit des Words (Bit 9 bis 15). Dann ver-oderst Du das ganze mit dem L-Byte und speicherst das Ergebnis in Deine Int-Variable.

Harald
 
Arbeitest du mit Beckhoff? Dann schau dir mal die MEMCPY() Function an.
Hmm... für MEMCPY() müssen die beiden Bytes aber schon in der richtigen Reihenfolge direkt hintereinander im Speicher stehen. (Da könnte man auch gleich per Pointer lesen.) Zusätzlich erzeugt die Nutzung von MEMCPY() vermutlich schon mehr Code allein für die Parameterübergabe als für den eigentlichen Code, von der vielfach längeren Ausführungszeit als ver-Odern ganz abgesehen.
Für richtig fetten Overkill könnte man die beiden Bytes in eine Binärdatei speichern und als Word wieder rauslesen ;)

Die Standardlösung mit dem ver-Odern der Bytes ist da um einiges effizienter, selbst ohne Optimierung.

Es ist nicht immer vorteilhaft, dem Compiler die Typwandlungen automatisch zu überlassen. Mit gezielten Typecasts kann man den Compiler zu effizienterem Code überreden. Ich weiß nicht wie gut der Codesys-Compiler übersetzt, doch bei Siemens SCL V5.3 erzeugt ein expliziter Typecast zu DWORD den kürzesten Code mit den wenigsten überflüssigen Operationen:
Code:
//automatische Typwahl des Compilers  (SCL: 62 Byte)
OutInt := WORD_TO_INT(SHL(H_Byte, 8) OR L_Byte);

//dies erzeugt vermutlich kürzeren Code  (SCL: 28 Byte)
OutInt := DWORD_TO_INT(SHL(BYTE_TO_DWORD(H_Byte), 8) OR L_Byte);

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wobei immer noch eine automatische Typanpassung besteht: OR L_Byte ist erst einmal ein Byte!
Da der Compiler das L_Byte mit einem DWORD verodern soll, weiß er, daß er das L_Byte erst in DWORD wandeln muß. Das muß ich nicht erzwingen, diese "Freiheit" lasse ich dem Compiler ;)

Harald
 
Danke, das war es und funktioniert so wie im Codebeispiel beschrieben.
Vielen Dank auch für die zusätzlichen Infos, ein bisschen Effizienzsteigerung kann ja schonmal nicht schaden :D
 
Zurück
Oben