Wie funktioniert SHR?
Aus der TIA 15.1 Hilfe, für SCL/FUP/KOP jeweils gleich.
S7-1200/1500
SHR: Rechts schieben
...
Bei Werten ohne Vorzeichen werden die beim Schieben frei werdenden Bitstellen im linken Bereich des Operanden mit Nullen aufgefüllt. Wenn der angegebene Wert ein Vorzeichen aufweist, werden die freien Bitstellen mit dem Signalzustand des Vorzeichenbits belegt.
Für den Input-Parameter IN sind die Datentypen "Bitfolgen" und "Ganzzahlen" angegeben.
S7-300/400
SHR: Rechts schieben
...
Die beim Schieben frei werdenden Bitstellen im linken Bereich des Operanden werden mit Nullen aufgefüllt.
Für den Input-Parameter IN ist nur der Datentyp "Bitfolgen" angegeben.
Trotzdem kann man auch mit Ganzzahlen programmieren
#MyDWord := SHR(IN := #MyDInt, N := 31);
Das wird in TIA widerspruchslos "erfolgreich" übersetzt, ohne irgendeine Warnung! Es werden wie erwartet Nullen eingeschoben. (-1 --> +1)
Nur wenn man für den Baustein die IEC-Prüfung aktiviert, dann wird beim Übersetzen eine Fehlermeldung ausgegeben:
"Parameter der Funktion oder des Funktionsbausteins stimmen nicht mit den übergebenen formalen Parametern überein."
Codesys 2.3
Operator SHR
...
Wenn ein vorzeichenloser Datentyp verwendet wird (BYTE, WORD, DWORD), wird von links mit Nullen aufgefüllt. Bei Vorzeichen-Datentypen wie z.B. INT wird dagegen ein arithmetischer Shift durchgeführt, d.h. es wird mit dem Wert des obersten Bits aufgefüllt.
Codesys 3
Die
Codesys Online Referenz zum Operator SHR gibt keinen Hinweis, was beim SHR mit vorzeichenbehafteten Datentypen passiert.
Ob beim Übersetzen Warnungen oder Fehler ausgegeben werden, weiß ich nicht.
Operator ‚SHR‘
...
Die Zielsysteme bewirken Auffüllen mit Nullen
Es gibt ein Add-on "CODESYS Static Analysis"
Das generiert eine
Meldung SA0052
SA0052: Unübliche Schiebeoperation
Ermittelt Schiebeoperationen (Bitverschiebung) auf vorzeichenbehaftete Variablen. Bei Schiebeoperationen auf Bitfeld-Datentypen (Byte, DWORD, LWORD, WORD) wird kein Fehler ausgegeben.
Begründung: CODESYS erlaubt Schiebeoperationen auf vorzeichenbehafteten Datentypen. Diese Operationen sind aber unüblich und können verwirrend sein. Die Norm IEC-61131-3 sieht solche Operationen nicht vor und sie sollten vermieden werden, um die Portierbarkeit des Codes auf andere Entwicklungssysteme zu erhöhen.
In der
IEC 61131-3 (2003) sind für den Input-Parameter IN nur ANY_BIT-Datentypen vorgesehen.
Bit string functions
SHR
OUT := IN right-shifted by N bits, zero-filled on left
Also
Achtung! beim Migrieren oder Portieren von SCL-/ST-/FUP-/KOP-Programmen, die SHR enthalten!