in SCL zwei bytes zu einem int zusammensetzen

Züttu

Level-1
Beiträge
195
Reaktionspunkte
19
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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....
 
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.
 
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.
 
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
 
Zurück
Oben