Hilfe bei Modbus TCP Kommunikation gesucht

Mephisto

Level-1
Beiträge
242
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich versuch mich mal daran, dass ich mit einer S7-315 2DP und zwei Lean-CPs eine Modbus TCP Kommunikation als Client aufbauen möchte.
Ich hab mir dazu das Paket von Siemens: S7-OpenModbus/TCP gekauft.
Darin enthalten ist ein Kommunikationsbaustein, der (no na) beschaltet werden muss.
Der Baustein bietet 8 Bereiche, in denen verschiedene Modbus Register und Datentypen zur Kommunikation angegeben werden können.
Ich benötige nur einen Datentyp (Holding Register mit Funktionscode 16) da ich nur Daten schreiben möchte.
Somit bleiben die anderen 7 Bereiche bei mir leer. Soweit so klar.
Aber:
Man muss bei dem Baustein noch zusätzlich angeben:
UNIT Unit Identifier
DATA_TYPE zu bearbeitender Datentyp
START_ADRESS Modbus Startadresse
LENGTH Anzahl der Werte

Was zum Geier muss da eingetragen werden? Die Modbuskommunikation wird ja schon in den Bereichen 1-8 definiert, oder?
Und bei der tollen Siemens-Hilfe (man möchte sich bei dem Kaufpreis was besseres erwarten) schreibt: "Dieser Eingang ist den Anforderungen entsprechend zu setzen"

Hat das von euch schonmal jemand gemacht und/oder kann mir einige Tipps dazu geben?

Hab leider noch keine Hardware dafür, muss noch bis Ende nächste Woche warten. Try und Error spielts also auch (noch) nicht.

mfg mephisto
 
Hi,

ich kenn zwar diesen Siemens Client nicht, aber

UNIT = Geräteadresse des Slave(Server)
START_ADRESS = Startregister des aktuellen Bereiches beim Slave
LENGTH = Anzahl Register

Unit und Startregister kennst du nur, wenn du den Slave kennst.
Normalerweise sind diese Parameter auf beiden Seiten einstellbar, müßen halt Abgesprochen und gleich parametriert werden.

Was das mit dem Datentypen soll weiß ich auch nicht.

Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aha,

Ist das nur eine Vermutung, oder weißt du das genau?

Ich dachte eigentlich, dass ich eigentlich bei den Bereichen 1-8 definiere, wohin ich die Daten schreibe.

mfg mephisto
 
Hallo Mephisto,

Ich habe vor ner Weile mal eine Modbus-Kommunikation aufgebaut. Damals gabs auf der Siemens-Homepage einen Modbus-Wizzard, der hat einem das alles abgenommen...

Grüße,
Johannes
 
Hallo!

Den Modbus-Wizzard kenn ich. (Zumindest weiß ich, dass er exisitert)
Problem:
Der funktioniert nur bei PN-CPUs
Da ich aber zwei Modbus-Verbindungen aufbauen muss, arbeite ich mit zwei Lean-CPs und für die gibts keinen Wizzard.

mfg roland
 
Ja. war dabei, aber gerade dieser Teil ist nicht kommentiert.
Ansonst hab ich mich auch an das Beispielprojekt gehalten.

hab mir zwischenzeitlich gedacht, dass der Modbus-Server ein Antworttelegramm sendet und über die vier Parameter (UNIT, DATA_TYPE_START_ADDRESS und LENGTH) wird das vom MODBUSCP Baustein überprüft. Aber dann stellen sich gleich mehrere Fragen:
1.)
Selbst wenn ich die Parameter DATA_TYPE, START_ADDRESS und LENGTH mit den selben Daten, wie den Sendedaten füttere, was mache ich mit UNIT?
2.)
Der Baustein kann mittels 8Bereichen aus 8 verschiedenen Registern lesen/schreiben. Die oben genannten Parameter sind aber nur 1x vorhanden. Wie wird also ausgewählt, was überprüft wird?

Fragen über Fragen...

mfg mephisto
 
UNIT ist die Modbus Slave Adresse (1-255), die stellst du auch an beiden Seiten gleich ein, nimm mal die 1.

Hast du dich mal mit dem Thema Modbus beschäftigt ?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja. war dabei, aber gerade dieser Teil ist nicht kommentiert.
Ansonst hab ich mich auch an das Beispielprojekt gehalten.

hab mir zwischenzeitlich gedacht, dass der Modbus-Server ein Antworttelegramm sendet und über die vier Parameter (UNIT, DATA_TYPE_START_ADDRESS und LENGTH) wird das vom MODBUSCP Baustein überprüft. Aber dann stellen sich gleich mehrere Fragen:
1.)
Selbst wenn ich die Parameter DATA_TYPE, START_ADDRESS und LENGTH mit den selben Daten, wie den Sendedaten füttere, was mache ich mit UNIT?
2.)
Der Baustein kann mittels 8Bereichen aus 8 verschiedenen Registern lesen/schreiben. Die oben genannten Parameter sind aber nur 1x vorhanden. Wie wird also ausgewählt, was überprüft wird?

Fragen über Fragen...

mfg mephisto

zu1: Wie gesagt, ich kenn den ominösen S-Baustein nicht, aber normalerweise musst du dem Baustein ja mitteilen
a) An wen sollen die Daten gesendet werden (SlaveID)
b) Wo liegen die Daten in der S7
c) Wo liegen die Daten beim Partner (Start-Registeradresse des Bereiches und die Länge in Registern)

zu2: Wenn du mehrere Bereiche parametrieren kannst, dann geht das nur der Reihe nach.
Achtung Schätzung: Der Baustein sagt dir über eine OUT-Variable welchen Bereich er gerade bearbeitet.
Wenn du das weißt, dann weißt du auch den Bereich der danach kommt.
Wahrscheinlich mußt du dann Startadresse, Länge und SlaveID umschalten
.
 
Hallo!

Zunächst mal Danke für die Antworten.
@Lars Weiß:
Das ist mein "erstes Mal" mit Modbus TCP. Hab dazu recht lange im Netz nach brauchbaren Unterlagen gesucht, jedoch alles was man findet, sind entweder die Grundlagen der Grundlagen oder irgendwelche Geräteparametrieranleitungen anderer Hersteller. Und Siemens lässt da auch nichts aus drüber. Kommt mir generell so vor, als wolle Siemens a) nicht mit anderen Herstellern kommunizieren und b) schon gar nicht über Modbus (oder Modbus Plus oder Modbus TCP). Deswegen bin auf dem Thema auch ziemlich unerfahren.

@SPSKiller:
Woher weiß der Baustein, an wen die Daten gesendet werden? Nun ich musste ja meine Steuerung und den Modbus-Server in NetPro parametrieren und eine (TCP-)Verbindung parametrieren. Diese Verbindungsadresse wird am Modbus-Baustein eingegeben. Von daher weiß der Bausten mal, wer sein Verbindungspartner ist.
Wo liegen die Daten der S7 und beim Modbus-Server? Es wird für jeden der 8 Bereiche ein Datenbaustein angegeben, indem die zu senden/empfangenen Daten liegen. Zusätzlich wird in diesen Bereichen eingestellt, aus welchen Registern mit welchen Modbusadressen geschrieben/gelesen wird.

Also meiner Meinung nach sollte der Baustein nun alles wissen, was er wissen muss.

Das mit der UNIT als Modbus-Client Adresse klingt ersmal logisch. Gilt das aber nicht nur für Modbus? Bei Modbus TCP wird ja über die TCP-Adresse(z.B.:192.168.0.10) adressiert. Gibts also die Client-Adresse nur bei Modbus über serielle Schnittstelle oder hab ich hier auch Wissenslücken?

Wenn der Baustein nun intelligent genug ist, 8 Datenbereiche zu schreiben/lesen, warum muss ich ihm dann nochmal händisch mitteilen was er wo hinschreiben soll? Sollte er ja automatisch können, oder zumindest sollte es dann reichen, wenn ich nur sage: sende Bereich 7, empfange Bereich 4, etc. oder?

Auch eine Antwort eines eventuellen Antworttelegegramms sollte er doch automatisch machen, oder?

Fragen über Fragen...

mfg mephisto
 
Hallo,
in den 8 Datenbereichen im OB100 sagst Du nicht, was der Baustein tun soll, sondern was der Bausteinen KÖNNEN soll. Also dass der Baustein weiß, welche Modbusadressen in welchen Datenbausteinen abgelegt sind. Mit den Runtimeparametern DATA_TYPE, START_ADDRESS, LENGHT etc. gibts Du an, welche Modbusregister jetzt gerade aktuell bearbeitet werden sollen.
Du kannst also in data_type_1 = 3 (Holding Register), db_1 = 10, start_1 = 0 und end_1 = 500 angeben. D.h. Die Holding Register 0 bis 500 sind in DB10 abgelegt und der DB muss dann 1002 Byte groß sein. In den Runtimeparametern sagst Du dann mit START_ADDRESS = 0 und LENGTH = 125, dass Du die ersten 125 Register lesen willst. Wenn der Auftrag fertig ist, dann änderst Du die START_ADDRESS und LENGTH und liest den nächsten Block.
Soweit ich gehört habe, macht Siemens gerade so einen Abarbeitungs-Baustein, der einem das ganze erleichern soll. Der ist aber noch nicht verfügbar.

Ach ja:
DATA_TYPE: 1 - Coils, 2 - Inputs, 3 - Holding Register, 4 - Input Register

Die UNIT-Nummer wird für die reine TCP-Kommunikation nicht mehr verwendet und ist meistens 1. Wichtig ist UNIT nur noch, wenn ein TCP-Seriell-Konverter eingesetzt wird. Die TCP-Verbindung wird mit dem Konverter aufgebaut und über die UNIT-Nummer werden die Pakete zu den jeweiligen Slaves hinter dem Konverter geschickt.

Snape
 
Zuletzt bearbeitet:
Na dann sag ich mal ganz brav Danke!
Werd meine Einstellungen dementsprechend ändern. testen kann ich erst frühestens gegen Ende der Woche.

Nun noch eine letzte Frage:

Wieso kannst du das in 6 Zeilen erklären und Siemens schafft das nicht in 58 Seiten?

mfg mephisto
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Slave Adresse gibt es bei RTU als auch bei TCP. Also hast du keine Wissenslücke ;) Macht hin und wieder auch sinn, so werden über die Slave Adresse bei einer Sunny Webbox die einezelnen Umrichter hinter der Box angesprochen.

Auf der Webseite von Vipa findest du eine sehr gute Beshreibung von Modbus TCP, die solltest du dir mal anschauen : http://www.vipa.com/uploads/tx_sbdownloader/HB97D_IM_12-30.pdf
 
Hi,
danke für die Blumen. :)

Also wenn Du die Siemens-Hardware hast und nur keinen Koppelpartner, dann kannst Du es trotzdem testen. Als Simulations-Modbus-Server eignet sich "mod_rssim" ganz gut. Google mal danach. Da spielt einfach der PC den Koppelpartner. Wenn Du das Tool startest, bekommt es die IP-Adresse vom Rechner und Du kannst von der S7 aus testen. Also entweder änderst Du kurzzeitig die IP-Adresse deines Rechners oder die Verbindungsprojektierung in NetPro.

Snape
 
Hallo!

Werd mal danach googeln. Freeware, oder?
Ich hätt den Test ansonst mit einer Schneider M340 gemacht. Die hab ich grad rumliegen.
Hab leider noch keine Hardware. erst gegen Ende der Woche

mfg mephisto
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Vipa Fibel wirft nun nochmal ne Frage auf.

Ich möchte eigentlich nur mit meiner S7-300 Daten auf den Server schreiben.

Ich hätte gedacht, ich muss nun das "Holding-Register" mit "Funktionscode 16" auf "Registeradresse 4x (z.B.:40001)" beschreiben. Wenn diese ganze Nomenklatur aber aus Sicht des Servers ist, dann muss doch der Server aus meiner Steuerung lesen.
Wär dann:
4 - Input Register
Funktionscode FC4 - Read Input Register
3x - Wortbereich für Master-Eingabe

Korrekt?

Hab schonmal mit einem Kollegen zusammengearbeitet:
Schneider M340 Anbindung an BVSS2. Da wurde der komplette Merkerbereich der Schneider Steuerung im Register 4x abgebildet. Egal ob jetzt die Steuerung lesend oder schreibend darauf zugegriffen hat.

Stimmt nun meine erste Vermutung mit Holding Register oder muss ich alles auf Input Register umschreiben?

Wie schon gesagt, ich möchte lediglich 5 REAL-Werte einlesen.

mfg mephisto
 
Du kannst 45 Minuten ohne Probleme damit testen. Danach kommt eine nervige Box. Aber wenn Du das Tool schließt und wieder öffnest, läuft es wieder 45 Minuten.

Mit VIPA kenn ich mich gar nicht aus...

Die Holding Register liegen immer ab Adresse 40001 und werden mit Funktionscode 3 gelesen und mit 16 geschrieben.
Für den Modbusbaustein von oben gilt:
DATA_TYPE = 3 (Holding Register) => Der Baustein weiß, dass er mit FC3 oder FC16 arbeiten muss.
WRITE_READ = FALSE => Der Baustein weiß, dass er lesen soll, also FC3 nimmt. Wenn er schreiben soll (FC16), muss WRITE_READ = TRUE gesetzt werden.

Snape
 
Ja,
Aber muss ich als Client nun in Registeradresse 40001 oder 30001 schreiben? Oder ist das egal und ich und mein Server können uns das aussuchen?

mfg mephisto
 
Zurück
Oben