Modbus TCP

doelckenbeck

Level-1
Beiträge
66
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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?
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.?
 
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.

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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.?

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.
 
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").
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zurück
Oben