TIA S7-1212C: Fragen Modbus/TCP-Kommunikation mittels MB_Client

Xaar

Level-1
Beiträge
70
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
S7-1212C: Fragen zu Modbus/TCP-Kommunikation mittels MB_Client

Guten Tag

Zunächst eine Vorabinformation:
Ich bin noch ein rechter Neuling, was die S7-1200-Serie angeht. In meiner Ausbildung (ist über 8 Jahre her) hatte ich mit dem Step 7 V5.1 und einer S7-300 zu tun. Nach der Ausbildung hatte ich dann auf Arbeit mit Step 7 V5.4 und diversen S7-400 zu tun - allerdings nur zur Störungssuche im Programm, nicht zur Programmierung. Mit der S7-1200 habe ich mich kurz schon befasst, aber mehr als ein paar Ein- und Ausgänge einzulesen bzw. zu setzen ist da auch noch nicht passiert. Was Modbus/TCP angeht, habe ich bisher noch gar keine Erfahrung.

Zur eingesetzten Technik:

  • Siemens S7-1212C
  • Siemens KTP400 Basic PN
  • Siemens TIA-Portal V13 (Step 7 Basic V13, WinCC Basic V13)
  • Emerson Smart Wireless Gateway 1420 (Gateway für WirelessHART)

Zu den Umständen:
Hier ist ein WirelessHART-Gateway der Firma Emerson Process Management, was einige Jahre lang im Einsatz war und nun schon eine Weile ungenutzt in der Ecke steht. Da ich mich im Rahmen meiner Abschlussarbeit u. A. mit WirelessHART befassen will, möchte ich mich dahingehend mal etwas einarbeiten. Außerdem ist es eine willkommene Gelegenheit, sich mit dem TIA-Portal auseinander zu setzen.

Was möchte ich nun tun?
Am WirelessHART-Gateway sind einige Sensoren eingerichtet und eingeloggt, deren Prozesswerte auf Modbus-Register gelegt werden können (ist frei konfigurierbar). Diese Register will ich per Modbus/TCP auslesen und auf dem KTP400 darstellen.

Was funktioniert bereits?
An sich klappt die Kommunikation. Mit dem Baustein "MB_Client" kann ich die Register auslesen und lege die Werte auf einen Merkerbereich ab. Ein Beispielnetzwerk habe ich angehangen. Der FC besteht aus mehreren solchen Abfragen, jeweils für ein anderes Register. Die Connect_ID ist im ganzen FC für alle Aufrufe von MB_Client gleich. Die Ablage in einem Datenbaustein habe ich nach vielen Anläufen auch hinbekommen, allerdings bereitet das unten genannte Problem 1 Sorgen.

Welches Problem habe ich?
Nun, eigentlich habe ich zwei Probleme.

Problem 1:
Lese ich mit der S7 Doppelworte (d. h. zwei Modbus-Register) aus, so werden die Daten "verkehrt herum" abgelegt, d. h. im Doppelwort sind die ersten 16 mit den zweiten 16 Bit vertauscht. Aktuell tausche ich die Werte über zwei MOVEs, was aber etwas umständlich ist. Für die Datenablage im Datenbaustein ist das auch nicht praktikabel. Als Anweisung habe ich auch bereits SWAP DWord versucht, aber hier werden ja die Bytes neu angeordnet - so dass es am Ende wiederum nicht passt. Gibt es hier eine Möglichkeit seitens der S7-1200, "Low-Wort" und "High-Wort" zu tauschen?
Problem 2:
Da die Aktualisierungsrate von den Sensoren am Gateway relativ gering ist, möchte ich die Modbus/TCP-Abfragen nicht bei jedem CPU-Zyklus durchführen, sondern nur in bestimmten Intervallen (bspw. alle zwei Sekunden). Hierzu hatte ich testweise den Aufruf des FCs, in dem ich die Kommunikation eingebaut habe, in einen Weckalarm-OB (OB30) gepackt. Leider funktioniert das nicht so - ich bekomme nur von einem MB_Client Daten, die anderen melden immer, dass der Instanz-DB für die Connect_ID belegt ist (MB_Client-Status-Parameter 8200). Welche Möglichkeit besteht hier?

Vorab Vielen Dank!

Grüße, Xaar.
 

Anhänge

  • HG1420.png
    HG1420.png
    36 KB · Aufrufe: 148
Zuletzt bearbeitet:
1) Man könnte das Doppelwort um 16 Bit rotieren.
2) Das sollte mit einem ge-time-ten Trigger-Bit an REQ statt dem dauerhaften TRUE machbar sein.

(Aufrufe in verschiedenen OB-Ebenen sind bei dem Baustein vermutlich auch nicht zulässig?)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Xaar,

Problem 1 :

Du könntest ein FC mit der Dreh Logik machen. Sonnst auf Doppelword ebene kenn ich kein andere (FUP)Möglichkeit.

Problem 2:

Da könntest du im OB1 Zyklus jede 2 S ein Impuls machen womit due dann die EN-Schnittstelle der MB-Client beschaltest und das die aufruf aktiv bleibt bis Done gemeldet ist.

Bram
 
Hallo!

Danke an PN/DP für den Tipp mit dem Rotieren. Funktioniert - habs jetzt mit einem ROR DWord um 16 Bit nach Rechts rotiert :)

Danke auch an de vliegende hollander. Ich lasse jetzt im OB30 (wird alle 2 Sekunden aufgerufen) ein Merkerbit setzen, wenn der OB aufgerufen wird. Dieses Bit ist am REQ-Eingang vom MB_Client-Aufruf verschalten und wird am Ende des FCs zurückgesetzt, sobald am Ausgang DONE eine "1" ansteht. Damit funktioniert das Ganze für den einzelnen MB_Client-Aufruf ganz gut. Für mehrere Aufrufe muss ich mir noch etwas überlegen. Vermutlich werde ich dann einfach je nach Aufruf-Anzahl entsprechend viele Bits auf "1" setzen, die dann je nach Aufruf-Ende zurück gesetzt werden. Auf jeden Fall habe ich jetzt statt vielen einzelnen Aufrufen von MB_Client der selben Connect-ID einfach gleich alle 41 Modbus-Register auf einmal ausgelesen. Die "Flut" an Anfragen an das Gateway (nach Beobachtungen über Hundert Anfragen pro Sekunde) ist damit jetzt auch deutlich verringert.

In dem Zuge habe ich eine weitere Frage: Wenn ich alle 41 Modbus-Register mit einem Mal auslese, ist das per Pointer auf einen Speicherbereich (in meinem Fall "P#M1000.0 WORD 656") ja kein Ding. Anschließend hab' ich dann für jedes Register ein Move (für 8- und 16 Bit-Inhalte) bzw. ein ROR DWord (für die 32 Bit-Inhalte), um die Daten in den DB zu schieben. Kann ich das auch in einem Rutsch machen? Im Grunde sind lt. Anleitung zum Gateway (wo ich derzeit Werte auslese, da die Sensorik noch nicht endgültig parametriert ist - folgt aber) die Register von folgender Länge:

RegisterLänge (Bit)
49001-4901116
4901232
4901416
49015-490278
4902816
4902932
490311
49032-490338
49034-4903516
49036-4904032

Besteht da die Möglichkeit, gleich lange Bitfolgen (oder alle 41 Worte zusammen) gesammelt in einen DB zu schieben? Der jetzt von mir angelegte DB hat einfach die Registereinträge direkt hintereinander, jeweils in dem Datentyp, wie die auszulesenden Modbus-Register. Also nicht alle Einträge 16 oder 32 Bit breit, sonder wie in der obigen Liste angegeben. Allerdings muss ich dazu sagen: Im Umgang mit Datenbausteinen habe ich leider keine große Erfahrung :(

Vorab Vielen Dank!

Grüße, Xaar.
 
Zuletzt bearbeitet:
Guten Tag,

Die Probleme mit dem WirelessHART-Gateway sind nun soweit geklärt - die Anlage funktioniert recht gut. Die Frage mit den Datenbausteinen ist zwar noch offen - aber mit meiner Variante ("Umweg" über Merkerbereiche) kann ich leben.

Nun ist ein weiteres Stück Technik für meine Abschlussarbeit hier eingetroffen: Ein paar Module des Modularen Fernwirksystems ("MFW") der Fa. EES (Link: Beschreibung bei EES auf der Web-Site). Hierbei habe ich (wieder) einige Probleme - und hoffe, hier Hilfe zu finden :)

Zur eingesetzten Technik:
  • Siemens S7-1212C
  • Siemens KTP400 Basic PN
  • Siemens TIA-Portal V13 (Step 7 Basic V13, WinCC Basic V13)
  • Emerson Smart Wireless Gateway 1420 (Gateway für WirelessHART)
  • EES MFW-Masterstation 70cm ISM-Band 10 mW mit Modbus/RTU/TCP (MD-F70LP-1PMIP-AKP-A-BX-0)
  • 2 Stk. EES MFW-Unterstation 70cm ISM-Band 10 mW (UL-F70LP-G2N6D-DIA-0-BB-0) mit je einem Erweiterungsmodul 4 analoge Eingänge (EM-G4AE0-0-BX-0)

Zu den Umständen:
Die MFW-Masterstation ist über Ethernet an die S7-1200 angebunden. Über Funk ist jeweils eine Unterstation mit einem Erweiterungsmodul ("Modulnummer 1" und "Modulnummer 2") angebunden. Die Unterstationen übermitteln in regelmäßigen Abständen die Analogwerte der 4 Analogeingänge an die Masterstation, welche die Werte dann per Modbus/TCP oder Modbus/RTU bereitstellt. Die Analogwerte kommen in der Masterstation an - über die Diagnoseschnittstelle (entweder per Telnet oder per RS232) des Mastermoduls kann ich mir die Werte auch anzeigen lassen.

Was möchte ich nun tun?
Ich möchte nun mit der S7-1212C die Analogwerte auslesen und wieder auf dem KTP 400 Basic visualisieren.

Welches Problem habe ich?
Lt. der Beschreibung zum Modbus-Protokoll von EES (siehe pdf-Dokument im Anhang) sind die Analogwerte in den Modbus-Registern 5 bis 8 (4 Analogwerte vom Erweiterungsmodul mit der Modulnummer 1) und 9 bis 12 (4 Analogwerte vom Erweiterungsmodul mit der Modulnummer 2) abgelegt. Nun stehe ich vor einem Problem: Lt. Beschreibung von Siemens zum Baustein MB_Client wird der Modbus-Funktionscode aus der Kombination von "MB_MODE" (in meinem Falle "0") und der Adresse "MB_DATA_ADDR" gebildet. Da lt. Beschreibung von EES die Daten auf den Modbus-Registern 5 bis 12 liegen, ich diese aber wortweise (also Function Code 03 oder 04) auslesen soll, stehe ich jetzt vor dem Problem, dass ich dazu den Baustein MB_Client nicht nutzen kann. Function Code 03 und 04 gehen lt. MB_Client-Beschreibung nur bei den Adressen 40001 bis 49999 bzw. 30001 bis 39999.

Nun habe ich verschiedene Möglichkeiten getestet: MB_MODE ist dabei immer "0" geblieben. Gebe ich bei MB_DATA_ADDR die Adresse 40005 und bei MB_DATA_LEN 8 an (um Function Code 03 zu nutzen), so erhalte ich als Werte immer nur "0" in den einzelnen Registern. Genauso sieht es aus, wenn ich Adresse 30005 (d. h. Function Code 04) nutze. Auch wenn ich das Ganze bitweise auslese mit Adresse 5 (d. h. Function Code 01) und MB_DATA_LEN 128, erhalte ich im Endeffekt nur "0" als Werte.

Als STATUS gibt MB_Client immer wieder 80C8 (Keine Antwort des Servers im definierten Zeitraum) aus. Die IP-Adresse der MFW-Masterstation ist korrekt angegeben, weitere Einstellungen kann ich nicht machen. Der Port ist die 502, wie bei Modbus/TCP Standard. Muss die Modbus-Adresse bei Modbus/TCP auch anders gewählt werden? Das WirelessHART-Gateway (was ja nebenbei auch noch abgefragt wird) hat ja auch die Modbus-Adresse 1, genau wie die MFW-Masterstation. Allerdings haben beide verschiedene IP-Adressen (das Gateway die 10.147.186.220, das MFW-Modul die 10.147.186.221, die SPS selbst hat die 10.147.186.210). Auch wenn ich die Abfragen an das WirelessHART-Gateway einstelle, ändert sich nichts. Einen Fehler sehe ich hier nicht - was könnte da die Ursache sein?

Weiterhin ist noch meine Frage: Besteht nun irgendwie die Möglichkeit, den Function Code 03 oder 04 auch auf die Adresse 5 bis 12 anzuwenden? Oder habe ich einen Denkfehler?

Vorab Vielen Dank!

Grüße, Xaar.
 

Anhänge

  • MFW-SMODBM-BA-DE-003.pdf
    176,1 KB · Aufrufe: 78
  • MFW_MB_Client.png
    MFW_MB_Client.png
    24,2 KB · Aufrufe: 113
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Xaar,
bei Modbus gibt es zwei Adressierungsarten: die vom data link layer (das wird auf der Leitung übertragen und ist die aktuelle Adressierungsart der Modbus-Spezifikation) und die vom application layer (das ist die altmodische, von den Amis bevorzugte und auch bei S7-1200 verwendete).

Application layer --- data link layer
00001 bis 9999 ---- FC 1 offset 0
10001 bis 19999 --- FC 2 offset 0
30001 bis 39999 --- FC 4 offset 0
40001 bis 49999 --- FC 3 offset 0

Wenn das Gateway gar nicht antwortet, verwendest du wohl die falsche UNIT (das ist das was bei serieller Kommunikation die Slaveadresse war). Sie wird bei der S7-1200 im IDB vorgegeben und ist standardmäßig mit 255 vorbelegt.
Wenn du eine falsche Registeradresse verwendest, antwortet der Kommunikationpartner mit Exception 2. Das wirst du kriegen wenn du die UNIT angepasst hast, es muss nämlich 40001 addiert werden, nicht 40000.

Gruß,
Kaulquappe
 
Hallo Kaulquappe,

vielen Dank für die Erklärung! :) Dein Hinweis mit der UNIT-ID war goldrichtig! Als Modbus-Adresse ist in der MFW-Masterstation die "1" eingestellt - und die Kommunikation auf Modbus/TCP. Wenn ich das recht gelesen habe (hier), wird die Modbus-Adresse bei Modbus/TCP wohl meist nur bei Bridges von Modbus/TCP auf Modbus/RTU verwendet. Vermutlich hat diese Masterstation hier eine solche Bridge drinnen - eine Modbus/RTU-Schnittstelle bietet das Gerät ja. Und gleichzeitig nutzen kann man Modbus/TCP und Modbus/RTU auch nicht. Auf jeden Fall habe ich nun die MB_UNIT_ID im Instanz-DB von "16#00FF" (also 255) auf "1" geändert, den DB geladen und die S7 neu gestartet - und schon läufts :)

Allerdings passt das mit dem "es muss 40001 addiert" werden nicht: Ich lese da ja 8 Analogeingänge ein - und wenn ich die mit den Modbus-Adressen 40005 bis 40012 (also 40005 als MB_DATA_ADDR und 8 als MB_DATA_LEN, so wie im Screenshot im Anhang von #5) auslese, sind die auch an der richtigen Stelle. Hab testweise mal an den 2. und den 5. Analogeingang zwei Zweidraht-Sensoren gehangen - die Werte kommen auch entsprechend an diesen Positionen an. Als Vergleich habe ich die Werte, die über die Diagnoseschnittstelle ausgelesen werden können - die sind identisch und an den richtigen Stellen.

Wie dem auch sei: Hab' Vielen Dank für deine Hilfe - du hast mir sehr geholfen :) Ich hatte schon einen Schrecken bekommen, dass vielleicht etwas an der Technik defekt wäre.

Grüße, Xaar.
 
Zuletzt bearbeitet:
Zurück
Oben