FHEM als Modbus Slave

Begonnen von SkyFox, 25 Januar 2016, 23:24:22

Vorheriges Thema - Nächstes Thema

ChrisD

Hallo,

@KerniSani: Kein Problem meinerseits.

@Ichirou: Das Modul bietet nur die Möglichkeit auf Registerebene zuzugreifen. Du kannst aber auf binäre Zustande über einzelne Bits in den Registern zugreifen.

Wenn du von einem externen ModbusTCP-Client auf einen Aktor in FHEM zugreifen willst musst du zuerst das Modul wie in Beitrag 3 beschrieben installieren und einbinden. Anschließend kannst du z.B. mit
attr aktor comment MBR:1,1,H,,B0
festlegen dass aktor unter der Registeradresse 1, Bit 0 ansprechbar ist.

Welchen ModbusTCP-Client verwendest du ?

Grüße,

ChrisD


Ichirou

Hi,

ich hab derzeit noch GSI Modbus App aufm tablet, es wird ein Eaton HMI älteren Baujahres werden.

Das mit den Registeradressen funktioniert gut, ich wollte es der Einfachheit wegen aber gerne über Coils regeln, da ich viele Einzelzustände habe und die Register dafür mißbrauchen eigentlich nicht Sinn und Zweck der Sache ist.

Technisch muss ich dann sehen, wie ich das auf dem Panel umsetze. Es soll die werte dann an eine PLC weiter reichen und das Gateway Modbus-MPI spielen.

Ggf. ist es nur eine kleine Anpassung für I und H noch ein C für Coil einzubauen, dann wäre dein Modul unschlagbar :)
Es funktioniert jetzt schon fast perfekt, einzig die Übertragung eines Baro-Sensor ist auf 5 Ziffern begrenzt, das muss ich noch fixen. Multiplikator 10 geht (5 Stellen), bei 100 (6 Stellen) kommt nur noch 0.

Sonst lesen und schreiben top :)

Daniel


ChrisD

Hallo,

Ich habe versucht das Modul so zu erweitern dass auch Coils direkt gelesen und geschrieben werden können, die Syntax ist ähnlich wie bei den Registern:

MBC:<unitId>,<coil>,<type>[,<reading>[,<off>[,<on>]]
mit
    <unitId> - Unit Id (0 - 255), * für beliebig
    <coil> - Coilnummer (1 - 65536) (Achtung, dies ist nicht die Adresse)
    <type> - I für Input (nur Lesen), C für Coil (Lesen und Schreiben), * für beide
    <reading> - optional, Name des Readings, wenn nicht angegeben wird 'state' verwendet
    <off> - optional, alternativer Wert für 'off', z.B. 'auf' bei Jalousie
    <on> - optional, alternativer Wert für 'on', z.B. 'zu' bei Jalousie

Damit kann der Aktor z.B. durch setzen von
attr aktor comment MBC:1,10,C
über Coil 10 ausgelesen und gesteuert werden.

Du kannst das Modul mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txt
aktualisieren. Danach muss FHEM neu gestartet werden.

Grüße,

ChrisD

Ichirou

Hallo ChrisD,

nach etwas rumprobieren, einigen Anwenderfehlern (shutdown restart vergessen, MBR nicht auf MBC geändert) und etwas ärger mit der App funktioniert es tadellos :)

Als Hinweis für andere:
Modbus kann mit einem Adressoffset arbeiten, in dem Beispiel von Chris: MBC:1,10,C habe ich Reaktion auf Coil 9.
Je nachdem wo die Anwendung anfängt zu zählen, sind die Coils und Register möglicherweise um -1 verschoben.

Danke ChrisD, vor allem für die superschnelle Umsetzung.  :)

ChrisD

Hallo,

Bei Modbus wird (leider) zwischen Coils/Registern und ihren Adressen unterschieden. Die Adressen liegen dabei immer 1 unter der Coil/Registernummer. Oft ist aber nicht klar ob ein Hersteller unter dem Begriff Register/Coil eigentlich die Adresse meint. Deshalb habe ich in der Dokumentation geschrieben
Zitat<coil> - Coilnummer (1 - 65536) (Achtung, dies ist nicht die Adresse)

Zum Teil findet man auch in der Dokumentation Register wie 40108 die unter der Adresse 107 anzusprechen sind. Hierbei wird der FC (4 für Eingangsregister lesen) vor die Registernummer gesetzt.

Grüße,

ChrisD

rammelsberg

Moin!

Ich habe das Ganze mit einem Codesys V3 auf einem Raspberry als Master getestet, lesen von der SPS aus mit FC 4 funktioniert, schreiben mit FC 6 leider nicht, ist ähnlich dem was franzlimholz weiter oben geschrieben hatte: im Event Monitor taucht das zyklische Schreiben (1x pro sekunde) auf, allerdings immer mit dem Wert 0, ich schreibe aber 255 rein, es sollten 25,5 ankommen.
"2018-01-14 02:11:58 MAX MAX_0682e1 desiredTemperature 0"
Definition am Aktor: MBR:1,1,I,temperature,N,10:1,21,*,desiredTemperature,N,10

Fällt Euch da direkt was auf?
Danke und viele Grüße...


ChrisD

Hallo,

Ich habe das Modul geändert, so dass das Schreiben in deinem Fall auch funktionieren sollte. In der Version 0007 werden unbekannte Format-Bezeichner (in deinem Fall 'N') ignoriert.

Grüße,

ChrisD

rammelsberg

Hallo ChrisD,

Das hat auf Anhieb geklappt, vielen Dank!  :D
Grüße...

lechez

Hallo Chris,

ich möchte gerne dass fhem als Modbus Slave über rs485 läuft, kann man kein Modul Slave auf von TCP auf RS485 rtu irgendwie umbauen?

Gruß

lechez

ChrisD

Hallo,

Die Anpassungen für den Betrieb als Modbus Slave sind nicht all zu groß. Ich sehe mir das am Wochenende an.

Grüße,

ChrisD

ChrisD

#25
Hallo,

Anbei eine erste Version für Modbus RTU. Das Gerät kann z.B. mit
define mbslave ModbusSlave /dev/ttyS0angelegt werden. Die Schnittstelle wird dann mit 9600,8,E,1 geöffnet.

Optional können auch die Parameter für die Schnittstelle mit übergeben werden, z.B.:
define mbslave ModbusSlave /dev/ttyS0@19200,8,N,1

Unter Windows mit Strawberry Perl lautet die Syntax:
define mbslave ModbusSlave COM1@19200,8,N,1

Bei Problemen mit der Datenübertragung kann verbose auf 5 gesetzt werden damit die ein- und ausgehenden Pakete aufgezeichnet werden.

Die Zuordnung von Coils/Registern erfolgt wie beim Modul ModbusTCP_CC über die Kommentarfelder.

Grüße,

ChrisD

Edit 06.10.2019: Version 0002 mit Anpassungen für Windows

Edit 24.09.2022: die angehängte Version ist nicht mehr aktuell, bitte von hier herunterladen

lechez

Cool vielen Dank!
Werde hoffe ich heute noch ausprobieren können.

monty_burns_007

Hallo Chris,

Zunächst einmal vielen Dank für die hervorragenden Modbus Master & Slave FHEM-Module.
Ich habe eine Frage zum Schreiben von separaten Bits in Holding-Register (4xxxxx).

Mein SCADA-System (Industrial HMI) scheint ein separates Bit an FHEM (als Modbus-Slave) zu schreiben.

Lesen ist kein Problem. Der SCADA Modbus IO-Treiber kann ein separates Bit aus einem Halteregister lesen.

Das Schreiben eines separaten Bits in ein Halteregister funktioniert jedoch nicht.

Ich vermute, der SCADA IO-Treiber verwendet Modbus FC22 (16 Hex). (Maskenschreibregister).
Ich glaube, das Modbus-Slave-Modul unterstützt dies nicht? Richtig?

FHEM als Modbus-Master unterstützt auch FC22 nicht? (zB wenn FHEM mit einer Slave-Modbus-SPS verbunden ist).
Kann der FC22 auch für beide Master als Slave-Module unterstützt werden?

Andere Lösung ist, dass ich für Ex verwendet habe. Kepware OPC-Server, der auswählen kann, ob Sie FC22 verwenden oder nicht.
Wenn der FC22 nicht verwendet wird, liest der OPC-Server den Wert schnell, bevor er mit den "geänderten" Bits maskiert wird, bevor er zum Modbus-Slave zurückgeschaltet wird.

Eine weitere Bemerkung, die ich zu dem Modbus-Slave-Modul habe, ist, dass eine Modbus-UnitID-Slave-Nummer erwartet wird, wenn sie von einem Modbus-Master abgefragt wird. Einige Modbus-Master geben diese Slave-ID (meistens 1) in ihren Modbus-FC-Anforderungen nicht an. (da meistens nur eine einzige IP-Adresse angegeben ist).

Danke im Voraus,

Monty :-)

Or english:


Hi Chris,

First of all thanks already for the excellent Modbus Master & Slave FHEM Modules.
I have a question about writing seperate bits into Holding registers (4xxxxx). My SCADA system (industrial HMI) can seem to write a seperate bit to FHEM (as modbus slave).
Reading is no problem. SCADA Modbus IO driver can read a seperate bit from a holding register. But writing a seperate bit into a holding register does not work.
I suspect the SCADA IO driver uses modbus FC22 (16 hex). (Mask write Register).
I seems the modbus slave module does not support this ? Correctly ?

FHEM as Modbus master also does not support FC22 ? (for ex. if FHEM connects to a slave Modbus PLC).
Is it possible to also add support for FC22 for both Master as Slave modules ?

Other solution is that I used for ex. Kepware OPC server which has the ability to select if you use FC22 or not. If FC22 is not used then the OPC server quickly reads the value before masking it with the "changed" bits before poking it back to the modbus slave.

Another remark I have on the Modbus Slave module is that it expects a Modbus UnitID slave nr when polled by a modbus master. Some Modbus master don't provide this slave ID (mostly 1) in it's modbus FC requests. (as it mostly is a single IP adress already specified).

Thanks in advance,

Monty :-)


monty_burns_007

FC22 :


5.3.4 Mask write register (FC 22)

Request

Byte 0:      FC = 16 (hex)
Byte 1-2:   Reference number
Byte 3-4:   AND mask to be applied to register
Byte 5-6:   OR mask to be applied to register

Response

Byte 0:      FC = 16 (hex)
Byte 1-2:   Reference number
Byte 3-4:   AND mask to be applied to register
Byte 5-6:   OR mask to be applied to register

Exceptions

Byte 0:      FC = 96 (hex)
Byte 1:      exception code = 01 or 02

Example

Change the field in bits 0-3 of register at reference 0 (40001 in Modicon 984) to value 4 hex
(AND with 000F, OR with 0004)

16 00 00 00 0F 00 04  =>   16 00 00 00 0F 00 04

ChrisD

Hallo,

Ich habe versucht FC 22 in ModbusTCP_CC zu integrieren. Leider kann ich es nur sehr begrenzt testen.

Du kannst die neue Version mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txt
installieren.

Nach einem Neustart von FHEM sollte FC 22 funktionieren.

ZitatEine weitere Bemerkung, die ich zu dem Modbus-Slave-Modul habe, ist, dass eine Modbus-UnitID-Slave-Nummer erwartet wird, wenn sie von einem Modbus-Master abgefragt wird. Einige Modbus-Master geben diese Slave-ID (meistens 1) in ihren Modbus-FC-Anforderungen nicht an. (da meistens nur eine einzige IP-Adresse angegeben ist).

Das Protokoll verlangt eine UnitId im Byte 7. Sie ist aber bei vielen echten ModbusTCP-Servern ohne Funktion. Wenn du in FHEM die UnitId ignorieren möchtest, kannst du bei der Definition * angeben.

Grüße,

ChrisD