Device über Modbus TCP auslesen

S_Liner

Level-2
Beiträge
365
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich habe eine CPU1211C DC/DC/DC (6ES7 211-1AE40-0XB0 - V4.4) und möchte mit der unsere Sentron Pacs 3200 & 4200 auslesen.

Ich habe mir mal dieses Beispielprojekt von Siemens mal runtergeladen, aber ich verstehe nur Bahnhof.

Datenkommunikation zwischen S7-1200 und SENTRON PAC3200 über MODBUS TCP (Set 22) - ID: 40614428 - Industry Support Siemens

Die Sentrons sind alle miteinander vernetzt, nun möchte ich das meine CPU mir die Energiestände täglich einholt. Kann mir jemand helfen beim Auslesen der Werte aus den Sentrons?

Ich nutze TIA V16.

Beste Grüße
 
Die Sentrons sind alle miteinander vernetzt, nun möchte ich das meine CPU mir die Energiestände täglich einholt. Kann mir jemand helfen beim Auslesen der Werte aus den Sentrons?
Woran hapert es denn genau?
Hast du dir das TIA Beispiel-Projekt mal runtergeladen und angeschaut?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja genau, ich habe es runtergeladen und die Hardware auf meine CPU geändert. Dann habe ich das in meine CPU geladen.

Aber die ganze Beschriftung und sonstiges verstehe ich überhaupt nicht.

Trage ich nirgends die IP's von den Teilnehmern ein? Wo sind meine Werte falls sie gelesen werden? Ich komme damit überhaupt nicht klar..
 
Hi,

sei nachsichtig - ich hab mir des Beispiel nicht angeschaut weil ich es extra laden und hochrüsten müsste, schreib des grad aus dem Kopf :D.

Im Prinzip arbeitet Siemens immer mit dem MB_Client-Baustein.

Dort ist der Parameter Connect, daran kommt eine Variablenstruktur mit dem Datentyp TCON_IP_V4.
Darin enthalten sind sämtliche Kommunikationseinstellungen, die Werte werden alle in die Startwerte eingetragen vor dem ersten Laden, dann verschwinden die auch nimmer.

Unter anderem die Hardwareadresse Deiner CPU "Local PN Schnittstelle" z.B. mit 64, sollte HW* heissen
Dann Connection_ID - Diese darf Systemweit nur einmal belegt sein oder aber nur einmal kommunizieren falls man sie nicht verteilen will. Die 0 macht oft Probleme, also z.B. 16#00AA reintippen.
Conn_Established - TRUE wenn Deine Steuerung die Verbindung aufbauen soll (soll sie!, das TRUE durchgehend aktiv lassen, also in den Startwert und danach nimmer antasten)
Dann der Typ der Verbindung mit TCP, UDP, UDP(TCP), wobei ich TCP eintrage, also 11. Im Startwert müsste dann 16#0B stehen.
Du findest dort auch die Adressdaten im IP_V4-Format. Darin stehen als HEX-Code die IPs in den Startwerten. Hab ich immer mit dem Windows-Rechner umgewandelt von 192 nach 16#CB oder so.
Darunter kommt Remote Port - wenn nix geändert wurde steht dort 502
Dann Local Port - der steht dann in der Regel auf 0

Dann sobald der MB_Client im Projekt ist verlangt er unter anderem Mode etc.
Mode: 103
LEN=101 - Anzahl zu lesender Einträge
MB_DATA_PTR = Der Lesebereich. Mach einfach ein mal ein UDT und zieh dort 101 Reihen rein, alle mit Datentyp real. Dann diesen UDT in einem DB angeben und hiermit verlinken. Hier stehen später die Werte alle drin.
Da war nun noch eine Variable die zu vergeben ist mit dem Beginn des Lesebereichs. Das sollte auf 1 stehen glaub ich, evtl. 0. Unsicher, zu probieren.

Was wäre noch...die Error, Disconnect, Status etc. verschalten.
Da hab ich bei mir immer
REQ=NOT MB_CLIENT_ERROR AND Comm_Enable AND NOT MB_CLIENT_BUSY
DISCONNECT=MB_CLIENT_ERROR OR MB_CLIENT_DONE OR NOT Comm_Enable

Im Prinzip sollte das dann so laufen und in dem DB mit dem UDT sollten die Werte gefüllt werden. Natürlich ohne Sinn erstmal.
Aber im Handbuch stehen die Offsets 1,3,5,7,9,.. in 2er-Schritten. In exakt der gleichen Reihenfolge stehen die im UDT. Eventuell noch ein paar real zu word umlegen und das sollte so klappen.

In diesem Beispiel wird im Akkord die Verbindung aufgebaut, gelesen, abgebaut. Der Comm_Enable müsste von Dir dann immer True werden zum lesen und rückgesetzt durch MB_CLIENT_DONE. Dann wird die Leitung nicht so ausgelastet.

Falls des nicht geht kann ich Dir morgen ein 16er-Projekt von mir zusammenschustern, ist vllt. anschaulicher.



Falls Du aber konkrete Fragen zu Deinem Programm hast - kennst des ja - zeig uns was :D
 
Hallo, sorry für die späte Antwort, aber ich hatte auf Arbeit keine Zeit zu testen. Und erstmal einen riesen Dank für den ausführlichen Beitrag. Aufgrund des Zeitmangels auf Arbeit, habe ich es nun zu hause probiert.

Im Prinzip arbeitet Siemens immer mit dem MB_Client-Baustein.

Dort ist der Parameter Connect, daran kommt eine Variablenstruktur mit dem Datentyp TCON_IP_V4.
Darin enthalten sind sämtliche Kommunikationseinstellungen, die Werte werden alle in die Startwerte eingetragen vor dem ersten Laden, dann verschwinden die auch nimmer.

Unter anderem die Hardwareadresse Deiner CPU "Local PN Schnittstelle" z.B. mit 64, sollte HW* heissen
Dann Connection_ID - Diese darf Systemweit nur einmal belegt sein oder aber nur einmal kommunizieren falls man sie nicht verteilen will. Die 0 macht oft Probleme, also z.B. 16#00AA reintippen.
Conn_Established - TRUE wenn Deine Steuerung die Verbindung aufbauen soll (soll sie!, das TRUE durchgehend aktiv lassen, also in den Startwert und danach nimmer antasten)
Dann der Typ der Verbindung mit TCP, UDP, UDP(TCP), wobei ich TCP eintrage, also 11. Im Startwert müsste dann 16#0B stehen.
Du findest dort auch die Adressdaten im IP_V4-Format. Darin stehen als HEX-Code die IPs in den Startwerten. Hab ich immer mit dem Windows-Rechner umgewandelt von 192 nach 16#CB oder so.
Darunter kommt Remote Port - wenn nix geändert wurde steht dort 502
Dann Local Port - der steht dann in der Regel auf 0

Dann sobald der MB_Client im Projekt ist verlangt er unter anderem Mode etc.
Mode: 103
LEN=101 - Anzahl zu lesender Einträge
MB_DATA_PTR = Der Lesebereich. Mach einfach ein mal ein UDT und zieh dort 101 Reihen rein, alle mit Datentyp real. Dann diesen UDT in einem DB angeben und hiermit verlinken. Hier stehen später die Werte alle drin.
Also das habe ich verstanden

Bei mir sieht das jetzt so aus:
1.JPG2.JPG

Ist das soweit erstmal richtig? Mit "MB_DATA_ADDR" weiß ich jetzt nicht was damit gemeint ist.


Und woher weiß ich jetzt welches Sentron Pac ausgelesen wird? Ich musste ja nur die IP von meiner CPU angeben. In meinem Fall:

IP: 10.81.73.100
Sub: 255.255.255.0
Gateway: 10.81.73.1

In diesem Netzwerk sind nur Sentron Pacs. Wie ist das jetzt wenn ich alle lesen möchte? muss ich dann für jedes Sentron ein neues Netzwerk schreiben?


Beste Grüße
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, sorry für die späte Antwort, aber ich hatte auf Arbeit keine Zeit zu testen. Und erstmal einen riesen Dank für den ausführlichen Beitrag. Aufgrund des Zeitmangels auf Arbeit, habe ich es nun zu hause probiert.


Also das habe ich verstanden

Bei mir sieht das jetzt so aus:
Anhang anzeigen 51912Anhang anzeigen 51913

Ist das soweit erstmal richtig? Mit "MB_DATA_ADDR" weiß ich jetzt nicht was damit gemeint ist.
Den REQ verschalte gleichzeitig noch mit BUSY. Wenn er Busy ist und nochmals aufgerufen wird dann kommt der Fehler Zwischenaufruf.

MB_DATA_ADDR ist der Bereich bei dem auf dem fernen Gerät begonnen werden soll auszulesen. In diesem Fall also sollte es 1 sein.
Und woher weiß ich jetzt welches Sentron Pac ausgelesen wird? Ich musste ja nur die IP von meiner CPU angeben. In meinem Fall:

IP: 10.81.73.100
Sub: 255.255.255.0
Gateway: 10.81.73.1
im "MB_Config".IP_Config steht die Adresse(IP) des Gerätes das Du erreichen willst. Subnetz und Gateway werden hier ignoriert, sollte also direkt erreichbar sein.
Falls es zwingend über anderem Sub bzw. IP-Bereich arbeiten muss dann müsste etwas anders konfiguriert werden, das habe ich aber nicht im Kopf ob und wie es geht, ich arbeite immer im gleichen Netz. Ich gehe gerade davon aus das CPU und PAC im gleichen Netz sind?!
In diesem Netzwerk sind nur Sentron Pacs. Wie ist das jetzt wenn ich alle lesen möchte? muss ich dann für jedes Sentron ein neues Netzwerk schreiben?


Beste Grüße
Ja, Du musst für jeden PAC ein solches Netzwerk erstellen mit jeweils einer eigenen Instanz des MB_Client und anderen Daten am MB_DATA_PTR sowie CONNECT, DONE, BUSY, ERROR.
Dabei muss beachtet werden das jede CPU nur max. X Verbindungen gleichzeitig aufbauen kann.
Daher habe ich bei mir für solche Anwendungen den MB_Cleint in einen FB gezogen und darin enthalten wird der MB_Client über ein Array adressiert. Hier wird dann allerdings jedes Mal die Verbindung aufgebaut und abgebaut.
Weitergeschaltet im Index des Array wird wenn der vorherige MB_Client-Aufruf DONE und NO ERROR anzeigt in 2 Schritten: 1-Disconnect, 2-Index erhöhen.
Gleichzeitig nutze ich den Index auch um die Connection_ID durchzuschalten, denn eine ID die mal hängt kann somit nicht alle anderen Geräte behindern und gleichzeitig ist hierdurch immer exakt nachvollziehbar welches Gerät Probleme machte.
Das würde ich aber erst angehen wenn der erste läuft :D.
 
Hallo,

Den REQ verschalte gleichzeitig noch mit BUSY. Wenn er Busy ist und nochmals aufgerufen wird dann kommt der Fehler Zwischenaufruf.
Alles klar, macht Sinn.

im "MB_Config".IP_Config steht die Adresse(IP) des Gerätes das Du erreichen willst.
Ok dann habe ich das falsch verstanden, dachte ich muss da die Adressen der CPU einstellen

Subnetz und Gateway werden hier ignoriert, sollte also direkt erreichbar sein.
Falls es zwingend über anderem Sub bzw. IP-Bereich arbeiten muss dann müsste etwas anders konfiguriert werden, das habe ich aber nicht im Kopf ob und wie es geht, ich arbeite immer im gleichen Netz. Ich gehe gerade davon aus das CPU und PAC im gleichen Netz sind?!
Das werde ich testen, kann die Sentrons auch nochmal beliebig umstellen. Im Grunde sind Sie aber in unserem Firmennetzwerk und somit auch im Netzwerk der CPU. Die Adressen wurden damals von unsere IT vorgegeben.

Ja, Du musst für jeden PAC ein solches Netzwerk erstellen mit jeweils einer eigenen Instanz des MB_Client und anderen Daten am MB_DATA_PTR sowie CONNECT, DONE, BUSY, ERROR.
Dabei muss beachtet werden das jede CPU nur max. X Verbindungen gleichzeitig aufbauen kann.
Ok, das übt ja dann auch noch ein wenig :)

Dabei muss beachtet werden das jede CPU nur max. X Verbindungen gleichzeitig aufbauen kann.
Also mir würde es auch reichen, wenn die CPU einmal täglich den Verbrauchswert ausliest.
Dann brauche ich doch nur eine weitere Bedingung an den REQ anlegen oder? Reicht dafür ein Impuls? Oder brauche ich an REQ ein dauersignal was durch "Done" oder "Error" unterbrochen wird?


Daher habe ich bei mir für solche Anwendungen den MB_Cleint in einen FB gezogen und darin enthalten wird der MB_Client über ein Array adressiert. Hier wird dann allerdings jedes Mal die Verbindung aufgebaut und abgebaut.
Weitergeschaltet im Index des Array wird wenn der vorherige MB_Client-Aufruf DONE und NO ERROR anzeigt in 2 Schritten: 1-Disconnect, 2-Index erhöhen.
Gleichzeitig nutze ich den Index auch um die Connection_ID durchzuschalten, denn eine ID die mal hängt kann somit nicht alle anderen Geräte behindern und gleichzeitig ist hierdurch immer exakt nachvollziehbar welches Gerät Probleme machte.
Das würde ich aber erst angehen wenn der erste läuft :grin:.

Ja darauf komme ich zurück wenn ich das Erste zum laufen bekommen habe.. :=)


Vielen Dank nochmal, Gruß
 
So ich habe da jetzt mal getestet. Leider funktioniert das bei mir nicht. Auch nicht wenn ich ein Sentron direkt mit der SPS verbinde.

Die Sentrons sind eigentlich von jedem Zugang unserer Firma mit Power Config zu erreichen. Ich muss bei den PC's die IP auch nicht statisch machen und an die IP's der Sentrons anpassen. Physikalisch sind die dann doch eigentlich alle in einem Netz.


1.JPG2.JPG3.JPG




Sieht jemand ob ich in der Konfiguration einen Fehler habe?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Am Status sehe ich 8188 als Fehler?
Das müsste der falsche Mode sein der bemängelt wird.
Ich hatte Dir 103 genannt, der sollte funktionieren.
Alternativ könntest Du den Mode auf 0 und MB_DATA_ADDR auf 40.001 stellen, dann die CPU aber neu starten damit die VErbindung sicher gekappt ist.

Du nutzt PowerConfig? Hast Du was anderes eingestellt am PAC ausser die IP?
Welches PAC genau hast Du?
 
SCL_p3200.jpgtcon_ip_v4_p3200.jpgLesedaten_P4200.jpg

Das Programm aus der letzten Anlage, jedoch eine 1500er, wobei das keinen Unterschied macht da ich den gleichen Baustein und Aufbau auch in den aktuellen 1200ern einsetze.
An den PAC stelle ich lediglich die IP sowie Umsetzung ein sowie das Passwort.
3200 oder 4200 kann ich beides gleichermaßen mit diesem Baustein erschlagen, in dieser Anlage ist ein 3200 eingebaut worden.

Warum ich bei ConnectionType auf 17 bin weiß ich gerade nicht, da 17 eigentlich nicht zulässig sein sollte. In einem anderen Proekt ist noch die 11 eingetragen.
 

Anhänge

  • SCL_p3200.jpg
    SCL_p3200.jpg
    96,4 KB · Aufrufe: 33
Am Status sehe ich 8188 als Fehler?
Ich hatte einen Fehler bei der Parametrierung an "MB_DATA_PTR" gemacht.
Jetzt ist der Ausgang "ERROR" nicht mehr dauerhaft "true", sonder er verbindet sich, dann "True" und Status zeigt "16#80A3". Dann geht der Fehler wieder "false" und der Status zeigt 7000..

Du nutzt PowerConfig? Hast Du was anderes eingestellt am PAC ausser die IP?
Na am Pac ist die IP: 10.81.73.XX, Sub: 255.255.255.0 & Gateway: 10.81.73.1 eingestellt. Ich nutze die 3200'er und 4200'er...

Ich habe die Komplette Liste der Verfügbaren Liste in den DB als Struct eingetragen. die geht ja bis zum Offset 837. Komme ich da mit der Datenlänge 101 hin? Eigentlich würde mir auch nur der Wert (Offset 801 Wirkarbeit Bezug Tarif 1) reichen.

Gruß
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, 7000 heisst nix anderes als das nix aktiv ist.
80a3 müsste ein TCON-Fehler sein der bedeutet das die Verbindungs-ID bereits genutzt wird.

Am Status sieht man NUR dann den Status des MB_Client wenn die Verbindung aktiv ist bzw. durchlaufen ist. Ansonsten treten dort auch Status vom TCON, TDISCON, TSEND, TRCV, T_DIAG, TRESET auf, da diese vom MB_Client genutzt werden.

In diesem Fall aber 80A3 vom TCON.
Stell die Connection ID auf was anderes als 1. Geh einfach hoch oder schau nach welche IDs frei sind. Hatte ja geschrieben ich hab da ne hohe Nummer dran stehen.
 
Ich habe die Komplette Liste der Verfügbaren Liste in den DB als Struct eingetragen. die geht ja bis zum Offset 837. Komme ich da mit der Datenlänge 101 hin? Eigentlich würde mir auch nur der Wert (Offset 801 Wirkarbeit Bezug Tarif 1) reichen.

Gruß

Nein.
Die UDT muss exakt gleich lang sein, sonst kommt ein anderer Fehler, hat aber mit 80a3 nix zu tun.

Wenn Du nur einen einzigen Wert brauchst hätte auch eine LEN von 1 und nur eine Real-Variable gereicht ^^.
Dann wäre
Mode=103
Data_Addr=801
Data_Len=1
einzutragen.

edit:
Ach ja - wichtig ist das die Verbindung sauber getrennt ist bevor erneut geladen wird mit Änderungen am Mode etc. Sonst hängt sich die Verbindung evtl. auf was am einfachsten mit einem Neustart der CPU zu lösen ist.
 
Zuletzt bearbeitet:
Schau mal genau auf den Status - nicht das der switcht, das könnte auch vorkommen. Z.B. das er die Datenlängen anprangert und sich verschluckt oder hast des schon angepasst? Sonst stoss REQ doch mal nur per Flanke an, dann führt er es auch aus, sollte den Status dann aber nicht so schnell aktualisieren und somit leichter einsehbar zu sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sonst stoss REQ doch mal nur per Flanke an, dann führt er es auch aus, sollte den Status dann aber nicht so schnell aktualisieren und somit leichter einsehbar zu sein.

Ja jetzt switcht er zwischen 7000 und 16#80A3 hin und her. Die ID habe ich jetzt mehrmals geändert, aber das Resultat bleibt das Gleiche..
 
Hattest Du die Datenlängen angepasst? Also len=101 und udt=101 einträge?
Sonst schieb len auf 1 und stell einfach nur ein word oder real dran damit das erstmal nicht stört, brauchst ja später eh nur.

Manchmal hat der Baustein seltsame Verhaltensweisen die sich nicht so ganz erschliessen lassen und meggert was anderes an, überschreibt seinen eigenen Status etc.
 
Hattest Du die Datenlängen angepasst? Also len=101 und udt=101 einträge?
Also ich habe 132 Einträge im UDT und nun auch 132 an LEN geschrieben.

Sonst schieb len auf 1 und stell einfach nur ein word oder real dran damit das erstmal nicht stört, brauchst ja später eh nur.
Auch das ändert nichts

Ich habe jetzt ein Sentron direkt mit der CPU verbunden. REQ schiebe ich nur über einen Impuls an. Nach dem CPU- Start Ist der Status 7000 --> 7001 --> 7002 und da bleibt er dann.

Das Sentron hat jetzt die IP 10.81.73.11 Sub: 255.255.255.0 und kein Gateway.
Die CPU hat 10.81.73.100 Sub: 255.255.255.0 kein Gateway

Gruß
 
Zurück
Oben