TIA INT in Real umwandeln - SCL

SimUser

Level-2
Beiträge
53
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

Ich arbeite an einem kleinen Projekt, bei welchem es um Stanzanlage geht.

CPU ist eine S7 1517
Visu ist WinCC TP700 Comfort
TIA hat Version 19 Update 3

In dem Programm befinden sich einige Formeln, die Variablen Typen sind unterschiedlich INT, REAL und wenige DINT.

Mich würde interessieren, was bei den Konvertierungen genau passiert. Wie das geht ist mir klar. Ich mache das so :

Real1 := int_to_real(INT1) ;

Grund warum ich frage :

Mir ist einmal aufgefallen, dass das Ende des REAL nicht "abgeschnitten" wurde, sondern es wurde aufgerundet. (anders herum als wie oben)

Was "könnte" passieren, wenn ich die Konvertierung vergesse? Ich schreibe bspw.

REAL1 := INT1 + REAL2;

Gruß
 
Mir ist einmal aufgefallen, dass das Ende des REAL nicht "abgeschnitten" wurde, sondern es wurde aufgerundet. (anders herum als wie oben)
Da müsstest du dich mal mit den Grundlagen des Datentyp REAL ( IEEE-754 ) auseinandersetzen. Mit dem Datentyp REAL kann man nicht jede beliebige Zahl darstellen.

Hier auch mal was zum probieren / spielen. Gib mal dezimal "1" ein und klicke dann auf +1 oder -1 und schaue was passiert.
https://www.h-schmidt.net/FloatConverter/IEEE754de.html
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja, grundsätzlich mit Datentypen befassen, siehe TIA Handbuch PLC programmieren -> Datentypen.

Vor allem der "Wertebereich" ist interessant, also immer wenn irgendwas nicht in den gewünschten Datentyp reinpasst, brauchst nen andern und musst u.U. konvertieren.
Real1 := int_to_real(INT1) ;
hier weisst Du genau, was passiert (der INT-Wert wird in einem REAL-Wert gewandelt und verliert u.U. Genauigkeit)
REAL1 := INT1 + REAL2;
hier musst Du hoffen und beten, dass der Kompiler zuerst das INT nach REAL wandelt, dann addiert. Und nicht aus nem schlechten Tag heraus das REAL nach INT wandelt als INT addiert und wieder nach REAL zurückwandelt...
 
Zuletzt bearbeitet:
Da müsstest du dich mal mit den Grundlagen des Datentyp REAL ( IEEE-754 ) auseinandersetzen. Mit dem Datentyp REAL kann man nicht jede beliebige Zahl darstellen.
und der Datentyp REAL ist auf bitebene anders aufgebaut als eine Ganzzahl (INT/DINT/...).
hier musst Du hoffen und beten, dass der Kompiler zuerst das INT nach REAL wandelt, dann addiert. Und nicht aus nem schlechten Tag heraus das REAL nach INT wandel als INT addiert und wieder nach REAL zurückwandelt...
Wird auch als expliziter und impliziter Typecast / Konvertierung bezeichnet.
Real1 := int_to_real(INT1) ;
ist explizit. Du sagst hier dem Compiler genau was zu tun ist.
REAL1 := INT1 + REAL2;
ist implizit. Der Compiler erkennt, dass die Operation mit diesen Datentypen nicht sinnvoll funktionieren kann und wandelt die Datentypen anhand eines internen Regelwerks in zueinander passende Typen um bzw. fügt für den Mikrocontroller-Code entsprechende Typecasts ein.

TIA-Portal bzw. die 1200/1500 unterstützen von Haus aus impliziten Typecast und fangen solche "Fehler" automatisch ab.
Bei z.B. den 300/400er Steuerungen muss man immer explizit casten, was zu Bit-Müll in der Zielvariable führt wenn man nicht aufpasst.

Ich empfehle grundsätzlich explizit zu casten, da, wie von @ducati bereits erwähnt, das implizite Casten zu ganz blöden Fehlern führen kann wenn der Compiler sich für einen anderen typecast entscheidet als du erwartest.
Es gibt in den Migrationsdokumenten von S7-Classic auf TIA irgendwo einen ausführlichen Abschnitt dazu.
 
Ich empfehle grundsätzlich explizit zu casten, da, wie von @ducati bereits erwähnt, das implizite Casten zu ganz blöden Fehlern führen kann wenn der Compiler sich für einen anderen typecast entscheidet als du erwartest.
oder wenn nach dem Hochrüsten des Projektes von TIA V14 nach TIA V20 oder so auf einmal manches anders funktioniert...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mich würde interessieren, was bei den Konvertierungen genau passiert.
Das Bitmuster in der INT Variable sieht halt ganz anders aus als bei ner REAL Variable, deshalb kann der Prozessor das auch nicht "einfach" miteinander sinnvoll addieren:
__________________________1752652278542.png

1752652340018.png
 
Ich empfehle grundsätzlich explizit zu casten, da, wie von @ducati bereits erwähnt, das implizite Casten zu ganz blöden Fehlern führen kann wenn der Compiler sich für einen anderen typecast entscheidet als du erwartest.
dazu gehört auch, dass man als REAL-Konstanten gemeinte Konstanten mit Dezimalpunkt hinschreibt und nicht denkt "der Compiler versteht doch, was ich flüchtig hingerotzt habe"
Code:
REAL1 := REAL2 + 1;    // implizit
REAL1 := REAL2 + 1.0;  // besser

y := x + 1.0;  // sollte imho eine Warnung ergeben, wenn x nicht REAL ist

Oder z.B. die für RTD-Analogeingänge zur Temperaturmessung obligatorische Skalierung:
Code:
Real_MeineTemperatur := Int_Analogwert / 100.0;              // Analogeingang in Messbereich "xxx Klima"
Real_MeineTemperatur := INT_TO_REAL(Int_Analogwert) / 100.0; // besser weil deutlicher

Real_MeineTemperatur := Int_Analogwert / 100;   // ! sollte unbedingt zu einer Warnung führen !
 
Das Bitmuster in der INT Variable sieht halt ganz anders aus als bei ner REAL Variable, deshalb kann der Prozessor das auch nicht "einfach" miteinander sinnvoll addieren:
__________________________Anhang anzeigen 89154
Das Bild zum Aufbau von Ganzzahlen ist nicht korrekt, weil negative Ganzzahlen im Zweierkomplement gespeichert werden. Bit 15 ist nicht das Vorzeichen (sondern die Wertigkeit -32768), hat aber stets den gleichen Wert wie das Vorzeichen - daher wird das Vorzeichen nicht extra mitgespeichert.
 
dazu gehört auch, dass man als REAL-Konstanten gemeinte Konstanten mit Dezimalpunkt hinschreibt und nicht denkt "der Compiler versteht doch, was ich flüchtig hingerotzt habe"
wichtig auch bei Ganzzahlkonstanten wenn man z.B. INT mit DINT verrechnet/vergleicht oder noch besser bei vorzeichenlosen Datentypen...

vor allem so blödes Verhalten, wenn es im Büro oder bei der IBN alles funktioniert (weil man mit kleinen positiven Zahlen testet) und dann irgendwann nach par Jahren, wenn die Zahlen mal größer oder negativ werden nurnoch Quatsch passiert...
 
Zurück
Oben