TIA String_To_Real

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe wieder mal ein Problem und bräuchte eure Hilfe.

Ich programmiere in SCL und will einen String in einen Real wandeln, weil ich anschließend eine Rechnung mit der Real-Variable machen muss.

Die Anweisung lautet:

"RLaenge":= STRING_TO_REAL('212.0');

RLaenge ist natürlich vom Datentyp Real.

Wieso steht in RLaenge immer 0?
 
Die Hilfe zu STRING_TO_REAL verrät, daß der Real-Wert im String in exponential-Schreibweise vorliegen muß:
Code:
"RLaenge":= STRING_TO_REAL('+2.1200000E+02');

In welchem Bereich liegen Deine Zahlen und haben die immer 1 Nachkommastelle? Vielleicht ist es einfacher, selbst eine Wandlung des Strings zu REAL zu programmieren als STRING_TO_REAL zu nutzen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In meiner Hilfe steht (S7-300):
Die Konvertierung fängt mit dem
ersten Zeichen der Zeichenkette (STRING) an und endet am Kettenende oder am
ersten Zeichen, das nicht zulässig ist. Zulässig für die Konvertierung sind die
folgenden Zeichen:

  • Ziffer
  • Vorzeichen
  • Punkt
Das erste Zeichen der Zeichenkette
darf ein Vorzeichen (+, -) oder eine Ziffer sein. Führende Leerzeichen werden
ignoriert. Bei der Konvertierung von Gleitpunktzahlen dient der Punkt als
Trennung. Die exponentielle Notation "e" oder "E" ist nicht erlaubt. Das Komma
als Tausender-Trennzeichen links vom Dezimalpunkt ist erlaubt und wird
ignoriert. Wenn der Aufbau der Zeichenkette für die Konvertierung ungültig ist
oder ein Überlauf auftritt, wird der Freigabeausgang ENO auf "0" gesetzt.


Bei deiner Exponentialschreibweise kommt bei mir auch 0 raus.

Bei: "RLaenge":= STRING_TO_REAL('2000');
kommt auch 0 raus.

In Wirklichkeit bestehen meine Strings aus 4 Ziffern (ganzzahlig). Führende Nullen können enthalten sein.
 
Zuletzt bearbeitet:
Ist RLaenge ein REAL-Merker? Oder ist RLaenge im SCL-Code definiert?
Lass mal die "" bei RLaenge weg, wenn du es im SCL-Code deklariert hast.
 
Verstehe nicht was du meinst. Die Anführungszeichen kann man nicht weglassen. bei TIA werden globale Variablen stets in Anführungszeichen gesetzt. Hinter "RLaenge" verbirgt sich das MD0.
 
Ich habe jetzt TIA V13.1.

Ich teste in PLCSim.

Ich habe das ganze TIA-Projekt auf die einzige Anweisung im OB1 reduziert. Es kann also keine andere Anweisung ins MD0 schreiben.

Wenn man MDO eintippt, wird das sofort in "RLaenge" umgewandelt und verstanden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe jetzt den Rechner neu gebootet,

dann ein neues TIA-Projekt angelegt, mit CPU 314C-2DP,

dann in die Variablentabelle die einzige Variable
RLaenge, Real, %MD0

eingetragen.

Im einzigen Baustein OB1 steht
"RLaenge" := STRING_TO_REAL('2000');

Wenn ich das Projekt nach PLCSim kopiere und die CPU auf RUN stelle steht weiterhin im MD0 die 0!!!
 
STRING_TO_REAL ist ein Baustein das geladen werden muss. Es ist kein SFB oder SFC.
Macht TIA das Automatisch ? Gibt es im Bausteinordner den STRING_TO_REAL Baustein ?
Gibt es in den Diagnosepuffer etwas verdächtiges ?
 
Die FC39 (STRNG_R) liegt in Systembausteine - Programmrecourcen.

Die Übersetzung des Projekts ist natürlich auch fehlerfrei.
 
Ich teste mit PLCSim.
Im Diagnosepuffer steht nichts auffälliges drin.
Online-Zugänge - PLC_1 (MPI=2) - Online und Diagnose - Diagnosepuffer

Da steht nur "Neue Anlaufinformation im Betriebszustand STOP", "Urlöschen durchgeführt" und "Start Urlöschen automatisch..."



Ich muss jetzt mal weg.
 
Mit allerhöchster Wahrscheinlichkeit ist die Bausteindokumentation im TIA-Portal nicht korrekt. Die Funktion sollte sich genau so verhalten wie in Step7 Classic, ansonsten wäre kein Programm von Step7 auf TIA migrierbar. D.h. den String mit vollen 14 Stellen in Exponentialschreibweise.

Dann schau dir mal die Bausteinversion des FC39 an welchen TIA-Portal verwendet. Die V12 hat nämlich eine Version 1.4 intus, Step7 bringt hingegen eine neuere Version 1.5 mit. Und dort wurde nicht umsonst etwas geändert. Guck mal was die V13 so treibt, habe ich gerade nicht greifbar.

Erstaunlich (bzw. eigentlich überhaupt nicht erstaunlich) ist zusätzlich, dass der SCL-Compiler in Step7 Classic besser optimiert als das neue TIA-Portal. Wenn STRING_TO_REAL mit einem String-Literal als Parameter aufgerufen wird, wird das erkannt und die Funktion FC39 überhaupt nicht aufgerufen, sondern direkt die Real-Konstante im Programm eingefügt. TIA erkennt das nicht, sondern baut den String im Temp-Speicher zusammen und ruft damit die Funktion auf.

Darum funktioniert in Step7-Classic SCL ein
Code:
realVar := STRING_TO_REAL('123.4');

ein
Code:
s := '123.4';
realVar := STRING_TO_REAL(s);
hingegen nicht, weil das Format nicht korrekt ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Thomas v2.1 und PN/DP hatten Recht. Gebe ich die Real-Zahl als String mit 14 Zeichen vor, funktioniert es.
"RLaenge" := STRING_TO_REAL('+2.1200000E+02');

Damit stehe ich jetzt vor dem nächsten Problem. Wie mache ich aus einer String-Ganzzahl mit 4 Ziffern einen String, der die Zahl in wissenschaftlicher Darstellung beinhaltet?
 
Problem gelöst.
Ich nehme anstelle String_To_Real die Umwandlung String_To_Int.
Da immer nur 4 Ziffern im String stehen, geht die Umwandlung nach Int immer gut.
Auch die führenden Nullen bereiten kein Problem.
 
Zurück
Oben