AWL: Dez Zahl auf 10er Potenzen Zerlegen

zerlegen

Hallo maxi,

manche denken zwar ich kann nur KOP, aber hier die Lösung in AWL bis 999. Für grössere Zahlen musste das Format anpassen.

L #Zahl
ITB
T #Zahl_temp

SRW 8
UW W#16#F
T #Stelle 1

L #Zahl_temp
SRW 4
UW W#16#F
T #Stelle 2

L #Zahl_temp
UW W#16#F
T #Stelle 3

MfG
André Räppel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke dir,

ich war jetzt echt voll am Grübeln ob es mit schieben geht.
Wollte sie schon in AscII wandeln und einfach wie in Assembler die gewünschte Stelle raus picken.

Manchmal einfach zu viel Exremes im Kopf habe das man das einfachste nimemr sieht :)

Danke udn schönen Tag dir.
 
Die ST variante:

Code:
VAR
  diWert      : DINT;
  diHunderter : DINT;
  diRest      : DINT;
  diZehner    : DINT;
  diEiner     : DINT;
END_VAR


diWert      := 345;

diHunderter := diWert  /  100;
diRest      := diWert MOD 100;
diZehner    := diRest  /  10;
diEiner     := diRest MOD 10;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie geht das mit 5 stelligen Zahlen ?

ich habe versucht dein Beispiel zu erweitern klappt aber irgendwie nicht.
Problem ist das ich diverse Daten von einer Waage (Siwarex, Scanner, datum, Uhrzeit) als Ausgabe müssen die Daten als ASCII Code in einem DB geschrieben werden.

WgNr ARRAY[0..1]
CHAR
AlibiNr ARRAY[0..6]
CHAR
LfdNr ARRAY[0..6]
CHAR
Datum ARRAY[0..8]
CHAR
Zeit ARRAY[0..6]
CHAR
Netto ARRAY[0..6]
CHAR
Brutto ARRAY[0..6]
CHAR
EAN_Code ARRAY[0..18]
CHAR
Artikelbezeichnung ARRAY[0..28]
CHAR
ArtikelID ARRAY[0..2]
CHAR
Bediener ARRAY[0..18]
CHAR

gibt es eine einfache Möglichkeit dieses zu realisieren?
 
Problem ist das ich diverse Daten von einer Waage (Siwarex, Scanner, datum, Uhrzeit) als Ausgabe müssen die Daten als ASCII Code in einem DB geschrieben werden.

Kannst Du Dein Problem noch mal etwas genauer beschreiben?

Was für Daten bekommst Du genau?

In welchem Datenformat bekommst Du die Daten?

Wo liegen die Daten die Du bekommst? Auch in einem DB?

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

nen Trick gibts.

INT -> DINT -> 32Bit BCD und dann sinngemäss wie meine hier vorgestellte Lösung.

André
Wußte gar nicht, daß es 32Bit BCD auf der S7 gibt. Wenn es die nicht gäbe und für noch größere Zahlen geht folgendes: Wenn ITB eine Zahl bis 999 umwandeln kann (oder sind es 9999?), kann man eine größere Zahl n zerlegen:
n mod 1000 ist eine Zahl mit den letzten drei Stellen von n.
n /1000 enthält die führenden Ziffern und wenn sie immer noch zu groß für ITB ist, kann man den obigen Schritt wiederholen.

ITB ergibt sicherlich den kürzeren Code. Intern ist dieser Befehl aber bestimmt auch über mehrfache Division mit Rest implementiert, so daß die Ausführungszeit nicht wesentlich kleiner als die für mehrere MOD-Operationen sein sollte. Allerdings läßt sich der ITB-Befehl intern etwas optimieren, da der Divisor immer 10 ist. Deshalb könnte er schneller sein.
 
Zurück
Oben