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

Ergebnis 1 bis 10 von 10

Thema: in SCL zwei bytes zu einem int zusammensetzen

  1. #1
    Registriert seit
    05.10.2006
    Beiträge
    169
    Danke
    21
    Erhielt 19 Danke für 11 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich mache gerade die ersten Gehversuche mit SCL, und bin von den Funktionen total begeistert (ich hoffe aber das der Editor noch gewaltig verbessert wird im TIA-Portal).

    Ich versuche nun zwei Bytes (aus einem Array) zu einem Integer zusammen zu fügen. Mit + und AND bin ich nicht weiter gekommen. Es ist vielleicht noch zu sagen das in den Bytes Werte BCD codiert liegen.
    Zitieren Zitieren in SCL zwei bytes zu einem int zusammensetzen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    das Einfachste, was mir hier einfällt wäre die AT-Variante.
    Du machst dir auf deinen INT eine AT-Sicht auf, die diesen als 2 Byte interpretiert.
    Also so :
    Code:
    Var
      myINT : INT ;
      myByteVar AT myINT : struct 
                             Byte_0 : byte ;
                             Byte_1 : byte ;
     end_struct ;
     
     
    und im Code kannst du dann die Byte-Werte, die du hast, entsprechend zuweisen :
     
    myByteVar.Byte_0 := dasByte0 ;
    myByteVar.Byte_1 := dasByte1 ;
     
    nun hat dadurch die Variable myINT automatisch den korrespondierenden Wert ...
    Gruß
    Larry

  3. #3
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Larrys code fügen die Bytes zusammen, bitwise.
    Aber ist das was du willst ?

    Willst du irgendwie die BCD Werte in INT Werte addieren, oder was ?
    z.b.: die BCDs "12" und "34" sollen zu ein INT "46" werden (addition)
    oder z.b.: die BCDs "12" und "34" sollen zu ein INT "1234" werden.
    oder mit Larrys Verfahren: die BCDs "12" und "34" sollen zu ein INT "4660" werden.
    Jesper M. Pedersen

  4. #4
    Züttu ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    169
    Danke
    21
    Erhielt 19 Danke für 11 Beiträge

    Standard

    zugegeben das ist eine Möglichkeit...

    Ich möchte hier noch kurz schildern was ich eigentlich vorhabe: Ich habe im OB1 die Standard Temp-Variable DATE_TIME als AT Sicht (Array of Bytes) ausgelegt, nun sind im Byte 6 und im LSB von Byte 7 die Milisekunden enthalten. Diese möchte ich nun einem neuen Integer zuweisen (MW34).

    Programiert habe das im Moment wie folgt:
    MW34 := (BCD_TO_INT(D_T[6]) * 10) + (BCD_TO_INT(SHR(IN:= D_T[7], N:= 4)));

    funktionieren tut das, sieht nur nicht schön aus....

  5. #5
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Ich glaube das es gibt mehrere Möglicheiten, aber es wird nicht "schöner".
    Wie Du schon gemacht hast, musst du die Bytes zusammenfügen UND die 4 LSB von einen Byte ausmaskieren.
    Jesper M. Pedersen

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Na ...
    Das sieht bei mir aber sehr ähnlich aus ...
    Da wüßte ich auch keine grundlegend andere Variante um speziell dieses Problem anzufassen ...

  7. #7
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Die Aufgabe ist eigentlich:
    die BCDs "12" und "3*" sollen zu ein INT "123" werden, wobei die "*" sind die 4LSB die ignoriert werden muss.
    Jesper M. Pedersen

  8. #8
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Es hat mir immer verwundert.
    Warum packen Siemens die Bytes zusammen in diesen Weise ?
    Warum verwenden Siemens das uralte BCD Format ?
    Unendlich einfacher wäre die Werte als INTs bereitzustellen, obwohl es ein minimalen RAM Speicher kostet.
    Jesper M. Pedersen

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    @Jesper:
    Wahrscheinlich wegen : "never change a running system ..." oder so ...

  10. #10
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ich bin jetzt kein SCL-Spezi, daher würde ich die Sache in AWL so angehen:

    1. jede BCD-Stelle des Bytes (je 4 Bits) in ein neues Byte kopieren
    2. diese Bytes von BCD nach INT wandeln (ergibt je einen Wert von 0-9)
    3. dann die Ergebnisse je nach Stelle mit je nach Wertigkeit mit 10^0, 10^1, 10^2, ... multiplizieren
    4. alles zusammenaddieren ==> meine INT-Zahl
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

Ähnliche Themen

  1. Real in zwei Bytes
    Von Mobi im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 20.08.2011, 10:14
  2. Wert de Bytes in einem DB
    Von Bensen83 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 15.03.2010, 09:38
  3. BYTES zusammensetzen in CHAR
    Von hoT im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 26.11.2009, 09:57
  4. Antworten: 9
    Letzter Beitrag: 16.12.2007, 21:20
  5. Antworten: 12
    Letzter Beitrag: 19.11.2007, 11:06

Lesezeichen

Berechtigungen

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