Auswirkungen der Compiler-Einstellungen auf die Ausführung
Genauigkeit und Verhalten von mathematischen Funktionen
Mathematische Funktionen, die Gleitkommazahlen (REAL, LREAL) verarbeiten, können unterschiedliche Ergebnisse auf den unterschiedlichen Zielsystem liefern – vor allem, wenn das Ergebnis der Funktion im Grenzbereich des Datentyps liegt. Die se unterschiedliche Genauigkeit der mathematischen Funktionen wird durch die folgenden Faktoren verursacht:
das →Zielsystem selbst,
der dafür verwendete Compiler und
die konfigurierten Optimierungseinstellungen des Compilers.
Bausteine/Variablen mit LREAL nicht für Controllino oder Arduino Nano verwenden
Falls Sie eine Anwendung für einen →Controllino oder →Arduino Nano erstellen, vermeiden Sie die Verwendung von Bausteinen/Variablen, die LREAL-Werte verarbeiten/liefern. Die Verwendung solcher Bausteine/Variablen ist zwar möglich, die LREAL-Werte werden jedoch mit der Genauigkeit von REAL-Werten abgearbeitet.
Beachten Sie, dass der DIV_TIME-Baustein intern immer mit LREAL-Werten arbeitet.
Verhalten von Konvertierungsbausteinen bei nicht-übereinstimmendem Wertbereich
TRUNC-Bausteine und andere Konvertierungsbausteine mit einem REAL/LREAL-Eingang können ebenfalls unterschiedliche Ergebnisse für unterschiedliche Compiler auf den unterschiedlichen Zielsystemen liefern, wenn der anliegende Wert nicht im gemeinsamen Wertbereich des Eingangsdatentyps und des Datentyps für den Ergebniswert liegt. Die se unterschiedliche Ergebnisse werden durch die folgenden Faktoren verursacht:
der für das Zielsystem verwendete Compiler und
das →Zielsystem selbst
Geben Sie deshalb Code in Ihrer Anwendung ein (z.B. IF-Anweisungen im ST-Code), mit denen so ein nicht-übereinstimmender Wertbereich erkannt wird. Informieren Sie sich unter "Convert-Funktionen" und "ConvertEnh-Funktionen" nach, welche der Konvertierungsbausteine einen REAL/LREAL-Eingangsdatentyp unterstützen.
Bekannte Beispiele:
Zielsystem |
Ergebnis der mathematischen Funktion TRUNC_DINT(REAL#3.402823466e+38); |
→Laufzeitsystem für Windows |
-2147483648 |
2147483647 |
|
RTOS32-Compiler |
-2147483648 |
Der RTOS32-Compiler meldet einen Fehler, wenn die Anwendung eine bestimmte Division enthält.
Falls Sie den RTOS32-Compiler verwenden, vermeiden Sie eine bestimmte Division (siehe das folgende Beispiel) in der Anwendung.
PROGRAM Program1
DIV(DINT#-2_147_483_648, DINT#-1);
END_PROGRAM
Beim Erstellen der Anwendung melden die Compiler die erwartete Warnung overflow in constant division, undefined behavior. Der RTOS32-Compiler meldet jedoch auch einen Fehler divide or mod by zero. Andere Compiler akzeptieren den Code – nur die erwähnte Warnung wird gemeldet. Damit der Fehler beim RTOS32-Compiler nicht gemeldet wird, dürfen Sie eine Division mit den oben erwähnten negativen Integers nicht in der Anwendung verwenden.