openiolink / io-link-master-shield-hat-sw

Software for the IO-Link Master Shield/Hat for Arduino and Raspberry Pi
Apache License 2.0
25 stars 6 forks source link

Falsche IO-Link Mastercommands #9

Closed SecurityCheck closed 4 years ago

SecurityCheck commented 4 years ago

Im File iolink.h stehen falsche Mastercommands für PD und Write.

constexpr uint8_t PD_READ     = 0xF1u;
constexpr uint8_t WRITE       = 0x20u;

Korrekt laut IO-Link Spezifikation müsste dort folgendes stehen:

constexpr uint8_t PD_READ        = 0x80u;
constexpr uint8_t PD_WRITE       = 0x00u;
constexpr uint8_t PAGE_READ      = 0xA0u;
constexpr uint8_t PAGE_WRITE     = 0x20u;
constexpr uint8_t OD_WRITE       = 0x70u;
constexpr uint8_t OD_READ        = 0xF0u;
maehne commented 4 years ago

Danke für den Hinweis! Wir werden Ihren Korrekturvorschlag überprüfen und integrieren, wenn keine Gründe auftauchen, die dagegen sprechen.

Für eine schnelle Überprüfung von gemeldeten Abweichungen von der IO-Link-Spezifikation wäre es hilfreich, wenn Sie uns auch die Stelle(n) in der IO-Link-Spezifikation angeben könnten, auf welche Sie sich beziehen.

Sie können Verbesserungsvorschläge am Code gerne direkt per Pull Request einreichen -- vorzugsweise auf den Branch develop.

CrazyGecko commented 4 years ago

Ich bin dem Hinweis kurz nachgegangen. Da haben Sie recht, der MC (IO-Link Spezifikation A.1.2) für eine Abfrage der Prozessdaten müsste 0x80 entsprechen. 0xF1 entspricht einer ISDU Abfrage mit IDLE 1, sprich keiner ISDU Übertragung. Ich habe die beiden Varianten kurz mit einem Sensor BUS004P von der Balluff AG ausgemessen. Er reagiert auf beide Abfragen, jedoch bei der ISDU Abfrage mit einer "No Service" I-Service Antwort 0x0 (IO-Link Spezifikation A.5.2). Der Bedeutung von 0x81 als Antwort auf die Prozessdaten Abfrage muss noch nachgegangen werden. Um den Spezifikationen gerecht zu werden, muss dies also angepasst werden. Aus persönlicher Erfahrung kann ich sagen, dass ich, auch von käuflichen Master, eine Abfrage der Prozessdaten mit 0xF1 beobachtet habe. Sensor0x80 Sensor0xF1

Dass die anderen Makros wie Page_Read/Write etc. noch nicht implementiert wurden, hängt damit zusammen, dass die Bibliothek momentan nur über die grundlegenden Funktionen, welche zum Betreiben des "Demonstrators" notwendig sind, verfügt. Sie können sich aber über einen baldigen Ausbau der Bibliothek freuen.

SecurityCheck commented 4 years ago

Danke für Ihre Antworten. Das gleiche ist mir auch beim BCM002 von Balluff aufgefallen. Es werden Prozessdaten sowohl bei 0xF1 als auch bei 0x80 übertragen. Bei richtiger Längenangabe werden immer OD+PD-Daten übertragen. Leider funktioniert das Auslesen der Prozessdaten nicht wenn der Sensor Prozessdaten empfangen kann(PDin). So kann ich keine Werte beim BOS026R(https://www.balluff.com/local/de/productfinder/#/ca/A0001/cg/G0103/product/F1327/variant/PV511939) von Balluff auslesen, da dieser laut Datenblatt folgende Spezifikation hat. Prozessdaten IN 1 Byte Prozessdaten OUT 3 Byte

Ich vermute das ich erst Prozessdaten zum Sensor schicken muss um anschließend die Prozessdaten des Sensors auszulesen. Bin mir dabei aber nicht sicher.

maehne commented 4 years ago

@CrazyGecko: Merged PR #12 fixed only part of this issue (PD_READ). @SecurityCheck also listed other commands, which need to be considered.

CrazyGecko commented 4 years ago

@maehne This is correct, there are other commands listed. But these commands are, at this time, not included in the library. Since I'm reworking the library, these commands will automatically be included, as needed. I think this Issue can be marked as closed, because the "issue" is fixed.