Zeichenkette umwandeln?

Mike Vanstrike

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

Ich hab da ein kleines problem, und zwar hab ich einen Handschrauber mit Peripherie steuerung am Profibus und muss 2 Messwerte auslesen und zur Datenbank weitergeben. Soweit so gut, ich bekomm auch meine Messwerte!
Nur bekomme ich diese in ASCII.Codierung und muss sie aber als REAL-wert zur Datenbank Schicken.

Hat jemand eine Idee wie ich das umwandeln kann???

Für hilfreiche tipps wär ich sehr Dankbar!

Mfg Mike :confused:
 
Es sollte eine "FC39 STRG_R Zeichenkette in Realzahl" Konvertierungs Funktion geben.
Die Alternativen die mir einfallen, wären:
Das ganze selber schreiben, dazu müsstest du die normierung von Real Zahlen wissen, oder du addierst einfach die entsprechenden werte aus dem String in eine mit 0 Vorbelegte Real Zahl.
Eventuell sollte sich das ganze auch Server seitig lösen lassen (hängt aber von der verwendeten Datenbank ab)

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
die genannte Funktion akzeptiert nur Strings, die im Siemens-Real-Format aufgebaut sind (also +1.234546+E001 oder ähnlich) - hierzu auch die Siemens-Hilfe einfach mal anschauen.
Ich verstehe die Frage so, dass der ASCII-String auch so aussehen könnte : "1234,567" - in dem Fall sehe ich nur die Chance, sich eine eigene Routine für die Umwandlung zu bauen.

Kannst du in SCL programmieren ?

Gruß
Larry
 
Leider kann ich nicht in SCL programmieren!

im endeffekt müsste ich es irgendwie so machen das der wert aus dem ersten byte in die 100er, aus dem zweiten in die 10er, und aus dem dritten in die einerstelle des realwertes kopiert werden und die bytes 4 - 6 als nachkommawert eingefügt werden!

Nur hab ich keine idee wie man sowas als routine programmiert!

mfg Mike
 
Na,
schau dir doch mal die ASCII-Codetabelle an !

1dez = 31hex
2dez = 32hex ....

Wenn du also "1234,56" in ASCII erhältst, dann nimm´
(1.ASCII-Zahl - 30hex) * 100 = 100
+
(2.ASCII-Zahl - 30hex) * 10 = 20
+
...usw. ...

zwischendurch stets auf das Komma prüfen, ab da dann
(1.ASCII-Zahl nach dem Komma - 30hex) / 10 = 0,5
+
(2.ASCII-Zahl - 30hex) / 100 = 0,06
... usw. ...

und alles in REAL aufaddieren !

Gruss
 
hey Softmachin,

das klingt ja schonmal ganz gut!

aber kannst du mir noch erklären was du mit - (minus?)30 hex meinst?

--> minus den wert 30 als hex-zahl??? und vllt. noch warum!

Danke

Mfg Mike
 
hey Softmachin,

das klingt ja schonmal ganz gut!

aber kannst du mir noch erklären was du mit - (minus?)30 hex meinst?

--> minus den wert 30 als hex-zahl??? und vllt. noch warum!

Danke

Mfg Mike

Dafür braucht Du eine ASCII tabelle
eine 0 als Text ist gleich einer Zahl 48 oder auch Hex#30
eine 1 als Text ist gleich einer Zahl 49 oder auch Hex#31

Code:
FUNCTION "Char->Real3" : VOID
TITLE =Char wandlung in Real ( Beispiel: 123,34 )
VERSION : 0.1


VAR_INPUT
  Hunderterstelle : CHAR ;    
  Zehnerstelle : CHAR ;    
  Einerstelle : CHAR ;    
  Zehntelstelle : CHAR ;    
  Hundertstellstelle : CHAR ;    
END_VAR
VAR_OUTPUT
  ZIEL_REAL : REAL ;    
END_VAR
VAR_TEMP
  ZW_Real : REAL ;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     0.000000e+000; 
      T     #ZW_Real; 
NETWORK
TITLE =Hunderterstelle

      L     #Hunderterstelle; 
      L     48; 
      <I    ; 
      SPB   n000; 
      POP   ; 
      L     57; 
      >I    ; 
      SPB   n000; 
      POP   ; 
      L     48; 
      -I    ; 
      ITD   ; 
      DTR   ; 
      L     1.000000e+002; 
      *R    ; 
      T     #ZW_Real; 

n000: NOP   0; 
NETWORK
TITLE =Zehnerstelle

      L     #Zehnerstelle; 
      L     48; 
      <I    ; 
      SPB   n001; 
      POP   ; 
      L     57; 
      >I    ; 
      SPB   n001; 
      POP   ; 
      L     48; 
      -I    ; 
      ITD   ; 
      DTR   ; 
      L     1.000000e+001; 
      *R    ; 
      L     #ZW_Real; 
      +R    ; 
      T     #ZW_Real; 

n001: NOP   0; 
NETWORK
TITLE =Einerstelle

      L     #Einerstelle; 
      L     48; 
      <I    ; 
      SPB   n002; 
      POP   ; 
      L     57; 
      >I    ; 
      SPB   n002; 
      POP   ; 
      L     48; 
      -I    ; 
      ITD   ; 
      DTR   ; 
      L     1.000000e+000; 
      *R    ; 
      L     #ZW_Real; 
      +R    ; 
      T     #ZW_Real; 

n002: NOP   0; 
NETWORK
TITLE =Zehntelstelle

      L     #Zehntelstelle; 
      L     48; 
      <I    ; 
      SPB   n003; 
      POP   ; 
      L     57; 
      >I    ; 
      SPB   n003; 
      POP   ; 
      L     48; 
      -I    ; 
      ITD   ; 
      DTR   ; 
      L     1.000000e-001; 
      *R    ; 
      L     #ZW_Real; 
      +R    ; 
      T     #ZW_Real; 

n003: NOP   0; 
NETWORK
TITLE =Hunderstellstelle

      L     #Hundertstellstelle; 
      L     48; 
      <I    ; 
      SPB   n004; 
      POP   ; 
      L     57; 
      >I    ; 
      SPB   n004; 
      POP   ; 
      L     48; 
      -I    ; 
      ITD   ; 
      DTR   ; 
      L     1.000000e-002; 
      *R    ; 
      L     #ZW_Real; 
      +R    ; 
      T     #ZIEL_REAL; 

n004: NOP   0; 
END_FUNCTION

An diesem Baustein schreibst du von aussen deine Stellen dran , und raus kommt ein Real, (Hoffe ich )
 
Hallo,
der Vorschlag von SoftMachine ist schon mal ganz gut - ich würde es dennoch etwas anders machen :
Du nimmst das erste Zeichen aus dem String, machst eine Zahl draus und schreibst sie in die REAL-Zahl.
Nun nimmst du das nächste Zeichen. Ist dies ein Komma oder Punkt, so merkst du dir das. Wenn nicht dann multiplizierst du die REAL-Zahl mit 10.0 und addierst den Wert der gelesenen Stelle drauf. Usw.
Bei den Nachkomma-Stellen verfährst du genauso nur das du einen Faktor für die eingelesene Stelle bildest, den du mit jeder neuen Stelle mit 0.1 multiplizierst. Die REAL-Zahl ist dann REAL-Zahl := REAL-Zahl + (akt_Stelle * Faktor).

Das würde die Sache m.E. etwas universeller gestalten ... ;)

Gruß
Larry
 
Hi,

Danke für den Baustein SoftMachin, werd den jetzt mal in mein programm einpflegen und testen!

Danke auch an Larry Laffer!

schönen Tag noch

Mfg Mike
 
Zurück
Oben