TIA S7-1500 Modbus TCP Verbindung mit Fremdgerät

MaNuE

Level-2
Beiträge
23
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich versuche aktuell, eine Verbindung zwischen einer Spannungsquelle einer Fremdfirma und einer Siemens CPU 1512SP-1 PN mit TIA Version 15.1 über Modbus TCP herzustellen.
Die Spannungsquelle ist mit einem Ethernet Anschluss versehen. SPS (192.168.3.156) und Quelle (192.168.3.35) sind über einen Switch verbunden und die IP-Adressen befinden sich im selben Netzwerk. Ich erreiche beide per Ping.
Vom Hersteller habe ich eine Testsoftware erhalten, mit der ich die Verbindung testen konnte. Dabei habe ich mithilfe von Wireshark die Kommunikation aufgezeichnet. Es handelt sich sicher um eine Kommunikation per TCP. Mit dem bisherigen Wissen (Ethernet Schnittstelle und TCP als Kommunikationsprotokoll) sollte eigentlich nichts mehr gegen eine Kommunikation per Modbus TCP sprechen, oder sehe ich das falsch?

In der SPS habe ich einen MB_CLIENT Baustein angelegt, weil die SPS einen Befehl an die Quelle schicken soll. Diese sendet im Normalfall immer direkt eine Antwort zurück. Ich sende von der SPS die Nachricht "F1\n" als Hexcode (46, 31, 0a), damit wird die Quelle eingeschaltet. Als Antwort sollte eigentlich "E0\n" (kein Fehler) zurückkommen.
Hier liegt aktuell wahrscheinlich auch mein Problem, denn der Ausgang DONE vom MB_CLIENT wechselt nie auf True. Beim Status werden mir abwechselnd die folgenden drei Codes angezeigt:
16#7005: Daten werden gesendet
16#7006: Daten werden empfangen
16#80C3: Error Code von TCON: Alle Verbindungsressourcen sind belegt.

Die Meldungen machen irgendwo auch Sinn, weil die Quelle immer sofort eine Antwort sendet. Allerdings verstehe ich nicht, wie ich die Kommunikation anders aufsetzen muss, dass das Senden und Empfangen sauber nacheinander abgearbeitet wird und der Baustein nicht in einen Error wechselt. Bzw verstehe ich das Problem an der Stelle überhaupt richtig?
Hat jemand dazu Erfahrungen und kann mir weiterhelfen? Vielen Dank schon mal!

Hier sind noch mein Bausteinaufruf und die Parameter, die ich dabei verwende:

1692000736549.png
1692000998289.png

1692001050741.png
 
Hallo Zusammen,

ich versuche aktuell, eine Verbindung zwischen einer Spannungsquelle einer Fremdfirma und einer Siemens CPU 1512SP-1 PN mit TIA Version 15.1 über Modbus TCP herzustellen.
Die Spannungsquelle ist mit einem Ethernet Anschluss versehen. SPS (192.168.3.156) und Quelle (192.168.3.35) sind über einen Switch verbunden und die IP-Adressen befinden sich im selben Netzwerk. Ich erreiche beide per Ping.
Vom Hersteller habe ich eine Testsoftware erhalten, mit der ich die Verbindung testen konnte. Dabei habe ich mithilfe von Wireshark die Kommunikation aufgezeichnet. Es handelt sich sicher um eine Kommunikation per TCP. Mit dem bisherigen Wissen (Ethernet Schnittstelle und TCP als Kommunikationsprotokoll) sollte eigentlich nichts mehr gegen eine Kommunikation per Modbus TCP sprechen, oder sehe ich das falsch?

In der SPS habe ich einen MB_CLIENT Baustein angelegt, weil die SPS einen Befehl an die Quelle schicken soll. Diese sendet im Normalfall immer direkt eine Antwort zurück. Ich sende von der SPS die Nachricht "F1\n" als Hexcode (46, 31, 0a), damit wird die Quelle eingeschaltet. Als Antwort sollte eigentlich "E0\n" (kein Fehler) zurückkommen.
Hier liegt aktuell wahrscheinlich auch mein Problem, denn der Ausgang DONE vom MB_CLIENT wechselt nie auf True. Beim Status werden mir abwechselnd die folgenden drei Codes angezeigt:
16#7005: Daten werden gesendet
16#7006: Daten werden empfangen
16#80C3: Error Code von TCON: Alle Verbindungsressourcen sind belegt.

Die Meldungen machen irgendwo auch Sinn, weil die Quelle immer sofort eine Antwort sendet. Allerdings verstehe ich nicht, wie ich die Kommunikation anders aufsetzen muss, dass das Senden und Empfangen sauber nacheinander abgearbeitet wird und der Baustein nicht in einen Error wechselt. Bzw verstehe ich das Problem an der Stelle überhaupt richtig?
Hat jemand dazu Erfahrungen und kann mir weiterhelfen? Vielen Dank schon mal!

Hier sind noch mein Bausteinaufruf und die Parameter, die ich dabei verwende:

Anhang anzeigen 70786
Anhang anzeigen 70787

Anhang anzeigen 70789
Kann es sein, dass Du da etwas durcheinander bringst? Eine Kommunikation via TCP bedeutet nicht zwangsläufig, dass dabei Modbus zum Einsatz kommt. Bei Modbus schreibst Du Daten (z.B. Word oder Bool) in bestimmte Register und liest Daten aus Registern aus, Das dabei Strings verschickt werden ist eher ungewöhnlich.
Ich vermute, dass Dein Netzteil direkt per Netzwerk angesteuert werden muss ohne Modbus. Was für ein Netzteil ist es denn genau?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Du schickst eine ASCII Code an einen Modbus-Server. Das funktioniert lt Beschreibung ?

Wenn das ein ModbusServer ist erwartet er Anfragen mit Registernummern. Die beantwortet er dann mit den entsprechenden Werten im hinterlegten Format (int oder Float). Anfragen über ganze Registerbereiche muß der Server auch unterstützen.
 
Es kann gut sein, dass ich hier etwas durcheinander bringe, da ich noch nicht so viel Erfahrung mit der SPS-Kommunikation habe. Mit Modbus selbst habe ich zb auch noch nie gearbeitet, sondern bisher nur mit Profinet. 😅
Die Quelle ist von FuG bzw. mittlerweile von der Firma XP Power.
Laut der Doku gibt es hierbei aber auch "Register im RAM, die beim Einschalten des Gerätes auf definierte Weise gesetzt werden und im Betrieb beliebig programmiert werden können."
Möchte ich zum Beispiel den Spannungssollwert setzen, startet der String mit dem Register >S0, so zumindest laut der Doku. Der Befehl F1\n aus meiner Ausgangsnachricht bildet dabei eine Ausnahme, dabei ist kein Register vorne angestellt.
Aber das ist glaube ich trotzdem etwas anderes als was ihr mit den Registern meint. Auch in der Testsoftware des Herstellers sende ich nur Strings.

Ich vermute, dass Dein Netzteil direkt per Netzwerk angesteuert werden muss ohne Modbus. Was für ein Netzteil ist es denn genau?
Wie würdest Du denn die direkte Ansteuerung versuchen? Das ist mir gerade nicht ganz klar.
 
ich versuche aktuell, eine Verbindung zwischen einer Spannungsquelle einer Fremdfirma und einer Siemens CPU 1512SP-1 PN mit TIA Version 15.1 über Modbus TCP herzustellen.
Wie heißt denn das Gerät (Hersteller, Typ)? Hast Du einen Link zum Handbuch des Gerätes mit Erklärung des Kommunikations-Protokolls?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Du schickst eine ASCII Code an einen Modbus-Server. Das funktioniert lt Beschreibung ?

Wenn das ein ModbusServer ist erwartet er Anfragen mit Registernummern. Die beantwortet er dann mit den entsprechenden Werten im hinterlegten Format (int oder Float). Anfragen über ganze Registerbereiche muß der Server auch unterstützen.
Die Registernummer ist eigentlich im ASCII Code enthalten, so hatte ich das bisher verstanden.

Wie heißt denn das Gerät (Hersteller, Typ)? Hast Du einen Link zum Handbuch des Gerätes mit Erklärung des Kommunikations-Protokolls?
Der Hersteller ist FuG, es handelt sich um eine Hochspannungsquelle vom Typ HCK, allerdings ist die Quelle mit einigen Modifikationen versehen, die so nicht auf der Internetseite aufgeführt sind. Die beeinflussen allerdings die Kommunikation nicht.
Das Handbuch habe ich als PDF, ich hänge es hier direkt mal an. (S. 12-13)
Etwas ausführlichere Infos findet man ansonsten noch hier: https://smt.at/wp-content/uploads/smt-datenblatt-fug-probusv-deutsch.pdf (S.8)
 

Anhänge

  • Probus_V_ADDAT30_31_V3.1_E.pdf
    984,6 KB · Aufrufe: 11
Hallo

da steht nix von ModbusTCP. Das wird mit ASCII Code gesteuert.

Du brauchst dafür eine TCP Verbindung auf den Port 2101. Damit dann die Codes schicken.

Mit dem Baustein TCP Recieve werden die Daten empfangen und in DB abgelegt.
 
Hallo

da steht nix von ModbusTCP. Das wird mit ASCII Code gesteuert.

Du brauchst dafür eine TCP Verbindung auf den Port 2101. Damit dann die Codes schicken.

Mit dem Baustein TCP Recieve werden die Daten empfangen und in DB abgelegt.
Vielen Dank!
Tatsächlich war das auch mein erster Versuch (ich sitze an dieser Kommunikation schon etwas länger).

1692005807211.png
1692005861491.png

Auch hier kam regelmäßig die Fehlermeldung 16#80C3, aber ich konnte schon Daten empfangen. Allerdings nichts, was in der Doku als Antwort-Strings aufgeführt wäre, sondern eine Nachricht, die mit "ÿûÿû" startet und dann die Mac-Adresse, die Softwareversion und weitere Informationen mit sendet. Fällt euch vielleicht noch ein Fehler auf?

Weil ich mir dieses Verhalten nicht erklären konnte, wollte ich etwas anderes ausprobieren und dachte bisher eben, dass Modbus TCP eine Lösung sein könnte. Wie ich jetzt hier gelernt habe, ist das allerdings nicht der Fall.
 
Adressdetails: "Lokaler Port" läßt man üblicherweise leer, wenn der Partner da nicht zwingend einen Port vorgibt. Dann kann der aktive Client irgendeine Portnummer aus seinem Pool verwenden, und man muß die verwendeten Ports nicht manuell verwalten.
 
Am besten mit Wireshark prüfen.
Das ist mein nächstes Ziel. Allerdings muss ich dafür einen freien Port am Scalance Switch für Mirroring freigeben, damit Wireshark etwas von der Kommunikation mitbekommen kann.
Die Option ist nur leider ausgegraut. Kennt sich hier vielleicht jemand auch noch damit aus oder gibt es einen anderen Weg, dass Wireshark die Kommunikation sehen kann?

1692022376379.png

So oder so schon mal vielen Dank, die Nachrichten bisher haben vor allem meinem Verständnis für Modbus TCP und ASCII x TCP sehr weitergeholfen.
 
Netzwerk TAP oder ein weiteres Switch wo du den Mirror Port einstellen kannst dazwischen schalten.

Mit dem USB Netzwerkadapter an den anderen Port der PLC wird nicht funktionieren, weil die Telegramme nicht wie bei einem HUB an allen Ports rausgesendet werden, sondern nur da wo die Ziel Adresse erreicht wird.

Mit zwei Netzwerk karten, könnte man die Kommunikation auch über den PC (mit Wireshark) laufen lassen. Dafür muss aber einiges im System konfiguriert werden.
 
Hallo zusammen,
tatsächlich bin ich heute ein ganzes Stück weitergekommen. Ich konnte heute einen Mirror Port beim Switch freischalten. Das ging gestern nicht, weil ich nur Zugangsdaten mit Leserechten gehabt habe. Heute morgen hat mir ein Kollege die Zugangsdaten mit Lese- und Schreibrechten gegeben, somit konnte ich das Mirroring freischalten.
Das ist mein nächstes Ziel. Allerdings muss ich dafür einen freien Port am Scalance Switch für Mirroring freigeben, damit Wireshark etwas von der Kommunikation mitbekommen kann.
Die Option ist nur leider ausgegraut. Kennt sich hier vielleicht jemand auch noch damit aus oder gibt es einen anderen Weg, dass Wireshark die Kommunikation sehen kann?

Anhang anzeigen 70828

So oder so schon mal vielen Dank, die Nachrichten bisher haben vor allem meinem Verständnis für Modbus TCP und ASCII x TCP sehr weitergeholfen.


Die Analyse mit Wireshark hat mich auch direkt ein ganzes Stück weitergebracht. Dank euren Erklärungen hatte ich gestern bereits die Modbus TCP Lösung wieder verworfen und bin zu meinem ursprünglichen Ansatz zurück, bei dem ich ASCII-Nachrichten über den TSEND Baustein versendet habe. Und siehe da - Wireshark zeichnet eine perfekt funktionierende Kommunikation auf! 🥳
Warum der TRCV-Baustein entweder überhaupt keine Antworten anzeigt oder nur die Nachricht, die mit "ÿûÿû" startet, kann ich mir allerdings nicht erklären. Entweder habe ich dort die Eingänge falsch verschaltet oder aber die Verbindung ist noch durch TSEND belegt sodass TRCV nichts empfangen kann. Oder hat hier noch jemand eine andere Theorie?
Auch hier kam regelmäßig die Fehlermeldung 16#80C3, aber ich konnte schon Daten empfangen. Allerdings nichts, was in der Doku als Antwort-Strings aufgeführt wäre, sondern eine Nachricht, die mit "ÿûÿû" startet und dann die Mac-Adresse, die Softwareversion und weitere Informationen mit sendet. Fällt euch vielleicht noch ein Fehler auf?
 
Warum der TRCV-Baustein entweder überhaupt keine Antworten anzeigt oder nur die Nachricht, die mit "ÿûÿû" startet, kann ich mir allerdings nicht erklären.
Kann es sein, daß Du S7-Strings versendest inklusive den 2 String-Header-Bytes? Die wird der Empfänger wohl nicht verstehen. Sende mal nur den eigentlichen Message-Text als Char-Array oder Byte-Array.
Schau Dir den Aufbau des Datentyps STRING an mit seinen 2 Header-Bytes.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann es sein, daß Du S7-Strings versendest inklusive den 2 String-Header-Bytes? Die wird der Empfänger wohl nicht verstehen. Sende mal nur den eigentlichen Message-Text als Char-Array oder Byte-Array.
Schau Dir den Aufbau des Datentyps STRING an mit seinen 2 Header-Bytes.

Harald
Ich sende mittlerweile schon alles als Byte-Arrays, da sind also keine Header-Bytes mehr enthalten.
Die Ansteuerung funktioniert jetzt auch, aber der TRCV bekommt die Antworten nur sporadisch mit.
 
TRCV wird immer aufgerufen? Eventuell ist es auch eine gute Idee, mit einer State machine oder Schrittkette auf Antworten entsprechend dem Protokoll zu warten.
 
Ja, aktuell wird TRCV immer aufgerufen. Das mit der Schrittkette ist eine gute Idee, die werde ich ausprobieren. Danke für den Vorschlag!
 
Zurück
Oben