[Problem] 5-stellige Zahl auf 5 Bytes verteilen (1er/10er/100er/1000er/10000er)

diabolo150973

Level-2
Beiträge
1.075
Reaktionspunkte
404
Zuviel Werbung?
-> Hier kostenlos registrieren
So... ich mal wieder...
wenn das hier so weitergeht, bekomme ich meine 1000 heute noch voll.

Kann man (und wenn ja...wie???) eine 5-stellige Zahl auf 5 Bytes verteilen, so dass ich jeweils ein Byte für die 1er, 10er, 100er, 1000er und 10000er habe?
Wahrscheinlich habe ich schon wieder Grundlagendefizite, aber mit der "F1"-Taste komme ich nicht so recht weiter.

Als Beispiel mal die Zahl 99999

Kann ich das erstmal mit "DI_BCD" umwandeln? Nur "I" scheint mir zu wenig...


99999 in BCD sind: 11000011010011111 (sagt mein Windows-Taschenrechner)

Aber: wo befindet sich nun welcher Wert...und wie komme ich daran? Oder bin ich nur zu blöde, dass zu erkennen?

Spaß macht das so irgendwie nicht...



Gruß,

dia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Dia,
in AWL wäre das dann der Befehl DTB (DINT nach BCD wandeln). Das könnte das sein (für KOP oder FUP), was du da oben schon stehen hast.
Aus jeder Stelle der Zahl wird dann eine 4-Bit-Matrix. Allerdings kann mein Windows-taschenrechner nur in Hex (Bin) wandeln, was nicht identisch mit BCD ist.
In BCD würde aus 99999 dann "1001 1001 1001 1001 1001" werden (die Leerzeichen sind für die Übersichtlichkeit drin).

Gruß
Larry
 
Aha...

Du meinst:

Durch 10000 teilen = Byte 1
Durch 1000 teilen = Byte 2
Durch 100 teilen = Byte 3
Durch 10 teilen = Byte 4
Durch 1 teilen = Byte 5

oder bin ich jetzt total auf dem Holzweg?

tz...tz...tz...was es alles gibt...:p


Gruß,

dia
 
Genau..... und damit kann man weiterarbeiten. Ich zerlege mir mit diesem Befehl meine Zahlen und wandele sie dann in ASCII-Zeichen. Ich mache das zwar nur mit 4 Byte aber mit 5 sollte es auch gehen.
 
[Doppelpost]

Ich war zu langsam...

@Larry: So wie Du das da stehen hast, erkenne ich das... Aber wie kriege ich die vier zusammengehörigen Bits da rausgepult?

Gruß,

dia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aha...

Du meinst:

Durch 10000 teilen = Byte 1
Durch 1000 teilen = Byte 2
Durch 100 teilen = Byte 3
Durch 10 teilen = Byte 4
Durch 1 teilen = Byte 5

oder bin ich jetzt total auf dem Holzweg?

tz...tz...tz...was es alles gibt...:p


Gruß,

dia

du bist auf dem richtigen weg ......
 
@Dia:
die zusammengehörigen 4 Bits ausmaskieren (mit UND $0F) und dann den gewandelten Wert um 4 Bits nach Rechts schieben und wieder ausmaskieren.
Ich denke aber, die Vorgehensweise geht schon mehr in Richtung "Geschmackssache".
Aber was soll denn dabei herauskommen ?
Es gäbe ja auch noch die Möglichkeit den DINT-Wert in einen String zu wandeln (mit dem dazugehörigen Siemens-FC aus der Bibliothek). Dann hättest du ja auch n Bytes gefüllt - aber mit ASCII-Zeichen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... hier mal meins als Beispiel :
Code:
L #Ausgangszahl
DTB
T #BCD_Zahl
L w#F
UW
T #Byte_5

L #BCD_Zahl
SRD 4
L w#F
UW
T #Byte_4

usw.
 
Zuletzt bearbeitet:
Ich soll hier einen Generator ansteuern, dessen Speicher so aufgebaut ist, dass er er maximal den Wert 99999 fassen kann. Aber es ist eben jede einzelne Stelle in einem Extrabyte. Und genau so muss ich den Kram dann da reinschreiben. Ich habe langsam das Gefühl, dass das ein langer, langer Weg werden wird, bis das alles so hinhaut, wie Chef das möchte...

Immerhin: Chef hat mich erstmal zu SERV1 und SERV2 angemeldet um mein Grundwissen zu erweitern. Mit Glück lässt er dann noch PRO2 springen. Mit meinem Berufsschulniveau bin ich hier echt am Ende meines Lateins angekommen...

Gruß,

dia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Umwandlung von 4 Zeichen in ASCII mit MOD-Befehl



Code:
 L     "DB109".Palletdata.Palletwidth  // INT
      L     1000
      MOD   
      T     #MOD_100
      L     100
      MOD   
      T     #MOD_10
      L     10
      MOD   
      T     #MOD_1


      L     "DB109".Palletdata.Palletwidth
      L     1000
      /I    
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_1  // 1. Stelle

      L     #MOD_100
      L     100
      /I    
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_2  // 2. Stelle

      L     #MOD_10
      L     10
      /I    
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_3  // 3. Stelle

      L     #MOD_1  // 4. Stelle
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_4
 
Zuviel Werbung?
-> Hier kostenlos registrieren
[gleiches Thema...gleiches Elend]

So... neuer Tag, neuer Versuch...

Guten Morgen zusammen,

ich habe das mit "MOD" mal ausprobiert und irgendwie hat das nicht so recht geklappt.
DB30.jpgFB10.jpg

Vielleicht habe ich es auch nicht begriffen...
Allerdings verstehe ich Larrys Lösung auch nicht. Kann mir bitte jemand Schritt für Schritt erklären, was da vor sich geht.:confused:
Mit AWL habe ich es nicht so. Ich habe immer (bisher erfolgreich) versucht, mich davor zu drücken... nun rächt es sich!

In meinem Fall habe ich mal die Zahl 547 genommen... nun hätte ich gerne in Byte 43 die 7, in Byte 42 die 4 und in Byte 41 die 5.
Und ich brauche den ganzen Kram als Hexadezimalzahl...nicht als BCD... da habe ich wohl beim Lesen gepennt!


Anschließend muss ich den ganzen Kram dann Byte für Byte an den Profibus-Konverter schicken. Aber das bekomme ich wahrscheinlich hin.

Gruß,

dia
 
Zuletzt bearbeitet:
Du hast das Beispiel von Lipperlandstern genommen, aber nur die 1. Hälfte davon.
Mit Mod ermittelt er jeweils den Rest nach einer Division. Dieser jeweilige Rest muß dann noch einmal dividiert werden (/1000, /100, /10), dann hat man das ganzzahlige Vielfache, also die Ziffer der Stelle.

Larry wandelt die Zahl in BCD. Dann steht eine Ziffer jeweils in 4 Bit.
Mit

L w#F
UW

maskiert er die rechten 4 Bit, also nur die bleiben stehen, alle anderen bit links davon werden 0
Dann hat er zuerst die kleinste Ziffer.
Nun die gespeicherte Zahl und 4 Bit nach rechts schieben.

Siehe Kommentar am Code.

Code:
L #Ausgangszahl   
DTB                //wandeln in BCD
T #BCD_Zahl        //Zwischenspeichern
L w#F              //Maske für 4 Bit rechts laden
UW                 //die rechten 4 Bit ausmaskieren (kleinste Ziffer, alle Bit links davon werden 0)    
T #Byte_5          //Einer-Stelle ermittelt

L #BCD_Zahl        //Zwischengespeicherte BCD-Zahl laden  
SRD 4              //4 Bit nach rechts schieben, jetzt steht die Zehnerstelle in den 4 Bit ganz rechts
L w#F              //Maske für 4 Bit rechts laden
UW                 //die rechten 4 Bit ausmaskieren (kleinste Ziffer, alle Bit links davon werden 0)    
T #Byte_4          //Zehner-Stelle ermittelt

usw. bis Stelle 1
 
Zuletzt bearbeitet:
So... neuer Tag, neuer Versuch...

Guten Morgen zusammen,

ich habe das mit "MOD" mal ausprobiert und irgendwie hat das nicht so recht geklappt.
Anhang anzeigen 16775Anhang anzeigen 16776

Vielleicht habe ich es auch nicht begriffen...
Allerdings verstehe ich Larrys Lösung auch nicht. Kann mir bitte jemand Schritt für Schritt erklären, was da vor sich geht.:confused:
Mit AWL habe ich es nicht so. Ich habe immer (bisher erfolgreich) versucht, mich davor zu drücken... nun rächt es sich!

In meinem Fall habe ich mal die Zahl 547 genommen... nun hätte ich gerne in Byte 43 die 7, in Byte 42 die 4 und in Byte 41 die 5.
Und ich brauche den ganzen Kram als Hexadezimalzahl...nicht als BCD... da habe ich wohl beim Lesen gepennt!


Anschließend muss ich den ganzen Kram dann Byte für Byte an den Profibus-Konverter schicken. Aber das bekomme ich wahrscheinlich hin.

Gruß,

dia


Wie Ralle schon geschrieben hast musst du auch den ganzen Teil von der Umwandlung benutzen ......

Code:
 L     "DB109".Palletdata.Palletwidth
      L     1000
      /I    
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_1  // 1. Stelle

      L     #MOD_100
      L     100
      /I    
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_2  // 2. Stelle

      L     #MOD_10
      L     10
      /I    
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_3  // 3. Stelle

      L     #MOD_1  // 4. Stelle
      L     W#16#30
      +I    
      T     "DB560".Palletwidht_4

Nur zur Vollständigkeit. Wenn die Ziffern nicht in Ascii-Code (also als Char) benötigt werden, dann bitte

L W#16#30
+I

weglassen!

PS: Oh, entschuldige Lipperlandstern, ich habe ausversehen in deinen Post reingeschrieben. War keine Absicht, aber ich laß es mal drin ja. Ralle!
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben