Step 7 INT Zahl Dezimalstelle 1er, 10er, 100er, 1000er

XPM

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

ich arbeite an einer S7-400er mit dem Simatic-Manager (AWL).
Ich bekomme vom Leitsystem eine (i.d.R. 4stellige) Integer-Zahl.
z.B. 1302 - diese gliedert sich in zwei Bereiche 13=Förderweg & 02=Antrieb.

Ich würde gerne aus dieser INT-Zahl zwei getrennte INT-Zahlen erstellen.

Vielleicht hat jemand eine Idee, wie ich das am elegantesten lösen könnte.
 
Zerlegung in einzelne Ziffern: Den INT-Wert fortlaufend durch 10 dividieren - der Divisionsrest liefert jeweils die letzte Ziffer. Für den Divisionsrest kann man auch MOD benutzen.
In zwei zweistellige Zahlen zerlegen: durch 100 dividieren. Liefert: Quotient = vordere 2 Ziffern, Divisionsrest = hintere 2 Ziffern.

Harald
 
@Larry Laffer Danke! :D
Code:
L     DB704.DBW    0
      T     #FWAN_NR
      L     100
      /D    
      T     #FW

      L     #FWAN_NR
      L     100
      MOD   
      T     #AN
Hatte erst den Fehler begangen, durch I zu teilen, und nicht durch /D
Und den Befeh MOD kannte ich bis dato noch gar nicht :rolleyes:
 
@Larry Laffer Danke! :D
Code:
L     DB704.DBW    0
      T     #FWAN_NR
      L     100
      /D    
      T     #FW

      L     #FWAN_NR
      L     100
      MOD   
      T     #AN
Hatte erst den Fehler begangen, durch I zu teilen
Das war eigentlich kein Fehler sondern clever, wenn Du es bewußt gemacht hättest.
Code:
      L     DB704.DBW0
      T     #FWAN_NR
      L     100
      /I
      T     #FW
      SRD   16
      T     #AN

Darf man fragen, was Dir an meiner Antwort nicht gefallen hat? ;)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
 L     DB704.DBW0
      T     #FWAN_NR
      L     100
      /I
      T     #FW
      SRD   16
      T     #AN
Mit dem o.g. Beispiel #FW_AN = 1302
Liefert mir in der INT-Variable #FW = 131085 zurück ?
Antriebsnummer stimmt = 02
 
Die Aussage von Harald ist trotzdem richtig.
Ich hätte auch /I geschrieben. Stellt sich nun die Frage, warum das bei dir ein falsches Ergebnis bringt. Welchen Typs ist den "#FWAN_Nr" ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Liefert mir in der INT-Variable #FW = 131085 zurück ?
Das ist so formuliert nicht richtig.
- Wie kann 131085 in eine INT-Variable passen? ;)
- Liefert "L #FWAN_Nr" auch 131085 zurück?

AWL-Beobachten: Achtung! Man beobachtet nicht den Inhalt von Variablen sondern den Inhalt der AKKUs!
- Bei "T #FWAN_Nr" beobachtet man nicht den Wert, der in #FWAN_Nr geschrieben wird, sondern den Wert, der dabei in AKKU1 (32 Bit) steht. Es werden aber nur die unteren 16 Bit in die INT-Variable geschrieben.
- Bei "L #FWAN_Nr" beobachtet man, was nach dem Transfer in AKKU1 steht - das ist das was in #FWAN_Nr steht.

PS: Die INT-Division mit /D ist genaugenommen nicht richtig. Das darf man nur bei positiven Zahlen machen. Wenn die Ausgangszahlen auch negativ sein können, dann MUSS man /I benutzen.

Harald
 
Das ist so formuliert nicht richtig.
- Wie kann 131085 in eine INT-Variable passen? ;)
- Liefert "L #FWAN_Nr" auch 131085 zurück?
Das hatte mich auch stutzig gemacht... 131085 passt doch gar ned in 16Bit :confused:

Danke für die ausführliche Erklärung der Basics ;) Man sollte sich eben daran erinnern WAS man da gerade beobachtet...

Habe mir den Befehl /I nochmal genauer durchgelesen >
Akku2-L wird durch Akku1-L geteilt > Egebnis in Akku1 (wobei dieser 32Bit, bzw. zwei 16Bit Zahlen sind,
die im Low ist mein Quotient, die im High mein Rest.
Mit SRD16 wird der Inhalt vom Akku1 von links nach rechts um 16 stellen verschoben, wobei dann der Inhalt von Akku1-H (mein Rest) in den Akku1-L wandert. Wobei die 16Bit von Akku1-H mit 0en aufgefüllt wird.
Deshalb sehe ich mit der "Brille" dann in der Zeile des Befehls "T #AN" den Inhalt von Akku1 (auch wenn der 32Bit hat) "nur" meinen Rest :D

Hoffe mal, ich hab das jetzt richtig verstanden :rolleyes:

PS: Vom Leitsystem bekomme ich nur positive Zahlen
 
Zurück
Oben