TIA Modbusregister vom Modbus Server erstellen

S_Liner

Level-2
Beiträge
427
Reaktionspunkte
16
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe eine S7 1515-1PN und nutze TIA V17.

Ich möchte meine Steuerung als Modbus Server nutzen und habe dafür den Baustein MB_Server aus der Bibliothek genutzt.
1723800603467.png

Da der Status auf 7006 steht, gehe ich mal erstmal davon aus, dass die Verbindung zum Client korrekt aufgebaut worden ist.
Ich habe jetzt in einem DB ein Register aus 30 Integer erstellt.

1723800743958.png

und komme nun zu meiner eigentlichen Frage.

Die Werte die ich in diese Register schreiben möchte, sind aber REAL zahlen. Ein umwandeln ist aufgrund der Zahlengröße nicht möglich, aber sicherlich auch nicht nötig.

Wie schreibe ich jetzt am saubersten einen Real- wert in 2 Integer - Register?

Eine Lösung die mir einfällt wäre in AWL

L Real
T DB75.DBD0

Aber weiß nicht wie gut die Lösung ist.

Wenn ich den Client konfiguriere, wäre doch die Registeradresse des ersten Wertes die 1 oder? Und bei Register Anzahl gebe ich 2 an. Könnte man auch die Register direkt als REAL erstellen und dann als Adresse 1 und Anzahl Register 1 im Client konfigurieren?



Beste Grüße
 
Der DB_MB_Register muss kein Array of INT sein, du kannst den einfach so strukturieren mit Datentypen, wie die Werte die da drin liegen sollen. Also z.B. REAL, INT, DINT, WORD, DWORD ... nach Bedarf gemischt. Ich würde nach Möglichkeit einen DB mit Standard-Zugriff nehmen, da kann man besser kontrollieren, ob die Variablen auf den richtigen Register-Adressen liegen, als bei "optimiertem" DB.

Der Client muss beim Lesen immer die Anzahl Register angeben. Wenn er REAL oder DINT lesen will, dann muss er Anzahl 2 angeben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und vielen Dank.. Ich habe das jetzt mal so geändert..

1723806854161.png

Aber jetzt wäre es ja so, das wenn ich den ersten Datensatz auslese möchte, ich die Adresse 1 und die Länge 2 im Client konfiguriere.. Für den 2 Wert müsste ich dann aber die Adresse 3 angeben richtig? Denn mein Client sagt das die Adresse 2 bereits verwendet wird...


Gruß
 
Jetzt hast du einfach ein Array of REAL angelegt, aber deine Variablennamen sind irreführend.
Deine REAL-Variable MB_Reg[1] belegt die Modbus-Register 1 und 2, die REAL-Variable MB_Reg[2] belegt die Modbus-Register 3 und 4 usw.
Ich wäre nicht so schreibfaul, sondern würde tatsächlich eine Struktur aus einzelnen REAL-Variablen und ggf. Variablen mit anderen Datentypen anlegen und jeder Variable einen aussagekräftigen Name geben. Dann wird das Programm zum kopieren der Werte in den MB-Register-DB viel einfacher und verständlicher.
Der MB_SERVER-Baustein greift auf den MB-Register-DB nur wordweise zu, berechnet aus den Register-Nummern von den Client-Anfragen, egal wie der DB strukturiert ist. Offset im DB = (Registernummer - 1) * 2

mein Client sagt das die Adresse 2 bereits verwendet wird...
Was genau sagt dein unbekannter Client? Er kann gar nicht wissen, welche Register zusammen gehören, z.B. ob Register 1+2 oder 2+3 den REAL-Wert enthalten. Außerdem könnte er auch zusammenhängend 20 Register auslesen und in 4 REAL-Variablen + 2 INT-Variablen kopieren. Da sollte er auch nicht meckern, wenn zusätzlich noch ein Register aus dem Bereich einzeln ausgelesen wird.
Oder projektierst du in dem Client mit einem Engineering-Tool eine Variablenliste mit den Modbus-Adressen/Registern?
 
Zuletzt bearbeitet:
Guten Morgen... :)

Jetzt hast du einfach ein Array of REAL angelegt, aber deine Variablennamen sind irreführend.
Deine REAL-Variable MB_Reg[1] belegt die Modbus-Register 1 und 2, die REAL-Variable MB_Reg[2] belegt die Modbus-Register 3 und 4 usw.
Ich wäre nicht so schreibfaul, sondern würde tatsächlich eine Struktur aus einzelnen REAL-Variablen und ggf. Variablen mit anderen Datentypen anlegen und jeder Variable einen aussagekräftigen Name geben.
Da hast du natürlich vollkommen recht.. Habe das jetzt mal geändert:
1724045560871.png

Was genau sagt dein unbekannter Client?

Also wir verwenden eine Software, in der wir einen Client erzeugen. Wenn ich jetzt die Adresse 1 vergebe und Länge 2 angebe, kann ich in der Software nicht die Adresse 2 angeben, da sie von der Adresse 1 (Anzahl 2) bereits verwendet wird..



Gibt es da auch eine Grenze, wie groß das Register sein darf?



Beste Grüße
 

Anhänge

  • 1724045215038.png
    1724045215038.png
    27 KB · Aufrufe: 3
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es da auch eine Grenze, wie groß das Register sein darf?
Du meinst den Register-Speicherbereich? So groß wie DB sein können. Sinnvoll ist z.B. max 128kB, weil die Registernummern 1...65535 sein können..
Ich würde für den Register-DB einen eigenen DB verwenden, ohne weitere Variablen drin. Dann läßt er sich einfacher erweitern, wenn man später mal weitere Register zur Verfügung stellen will.
 
Hallo,
Du meinst den Register-Speicherbereich? So groß wie DB sein können. Sinnvoll ist z.B. max 128kB, weil die Registernummern 1...65535 sein können..
Ich würde für den Register-DB einen eigenen DB verwenden, ohne weitere Variablen drin. Dann läßt er sich einfacher erweitern, wenn man später mal weitere Register zur Verfügung stellen will.
Ja das habe ich jetzt auch so gemacht.. Die Verbindungsparameter habe ich aus dem DB entfernt und erstmal noch weiteren Reserven eingefügt..


Vielen Dank für deine Unterstützung
 
Guten Morgen zusammen, noch eine abschließende Frage... In der Software bekomme ich immer die Meldung "Kommmunikationsfehler" angezeigt und erhalte somit ein keine Werte. Mir ist klar das mir dabei keiner helfen kann, aber könnte mal jemand über meine Einstellungen schauen um zusagen, dass die Einstellungen (SPS-Seitig) korrekt sind?

1724130294598.png
bei HW_ANY habe ich die 64 eingetragen, weil ich das in Tutorials so gesehen habe. Ist das korrekt?
Und die ID 1, aber ich lese noch über 60 Sentron Packs mittels des MB_Client Baustein aus,. Dort durfte ich ja auch die ID nur einmal vergeben. Kann ich hier dennoch die 1 nehmen?


1724130456965.png

Da sich mein Status relativ schnell ändert, habe ihn mal bei jeder Änderung in ein Register geschrieben...
1724140399576.png

Also der Status 8382 steht für Datenlängenfehler..

Hier nochmal mein Datenbaustein..

1724140609792.png


Kann mir jemand sagen warum ich den Datenlängenfehler habe?


Vielen Dank und Beste Grüße
 
Zuletzt bearbeitet:
könnte mal jemand über meine Einstellungen schauen um zusagen, dass die Einstellungen (SPS-Seitig) korrekt sind?

Anhang anzeigen 80604
Ich sehe keinen Fehler. Aber: Soll nur ein Teilnehmer mit der IP-Adresse 10.81.3.35 sich mit dem Modbus Server verbinden können/dürfen? Ich würde (zumindest bis es richtig funktioniert) als RemoteAddress 0.0.0.0 eintragen, damit ich auch mal mit anderen Client-Geräten oder Test-Clients testen kann.
Oder ist 10.81.3.35 die IP-Adresse deiner SPS, auf dem dein MB_SERVER läuft? Dann wäre das falsch.

bei HW_ANY habe ich die 64 eingetragen, weil ich das in Tutorials so gesehen habe. Ist das korrekt?
Da muss die Hardware-Kennung der lokalen PN-Schnittstelle angegeben werden, über die kommuniziert werden soll. z.B. die PN-Schnittstelle der CPU.
siehe Gerätekonfig > Eigenschaften der CPU > Reiter Systemkonstanten, da steht üblicherweise:
Local~PROFINET-Schnittstelle_1 Hw_Interface 64
Wenn man über CP oder CM kommuniziert, dann hat die Hardware-Kennung andere Werte (z.B. 263)

Und die ID 1, aber ich lese noch über 60 Sentron Packs mittels des MB_Client Baustein aus,. Dort durfte ich ja auch die ID nur einmal vergeben. Kann ich hier dennoch die 1 nehmen?
Du musst eine ID nehmen, die von keinem anderen Kommunikationsbaustein verwendet wird. Die Kommunikationsressource/Verbindung mit dieser Nummer darf nur exklusiv von dieser MB_SERVER-Instanz verwendet werden.
Schau dir die Baustein-Hilfe zu MB_SERVER in der TIA Hilfe gründlich an. Da werden alle Parameter und Status-Werte erklärt. Und auch die CONNECT Parameter.
MB_Server_Connect.png


Da sich mein Status relativ schnell ändert, habe ihn mal bei jeder Änderung in ein Register geschrieben...
Üblicherweise reicht es, wenn man nur im Fehlerfall den STATUS-Wert wegspeichert, also dann wenn ERROR = TRUE dann den STATUS in eine Speicher-Variable kopieren.

Also der Status 8382 steht für Datenlängenfehler..
(...)
Kann mir jemand sagen warum ich den Datenlängenfehler habe?
Dein Modbus Client (von IP-Adresse 10.81.3.35) baut das Modbus-Request-Kommando/Telegramm anscheinend falsch zusammen. Oder verwendest du die Connection ID 1 mehrmals?
 
Hallo und vielen Dank für die Ausführliche Antwort...

Soll nur ein Teilnehmer mit der IP-Adresse 10.81.3.35 sich mit dem Modbus Server verbinden können/dürfen? Oder ist 10.81.3.35 die IP-Adresse deiner SPS, auf dem dein MB_SERVER läuft? Dann wäre das falsch.
Das ist die IP- Adresse des Servers, wo der Client drauf läuft.. Was also bedeutet das es die IP des Clients ist.

Da muss die Hardware-Kennung der lokalen PN-Schnittstelle angegeben werden, über die kommuniziert werden soll. z.B. die PN-Schnittstelle der CPU.
siehe Gerätekonfig > Eigenschaften der CPU > Reiter Systemkonstanten, da steht üblicherweise:
Local~PROFINET-Schnittstelle_1 Hw_Interface 64
Wenn man über CP oder CM kommuniziert, dann hat die Hardware-Kennung andere Werte (z.B. 263)
Ok, dann ist die 64 bei mir richtig, besten Dank.

Du musst eine ID nehmen, die von keinem anderen Kommunikationsbaustein verwendet wird. Die Kommunikationsressource/Verbindung mit dieser Nummer darf nur exklusiv von dieser MB_SERVER-Instanz verwendet werden.
Schau dir die Baustein-Hilfe zu MB_SERVER in der TIA Hilfe gründlich an. Da werden alle Parameter und Status-Werte erklärt. Und auch die CONNECT Parameter.
Ja das dachte ich mir bereits, daher hatte ich das bereits geändert...

Üblicherweise reicht es, wenn man nur im Fehlerfall den STATUS-Wert wegspeichert, also dann wenn ERROR = TRUE dann den STATUS in eine Speicher-Variable kopieren.
Da hätte ich natürlich auch von alleine drauf kommen können... 🤦‍♂️
1724218080268.png


Dein Modbus Client (von IP-Adresse 10.81.3.35) baut das Modbus-Request-Kommando/Telegramm anscheinend falsch zusammen. Oder verwendest du die Connection ID 1 mehrmals?
Mmh, dann muss ich schauen was dort falsch ist.. Funktionscode 03 wäre aber richtig ja?
ID1 wird bereits verwendet, daher habe ich eine nicht nochmal verwendetet ID gewählt.



Beste Grüße
 
Also ich habe jetzt so eine Client Test Software genommen.. Da funktioniert alles..
Also muss es an den Einstellungen meines Clients liegen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich wollte nur nochmal bescheid sagen das das Problem gelöst werden konnte und nun die Daten übertragen werden.

Das Problem war das konfigurierte Device..
1724405914901.png
Es wurde ausversehen als Generic TCP konfiguriert, hätte abernatürlich als Generic Modbus TCP konfiguriert werden müssen.

Naja, Fehler gefunden und vielen Dank für euren Support..


Gruß
 
Zurück
Oben