Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: Programmierhilfe: Bytes managen mit ST

  1. #1
    Registriert seit
    23.11.2015
    Beiträge
    2
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Idee


    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
    Zitieren Zitieren Programmierhilfe: Bytes managen mit ST  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.190
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Registriert seit
    04.11.2015
    Beiträge
    17
    Danke
    4
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Arbeitest du mit Beckhoff? Dann schau dir mal die MEMCPY() Function an.

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.190
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von EXOR Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Lufti (24.11.2015)

  6. #5
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Hmm.
    Code:
    //dies erzeugt vermutlich kürzeren Code  (SCL: 28 Byte)
    OutInt := DWORD_TO_INT(SHL(BYTE_TO_DWORD(H_Byte), 8) OR L_Byte);
    Harald
    Wobei immer noch eine automatische Typanpassung besteht: OR L_Byte ist erst einmal ein Byte!
    Als Freelancer immer auf der Suche nach interessanten Projekten.

  7. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.190
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #7
    Lufti ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.11.2015
    Beiträge
    2
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  9. #8
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Integerwert := WORD_TO_INT(LowByte + HighByte * 16#100);

Ähnliche Themen

  1. Step 7 Programmierhilfe AWL
    Von Mav26 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 08.10.2013, 23:26
  2. programmierhilfe
    Von holschin im Forum Suche - Biete
    Antworten: 1
    Letzter Beitrag: 09.12.2009, 09:31
  3. max bytes mit libnodave
    Von Praseodym im Forum Hochsprachen - OPC
    Antworten: 4
    Letzter Beitrag: 13.02.2008, 12:29
  4. Suche Programmierhilfe S5
    Von Sarah2000 im Forum Suche - Biete
    Antworten: 1
    Letzter Beitrag: 21.07.2005, 09:29
  5. Programmierhilfe: Pumpensteuerung
    Von xpert im Forum Programmierstrategien
    Antworten: 4
    Letzter Beitrag: 28.01.2005, 13:33

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •