Auswirkungen der Compiler-Einstellungen auf die Ausführung

Genauigkeit und Verhalten von mathematischen Funktionen

Mathematische Funktionen, die Gleitkommazahlen (REALLREAL) verarbeiten, können unterschiedliche Ergebnisse auf den unterschiedlichen Zielsystem liefern – vor allem, wenn das Ergebnis der Funktion im Grenzbereich des Datentyps liegt. Diese 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. Diese 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:

ZielsystemErgebnis der mathematischen Funktion TRUNC_DINT(REAL#3.402823466e+38);
→Laufzeitsystem für Windows-2147483648
→Raspberry Pi2147483647
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.

Beispiel für ST-Code
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.