TIA Modbus TCP S7-1500 <-> Fremdanlage

litlegerman

Level-2
Beiträge
336
Reaktionspunkte
13
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich habe eine Anlage mit einer Et200sp (Server) CPU, an diese soll via Modbus TCP 4 weitere Anlagen (Clients) angebunden werden.
Ich versuche mich grade an dem ModbusTCP_S71500_V15-1 von Siemens, um Erfahrungen mit dem Kommunikationsweg zu sammeln.
Die Kommunikation zwischen eine S7-1200 und der E200sp CPU via Modbus TCP scheint soweit zu funktionieren...
aber mir ist folgendes aufgefallen, die Kommunikation scheint nur jeweils in eine Richtung zu funktionieren?!
ich kann zwar Daten zwischen den beiden Steuerungen austauschen, auch in beide Richtungen, aber wie kann ich eine Read/Write Verbindung aufbauen?
Also ich habe bestimmte Steuerbefehle die von der Anlage (Et200sp CPU) zu den 4 weiteren Anlagen geschrieben werden soll, aber auch wiederum zurück gelesen werden soll.
Wie könnte man das am einfachsten realisieren? Ich steh hier ein bisschen auf dem Schlauch!

Software: TIA V15.1

Danke schon mal
 
Ein Modbus Server kann nicht von sich aus an die Clients senden. Er muß warten, bis die Clients ihn abfragen.
In Deinem Fall müssten die Clients aktiv werden und die Steuerdaten pollen/abholen. Oder Du änderst das Konzept so, daß Deine Anlage Modbus Client ist und die 4 anderen Anlagen sind Modbus Server, dann kann Deine Anlage aktiv Daten zu/von den anderen Teilnehmern senden/lesen.

Harald
 
Guten Morgen,
Inzwischen konnte ich die Anlage mit der SPS, in einem Versuchsaufbau, verbinden.
Leider bekomme ich bei meinen MB_Server (FB1085) immer nur den Status = 7002 (Zwischenaufruf. Verbindung wird aufgebaut).
Aber es werden keine Daten empfangen!?
Ich vermute es liegt an den Einstellungen des Connect Parameters!
ich habe auf jeden fall die richtige IP-Adresse angegben, ist denn noch irgendwas anderes nötig um die Verbindung aufzubauen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Laufen die Clients schon und wollen Modbus-Daten lesen/schreiben? Der Server ist passiv und tut nichts von sich aus, er wartet auf den Verbindungsaufbau und die Requests der Clients.

Ich vermute es liegt an den Einstellungen des Connect Parameters!
ich habe auf jeden fall die richtige IP-Adresse angegben, ist denn noch irgendwas anderes nötig um die Verbindung aufzubauen?
Wenn Du das vermutest, warum zeigst Du uns nicht gleich was Du eingestellt hast? So brauchen wir wieder weitere Posts um abzuklären daß/ob Deine Einstellungen richtig sind...

Harald
 
Danke für die schnelle Antwort.

Die ist ein Auszug aus der Bedienungsanleitung des Gerätes das ich versuche anzubinden:

4.5.2.2.2 Einstellungen am Modbus-TCP-Master

[FONT=Arial,Arial][FONT=Arial,Arial]Werden Daten aus mehreren Segmenten (siehe Feldbusdaten) benutzt, so ist für jedes Segment mindes-tens ein Telegramm nötig. Ausnahme: Siehe Variablenlisten im Kapitel 'Nutzdaten'.
Einstellen der korrekten Bytereihenfolge bei Werten im IEEE- und LONG-Format.
Die maximal zulässige Telegrammlänge beträgt 256 Bytes, inklusive der Kopf- und Trailerbytes.
Von dem im OPEN MODBUS-Standard definierten 6-Byte-Telegrammheader wird beim DISOCONT Tersus lediglich das sechste Byte zur Übertragung der Datenlänge genutzt. Alle übrigen Bytes werden 1:1 in der Antwort zurückgesandt. Um spätere Erweiterungen zu ermöglichen, sollte die Protokoll-ID nicht benutzt wer-den; sie ist auf NULL zu setzen!
[/FONT]
[/FONT]
[FONT=Arial,Arial][FONT=Arial,Arial]
[/FONT]
[/FONT]​
4.5.2.3 Redundanter MODBUS-TCP

[FONT=Arial,Arial][FONT=Arial,Arial]Die Steuerung unterstützt die redundante Ausführung von Feldbusverkabelung und Leitsystem. Neben dem Standard-Port 502 kann für die redundante Verbindung der Port 503 genutzt werden. Alle Prozess-Signale sind über beide Ports verfügbar. Das jeweils letzte Steuerkommando bestimmt das Verhalten des Systems. Damit übernimmt der zweite Kanal nahtlos die Aufgaben eines eventuell gestörten ersten Kanals.

Und dies ist ein Screenshot von meiner Connect Struktur:
2020-03-24 09_39_05-Window.jpg

[/FONT]
[/FONT]
 
Wenn du dich mit deiner SPS zu dem Gerät verbinden möchtest, dann muss bei RemotePort die 502 eingestellt werden. LocalPort sollte vom Betriebssystem vergeben werden wenn nichts anderes notwendig sein sollte, also am besten dort 0 eintragen.

Ergänzung:
ActiveEstablished sollte dann auch auf true gesetzt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du dich mit deiner SPS zu dem Gerät verbinden möchtest, dann muss bei RemotePort die 502 eingestellt werden. LocalPort sollte vom Betriebssystem vergeben werden wenn nichts anderes notwendig sein sollte, also am besten dort 0 eintragen.

Ergänzung:
ActiveEstablished sollte dann auch auf true gesetzt werden.

Das probiere ich nachher mal aus

Danke schon mal
 
Noch einmal klarstellen: Deine SPS kann sich mit dem anderen Gerät nur dann verbinden, wenn Deine SPS Modbus-Client ist und das andere Gerät ist Modbus-Server.
Wenn Du auf Deiner SPS nur den FB MB_Server aufrufst, dann wirst Du keine Verbindung zu anderen Geräten aufbauen können, sondern mußt warten, bis diese das tun.

Oder wenn Du lieber die eigentlich falschen Bezeichnungen verwenden willst:
Client = Master
Server = Slave

Harald
 
Ok...
Als Clinet funktioniert zumindest die Verbindung.
Sobald ich den Request freigebe bekommen ich direkt Status: 8383
2020-03-25 10_43_24-Informationssystem.jpg
Die Length habe ich schon mehrfach mit anderen Werten probiert, ohne Erfolg!

Ich habe mal die Anleitung des Teilnehmers angehängt!
kann mir irgendwer hier helfen?
 

Anhänge

Gerne,
Hier versuche ich den Aufruf aus der Version zu lesen.
Bedienungsanleitung Seite 64:
BA_Aufruf.jpg
Dies ist der DB mit dem Connect-Parametern:
SiEx_06_01 DB7010.png
Dies hier sind ist die Abarbeitung des MB_CLIENTS:
SiEx_06_01 FB7031.jpg
Im ersten Netzwerks dieses FBs wird noch
"St_connectParamServer_Dos2" in "#tmp_St_connectParamClient" geschoben
der movebefehl in NW19 dient dazu, nur die ID zu beeinflussen.

Danke schon mal!
 
Hey,

MB_DATA_PTR=AR_hold=Array[0..10] of word = 11 Wörter

Hast Du entweder Len mal auf 11 gestellt oder aber AR_Hold auf array[0..3] of word?
Eigentlich soll der Zielbereich so groß wie der Quelbereich sein. Bei LEN=4 also 4 Wörter.

Du willst 02e0 einlesen. Das ist die HEX-Adresse. Diese ist Dezimal 00736 laut Handbuch. Das wäre also die beginnende Adresse die in MB_DATA_ADDR eingetragen werden sollte.

Ich würde also folgende Werte versuchen:
MB_DATA_PTR=AR_HOLD=Array[0..3] of word
MB_DATA_LEN=4
MB_DATA_ADDR=16#02e0 oder 736

Die Adressen sollten nach meinem Handbuchverständnis so aufgebaut sein:
736: SW-Version low Word 1
738: SW-Version low Word 2
740: SW-Version low Word 3
742: SW-Version low Word 4
744: SW-Version high Word 1
746: SW-Version high Word 2
748: SW-Version high Word 3
750: SW-Version high Word 4


Zumindest würde ich das so erstmal versuchen und schauen welche Werte ankommen. Es kann sein das es nur das erste Wort gibt und die 2 bis 4 leer sind. Habe "auf die Schnelle" nun nicht alle Informationen gefunden die ich gesucht habe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah Ok,
Dann hab ich das ganze falsch verstanden, ich dachte die Adresse 736 (Hex 02e0) wäre die ID!
Also ist die ID Quasi Fix und die 736 dient Quasi als OFFSET.
Das ist ein guter Ansatz… das werde ich direkt mal ausprobieren!

Vielen Dank
 
Ja, die ID ist fix und darf nicht verändert werden zwischen Aufbau und Abbau. Die ID die angeschrieben wird dient der SPS als Information wie diese Verbindung heißt, nur eben als Nummer.
Verarbeitet man verschiedene MB_Clients gleichzeitig dann muss für jeden eine eigene ID genutzt werden.

Bei der ID fängt man in der Regel bei 1 an und zählt eben hoch.
 
Ich hab zu diesem Thema auch noch eine Frage. Wir wollen wie in diesem Bsp. Modbus TCP zwischen einer CPU1500 und einem Fremdgerät herstellen. Ich nutze den MB_Client und kann dort ja durch den Parameter MB_Mode sagen ob Daten gelesen (1) oder geschrieben (0) werden sollen. Nun meine eigentliche Frage. Bekomme ich irgendwo raus, wieviele Daten ich im Modus 1 (Daten empfangen) bekommen habe? Weil der Parameter MB_DATA_LEN ist ja ein IN und gibt ja nur die Länge fürs senden weiter. Ich brauch aber die Anzahl empfangener Daten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zumindest nicht ohne eigene Prüfung meines Wissens nach.

Lediglich wenn die Kommunikation funktioniert hat wird Error 0 und Done True werden. Die Anzahl der empfangenen Daten wird ja vorher festgelegt, also hat man auch so viele Daten empfangen wie eingestellt wurden. Ansonsten würde ein Fehler angezeigt werden, glaube 8382 falls das Erwartete nicht dem Erhaltenen entspricht.

Als Lösung, da ich nicht weiß ob es anders geht:
Wenn Du die Abfrage in eine Array-Struktur schiebst, dann könnte man filtern. z.B. müssen alle Daten immer ungleich 0 sein, dann sucht man nach der ersten 0 im Array via Schleife und hat dann den Punkt wie viele Bits empfangen wurden. Der Rest ist Umrechnungssache.
 
Wo wird die Anzahl der zu empfangenen Daten vorher festgelegt?
Über Schleife und selber zählen könnte ev. gehen, oder gibt es eventuell eine Telegrammendekennung? Ich hab derzeit noch keine Hardware, um das am "lebenden" Objekt zu testen.
 
Zurück
Oben