TIA Real in String - Komisches Verhalten

Geisterkarle

Level-2
Beiträge
135
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe grade ein merkwürdiges Phänomen. Weiß nicht ob das ein Bug ist oder mir das wer erklären kann.
Ich PLC-SIMe gerade in TIA V19 und möchte eine REAL-Zahl in einen String umwandeln. Nutze dafür VAL_STRG.
Das sieht so aus:
Code:
rZahl - REAL
sErg - String
sTmp - String
----------

sErg := '';
VAL_STRG(IN:=rZahl,
             SIZE:=0,
             PREC:=3,
             FORMAT:=0,
             P:=1,
             OUT=>sTmp);
 sErg := sTmp;
Wenn ich da jetzt (z.B.) als rZahl := 0.3 eingebe kommt als sErg = '0.300'
Alles gut.

Nun ist mir aufgefallen, wenn ich dieses hier mache:
Code:
sErg := '';
sTmp := REAL_TO_STRING(rZahl);
VAL_STRG(IN:=rZahl,
             SIZE:=0,
             PREC:=3,
             FORMAT:=0,
             P:=1,
             OUT=>sTmp);
 sErg := sTmp;
dann steht in sErg plötzlich '+3.000000E-1'
???
VAL_STRG scheint es nicht mehr zu schaffen, sTmp zu "überschreiben"! Dabei kommt die Funktion im Programm ja nach dem REAL_TO_STRING. Wüsste nicht, dass das "asynchron" ist und mehrere Zyklen braucht und dadurch irgendwas schief geht.
Natürlich kann ich das "Problem" lösen, aber wollte mal wissen, ob irgendwer ne Idee hat, warum das überhaupt passiert!? Oder sollte es da gar nicht!?

grüße
 
Ändert sich was wenn du sTmp auch intialisierst? Temporäre Variablen haben ja einen undefinierten Wert.. deswegen sollten sie immer initial mit einem Defaultwert beschrieben werden
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Real_to_String ist im Grund auch eine Funktion (FC) und ich meine mich zu erinnern, dass diese auch schon einen initialisierten String braucht.
Nochmal genauer nachgefragt:
String ist doch "nur" der Rückgabewert. Wieso muss der für die Funktion initialisiert werden? Das dürfte doch völlig egal sein, was darin steht, oder?
Oder geht es um das Byte "maximale Länge"? Aber das müsste doch schon durch die Deklaration fertig beschrieben worden sein.
 
Also ich hab auch mal ganz oben "sTmp := '';" gemacht, aber ändert nichts.

Aber habe gerade herausgefunden, woran es liegt! Es liegt tatsächlich an der Initialisierung, bzw. wie VAL_STRG funktioniert.
VAL_STRG erzeugt keinen neuen String, sondern macht anscheinend einen INSERT.
Code:
sTmp := '0.00003';
VAL_STRG(IN:=rZahl,
             SIZE:=0,
             PREC:=3,
             FORMAT:=0,
             P:=1,
             OUT=>sTmp);
 sErg := sTmp;
macht (bei rZahl = 0.3)
sErg = '0.30003'

Damit hatte ich jetzt erstmal nicht gerechnet (pun intended).
Aber gut, wieder was gelernt!
 
Was für eine CPU hast du? Ist der Baustein "optimiert" oder Standard Zugriff?
Ich würde auf jeden Fall sTmp initialisieren mit sTmp := ''; (vor dem Aufruf von REAL_TO_STRING und VAL_STRG).

Wo ist sTmp deklariert? Warum steht in deinem Code nicht #sTmp (mit Raute # davor)?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was für eine CPU hast du? Ist der Baustein "optimiert" oder Standard Zugriff?
Ich würde auf jeden Fall sTmp initialisieren mit sTmp := ''; (vor dem Aufruf von REAL_TO_STRING und VAL_STRG).

Wo ist sTmp deklariert? Warum steht in deinem Code nicht #sTmp (mit Raute # davor)?
Idealerweise wird mit einer Konstante intialisiert, dann wäre es wirklich top ;)
 
VAL_STRG erzeugt keinen neuen String, sondern macht anscheinend einen INSERT.
(...)
Damit hatte ich jetzt erstmal nicht gerechnet (pun intended).
Aber gut, wieder was gelernt!
Das Verhalten ist aber so in der TIA Hilfe ausführlich beschrieben. Für Leute, die da vielleicht mal nachschauen wollen ;)


Idealerweise wird mit einer Konstante intialisiert, dann wäre es wirklich top ;)
Was meinst du damit? :unsure:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Verhalten ist aber so in der TIA Hilfe ausführlich beschrieben. Für Leute, die da vielleicht mal nachschauen wollen ;)
Du meinst:
"Die CPU befüllt OUT ab Position P unter Berücksichtigung der führenden Leerzeichen mit SIZE Zeichen."
irgendwo in der Mitte des Textes? :P

Also mal ehrlich, wenn ich eine Funktion habe, dann schaue ich mir möglicherweise jeden Input Wert an, aber die Details von einem simplen String-OUT nicht unbedingt. Liegt vielleicht daran, dass ich bisher glaub noch nie eine eigene Funktion gebaut hab, bei der ich das Ergebnis nicht erstmal "genullt" habe. Noch nie benötigt...
 
Scrolle mal die Hilfe zum VAL_STRG noch etwas weiter runter ... da kommt sogar ein detailliertes anschauliches i-sicheres Beispiel (mit "OUT vor dem Aufruf von VAL_STRG" und "OUT nach dem Aufruf von VAL_STRG")
 
Das Verhalten ist aber so in der TIA Hilfe ausführlich beschrieben. Für Leute, die da vielleicht mal nachschauen wollen ;)
Habe ich getan. Interessant. Das hätte ich so nicht erwartet.

Mein Erwartungshaltung wäre, dass die String-Variable neu beschrieben würde.

Aber dazu müsste die Funktion wahrscheinlich die maximale/tatsächliche Länge der Variablen, die sie beschreiben soll kennen.

Wieder was gelernt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zumindest mach ich das immer so, dass ich Temps mit Konstanten intialisiere, vielleicht ist es auch nur meine Vorsicht :D
Das Literal '' ist doch eine Konstante? Ist das von manchen Programmierern nicht als "Leerstring" erkennbar, muss man da wirklich eine Konstante mit einem Name EMPTYSTRING dafür anlegen??
 
Zurück
Oben