- Beiträge
- 9.191
- Reaktionspunkte
- 2.954
-> Hier kostenlos registrieren
Hallo Thomas,
könntest Du da mal bitte konkreter werden, bei welchen Datentypen das passiert? Wenn ein INT in einen DINT geschrieben wird kann man warnen aber man muss es nicht. Ich sehe das jetzt nicht als so problematisch an.
Du kannst bei Codesys z.B. eine UINT Variable ohne Warnung auf eine INT schreiben. Und die haben einen komplett anderen Wertebereich.
Ist das Ergebnis definiert, oder abhängig von der Zielhardware? Ich weiß es nicht, und in der Codesys-Doku (2.3) kann ich es nicht nachlesen.
Die Datentyp-Klasse ANY_BIT mit BYTE, WORD, DWORD usw. gibt es bei Codesys auch nicht. Man kann diese kreuz und quer Variablen anderen Datentyps zuweisen. Ohne Sinn ist diese Klasse nicht in die IEC-Norm gekommen. Was da im Hintergrund abläuft ist unbekannt, ob WORD als UINT oder was auch immer erkannt wird.
Bei Siemens mit eingeschalteter IEC-Prüfung ist das nicht erlaubt.
Ob man INT auf DINT immer warnen muss meine ich auch nicht, aber solche Konstrukte führen gerne mal zu wahrscheinlich nicht erwünschten Ergebnissen, wenn die Summe der beiden INT den Wertebereich eines INTs überschreiten:
DINT := INT + INT;
Ein C-Compiler gibt dir zumindest eine Warnmeldung (mindestens wenn es Konstanten sind) "integer overflow in expression".
Bei Siemens SCL lässt sich ein:
INT := 32000 + 32000;
nicht übersetzen. Bei Codesys - kein Problem.