TIA INT in Real umwandeln

Zuviel Werbung?
-> Hier kostenlos registrieren
Es könnte schon sein, daß der SCL-Compiler in TIA korrekterweise das i vor der Division implizit in REAL wandelt, doch da traue ich dem TIA nicht (*) und würde explizit schreiben "r=INT_TO_REAL(i)/100.0;". Möglicherweise interpretiert der Compiler das 100.0 auch als LREAL und beschwert sich, daß Deine SPS gar kein LREAL kann. (Welche SPS hast Du?)

(*) Zumal die Dokumentation in TIA zu den impliziten Konvertierungen seit Jahren fehlerhaft ist - nicht daß da mal ein Praktikant die Dokumentation "überarbeitet" und/oder ein andersprachlicher Programmierer die Arbeitsweise des Compilers an die fehlerhafte Dokumentation anpasst... ;)

Harald
 
"da traue ich dem TIA nicht" kann ich nachvollziehen.
Hängt ja davon ab, was zuerst benutzt wird. Wenn das INT zuerst kommt, kann es sein, das Real zu INT gewandelt wird. Egal was die Zielvariable ist. Und dann wird natürlich ungenau gerechnet ...
Ich habe da schon schlechte Erfahrung gemacht und mache seitdem immer "manuelle" Typkonventierung UND immer IEC-Prüfung statt die Siemens Rate-Interpretation. Da kommt bei potentiellen Problemen ein Fehler statt wie bei Siemens manchmal eine Warnung (hellgelb auf weis .... !!! ).

 
Bei älteren in AWL geschriebenen Programmen wird der Int Wert zuerst nach DInt gewandelt und danach nach REAL. Ist es besser, wenn man zwei Konvertierungen durchführt oder ist es egal? Reicht es aus, wenn ich schreibe: Realwert := Int_to_real(Intwert); ?
 
Zuletzt bearbeitet:
Bei AWL wird es notwendig sein aufgrund des DTR Befehles. Dieser wandelt eine 32Bit Ganzzahl im Akku 1 in eine 32Bit Realzahl um
Daher könnte ich mir vorstellen, dass es bei AWL notwendig ist um den AKKU1 (komplett) zu initialisieren. Bei SCL benötigst du das aber nicht.

Format

DTR

Beschreibung

DTR (Umwandlung einer Ganzzahl, 32 Bit, in eine Gleitpunktzahl, 32 Bit, IEEE 754) wertet den Inhalt von AKKU 1 als eine Ganzzahl (32 Bit) aus und wandelt diese in eine Gleitpunktzahl (32 Bit, IEEE 754) um. Sofern erforderlich, rundet die Operation das Ergebnis (eine Ganzzahl, 32 Bit, hat eine höhere Genauigkeit als eine Gleitpunktzahl, 32 Bit, IEEE 754). Das Ergebnis wird in AKKU 1 gespeichert.

Statuswort

BIE A1 A0 OV OS OR STA VKE /ER
schreibt: - - - - - - - - -
Beispiel

AWL Erläuterung
L MD10 //Lade die Ganzzahl (32 Bit) in AKKU 1.
DTR //Wandle die Ganzzahl (32 Bit) in eine Gleitpunktzahl (32-Bit, IEEE- FP) um, speichere das Ergebnis in AKKU 1.
T MD20 //Transferiere das Ergebnis (BCD-Zahl) nach MD20.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei AWL ist ITD unbedingt nötig, wenn der INT auch negativ sein kann bzw. wenn nicht sicher ist, ob die oberen 16 Bit des AKKU1 vor der Ausführung des DTR alle den selben Wert wie das Bit 15 haben. ITD kopiert das Bit 15 in die Bits 16 bis 31.

Bei SCL ist kein explizites INT_TO_DINT nötig, das macht der SCL-Compiler intern sowieso bei INT_TO_REAL.

Harald
 
Zurück
Oben