TIA 32Bit IO-Link Input Auslesen(Integer30 und 2Bit)

Zuviel Werbung?
-> Hier kostenlos registrieren
Mein IO-Link Master ist der AL1900 von IFM.
Als CPU Habe ich eine S7-315 und TIA V15.1.
Ich würde mal behaupten, das DWORD was Du von dem IO-Link-Master bekommen wirst, wird ganz normal im S7-üblichen Big Endian ankommen und die Bits 30 und 31 des MD0 liegen auf M0.6 und M0.7. D.h. es müssen keine Bytes getauscht werden. (Ich finde allerdings keine eindeutige Quelle dafür.) Der Eindruck des nötigen Byte-tauschens entsteht nur durch Deinen falschen Testaufbau aufgrund Deiner falschen Vorstellung, wie bei S7 Multibyte-Variablen im Speicher liegen.

Standarmäßig kann ich ja nur Byteweise lesen.
Wie meinst Du das "nur Byteweise"?

Wie hast Du den IO-Link-Master an die S7-300 angeschlossen? Als Profinet IO Device? An einem CP343-1 oder ist Deine CPU "S7-315" eine 315-2 PN/DP? Warum testest Du den Codeschnipsel mit einer 1515F, hast Du kein PLCSIM?

Harald
 
"geforced": ala "Byte-Reihenfolge gedreht" durch den Tester und nicht durch IO-Link :unsure:

Ich wiederhole nochmal meine Frage von Beitrag #11 an den OP: Hast Du mal eine Dokumentation Deines Gerätes, damit wir ohne Deine Fehlinterpretationen zweifelsfrei feststellen können, auf welchen Bits die Schaltsignale liegen und ob/wie die Bytes vertauscht sind?

Harald
Hab ich tatsächlich übersehen, tut mir Leid.
Hier dann mal die entsprechende Seite aus der BDA.

PLCSIM habe ich natürlich auch. Wenn sich die 300er und die 1500er hier unterschiedlich verhalten, werde ich das auch nochmal probieren.

Als IO-Link Master hängt hinterher ein AL1900 von IFM über Profinet dran.
 

Anhänge

Bei den von Dir ungünstig (oder geschickt? ;) ) gewählten Testdaten zeigt das Bild nicht mehr, als daß Codesys auch das Links-Schieben von Int-Variablen zulässt und daß auch tatsächlich Bits geschoben werden. Allerdings ist nirgends ein "Arithmetisches" Links-Schieben zu sehen.

Ein "Arithmetisches" SHL(16#A000, 1) oder SHL(16#8400, 4) sollte jeweils 16#C000 ergeben. Tut es das?

Harald
 
Ein "Arithmetisches" SHL(16#A000, 1) oder SHL(16#8400, 4) sollte jeweils 16#C000 ergeben. Tut es das?
Moin Harald,

ich verstehe leider nicht, was ein arithmetisches LinksSchieben sein soll.
Der WindowsRechner erlaubt zwar die Vorwahl "Arithmetische Verschiebung", diese scheint aber bei anschliessendem LinksSchieben wirkungslos zu sein.
Wie ich finde, zu Recht. Denn die Zahlen, die nach links geschoben werden, führen bei Deinen Beispielen eindeutig zu Unterläufen und somit sind die Ergebnisse ohnehin (arithmetisch gesehen) falsch und werden nicht richtiger dadurch, dass das höchstwertige Bit beim Schieben erhalten bleibt.
Nun gut, das negative Vorzeichen bleibt beim arithmetischen LinksSchieben erhalten, aber was hat man davon?
arithmetic-SHL.jpg
Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, es gibt gar kein "Arithmetisches Links-Schieben", weil es nicht benötigt wird bzw. nichts nützen würde.
Beim Links-Schieben um 1 Bit von Int-Werten im Bereich -16384..+16383 braucht man kein spezielles Arithmetisches Schieben, da funktioniert auch das normale Schieben richtig. Bei Werten außerhalb des Bereiches nützt ein "Arithmetisches" Schieben nichts, weil es sowieso zu einem Überlauf/Unterlauf kommt (also ein ungültiges Ergebnis), bei dem normalen Schieben kommt noch eine (vermutlich unerwartete) Vorzeichenumkehr dazu. Ein Arithmetisches Links-Schieben mit Erhalt des Vorzeichens macht das ungültige Ergebnis aber auch nicht viel besser.

Weißt irgendein Compilerhersteller auf den beschränkten Wertebereich und die Vorzeichenumkehr bei der Verwendung von Int beim Links-Schieben hin?? Prüfen die Programmierer, die SHL mit Int anwenden, vor dem Schieben, ob der Int klein genug für das beabsichtigte Schieben ist?

Meine Meinung: Bits schieben von Int sollte nicht zugelassen werden. Und die IEC 61131-3 sieht das auch so (zumindest bis zur Second edition 2003, eine neuere Ausgabe habe ich nicht) und sieht als Datentyp für Bit Shift Functions nur ANY_BIT vor (LWORD, DWORD, WORD, BYTE, BOOL). Wenn man in TIA die IEC-Prüfung aktiviert, dann wird Bit-Schieben von Int auch als Fehler angemeckert. Also besser SHL/SHR einfach nicht für Int benutzen. An den Bits von Int spielt man nicht mit Bit-Operationen rum ;)

Harald
 
Der Vollständigkeit halber
bei beiden Operationen wird das Vorzeichen mit rausgeschoben. Das Ergebnis ist also 16#4000 und nicht wie angenommen 16#C000.
Eine Warnung in irgendeiner Form gibt es nicht.
 
bei beiden Operationen wird das Vorzeichen mit rausgeschoben. Das Ergebnis ist also 16#4000 und nicht wie angenommen 16#C000.
Welche beiden Operationen meinst Du? Arithmetisches und nicht-arithmetisches LinksSchieben?
Das arithmetische LinksSchieben à la Harald hatte ich jetzt so verstanden, dass eine 1 im höchstwertigen Bit beim LinksSchieben "festgehalten" wird und nicht verlorengeht, auch nicht durch das Nachschieben irgendwelcher Nullen.
 
Probem Hat Sich erledigt, der Sensor wird nicht über IO Link ausgewertet und bietet somit nur 2 Binäre Schaltausgänge.

Damit habe ich zwar jetzt auch ein Problem, dazu aber ein neues Topic.

Danke trotzem an alle beteiligten, SHL und SHR kannte ich noch nicht.
 
Zurück
Oben