# Char umwandeln in Integer



## viperserver (2 Januar 2008)

Hallo Ihr,
ich hab folgendes Problem.
Zur Zeit lade ich von einem Handscanner Daten (Ascii) in einen DatenBaustein (DB). 
Zu Scannen ist 1.500 oder 500 oder 2.300 als Barcode.
In meinem DB schreibt er mir dann aber in jede Zeile ein Zeichen
0
1
_
5
0
0

(Zeile im DB ist als "Char" deklariert)

Mein Problem ist bloß das ich das so nicht gebrauchen kann, sondern als komplete Zahl ("1500" oder "500" oder "2300"). Am besten wäre es wenn es ein INT oder eine REAL Zahl wäre.

Leider bin ich in der SPS nicht so der Checker und hab keine ahnung wie ich das am besten umwandeln kann, ob ich das am besten davor mache bevor ich das in den DB schreibe oder hinterher.

Ich hoffe ihr könnt mir helfen.

Gruß Dennis


----------



## Larry Laffer (2 Januar 2008)

Hallo,
ich würde das Ganze in einen String einlesen und dann mit der Funktion aus der Systembibliothek (IEC-Funktionen) "STRING_I" (FC38) in einen INT-Wert wandeln lassen.
Es gäbe da auch noch "STRING_DI" für DINT-wandeln (FC37).

Gruß
LL


----------



## viperserver (2 Januar 2008)

Also ich hab das schon mal Probiert, aber das geht nicht! Hab an dieser Lösung auch schon herum gemacht. 
Aber was mir dazu noch aufgefallen ist, was mache ich mit dem Unterstrich "_"? den Kann die Funktion mir ja nicht Umwandeln.

Ist es normal das ich in deinem DB Strings nicht beobachten kann?

aber trotzdem vielen Dank
Nur kurz zur Info. 
Ich habe eine cou 315 2dp und eine cp340 über der ich die Daten per Handscanner einlese. (zur Zeit in den DB). Den Wert wie oben beschrieben möchte ich als Int oder Real haben z.B 1500.


----------



## Ralle (2 Januar 2008)

Sieh dir das mal an:

http://www.sps-forum.de/showthread.php?p=72914#post72914

Der FC207 von OHGN paßt eigentlich exakt zu dem, was du brauchst.


----------



## Larry Laffer (2 Januar 2008)

Hallo,
erstens:
- warum funktioniert die Geschichte mit dem String nicht bei dir ?
  Vielleicht stellst du mal dein bisheriges Programm hier ein - dann läßt sich vielleicht auch was lösen ...

zweitens:
- der Unterstrich ist immer zwischen der Tausender und der Hunderter-Stelle ? Wäre bei einem String auch kein Problem, da es dort noch die Funktion FIND gäbe für "Zeichen(-kette) in einem String finden" bzw. die Funktion DELETE, die ein (oder mehrere) Zeichen an/ab einer Position löscht ...

Gruß
LL


----------



## Kai (2 Januar 2008)

viperserver schrieb:


> Zur Zeit lade ich von einem Handscanner Daten (Ascii) in einen DatenBaustein (DB).
> Zu Scannen ist 1.500 oder 500 oder 2.300 als Barcode.
> In meinem DB schreibt er mir dann aber in jede Zeile ein Zeichen
> 0
> ...


 
Hier mal ein kurzes Programmbeispiel:


```
// ASCII-Tabelle
//
// CHAR '0' = HEX 30 = DEZ 48
// CHAR '1' = HEX 31 = DEZ 49 
// CHAR '2' = HEX 32 = DEZ 50 
// CHAR '3' = HEX 33 = DEZ 51 
// CHAR '4' = HEX 34 = DEZ 52 
// CHAR '5' = HEX 35 = DEZ 53 
// CHAR '6' = HEX 36 = DEZ 54 
// CHAR '7' = HEX 37 = DEZ 55 
// CHAR '8' = HEX 38 = DEZ 56 
// CHAR '9' = HEX 39 = DEZ 57 
 
      AUF   DB   200
 
      L     0
      T     MD   200                    // Ergebnis
 
      L     DBB    0                    // Wert x 10000
      ITD   
      L     L#48
      -D    
      L     L#10000
      *D    
      T     MD   200                    // Ergebnis
 
      L     DBB    1                    // Wert x 1000
      ITD   
      L     L#48
      -D    
      L     L#1000
      *D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
 
      L     DBB    3                    // Wert x 100
      ITD   
      L     L#48
      -D    
      L     L#100
      *D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
 
      L     DBB    4                    // Wert x 10
      ITD   
      L     L#48
      -D    
      L     L#10
      *D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
 
      L     DBB    5                    // Wert x 1
      ITD   
      L     L#48
      -D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
```
 
Gruß Kai


----------



## viperserver (2 Januar 2008)

Ich schreibe das Programm im FUP. 
von mir aus könnte ich dir das Programm schicken Larry Lafer. 
Das mit dem String ist so, er macht da einfach gar nichts... Ich bin mir eigentlich ziehmlich sicher, das es daran liegt, das da der Unterstrich "_" drin ist... 
Weil er mir das ja auch so vom Handscanner in den DB ließt. 
0
1
_
5
0
0
und er ja immer das Ziffern will!


----------



## Larry Laffer (2 Januar 2008)

viperserver schrieb:


> Ich schreibe das Programm im FUP.
> von mir aus könnte ich dir das Programm schicken Larry Lafer.


 
.. wenn dann hier einstellen (siehe Beispiel von Kai).
Ich denke aber, dass die FUP-Geschichte schon meinem Vorschlag entgegensteht. Ich glaube nicht, dass ich das in FUP schreiben könnte.

@Kai:
Ich glaube, dein Vorschlag funktioniert bei Zahlen unter 1000 nicht, da dann der Tausender-Punkt an der Position wegfällt und die vorderen Stellen vermutlich auch ...

Gruß
LL


----------



## Kai (2 Januar 2008)

Larry Laffer schrieb:


> Ich glaube, dein Vorschlag funktioniert bei Zahlen unter 1000 nicht, da dann der Tausender-Punkt an der Position wegfällt und die vorderen Stellen vermutlich auch ...


 
@Viperserver,

wie sehen Deine Zahlen < 1000 im DB aus?  

DBB0 = '0'
DBB1 = '0'
DBB2 = '.'
DBB3 = '9'
DBB4 = '8'
DBB5 = '7'

oder so:

DBB0 = '9'
DBB1 = '8'
DBB2 = '7'
DBB3 = ''
DBB4 = ''
DBB5 = ''

Gruß Kai


----------



## viperserver (2 Januar 2008)

Leider hab ich ein Problem mit AWL. Ich kenn mich damit mal 0 Aus



Also ich speichere das in den DB41   es kommt vom FC41 über den P_RCV   (1 Netzwerk)


----------



## viperserver (2 Januar 2008)

Meine Zahlen sehen so aus!! 

0            oder     1       oder   0
1                       5                2
_                       _                _
5                       0                3
0                       0                0  
0                       0                0


----------



## viperserver (2 Januar 2008)

Kai schrieb:


> @Viperserver,
> 
> wie sehen Deine Zahlen < 1000 im DB aus?
> 
> ...


 

so wie bei dir das Oberste. Außer anstatt dem Punkt kommt bei mir ein "_"


----------



## Larry Laffer (2 Januar 2008)

...
in welchem FB holst du dir den mit dem FB2 die Stückzahl aus dem Scanner ?
Du scannst in deinem Beispiel ja noch ein paar andere Sachen außerdem ein. Da bin ich auf die Schnelle nicht so durchgestiegen ...

Gruß
LL


----------



## Kai (2 Januar 2008)

viperserver schrieb:


> so wie bei dir das Oberste. Außer anstatt dem Punkt kommt bei mir ein "_"


 
Dann sollte mein Programmbeispiel funktionieren.

http://www.sps-forum.de/showpost.php?p=113144&postcount=6

Gruß Kai


----------



## viperserver (2 Januar 2008)

ich holle das im FC41 (Netzwerk 1) und speichere es dann in den DB41... 
da steht es dann drin.. jedes Zeichen in einer Spalte..


----------



## Larry Laffer (2 Januar 2008)

!... sehe ich auch so ...
War ja auch nur so eine Idee ...


----------



## viperserver (2 Januar 2008)

Kai schrieb:


> Dann sollte mein Programmbeispiel funktionieren.
> 
> http://www.sps-forum.de/showpost.php?p=113144&postcount=6
> 
> Gruß Kai


 

Kai,
vielen dank für das AWL BSP. 
Aber leider kenn ich mich echt Null mit AWL aus...

Aber DANKE


----------



## Larry Laffer (2 Januar 2008)

...?
Du machst einfach einen neuen FC, schaltest die Ansicht auf AWL um und dann gibst du den Code-Vorschlag von Kai so ein, wie der ihn gepostet hat. Mehr brauchst du da nicht dran können.
Für die Zukunft würde ich dir aber auf jeden Fall empfehlen, dich in AWL einzuarbeiten. In der Praxis kommst du so noch am Weitesten ... 

Gruß
LL

Nachsatz:
so kompliziert ist der Vorschlag von kai auch nicht, dass man nicht verstehen könnte, was er im Einzelnen programmiert hat ...


----------



## Ralle (2 Januar 2008)

@viperserver
Nimm doch den FC207 von OHGN, muß der zwingend in FUP sein? Du kannst den Code in eine leere Quelle einfügen, dann übersetzen. Anschließend hast du einen FC207, an den kannst du die 4 relevanten Char (ohne den Unterstrich) einzeln als INPUT antragen, als Ergebnis kommt dein INT raus. Was willst du mehr?


----------



## viperserver (2 Januar 2008)

Larry Laffer schrieb:


> ...?
> Du machst einfach einen neuen FC, schaltest die Ansicht auf AWL um und dann gibst du den Code-Vorschlag von Kai so ein, wie der ihn gepostet hat. Mehr brauchst du da nicht dran können.
> Für die Zukunft würde ich dir aber auf jeden Fall empfehlen, dich in AWL einzuarbeiten. In der Praxis kommst du so noch am Weitesten ...
> 
> ...


 

ja und wo speichert er mir das dann hin? und bzw. wo hollt er mir die daten dann raus.. ich sollte ihm ja sagen das er vom db 41 das hollen soll oder nicht? und wo er es hinspeichern soll.

ja danke das mit awl hab ich schon von vielen gehört. in der firma wo ich die technikerarbeit schreibe, wird aber alles in FUP programmiert.


----------



## OHGN (2 Januar 2008)

Ich hab Dein Programm mal testweise erweitert.

Im MW 100 sollten jetzt die Scannerdaten aus dem DB41 als Integerzahl stehen.


----------



## Larry Laffer (2 Januar 2008)

Kai schrieb:


> ```
> [COLOR=red][B] AUF   DB   200[/B][/COLOR]
> 
> L     0
> ...


 
Er holt die Daten aus dem DB200 und schreibt alles in das MD200.
Das könntest du beliebig ändern.

Ich wollte dich nicht kränken oder ähnliches, aber Fakt ist nun einmal :
"mit AWL geht alles - mit KOP oder FUP nun ein Teil" des Funktionsumfangs der SPS und immer nur, wenn du die Übersetzungs-Spielregeln beherrscht ...!

Gruß
LL


----------



## viperserver (2 Januar 2008)

Ralle schrieb:


> @viperserver
> Nimm doch den FC207 von OHGN, muß der zwingend in FUP sein? Du kannst den Code in eine leere Quelle einfügen, dann übersetzen. Anschließend hast du einen FC207, an den kannst du die 4 relevanten Char (ohne den Unterstrich) einzeln als INPUT antragen, als Ergebnis kommt dein INT raus. Was willst du mehr?


 

ja ok könnte ich so machen... 
aber der bring bei mir jetzt eine fehlermeldung

Symbolischer Bausteinname 'FC' nicht erkannt!!!


----------



## viperserver (2 Januar 2008)

Larry Laffer schrieb:


> Er holt die Daten aus dem DB200 und schreibt alles in das MD200.
> Das könntest du beliebig ändern.
> 
> Ich wollte dich nicht kränken oder ähnliches, aber Fakt ist nun einmal :
> ...


 

ne kränken kannst du mich damit nicht ;-) 
hab davor noch nie was mit SPS zu tun gehabt, und die Firma wo ich arbeite will das halt soll. Weil bei denen in jedem Werk das so ist.
Nach meiner Technikerarbeit sieht das anders aus, weil ich mich dann nicht mehr damit rumschlagen muss. 
aber dir vielen dank


----------



## viperserver (2 Januar 2008)

OHGN schrieb:


> Ich hab Dein Programm mal testweise erweitert.
> 
> Im MW 100 sollten jetzt die Scannerdaten aus dem DB41 als Integerzahl stehen.


 
hy.
vielen Dank. werde das gleich Testen.. 
vielen vielen Dank.


----------



## Larry Laffer (2 Januar 2008)

viperserver schrieb:


> ja ok könnte ich so machen...
> aber der bring bei mir jetzt eine fehlermeldung
> 
> Symbolischer Bausteinname 'FC' nicht erkannt!!!


 
Das bedeutet, dass du dem FC207 (warscheinlich den) in der Symbolik den Namen FC zugewiesen hast. Entweder er behält der alten Namen "txt_to_int" oder einen sinnvollen Neuen, wenn du symbolische Adressierung ausgeschaltet hast ...

Gruß
LL


----------



## viperserver (2 Januar 2008)

OHGN schrieb:


> Ich hab Dein Programm mal testweise erweitert.
> 
> Im MW 100 sollten jetzt die Scannerdaten aus dem DB41 als Integerzahl stehen.


 



wo läßt du jetzt das MW 100 hinspeichern? entweder bin ich zu blöde (was höchstwahrscheinlich ist) oder ich find es wirklcih nicht.. hast du es in einem DB wieder hineingespeichert...

ich hab nur deine AWL Datei txt_to_i


----------



## viperserver (2 Januar 2008)

viperserver schrieb:


> wo läßt du jetzt das MW 100 hinspeichern? entweder bin ich zu blöde (was höchstwahrscheinlich ist) oder ich find es wirklcih nicht.. hast du es in einem DB wieder hineingespeichert...
> 
> ich hab nur deine AWL Datei txt_to_i


 


hast sich erledigt danke.... mein pc hatte sich aufgehangen, hab das im ob nicht sehen können weil es das programm nur teilweise geladen hat


----------



## Kai (2 Januar 2008)

@Viperserver,

welche Daten aus dem DB41 willst Du eigentlich von CHAR nach INT umwandeln? 

Willst Du die Stückzahl_1 (DBB72) bis Stückzahl_5 (DBB77) umwandeln? 

Gruß Kai


----------



## Kai (3 Januar 2008)

Kai schrieb:


> ```
> // ASCII-Tabelle
> //
> // CHAR '0' = HEX 30 = DEZ 48
> ...


 
Hier noch mal ein kurzes Programmbeispiel, wie man den obigen AWL-Programmcode als FUP-Programmcode programmieren kann.

Gruß Kai


----------



## edison (3 Januar 2008)

Ups, hatte Seite 3 nicht gelesen


----------



## viperserver (3 Januar 2008)

Kai schrieb:


> Hier noch mal ein kurzes Programmbeispiel, wie man den obigen AWL-Programmcode als FUP-Programmcode programmieren kann.
> 
> Gruß Kai


 
hy kai,

vielen dank für deine Hilfe. 
Durch deine und OHGN`s Hilfe hat es jetzt voll geklapt.... 
Es waren genau die Stückzahl_1 bis Stückzahl_5.! 
vielen Dank

Gruß Dennis


----------



## Kai (4 Januar 2008)

Hallo Dennis,

Danke für die Rückmeldung.  

Gruß Kai


----------



## paula23 (5 Januar 2011)

Habe ich eine Möglichkeit, einen REAL Wert in Char zu zerlegen ???

Danke.


----------



## vierlagig (5 Januar 2011)

paula23 schrieb:


> Habe ich eine Möglichkeit, einen REAL Wert in Char zu zerlegen ???
> 
> Danke.



ohne jetzt großartig die bibliotheken gewälzt der gegoogelt zu haben: wert mal 100, in dint wandeln und bei der umwandlung in einen string, das komma nicht vergessen... zwei kommastellen sind meist mehr als ausreichend...


----------



## winnman (5 Januar 2011)

RDT Real nach DINT
DINT DINT nach INT
INC sollte CHAR ergeben
Sorry aber für genaue Syntax F1 

ach 4L war viel schneller und genauer, folg Ihm.


----------



## paula23 (6 Januar 2011)

ich bin mir nicht sicher, aber gibt es da nicht schon einen FC in der Biblothek ?


----------



## marlob (6 Januar 2011)

paula23 schrieb:


> ich bin mir nicht sicher, aber gibt es da nicht schon einen FC in der Biblothek ?


FC30 R_String, dann hat man die Chars auch


----------



## Larry Laffer (6 Januar 2011)

... bei Verwendung diese FC's wird aus der Variablen dann aber auch genau das, was man in der Status-Ansicht sieht - also aus 127.55 wird dann 1.275500E02 - das ist dann wahrscheinlich auch nicht unbedingt gewünscht.
Ich würde hier dann auch ehr dem Vorschlag von 4L folgen und mir ggf. das Komma später einschieben (falls benötigt).

Gruß
Larry


----------



## paula23 (6 Januar 2011)

Ich stelle mich gerade blöd an, wie übergebe ich denn jetzt einen STRING in einen DB ???


----------



## Larry Laffer (6 Januar 2011)

... am Besten symbolisch ... 

Du erzeugst in deinem DB eine Variable vom Typ String (mit der richtigen Größe). Du gibst dem DB einen symbolischen Namen (z.B. "myDB") und dann kannst du dem FC den String als Parameter in der Form "myDB".myString übergeben. Du mußt aber daran denken, dass der String initialisiert sein will - das heißt, dass im 1.Header-Byte des String dessen deklarierte Länge drinstehen muss (also von dir händisch dort eingetragen).

Zu dem Thema würde übrigens auch die Forums-Suche so Einiges ausspucken ...

Gruß
Larry


----------



## motamas (7 März 2011)

Hallo!

Ich habe auf der Suche nach einer Lösung für mein Problem diesen Thread hier gefunden und poste das hier einfach mal 

Prinzipiell habe ich bei mir einen Messumformer der mit einen 7 Byte langen rückgabe Wert in Form zurückgibt. Auch dieser ist nach meinen Informationen im ASCII Code codiert. Soweit so gut!
Das Hauptproblem was ich hatte war ein laufendes Komma zeichen. Sprich es ist nicht bekannt in welchem Byte es nun steht. Dafür hab ich vor jedem übertragen eine Überprüfung mit dem Dezimalwert für das Komma aus der ASCII tabelle eingefügt.
Leider hab ich den Messumformer auch nicht zum testen, was mich ja nicht daran hindert ne kleine Testumgebung zu basteln.
Da hab ich also angefangen mein Programm zu schreiben, welches dem hier gepostetem Beispiel von Kai sehr ähnlich aussieht.
Mein Hauptproblem ist allerdings dass die Werte von Step 7 in Hex umgerechnet werden und somit komplett falsche Werte entstehen.
Wenn ich also in meinem DB in eines der 7 Datenbytes (sind als char deklariert) eine '0' schreibe, dann habe ich den Wert 30 mit dem weiter gerechnet wird. 
Zum mindestens steht das so im beobachten Modus der AWL Tabelle.
Woran kann das liegen?
Jemand ne Idee wo mein Denkfehler liegt?


----------



## vierlagig (7 März 2011)

motamas schrieb:


> Wenn ich also in meinem DB in eines der 7 Datenbytes (sind als char deklariert) eine '0' schreibe, dann habe ich den Wert 30 mit dem weiter gerechnet wird.



0dez = 30char
1dez = 31char
...

http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange


----------



## jabba (7 März 2011)

vierlagig schrieb:


> 0dez = 30char
> 1dez = 31char
> ...




'0' Char  ^ 30 Hex ^ 48 Dez
'1' Char  ^ 31 Hex ^ 49 Dez
...


----------



## motamas (7 März 2011)

Danke für die super schnelle Antwort ;D
Dieser Punkt ist mir allerdings schon klar  Nur versteh ich nicht warum er dann auch mit 30 rechnet als hex bzw. 48 in dez.
Denn in meiner Tabelle AWL Tabelle steht wenn ich eine '0' eingegeben habe:
Operation - Daten - VKE - STA - Standard
L DB1.dbb0 (Datenbyte) 1 1 30 
ITD 1 1 30
L L#0 1 1 0
-D 1 1 30 
L L#1 (1er-Stelle) 1 1 1
*D 1 1 30 
L DB1.dbd50 (Daten) 1 1 0
+D 1 1 30 
T DB1.dbd50 (Daten) 1 1 30

Somit steht in dem DINT Daten eine 30 wo aber eine Null stehen sollte. Das wirkt sich dann so aus dass wenn ich die Daten auslesen möchte eine 48 im DB steht. Wie bekomme ich das weg sodass da dann die 0 steht ;D

Danke


----------



## Zefix (7 März 2011)

Schau dir die Tabelle an, dann wirds vielleicht klarer 

http://www.torsten-horn.de/techdocs/ascii.htm


----------



## vierlagig (7 März 2011)

jabba schrieb:


> '0' Char  ^ 30 Hex ^ 48 Dez
> '1' Char  ^ 31 Hex ^ 49 Dez
> ...



ja, natürlich ist deine darstellung richtiger :twisted:


----------



## motamas (7 März 2011)

So danke euch für die schnellen Links. Ich hab mein Problem gefunden, welches darin lag dass ich anstatt von L#48 L#0 abgezogen habe.
Dadurch wird dann wohl genau diese Umrechnung ermöglicht.
Danke nochmal!


----------

