LabVIEWForum.de
Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenkommunikation (/Forum-Datenkommunikation)
+---- Thema: Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. (/Thread-Modbus-TCP-Honeywell-HC900-Kein-Schreiben-in-Register)



Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - labviewnick - 29.08.2012 11:30

Moin moin LVF!
Ich bin neu im Thema Modbus, jedoch etwas erfahrener mit LV..

Ich habe ein Problem mit der Datenkommunikation zwischen LV (2011) und Modbus des HC900 (verbaut in einem Parr 4871). Genauer gesagt funktioniert das Schreiben in das Holding Register nicht, weshalb ich hier Hilfe suche.

Hier die Fakten:
- Verwendet wird die freie nimodbus121 Bibliothek (ni.com)
- Auslesen der Register via TCP funktioniert (modpoll und LV)
- Schreiben in das Holding Regiser in LV funktioniert nicht (sowohl als "Write Single" und "Write Multiple Register")
- Schreiben via SpecView (Honywells Softwarelösung) funktioniert (den unten beschriebenen Setpoint)

Parameter:
Durch die verwendeten Modi in den VIs sind ja die "Function Codes" bereits definiert (Write Single=6, Write Multiple=16). Nun soll zunächst ein Wert (in einem 1D-U16-Array der größe 1) in das Holding Register geschrieben werden. Starting Address im Holding Register ist hier die 96, ein Setpoint für Temperatur (read/write).

Ausgegeben wird dann der Exception Code 6004.

Dieser Fehler bedeutet, dass der Slave einen Fehler erfährt und das Schrieben nicht funktioniert.
Vergleiche S. 20 (Single) und S.31(Multiple) im MB-Protokoll.pdf

Wenn ich die Starting Address ändere, z.B. auf eine read only adresse kommt erwartungsgemäß der Fehler Code 6002 (falsche Adresse).

Kann jemand Rat geben oder hat eine Idee?
Ich danke im Voraus!

Grüße
labviewnick


Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - labviewnick - 30.08.2012 12:26

Moin,

eine Ergänzung:
- Single Coils schreiben funktioniert


RE: Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - jg - 30.08.2012 16:39

Ich schließe aus, dass es an der NI-Modbus-Library liegt.

Ich habe das Ding jetzt schon sooo oft eingesetzt, immer ohne Probleme bei der Software-Implementation des Modbus-Protokolls durch diese Library.

Dein Problem muss also eine andere Ursache haben. Ich fische mal im Trüben:
Schreibst du auf die richtige Adresse?
Passt der MBAP-Header?
Vielleicht muss erst im Hintergrund auf irgendein Register ein Passwort geschrieben werden, bevor dein Honeywell Teil Befehle annimmt?
Du könntest mal den TCP/IP Verkehr mit Wireshark mitsniffen und dann analysieren, vielleicht hilft es.

Gruß, Jens


RE: Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - labviewnick - 31.08.2012 11:35

Moin Jens,

vielen Dank für die Antwort.

Zum Fischen im Trüben:
Ich gehe davon aus auf die richtige Adresse zu schreiben, da ich mit SpecView einen Wert auf diese schreiben kann und die Veränderung an der Stelle im Register sehe (mit LV, Modpoll etc). Ausserdem erwarte ich bei einer falschen Adresse ja der Exception-Code 2 (gut möglich, dass ich falsch erwarte :/ ).

MBAP-Header: darum hab ich mich nicht so intensiv gekümmert, da er in den Demos (Master/Slave (Legacy)) nicht zu finden war). Ich hatte im Forum gelesen die Unit-ID undbedingt auf 1 zu setzen und dies getan. Die Symptome haben sich leider dadurch nicht verändert.

Den Punkt mit dem Passwort halte ich für unwahrscheinlich, da ich Coils schreiben kann, und SpecView als auch der Controll Builder ohne Abfrage in die Register schreiben können.

Vielen Dank für den Tipp mit Wireshark, sehr nützlich! Dies hat mich wieder auf eine andere Spur gebracht. Ich habe einen Setpoint (mit SpecView) geschrieben auf 100, dann die mit Wireshark erfassten Daten nach den Funktion-Code=16 durchsucht (Write Multiple Register) und unter DATA dann den Hexwert 42C8 0000 gefunden, entspricht der gesuchten 100 in der 32-bit schreibweise. Hier steht auf S.32/33 das IEEEFP-Format, also 32-bit float verwendet wird. Soweit ich das überblicke arbeitet die nimodbus121 ja durchgängig mit U16-bit.
Kann hier das Problem liegen???


Grüße
labviewnick


RE: Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - jg - 31.08.2012 13:00

Modbus arbeitet IMMER mit U16 Registern!!

Was gerne gemacht wird, und das ist auch hier der Fall, dass zwei oder auch mehr U16 Register zusammengefasst werden, um einen größeren Datentyp unterzubringen.

In diesem Fall sind zwei U16-Register zusammengefasst und bilden auf Binärebene die Darstellung des 4-Byte-Float-Wertes. Insgesamt entspricht, wie du richtig erkannt hast, 0x42C80000 als Float-Wert genau 100.
[attachment=41366]

Beim Schreiben musst du das natürlich genau umgekehrt machen. Wenn du einen Float-Wert setzen willst, dann musst du diesen auf 2 U16 Register aufteilen und dann per "Write Multiple Register" schreiben, also etwas in dieser Art:
[attachment=41368]

Gruß, Jens


RE: Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - labviewnick - 31.08.2012 14:04

Hab vielen Dank Jens, so funktionierts!!

Für mein Verständnis:
Ist das die Funktion des "Write Multiple Registers", also das Schreiben in die Ordnung von zusammengefassten und damit multiple Register?
Die Aufteilung auf 2 U16 Register zum Schreiben passiert dann beim typcasten von SGL auf das U16-Array, weshalb es dann die Größe 2 hat?
Beim Lesen wird da schon der "leere" Teil automatisch entfernt?

Grüße
labviewnick


RE: Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - jg - 31.08.2012 19:59

(31.08.2012 14:04 )labviewnick schrieb:  Ist das die Funktion des "Write Multiple Registers", also das Schreiben in die Ordnung von zusammengefassten und damit multiple Register?
Ja und Nein. Mit "Write Multiple Registers" kannst du ganz allgemein mehrere aufeinander folgende Register mit einem Kommando schreiben.
(31.08.2012 14:04 )labviewnick schrieb:  Die Aufteilung auf 2 U16 Register zum Schreiben passiert dann beim typcasten von SGL auf das U16-Array, weshalb es dann die Größe 2 hat?
Richtig erkannt. Anderes Beispiel: Wenn dir mal ein Gerät unterkommt, das einen Wert z.B. als U64 oder DBL erwartet, dann kommt nach dem Typecasten halt ein U16-Array der Größe 4 heraus.

Man sollte sich allgemein zum besseren Verständnis von der Vorstellung lösen, dass bei "Modbus" in der Registern wirklich U16-Werte stehen.
Aus meiner Sicht fährt man besser mit der Vorstellung, dass jedes Modbus-Register einfach einen Speicherbereich von 2 Byte Größe hat. Was in diesem Speicherbereich drinnen steht und wie das zu interpretieren ist, das muss man der Dokumentation des entsprechenden Gerätes entnehmen.
(31.08.2012 14:04 )labviewnick schrieb:  Beim Lesen wird da schon der "leere" Teil automatisch entfernt?
Was willst du damit aussagen bzw. fragen?

Gruß, Jens


RE: Modbus TCP Honeywell HC900-- Kein Schreiben in Register.. - labviewnick - 06.09.2012 08:36

Moin Jens,

ignorier den letzen Punkt bitte mit dem "leeren Bereich". War ein Problem meiner Vorstellung mit der Darstellung..

Gruß
labviewnick