# Modbus TCP



## doelckenbeck (18 Februar 2010)

Hallo, ich weiß nicht ob ich hier an der richtigen Stelle bin, aber ich frag einfach mal.
Ich will über das ModbusTCP- Protokoll Daten zwischen einer Max4 von ELAU und einem Power Panel von B&R austauschen und hab da so meine Probleme.
Die Modbus- Funktionen sind mir noch nicht ganz klar, also "Write_Multiple_Registers" und so weiter. 
Ich habe auf der ELAU- Steuerung vier Arrays, über die ich Daten austausche.
Mir ist allerdings noch ein bischen schleierhaft wie die da ankommen. Ich hab dem Panel nur die IP der Steuerung mitgeteilt und das wars dann. Ich beschreibe im Panel Variablen die mit den Modbusfunktionen verknüpft sind und diese Werte tauchen dann in den Arrays auf der Steuerung auf. Hab da noch so meine Verständnisprobleme.


----------



## pvbrowser (18 Februar 2010)

Wenn Du es genau wissen willst, lies hier nach.
http://modbus.org/specs.php

In
*MODBUS  Protocol Specification*
auf Seite 11 ist eine gute Übersicht.

Über Modbus können nur Bits und 16Bit Integer übertragen werden.


----------



## o_prang (18 Februar 2010)

Hi,

grundlegend ist Modbus TCP folgend aufgebaut.

Jedes Gerät hat eine IP Adresse.
Die Werte werden über Register (1bit oder 16bit) ausgetauscht. Diese sind meist von 1 bis 9999.
Dazu gibt es einen Funktionscode der die Zugriffsrechte und die Art der Register beschreibt.
Beispiel dazu:
400001 = Holding Register 1 mit Schreib/Leserechte in 16bit Format
300011 = Input Register 11 mit Leserechte in 16bit Format
100010 = Input Bit 10 mit Leserechte in 1bit Format


----------



## doelckenbeck (19 Februar 2010)

Danke für die schnelle Antwort. Was haben denn die 400001 usw. zu bedeuten? Ist das eine Adresse, oder nur ein Array oder ähnliches in das die Daten geschrieben, oder von dem die Daten gelesen werden?

Ich habe im Programm folgendes:

"#MBFUNCTION=READ_DISCRETE_INPUTS"            
"#MBTELEGRAMSTARTADDRESS=0"
"#MBNUMBEROFITEMS=4"
"#MBPOLLINTERVALL=3000"
"#MBSTATUS=uiTel2Status"
"bTestDi1, DI, 0"
"bTestDi2, DI, 1"
"bTestDi3, DI, 2"
"bTestDi4, DI, 3"

Die Modbusfunktion ist klar. Mit der Startadresse hab ich noch so meine Problem. Ist das die Adresse im Modbustelegramm?


----------



## pvbrowser (19 Februar 2010)

doelckenbeck schrieb:


> Die Modbusfunktion ist klar. Mit der Startadresse hab ich noch so meine Problem. Ist das die Adresse im Modbustelegramm?



Ja, siehe die methode request
http://pvbrowser.org/pvbrowser/sf/m...lModbus.html#f372c588b1805e831a7f3a6fc7760b58

aus unserer Modbus Klasse
http://pvbrowser.org/pvbrowser/sf/manual/rllib/html/classrlModbus.html

Die Werte der Start Adressen sind eigentlich nichts weiter, als eine Konvention. Du musst in die Spec des Anbieters sehen, welche Adressen wozu zugeordnet sind.


----------



## knarf (19 Februar 2010)

Hallo,
man kann über Modbus auch Real-Werte lesen und schreiben.
Die 400001 ist ein Funktionscode, wodurch der Modbus erkennt ob es ein Bit oder eine Real-Zahl u.s.w. ist die gelesen oder geschrieben werden muß.
Genauer gesagt handelt es sich hier um den Funktionscode 04. Die 1 ist dann die erste Variable wo es los geht (Startindex).

Gruß Frank


----------



## pvbrowser (19 Februar 2010)

knarf schrieb:


> Hallo,
> man kann über Modbus auch Real-Werte lesen und schreiben.



Davon steht in der Modbus Spezifikation nichts drin.
Man kann Register "missbrauchen", um Real übertragen zu können.
Das ist aber nicht vom Standard abgedeckt.


----------



## knarf (19 Februar 2010)

Hallo pvbrowser,
ich habe schon bei einem Honeywell Leitsystem über Modbus RTU und Modbus TCP Real (Float)-Werte übertragen. Der Funktionscode zum lesen ist die 03 und zum Schreiben die 16.

Als Startindex ist der Bereich von 20001 bis 29999 oder 70001 bis 79999
erlaubt.

Gruß Frank


----------



## pvbrowser (19 Februar 2010)

Hallo Knarf,

ich sagte ja auch: 
Man kann Modbus dazu "missbrauchen" Real zu übertragen.

Sieh aber bitte mal in der Spezifikation, auf die ich in meiner ersten Antwort verlinkt habe nach. Das wird NICHT von der Spezifikation abgedeckt und ist daher herstellerabhängig.


----------



## doelckenbeck (19 Februar 2010)

Aha, das bringt mich schon weiter!
Noch eine paar Fragen. Ich habe in meinem Testprogramm folgende Arrays:

a_bArrB0000          boolsches Array, 3000 Felder groß
a_bArrB1000          boolsches Array, 3000 Felder groß
a_bArrB3000          int Array, 2500 Felder groß
a_bArrB4000          int Array, 2500 Felder groß

1.Jetzt nehme ich an, dass die Nummern darstellen ob es sich um ein boolsches oder ein int Array handelt und ob gelesen oder geschrieben werden kann. Richtig?

2. Könnte ich jetzt 3000 boolsche Variablen anlegen und die Werte in einem Rutsch über Modbus in das entsprechende Array schreiben? Denke nicht, oder? 

3. Woher weiß mein Modbus- Protokoll wohin es die Daten schreiben soll?
Ich nehme mal an, dass immer ein Datenrahmen übertragen wird, egal was drin steht und diese Daten werden dann in die angeschlossenen Arrays geschrieben.?


----------



## Lars Weiß (19 Februar 2010)

pvbrowser schrieb:


> Hallo Knarf,
> 
> ich sagte ja auch:
> Man kann Modbus dazu "missbrauchen" Real zu übertragen.
> ...



In der Spezikikation steht nicht was übertragen wird, sondern nur das ein Register 16Bit sind. Ob man da Bits, Bytes, integer, dints oder reals überträgt spielt für kein Protokoll keine Rolle. Da steht auch nichts in den Schneider Quantum Bedienungsanleitungen.


----------



## Lars Weiß (19 Februar 2010)

doelckenbeck schrieb:


> Aha, das bringt mich schon weiter!
> Noch eine paar Fragen. Ich habe in meinem Testprogramm folgende Arrays:
> 
> a_bArrB0000          boolsches Array, 3000 Felder groß
> ...



zu 1: Wenn du mit Nummern die Funktionscodes meinst, ja.
zu 2: 3000bits sind 375 Bytes, das sind zuviel. In einem Modbus Telegramm FC1 können max. 252Bytes Nutzdaten stehen.
zu 3: Das modbus-Protokoll weiss es nicht. Es transportiert die Daten nur.


----------



## pvbrowser (19 Februar 2010)

Lars Weiß schrieb:


> In der Spezikikation steht nicht was übertragen wird, sondern nur das ein Register 16Bit sind. Ob man da Bits, Bytes, integer, dints oder reals überträgt spielt für kein Protokoll keine Rolle. Da steht auch nichts in den Schneider Quantum Bedienungsanleitungen.



Klar, sage ich doch.
Bei Real*4 musst Du 2 Register nehmen, auf die Byte Order achten und das entsprechend zusammensetzen ("missbrauchen").


----------



## doelckenbeck (19 Februar 2010)

zu 2: 3000bits sind 375 Bytes, das sind zuviel. In einem Modbus Telegramm FC1 können max. 252Bytes Nutzdaten stehen.

Ok, wie aber schreibe ich dann Daten an die beispielsweise 5000ste Stelle eines Arrays?


----------



## pvbrowser (19 Februar 2010)

In einem Byte können 8 Bit übertragen werden
(ForceMultipleCoils = 15)
252*8=2016 Bit auf einen Rutsch.

Für ein int16 brauchst Du 2 Byte.
252/2=126 int16 auf einen Rutsch.

Wenn Du nun mehr übertragen musst,
musst Du eben die Start Adresse jeweils um die pro Zyklus geschriebenen Werte erhöhen.


----------



## doelckenbeck (19 Februar 2010)

Vielen Dank! Das hab ich mir schon so in der Art gedacht. Aber jetzt wird es langsam klar.


----------



## Lars Weiß (19 Februar 2010)

Hier gibts ab Seite 324 noch eine prima Beschreibung in D:

http://www.vipa.de/uploads/tx_sbdownloader/hb97d_im_06-29.pdf


----------

