Auslesen eines Slaves über Modbus RS485 Fehlermeldung "illegal data value"

domiup

Level-2
Beiträge
39
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Beim Auslesen eines Messwerterfassers (PQ Plus) meldet mir der Slave den Fehler "illegal data value" zurück.
Ich möchte die Register 4096 bis 4901 einzeln als WORD auslesen.
Die Verbindung an sich sollte passen da ich keinen timeout error bekomme.

Hat jemand eine Lösung dafür bzw. kann mir sagen auf was die Fehlermeldung deutet?
Vielen Dank im Voraus!
 

Anhänge

  • Modbus Slave.png
    Modbus Slave.png
    98,8 KB · Aufrufe: 44
  • Register PQ Plus.png
    Register PQ Plus.png
    24,9 KB · Aufrufe: 46
Zuletzt bearbeitet:
HI,

ich vermute mal Du verwendest den falschen Function Code. Leider sieht man Deine Queries nicht.

Man kann auch mehrere Register auf einmal lesen, es müssen nicht alle Register einzekln gelesen werden.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Oberchefe Ich kenne es nur von Codesys 3.5 das die Register nur einzeln ausgelesen werden können und man selbstständig die beiden 16 Bit Register zu einem sinnvollen Wert zusammenrechnen muss. Ich brauche die Register auch einzeln da ich sie an einen anderen Slave weitergebe. Somit würde es keinen Sinn machen 2 Register als ein Wert auszulesen und wieder auf 2 Register aufzuteilen. Der einfachere Weg wäre diese einfach weiter zu schieben.

Das man die Register nur paarweise auslesen kann wäre mir neu, da es mit einem Modbus Tool auch funktioniert.

@Thruser anbei habe ich noch ein Screenshot von der Deklaration. Function Code 3 und 4 habe ich beides probiert.
 

Anhänge

  • Screenshot 2023-05-17 125350.png
    Screenshot 2023-05-17 125350.png
    55,8 KB · Aufrufe: 24
Somit würde es keinen Sinn machen 2 Register als ein Wert auszulesen und wieder auf 2 Register aufzuteilen.
Es macht ganz viel Sinn, die Register immer nur paarweise zusammen zu lesen, weil zwischen Einzelregister-Lesungen kann sich der REAL-Wert ändern und die zusammengebastelten Words würden einen falschen Wert ergeben. Stichwort: Datenkonsistenz

Außerdem dauert das Einzelwort-weise Lesen viel länger. Ob bei einer Modbus-Abfrage nur 1 Register oder gleich 50 Register auf einmal gelesen werden, dauert etwa gleich lange.


Ich brauche die Register auch einzeln da ich sie an einen anderen Slave weitergebe. (..) Der einfachere Weg wäre diese einfach weiter zu schieben.
Der "einfachere Weg" ist aber der falsche Weg, weil er falsche Daten produzieren kann. Es ist auch nicht wirklich komplizierter, bei Bedarf einen 32-Bit-Wert in 2 Words zu zerlegen und konsistent zu halten. Ich schätze, der Partner würde sich auch freuen, wenn er konsistent zusammengehörende Werte erhalten würde. Also laß das sein, wie auch immer Du dem die Werte nur einzelwortweise senden willst.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okey also ich würde gerne 3 Leistungen aus einem Messgerät auslesen. Da die Werte sehr hoch werden können werden sie über zwei Register übertragen. Ob ich einen Messwert über zwei 16Bit Register oder ein 32Bit Register (lesbarer logischer Wert)auslese wäre in erster Linie egal. Allerdings bekomme ich bei beiden Varianten den Fehler "illegal data value", womit ich leider nichts anfangen kann.
 
Der Modbusfehler 3: Illegal Data Value gibt ein gut implementierter Slave aus, wenn der gelesen Wert nicht gültig ist. Also z.B. wenn man nur die hälfte eines 32 Bit Wert liest.
Du solltest daher immer ganze Werte mit einer uiReadQuantity von 2, 4, 6, ... lesen.
Wenn man um ein Register verrutscht liest man einen halben Wert von einem und einen halben Wert vom nächsten Datenpunkt. Hier kann es auch sein, dass ein Slave den Fehler 3 zurück gibt.
 
Hi,
sind vielleicht Min und Max Werte vorgegeben in denen du dich bewegen musst.

Hatte mal ähnliches Problem, falsche Werte ausserhalb der Grenzwerte eingegeben .

Grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also deine Register im abzufragenden Gerät scheinen dezimal zusammenzuhängen.
Die würde ich in einem Schwung lesen, aus den oben genannten gründen. Bei Modbus liest die immer Word weise.
Dann sollte der Fehler weg sein, vorrausgesetzt der richtige Funktionscode wurde eingetragen.

Jetzt musst du dir deine words in Real Variablen, wandeln, evtl. noch HiWord und LowWord tauschen, dann hast du dein Ergebnis.

Du müsstest vielleicht mal deine Konfig, der Query posten, dann kann man schauen wieviele Register de liest und welche FC codes.
 
Vielen Dank für Antworten. Weder FC3 noch FC4 funktionieren auch die Quantitys 2,4,6 habe ich ausprobiert leider bekomme ich immernoch die Fehlermeldung. Anbei noch ein Screenshot meiner Anfrage.
 

Anhänge

  • Slave Antwort.png
    Slave Antwort.png
    89,6 KB · Aufrufe: 20
Hallo,

hast Du sonst mal die Möglichkeit die Kommunikation per PC mit USB RS 485 Wandler zu prüfen? Dann z.B. mit modpoll wie in Handbuch angegeben oder qmodmaster

Das würde ich mal als nächstes prüfen.

Gruß
 
Ja aber Eingangsregister sind doch FC4, das hat er ja auch schon erfolglos probiert...

@domiup Hast du mit den Parametern der Schnittstelle schon verschiedene Einstellungen probiert. Parity, stoppbits usw.
Ich glaube es liegt eher an dem.
Hatte da auch schon mal meine Probleme.
 
Die Baudrate habe ich zum testen mal verstellt. Die restlichen Einstellungen habe ich auf den Standartwerten gelassen. Aber ich denke wenn die Kommunikationseinstellungen nicht passen sollten, müsste ich auch einen TimeOut error bekommen.

@Thruser ist mir leider aktuell nicht möglich aber werde ich bei Gelegenheit mal ausprobieren.
 
Zurück
Oben