# Modbus TIA V16 - S7 1214 mit Stromzähler



## seekrabbe (27 Oktober 2020)

Hallo, ich hoffe mir kann jemand bei folgendem Problem helfen:
Ich muss vorweg schicken, dass ich mit Modbus noch nicht so viel gemacht habe und bisher ging es immer irgendwie (vielleicht auch zufällig)

Eine S7 1214 soll als Modbus client einen Stromzähler auslesen.
Der Zähler hat die Modbus ID1 und liefert 72DW Daten
An meinem client Baustein bekomme ich bei Status die Meldungen 7005 dann 7006 (Daten senden / lesen)
und dann 8383
in den Datenbaustein wird nichts geschrieben.

Weiß jemand was das Problem sein könnte?


Viele Grüße
Matthias


----------



## Blockmove (27 Oktober 2020)

seekrabbe schrieb:


> Hallo, ich hoffe mir kann jemand bei folgendem Problem helfen:
> Ich muss vorweg schicken, dass ich mit Modbus noch nicht so viel gemacht habe und bisher ging es immer irgendwie (vielleicht auch zufÃ¤llig)
> 
> Eine S7 1214 soll als Modbus client einen StromzÃ¤hler auslesen.
> ...



Mit den Angaben die du hier lieferst, gibt es eigentlich nur eine Antwort:
"Du machst was falsch" 

Es wär mal nicht schlecht, wenn du mal schreibst was es für ein Zähler ist.
Ein Screenshot deiner Bausteinparametrierung wäre auch nicht schlecht.

Hast du es schon mal probiert mit einer PC-Software die Daten auszulesen?

Gruß
Blockmove


----------



## seekrabbe (27 Oktober 2020)

Ja, auf die Idee kam ich auch schon... 

Es ist ein 4Quadrantenzähler von Wattline der zunächst über ein Modem mir RS232 ausgelesen wird.
Das Modem stellt dann als Modbus Slave die daten zur verfügung.
Wenn man mit dem Browser auf das Modem geht, sind auch alle daten da - es wird auch angezeigt das
Modbus aktiv ist - nur funktioniert es halt nicht...

Screenshot im Anhang...

Gruß Krabbe


----------



## escride1 (27 Oktober 2020)

Bestellnummer Modem oder ausführliche Anleitung? Immerhin ist das ja scheinbar Dein Kommunikationspartner, von daher ist das Gerät woher das Modem die Daten bekommt egal solange wie Du sehen konntest das das Modem Daten hat.


Laut Screenshot sind Startwerte ungleich Beobachtungswerte bei ID & ConnectionType - Warum?
Warum steht modbusMode auf 103 (lesen) wenn der Status auf 7005 (schreiben) ist? Zu früh ID geändert und dann nicht alles?
Welchen Baustein genau hast Du genommen und wie ist er verschaltet?

Sers

edit: Wenn das Modem Slave ist confused - Warum zeigst Du uns die clientdata und wie schreibt das Modem die Daten in die SPS?

Client: Holt bei Server ab und schickt ihm auch Daten
Server: Wartet bis Client was von ihm will


----------



## PN/DP (27 Oktober 2020)

"Modbus Slave" ist ein wenig falsch ausgedrückt (leider häufig im Modbus Umfeld). Den Slave gibt es nur bei Modbus RTU. Hier bei Modbus TCP sind die Rollen Modbus Server und Modbus Client. Das Modem ist hier Modbus Server und die S7-1200 der Modbus Client.

Harald


----------



## seekrabbe (28 Oktober 2020)

Hi, das Modem heißt energy2scada und kommt von H &IT Berlin. Einen Auszug aus der Anleitung in dem der Modbus beschrieben ist, sende ich in der Anlage.

Startwerte und Beobachtungswerte sind ungleich weil ich rumprobiert habe...
...das frag ich mich auch: der Status wechselt immer zwischen 7005, 7006 und 8383 der screenshot hat grad 7005 erwischt - die dürfte doch aber gar nicht da sein
wenn ich auf 103 stelle oder...?
Ich habe den Modbus "MB_Client" Baustein genommen der im TIA standartmäßig unter - weitere - Modbus tcp - zu finden ist..
Der Baustein ist im OB1 aufgerufen und mit einem DB Parametriert aus dem auch der screenshot stammt.

Das Modem ist Slave - also Server - PN/DP hat den richtigen Hinweis gegeben - hier muss es natürlich nicht Master/Slave sondern Client/Server heißen
sorry für diese Vermischung...
Also, wir reden hier vom Server und die S7 ist client.


----------



## seekrabbe (28 Oktober 2020)

*Anleitung*

In der Anlage nochmal die Anleitung


----------



## escride1 (28 Oktober 2020)

seekrabbe schrieb:


> Hi, das Modem heißt energy2scada und kommt von H &IT Berlin. Einen Auszug aus der Anleitung in dem der Modbus beschrieben ist, sende ich in der Anlage.
> 
> Startwerte und Beobachtungswerte sind ungleich weil ich rumprobiert habe...
> ...das frag ich mich auch: der Status wechselt immer zwischen 7005, 7006 und 8383 der screenshot hat grad 7005 erwischt - die dürfte doch aber gar nicht da sein
> wenn ich auf 103 stelle oder...?



Doch, eben weil gespielt wurde. Wenn Du mitten im Aufruf, ohne REQ entfernt und einen Zyklus später Disconnect setzt und wartest bis er disconnected ist und dann startest, einfach die Ansteuerungswerte änderst, unter anderem die VerbindungsID, dann wird die SPS solange auf dem aktuellen Zustand verharren bis der Timeout kommt, der wiederrum als Sende-/Empfangsfehler dokumentiert werden könnte wenn die ID verschwindet, oder aber abgebrochen wird. Die ID ist dann eben "verwaist", jedoch bekommt der Baustein noch immer die Rückmeldungen und zeigt dann eben "Sendefehler" an obwohl man gerade "liest", solange bis man die ID wieder mit dem MB_Client nutzt und dieser diese ID "Zuende" abarbeiten kann. Schlimmstenfalls ist die Funktion in der SPS (mb_client) einfach nur auf Error und zeigt es nicht an weil die ID nicht mehr aufgerufen werden kann. Könnte man als fehlerhafte Programmierung seitens Siemens sehen oder einfach nur nicht ausgeklügeltes Fehlermanagement von Siemens, wie man mag, Siemens wird dazu jedoch nur sagen: Wurde falsch genutzt, bitte richtig nutzen.
Im seltensten Fall trifft die richtige ID die richtige Anforderung und es baut sich alles von selbst wieder ab, ist jedoch sehr unwahrscheinlich.

In Deiner Beobachtung - das wechseln zwischen 7005, 7006 und 8383 liegt eventuell daran das Du 3 mal REQ gesetzt hast während die ID bereits genutzt wurde oder die ID/Mode geändert hast während REQ aktiv war, die SPS also 3 mal die Funktion MB_CLIENT aktiv geöffnet hat und nun willkürlich die Informationen zurückliefert, da sie diese selbst nicht mehr eindeutig zur ID zuordnen kann. Sie hat sich also aufgehangen: Einzige Lösung - In Stop versetzen und neu starten.
Könnte aber auch daran liegen das Du 3 mal MB_Client im Programm aufrufst, einmal lesend, dann schreibend, und einmal mit falschen Daten, oder aber 2 mal aufgerufen und es wird mitgeteilt: lese, kurz danach dann 8383 erscheint. Wer weiß.

Der Anstoss über REQ geschieht zwar nur in einem Zyklus, die tatsächliche Bearbeitung dahinter jedoch über mehrere Zyklen. Dafür wurde der Ausgang Done geschaffen, der die Fertigmeldung darstellt damit man weiß das der nächste Anstoss geschehen kann. Busy existiert z.B. damit REQ nicht gesetzt wird wenn er noch am arbeiten ist und die Verbindung danach abgebaut werden soll. Abschließen kann die SPS die Anforderung REQ auch nur wenn MB_CLIENT aktiv aufgerufen wird. Wenn ich also REQ setze, er fängt an, dann setze ich EN auf FALSE, so wird die SPS nie mehr mit dem Teilnehmer kommunizieren. Selbst wenn ich EN nun wieder auf TRUE schalte wird die Verbindung nicht mehr genutzt werden können.

Also: Für Lesen und Schreiben optimalerweise immer eine Verschaltung nutzen, sodaß es nicht vorkommen kann das beides gleichzeitig ausgeführt wird, ebenso die ID/Mode nicht verändern.
Um die Verbindung "sauber" zu trennen sollte man die Verschaltung dazu nutzen, um es "unsauber" zu trennen: SPS neu starten.
Heißt: Niemals den DB händisch bearbeiten solange u.a. REQ oder BUSY auf TRUE steht, dann kommen solche merkwürdige Konstellationen(Beobachtungswerte) auch nicht zustande.





> Ich habe den Modbus "MB_Client" Baustein genommen der im TIA standartmäßig unter - weitere - Modbus tcp - zu finden ist..
> Der Baustein ist im OB1 aufgerufen und mit einem DB Parametriert aus dem auch der screenshot stammt.
> 
> Das Modem ist Slave - also Server - PN/DP hat den richtigen Hinweis gegeben - hier muss es natürlich nicht Master/Slave sondern Client/Server heißen
> ...


Ja, ich neige dazu Dinge zu verschlucken die ich für mich als selbstverständlich erachte, Harald schreibt lieber ausführlich. Er ist schon länger hier im Forum dabei und hat einiges gelernt wie man es besser ausschreiben sollte, bzw. wann.  Daran muss ich mich gewöhnen, unsere Azubis finden das auch nicht immer lustig .

Der Baustein MB_Client ist schon richtig.
Du willst 72DW lesen.
Was ich sicher sehe ist, das Du eine Länge von 72 Halteregistern beginnend ab Adresse 0 im Beobachtungswert hast.
Von der richtigen IP etc. gehe ich mal aus.

Du hast aber die Ansteuerung des MB_Client nicht angegeben, daher könnte ich nun raten. Willst Du das nachholen?
Benötigt wird z.B.:
Screenshot vom MB_Client im Programm
Screenshot vom Datenbereich auf den an MB_DATA_PTR verwiesen wird.
Screenshot während der Beobachtung wie oben bereits geschehen, jedoch wenn die korrekten Informationen bei REQ=TRUE-Flanke bereits anlagen, also die Reaktion auf die "vermeintlich" richtige Ansteuerung mitsamt des dann entstandenen Fehlers.
Die Anleitung vom Modem in welcher aufgeschlüsselt wird welche der Register einfache Worte, und welche Doppelworte sind, also das was auf Seiten 12..13 oder so steht.

Je mehr Informationen von Dir aufbereitet an uns übergeben werden desto einfacher und zielgerichteter können wir die Lösung des Problems nennen. Raten will ich eigentlich nicht und die fertige Lösung ist nach vorliegenden Informationen nur schwer zu präsentieren da die Halteregister erraten werden müssen.

Was ich jedoch vermute ist das die Anzahl der tatsächlichen Register an MB_DATA_PTR nicht mit MB_DATA_LEN übereinanderstimmen, da es sich um einen 16- und 32-Bit-Mix an Registern handelt und der Baustein optimiert ist.


Beispiel was für Infos benötigt werden die hier noch fehlen (Aufbereitung):

UDT Siemens PAC4200 -> Lesedaten

```
Lesedaten	"Siemens PAC4200 Lesedaten"	16.0		True	True	True	False		
[...] // Alles hiervor ist wie Offset 119 deklariert
	Offset 119: Maximaler THD Spannung L2-L3, Einheit %, Wertebereich 0 … 100	Real	252.0	0.0	True	True	True	False		
	Offset 121: Maximaler THD Spannung L3-L1, Einheit %, Wertebereich 0 … 100	Real	256.0	0.0	True	True	True	False		
	Offset 123: Reserve, Einheit -, Wertebereich -	Word	260.0	16#0	True	True	True	False		
	Offset 125: Reserve, Einheit -, Wertebereich -	Word	262.0	16#0	True	True	True	False		
	Offset 127: Reserve, Einheit -, Wertebereich -	Word	264.0	16#0	True	True	True	False		
	Offset 129: Maximale Netzfrequenz, Einheit Hz, Wertebereich 45 … 65	Real	266.0	0.0	True	True	True	False		
	Offset 131: Maximaler 3-Phasen Durchschnitt Spannung L-N, Einheit V, Wertebereich -	Real	270.0	0.0	True	True	True	False		
	Offset 133: Maximaler 3-Phasen Durchschnitt Spannung L-L, Einheit V, Wertebereich -	Real	274.0	0.0	True	True	True	False
[...] // Alles hiernach ist wie Offset 133 deklariert
```
Insgesamt sind 100 Einträge vorhanden.

Ansteuerung:
#"Kommunikation aufbauen" wird gebildet aus einem Zähler für freie Verbindungs-IDs sowie maximal alle 2 Sekunden.

```
REGION Leseauftrag  
    //Lesen
    #DB_MB_Client(CONNECT := #Adressierung,
                  REQ := #"Kommunikation aufbauen" AND NOT #MBClient_Busy,
                  DISCONNECT := #MBCLient_Done OR NOT #"Kommunikation aufbauen",
                  MB_MODE := 103,
                  MB_DATA_ADDR := 1,
                  MB_DATA_LEN := 101,
                  MB_DATA_PTR := #Lesedaten,
                  DONE => #MBCLient_Done,
                  BUSY => #MBClient_Busy,
                  ERROR => #MBClient_Error,
                  STATUS => #MBClient_Status);
END_REGION
```
REQ= TRUE

DONE = FALSE
BUSY = TRUE
ERROR = TRUE
STATUS = 16#8383

Aus diesen Informationen können hier viele mindestens einen der (absichtlichen) Fehler erkennen.


Nicht böse gemeint, aber wenn wir nachfragen müssen nach Daten die man vorher schon bereitstellen könnte, dann wirst Du irgendwann das Problem bekommen das Dir die Zeit wegläuft (u.a. weil auch wir auf Baustellen sind und daher nicht dauernd hier hineinschauen können) und wir können nichts beantworten was nicht ersichtlich ist. In vielen Themen wird deshalb immer mit "ich befrage mal die Glaskugel" geantwortet.


----------



## funkey (2 November 2020)

72DW sind doch 144 Worte (Register). Das ist doch mehr als in einem Durchgang gelesen werden kann, oder täusche ich mich da?


----------



## escride1 (2 November 2020)

funkey schrieb:


> 72DW sind doch 144 Worte (Register). Das ist doch mehr als in einem Durchgang gelesen werden kann, oder täusche ich mich da?



Es werden Halteregister gelesen. Diese können Byte, Word, DW sein. Daher muss die Anzahl der Halteregister übereinanderstimmen und die Siemens-Bausteine wollen auch gleich die richtige Formatierung nutzen (Es sei denn man stellt auf nicht-optimiert um, muss jedoch einen Datenbereich angeben der groß genug ist).
Wie in meinem Beispiel ersichtlich sind Offsets 119-121 Real-Werte, also 32-Bit. 123-127 sind wieder normale Word, also 16-Bit. Danach folgen wieder 32-Bits. Die Offsets der Halteregister steigt aber weiterhin nur um 2 Register jeweils an.
Hinter einem Halteregister kann sich somit sowohl 16 als auch 32-Bit verstecken und ist in der Anleitung des Herstellers ersichtlich.
Hätte ich keine Anleitung, so würde ich fast "stumpf" ein Array mit 1000 Byte erstellen und darein schreiben, muss dann aber langwierig suchen was zusammengehört.

Würde ich mit Modbus-Adressen lesen und nicht Halteregister, dann muss ich 1:1= Adresse=1 Byte beachten. Das macht das mixen von verschiedenen Wertgrößen jedoch komplizierter und manchmal unübersichtlicher.

Das Beispiel von mir wird mit 101 Halteregistern, bis auf die 3 glaube alles 32Bit, gelesen. Inwieweit da eine Beschränkung ist, weiß ich ehrlich gesagt nicht, bin auch noch nie an eine Grenze gestoßen und das Beispiel funktioniert ja (wenn man die extra Fehler rausnimmt )


----------



## PN/DP (2 November 2020)

Nach Modbus Spezifikation V1.1b3 (Seite 15) können max 125 Holding Registers (250 Byte) mit einer Anfrage "am Stück" gelesen werden.

Nachtrag: Die maximale Anzahl Register/Words kann geräteabhängig auch geringer sein, besonders bei Modbus RTU, z.B. Janitza UMG96S können nur max 59 Register (118 Byte). 
Bei dem Gerät hier im Thread dürften es höchstens 62 Doppelworte/Doppelregister oder weniger sein. Also: im Gerätehandbuch nachschauen.

Harald


----------



## KarwendelP (24 September 2021)

Hallo Zusammen,

nachdem ich hier nicht rauslesen konnte ob und wie das Problem gelöst wurde hänge ich meine Frage einfach daran. Bei mir kommt immer der Status 8383 und ich weiß nicht warum. Ich hab hoffentlich alle relevanten Screenshots angehängt. Die Registerbeschreibung soweit ich das erkennen kann ist ja schon in einem Thread weiter oben.
Kenn mich allerdings nicht gut aus mit Modbus.

Vielen Dank für eure Hilfe.

Christoph


----------



## escride1 (24 September 2021)

Hallo Zusammen,


KarwendelP schrieb:


> nachdem ich hier nicht rauslesen konnte ob und wie das Problem gelöst wurde hänge ich meine Frage einfach daran. Bei mir kommt immer der Status 8383 und ich weiß nicht warum. Ich hab hoffentlich alle relevanten Screenshots angehängt. Die Registerbeschreibung soweit ich das erkennen kann ist ja schon in einem Thread weiter oben.
> Kenn mich allerdings nicht gut aus mit Modbus.
> 
> Vielen Dank für eure Hilfe.
> ...



Du möchtest 122 Werte lesen und diese in einem 173er Array ablegen.
Ich würde einfach damit beginnen das Array auf 0..9 und LEN auf 10 zu stellen, dann schauen was passiert.
Zwischendrin die CPU einmal neu starten kann nicht schaden um bei "0" zu beginnen mit der Kommunikation.


----------



## KarwendelP (24 September 2021)

Danke schon mal ich werde das am Montag gleich mal ausprobieren.


----------



## KarwendelP (27 September 2021)

Hallo escride1,

ich habs ausprobiert aber er meldet mir auch dann den Status 8383. Das Array ist jetzt 0..9 of Word und LEN ist bei 10. Steuerung wurde neu gestartet. Bringt mir dann auch erst den Status 7000 bis ich den REQ aktiviere. Dann kommt 7004. Kurzzeitig hab ich auch schon mal die 7006 als Status gesehen aber in meinem Array steht immer null. 
Solltet ihr mehr Informationen benötigen um mir bei dem Fehler helfen zu können gebt mir bescheid.

Gruß

Und danke schon mal.


----------



## PN/DP (27 September 2021)

Gibt es in dem Modbus-Gerät ein Register 0? Versuche mal ein einzelnes Register zu lesen, was es garantiert gibt und wo es auch die Registernummer + 1 und Registernummer - 1 gibt.

Harald


----------



## KarwendelP (29 September 2021)

Hallo,

Scheinbar gibt es gar kein Register. Ich habe mir jetzt einen Ablauf einprogrammiert der das Register immer weiter schiebt. Aber ich erhalte Grundsätzlich die Antwort 8383. Was hat das eigentlich mit den Adressen ab 30001 und 40001 zu sagen?

Grüße

Christoph


----------



## escride1 (30 September 2021)

KarwendelP schrieb:


> Hallo,
> 
> Scheinbar gibt es gar kein Register. Ich habe mir jetzt einen Ablauf einprogrammiert der das Register immer weiter schiebt. Aber ich erhalte Grundsätzlich die Antwort 8383. Was hat das eigentlich mit den Adressen ab 30001 und 40001 zu sagen?
> 
> ...


Im MB_Mode 0 unterscheidet Siemens die Modbus-Funktion indem Du 30001 als erstes Register, was im Gerät dann 1 wäre, angibst um Eingangs-Worte zu lesen, Modbus-Funktion 04.
Gleichzeitig wäre MB_DATA_ADDR 10001 das 1. Eingangs-Bits Deines Gerätes, also Modbus-Funktion öh, 02.

Das gleiche mit 40001 im Mode 1.

Du aber hast Mode 103
Dann wäre MB_DATA_ADDR 0 = Modbus-Register 1 im Gerät mit der Modbus-Funktion 03.



KarwendelP schrieb:


> Hallo escride1,
> 
> ich habs ausprobiert aber er meldet mir auch dann den Status 8383. Das Array ist jetzt 0..9 of Word und LEN ist bei 10. Steuerung wurde neu gestartet. Bringt mir dann auch erst den Status 7000 bis ich den REQ aktiviere. Dann kommt 7004. Kurzzeitig hab ich auch schon mal die 7006 als Status gesehen aber in meinem Array steht immer null.
> Solltet ihr mehr Informationen benötigen um mir bei dem Fehler helfen zu können gebt mir bescheid.
> ...


Von 7000 auf 7004 und 7006 ist ja okay.
Frage ist, ob das nun der letzte Stand ist und das Array leer bleibt oder ob immer noch die 8383 dauernd ansteht.

Du könntest uns ein wenig mehr Informationen geben über Deine Hardware, da es einfacher ist damit zu arbeiten.
Also:
Welche CPU (Bestellnummer) sowie Firmware-Version?
Welcher Stromzähler genau (Bestellnummer) sowie evtl. Firmware-Version?
Wie ist der Stromzähler eingestellt?
Oder hast Du die gleiche Konstellation wie @seekrabbe ?




KarwendelP schrieb:


> Hallo,
> 
> Scheinbar gibt es gar kein Register. Ich habe mir jetzt einen Ablauf einprogrammiert der das Register immer weiter schiebt. Aber ich erhalte Grundsätzlich die Antwort 8383. Was hat das eigentlich mit den Adressen ab 30001 und 40001 zu sagen?
> 
> ...





PN/DP schrieb:


> Gibt es in dem Modbus-Gerät ein Register 0? Versuche mal ein einzelnes Register zu lesen, was es garantiert gibt und wo es auch die Registernummer + 1 und Registernummer - 1 gibt.
> 
> Harald



Hast Du das was @PN/DP geschrieben hat probiert?
Also einfach fest LEN auf 1, Mode auf 103, DATA_ADDR auf 2 und nur ein Wort an MB_DATA_PTR schreiben? Also ein Register wo davor und dahinter noch eines steht, nicht das erste.

Da wir aktuell noch nicht wissen was Dir auf Deinen Adressen gesendet wird ist es natürlich schwer zu sagen das "alles null" falsch ist.
Eventuell könnte es nämlich auch sein das Dein Gerät keine Halteregister sondern Worte versendet und daher die Verbindung fehlschlägt. Könntest Du testen indem Du Mode 104 nutzt.


----------

