mehrstellige INT in CHAR u. in DB schreiben

A

Anonymous

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,

also eine vielstellige INT Zahl oder DINT Zahl umzuwandeln ist ja nicht so schwer. Das ganze habe zum ausprobieren mal statisch gemacht. Aus dem DINT 1234567 berechne ich die einzelnen Stellen mit einer Division durch 1000000, dann durch 100000.....bis hin zu 10 und die 1er bleiben dann noch übrig. Funzt auch soweit und die Daten liegen dann im DB43 in einem langen Char Array.Ich schreibe jeden CHAR einzeln, da ich danach dann eine Textdatei aus den DB43 gemacht habe, mit String würde das glaub ich nicht gehen,besser gesagt eine CSV-Datei, die ich dann in Excel bearbeiten kann.
Jetzt meine Frage, besser gesagt mein Problem:
Ich habe ca.100 7-stellige DINT Zahlen in einem Datenbaustein stehen, die jetzt umgewandelt werden müssen und einzeln als chars hintereinander in meinen DB43 eingetragen werden müssen.
Man müßte also einen DINT aus einem Datenbaustein holen umwandeln( dabei die einzelnen chars schreiben), dann um einen DINT hochzählen,den nächsten DINT holen,umwandeln,und der char pointer müsste dann noch an der alten Stelle stehen, wo man die Daten dann weiter einträgt.

Hier ist der Code, wie ich die Ints gewandelt hab.(Ne bessere Lösung ist mir nicht eingefallen):
/----------------------------------------- 1000000 -------------------------------------------------------
L DB1.DBD 0
L L#1000000
/D
T MW 20 //1000er liegen in MW20
L W#16#30 //W#16#30 wir addiert daraus wird char
+D

T DB43.DBB 20 //Fertiger Char in DB43 an Stelle 20

//--------------------------------------------100000 ---------------------------------------------------------------
L MW 20 //Bestimmung der 100000er
L L#-1000000
*D
L DB1.DBD 0
+D
T #ZwSpeicher
L L#100000
/D
T MW 22
L W#16#30
+D
T DB43.DBB 21

usw.
 

Jochen Kühner

Well-known member
Beiträge
4.186
Punkte Reaktionen
479
ints wandel....

wiseo wandelsd du die ints nicht mit der iec funktion DI_STRNG

von int in einen string.

dann hast du die einzelen zahlen jeweils in einem byte stehen...

wenn du nicht den char wert willst sondern die zahl, musst du glaube ich noch 30 abziehen.

dann würde es so ablaufen:

zähler+1
l zahl[zähler]
Distring zahl ==> text

text [2] ==> ziffer 1 usw...

zielbyte = zähler*länge des zielstrings
ziffer1==>zielbyte,p0
ziffer2==>zielbyte,p1...

hoffe das ist so verständlich...
 
OP
S

SchwesterEster

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
int´s wandeln

Hmm, das könnte klappen.....

Ich will ja am Schluß die CHAR´s in mein dickes Array reinschreiben. Strings gehen da nicht rein.Da wird dann keine Text-Datei raus.

Also, wenn ich das richtig verstanden habe:

1. Die INT mit DI_STRING in Strings wandeln, das sieht dann so aus "1234567" als String. Jede Zahl belegt ein Byte,richtig?

2. Die einzelnen Bytes "abfahren" und in das Char Array übertragen,richtig?

Wie krieg ich denn die einzelnen INT nacheinander in meine Funktion um sie erst mal in einen String zu Wandeln, den ich ja dann nochmal zwischenspeichern muß,oder nicht? und dann muß ich nochmal die Strings alle abarbeiten um die Chars rauszufischen, ist das denn dann nicht genau so kompliziert?
 

PORTAL

New member
Beiträge
1
Punkte Reaktionen
0
Hallo zusammen,
ich habe ein Ähnliches Problem. Ich muss DInt-Werte als Arrays fom typ CHAR zur weiterverarbeitung speichern. Die Länge von meinen Dint-Werten kenne ich nicht, aber nicht mehr als 10 Stellen, in einen String werden die auf jeden Fall passen. Also habe ich es mir so vorgestellt:
Mit DI_STRING (FC 5 aus iec Bibliothek) wandle ich meinen Dint_Wert in ein CHAR_String.
Mit LEN (FC 21 iec) kann ich die Länge vom CHAR_String ermitteln.
Anschliessend nacheinander in einer Schleife die Byte's aus dem CHAR_String in den CHAR_Array kopieren.
Nun mein Problem: Die FC 5 scheint nicht richtig zu funktionieren, d.h., dass ich bekomme uberhaupt nicht zurück. Woran kann es liegen?


Code:
CALL "DI_STRING"
  I :=#DInt_Wert
  RET_VAL:=#CHAR_String
NOP 0
 
CALL "LEN"
  S :=#CHAR_String
  RET_VAL:=#String_Laenge // als Int
NOP 0
 
// weiter werde ich abkürzen, denn hier kommen viele operationen mit
// Pointer und Zählern die nicht unbedingt wichtig sind
        L #String_Laenge
loop: T #String_Laenge
... // die Adresse im Pointer wird hochgezählt
L CHAR_String[#pointer] 
T CHAR_Array[#pointer]
...
L #String_Laenge
LOOP loop
nop 1

Nun erhalte ich schon nach dem aufruf von FC 5 keinen String zurück. Wo ist mein Problem?
Bin für jede Hilfe dankbar!
 
Oben