TIA MBTCP - Client, mehere Register parallel auslesen?

Daniel161

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin noch recht neu im Umgang mit TIA und habe ein Problem bei meinem Projekt.

Hardware: S7 1214C

Aktuell ziehe ich aus verschiedenen Registern mit dem MB_Client (MB TCP) Baustein meine Daten. Diese Daten gehen in verschidene DBs und teilweise in UDTs.

Zum testen des auslesen der verschidenen Registern hab ich für jedes Register ein FC erstell.

Somit hab ich für jedes Register ein FC sowie ein DB in den die Daten gespeichert werden.

Ich hab einen dbConnect in dem die Verbindungsdaten (TCON_IP_v4) sind.


Nun wollte ich einen Baustein erstellen, der alle Register ausließt.

Hierzu war mein Gedanke den FC "leer" aufzurufen und die zu wechselnden Daten als IN/OUT zu deklarieren. Und für MB_MODE, MB_DATA_ADDR, MB_DATA_LEN & MB_DATA_PTR variablen zu deklarieren welche in einer Switch Case Anweisung passend zugewiesen werden.

Das Problem ist nun der MB_DATA_PTR. Für diesen muss ich ein Passende Variable deklarieren, passend bedeutet die Länge vom Array muss passen sowie der Datentyp.
Da meine DBs aber unterschidliche Längen und sogar Datentypen haben funktioniert diese leider nicht so einfach.

Hat hier jemand einen Vorschlag für mein Problem?

Ist meine Struktur einfach schon verkehrt?
Meine aktuelle Alternative ist ein Variables Array of Word zu nehmen und alle meine gelesenen Daten in Word zu speicher, diese dann mit einem Array[*] of Word zu übergeben und anschließend die "Rohdaten" in die Entsprechenden UTD's zu schieben (BLKMOVE?)

Grüße
 
Bei Modbus ist der Protokoll-Overhead so groß, dass 100 zusammenhängende Register auf einen Rutsch auslesen viel schneller geht als 10 Register einzeln auszulesen.. Also nach Möglichkeit einfach immer reihum nacheinander ein paar wenige große Register-Bereiche auslesen und in der SPS auseinanderpflücken. Falls hinter dem ModbusTCP-Server/Gateway ein RS485-Modbus hängt, geht das parallele Auslesen (mehrere Leseaufträge gleichzeitig) eh' nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Modbus ist der Protokoll-Overhead so groß, dass 100 zusammenhängende Register auf einen Rutsch auslesen viel schneller geht als 10 Register einzeln auszulesen.. Also nach Möglichkeit einfach immer reihum nacheinander ein paar wenige große Register-Bereiche auslesen und in der SPS auseinanderpflücken. Falls hinter dem ModbusTCP-Server/Gateway ein RS485-Modbus hängt, geht das parallele Auslesen (mehrere Leseaufträge gleichzeitig) eh' nicht.
Verstehe aber die Register haben einiges an abstand und zum Teil sind es Holding und Input Register. Der Baustein supportet lediglich eine Länge von 125 Word auf einmal, daher reicht es mir nicht da es sonst in die 10000 Word hoch geht.
 
Der Baustein supportet lediglich eine Länge von 125 Word auf einmal
das liegt nicht an dem MB Client Baustein, sondern am Modbus Protokoll

daher reicht es mir nicht da es sonst in die 10000 Word hoch geht.
Sind die Registernummern so weit verstreut? Kannst du nicht auf nur wenige Bereiche reduzieren? Es macht nichts, wenn da auch ein paar uninteressante Register mitgelesen werden.
Ich würde die Bereiche nacheinander einlesen. Mit einem Auftragsmanager jeweils die Registernummern des Leseauftrags an den MB Client übergeben, und natürlich die Antwort-Daten unterschiedlich verteilen.

Oder sollen tatsächlich sooo viele Register gelesen werden? Was ist das für ein Kommunikationspartner? Wäre da nicht ein anderes Kommunikationsprotokoll besser?
 
Du hast jetzt nicht geschrieben, was der Modbus-Server für ein Gerät ist.
Ich hatte mal Modbus Server bei denen konnte man genau aus dem Grund einen Registerbereich konfigurieren, dass in diesem bestimmte Daten bereitgestellt wurden, damit man diese dann in einem Rutsch auslesen konnte und dies nicht einzeln machen musste.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast jetzt nicht geschrieben, was der Modbus-Server für ein Gerät ist.
Ich hatte mal Modbus Server bei denen konnte man genau aus dem Grund einen Registerbereich konfigurieren, dass in diesem bestimmte Daten bereitgestellt wurden, damit man diese dann in einem Rutsch auslesen konnte und dies nicht einzeln machen musste.
Es handelt sich hierbei um einen Messumformer welcher die Messdaten von mehreren Sensoren erhält. Außerdem werden auch andere Daten wie Serienummer und Diagnosedaten ausgelesen.

770 + 786 (64 Bytes)
501-503 (4 Bytes)
1095 (2 Bytes)
2095 (2 Bytes)

100016-10051 (72 Bytes)
100216-10251 (72 Bytes)

Holding Register 0-31 (48 Bytes)

und dann nochmal 43 und 39 Bytes.
 
Du hast jetzt nicht geschrieben, was der Modbus-Server für ein Gerät ist.
Ich hatte mal Modbus Server bei denen konnte man genau aus dem Grund einen Registerbereich konfigurieren, dass in diesem bestimmte Daten bereitgestellt wurden, damit man diese dann in einem Rutsch auslesen konnte und dies nicht einzeln machen musste.
Es handelt sich hierbei um einen Messumformer welcher die Messdaten von mehreren Sensoren erhält. Außerdem werden auch andere Daten wie Serienummer und Diagnosedaten ausgelesen.

770 + 786 (64 Bytes)
501-503 (4 Bytes)
1095 (2 Bytes)
2095 (2 Bytes)

100016-10051 (72 Bytes)
100216-10251 (72 Bytes)

Holding Register 0-31 (48 Bytes)

und dann nochmal 43 und 39 Bytes.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
770 + 786 (64 Bytes)
501-503 (4 Bytes)
1095 (2 Bytes)
2095 (2 Bytes)

100016-10051 (72 Bytes)
100216-10251 (72 Bytes)

Holding Register 0-31 (48 Bytes)

und dann nochmal 43 und 39 Bytes.
Hat das eine KI "ausgerechnet"? ;)

Ansonsten wie bereits geschrieben, mache dir eine Jobliste mit den Parametern der 9 Bereiche und lies die Bereiche nacheinander ein. Forumssuche: modbus jobliste
 
Du hast jetzt nicht geschrieben, was der Modbus-Server für ein Gerät ist.
Ich hatte mal Modbus Server bei denen konnte man genau aus dem Grund einen Registerbereich konfigurieren, dass in diesem bestimmte Daten bereitgestellt wurden, damit man diese dann in einem Rutsch auslesen konnte und dies nicht einzeln machen musste.
Es handelt sich hierbei um einen Messumformer welcher die Messdaten von mehreren Sensoren erhält. Außerdem werden auch andere Daten wie Serienummer und Diagnosedaten ausgelesen.

770 + 786 (64 Bytes)
501-503 (4 Bytes)
1095 (2 Bytes)
2095 (2 Bytes)

100016-10051 (72 Bytes)
100216-10251 (72 Bytes)

Holding Register 0-31 (48 Bytes)

und dann nochmal 43 und 39 Bytes.
Hat das eine KI "ausgerechnet"? ;)

Ansonsten wie bereits geschrieben, mache dir eine Jobliste mit den Parametern der 9 Bereiche und lies die Bereiche nacheinander ein. Forumssuche: modbus jobliste
Ne, 501 hat 2 bytes, 502 und 503 haben jeweils 1 byte.

770 und 786 haben jeweils 32 Byte.
 
Ne, 501 hat 2 bytes, 502 und 503 haben jeweils 1 byte.
Dein Gerät kommuniziert aber schon über Modbus? In Modbus ist ein Register immer ein Word (2 Byte).
Register 501 + 502 + 503 = 3 Register = 3 Word = 6 Byte

Selbst wenn du nur ein Register einzeln lesen willst, was laut Hersteller-Beschreibung nur ein Byte ist, dann musst du das ganze Register lesen und der MB Client liefert 1 Word, dessen relevantes Byte du dann selbst in eine eigene (Byte-)Variable umkopieren must.
 
Hallo zusammen, tut mir leid für die verspäteten Antworten aber die Priorität lag die letzten Tage woanders.

Hiermit hoffe ich alle bisher aufgekommen Fragen zu klären:

Und was für ein Messumformer ist das?
Das bringt einen jetzt auch noch nicht viel weiter.
Hersteller und Typ bitte noch und, falls vorhanden, Handbuch anhängen.
das liegt nicht an dem MB Client Baustein, sondern am Modbus Protokoll


Sind die Registernummern so weit verstreut? Kannst du nicht auf nur wenige Bereiche reduzieren? Es macht nichts, wenn da auch ein paar uninteressante Register mitgelesen werden.
Ich würde die Bereiche nacheinander einlesen. Mit einem Auftragsmanager jeweils die Registernummern des Leseauftrags an den MB Client übergeben, und natürlich die Antwort-Daten unterschiedlich verteilen.

Oder sollen tatsächlich sooo viele Register gelesen werden? Was ist das für ein Kommunikationspartner? Wäre da nicht ein anderes Kommunikationsprotokoll besser?



Messumformer: E+H CM44R
https://www.de.endress.com/de/messg...eb-95ee-005056a956fd&t.tabId=product-overview

Hier die Modbus Guideline welche unter "Downloads > Technische Dokumente > Sonderdokumentation" zu finden ist
https://bdih-download.endress.com/files/DLA/005056A500261EECB9FE4A363A4B4FD5/SD01189CEN_07.22.pdf

Übersicht
Wie bereits beschrieben will ich verschiedene Register auslesen, dies klappt soweit jedoch hab ich für jede "Registergruppe" einen separaten FC erstellt.
Der Tricky part ist nun jedoch alle bisherigen "Registergruppen" "zusammen" auszulesen.

Mein Plan
Mein Gedanke war einen FB zu erstellen in dem ein MB-Client baustein ist, die Variablen Dinge wie MB_Mode, Adresse, Länge und Speicherort via Variablen zu übergeben.
Unter dem MB Baustein dann einfach eine Switch Case Anweisung und in jedem Case eine anderen Wert für die die Variablen MB_Mode, Adresse, Länge und Speicherort (MB_DATA_PTR). Die Laufvariable für den Switch Case würde einfach bei dem Status_DONE eins hochzählen.

Das Problem
Mein Problem nun aber mit dieser Idee ist, dass meine Daten welche ich bereits erhalte direkt in verschidene DBs packe und zum Teil auch schon in UDTs, somit werden die Daten welche bsp in einem Float sind bereits automatisch in ein Real umgewandelt. Anfangs dachte ich dies sei super aber nun im nach hinein ist das Problem, das ich der Variable für den Speicherort nicht ändern kann da dieser verschiedenen Datentypen hat. Von Array of Word [0...X] zu Array of [UDT name(0...X)].

Mögliche Lösung?
Ich bin bereits auf Pointer gestoßen, jedoch versteh ich diese nicht ganz daher würde ich einen anderen Ansatz versuchen. Die Daten nicht in UDTs oder sonstige Datentypen zu konvertieren sondern diese in Word zu lassen und dann mit einem Variablen Array die Länge immer anpassen. Wenn ich dann die Daten alle habe sie mit einem BLCKMOVE in meine vorgefertigeten UDT zu verschieben.

Thema Jobliste
Ich vermute, dass hier wurde damit gemeint?
https://cache.industry.siemens.com/.../v1/Bibliothek_Additional_Modbus_Block_de.pdf
Verstehe nicht genau wo ich den Speicherort (MB_DATA_PTR) definiere, dieser nicht unterschiedlich je Job?

Details

User PN/DP hat den Vorschlag geäußert die Register einfach komplett in einem Auszulesen, meiner auffasung nach wird das in meinem Fall nicht gehen da die "Registergruppen" zu weit außeinander liegen.

Nachfolgend Liste ich alle Auszulesende Register aus und auch ihre dazugehörigen Seitenzahlen aus der Modbus Guideline (SD01189CEN_07.22.pdf).

Die Register
  1. Messwerte - Register 0 - 31 - 48 Bytes gesamt - Holding/Input, FC: 03, 16, 23, 04 - Seite 46
  2. Gerätestatus - Register 503 - 1 Byte - Input, FC04 - Seite 48
  3. Serialnummer Sensor 1 & Sensor 2 - Register 770 & 786 - 64 Bytes gesamt - Input, FC04 - Seite 50
  4. Diagnose Sensoren - Register 1095 & 2095 - 4 Byte gesamt - Input, FC04 - Seite 28 - 29
  5. Heartbeat Daten Sensor 1 - Register 10016 - 10051 - 72 Bytes gesamt - Input, FC04 - Seite 85
  6. Heartbeat Daten Sensor 2 - Register 10216 - 10251 - 72 Bytes gesamt - Input, FC04 - Seite 85
Register 0 - 10251 in einem Auslesen? 125 Word ist das Limit?!




Freu mich auf Feedback, Vorschläge und Ideen.

Grüße und Vielen Dank.
Daniel161
 
Zurück
Oben