TIA Kommunikation zwischen S7-1511-1 PN und Modbus MGate 3170

Zuviel Werbung?
-> Hier kostenlos registrieren
1724134019504.pngalso ich habe jetzt den Datenbaustein wie in der pdf angelegt. es sind 20 Register also die 20 bei DATA_LEN rangeschrieben.
in den Kommentaren habe ich geschrieben welcher Wert was ist.
das Array of real ist bei MB_DATA_PTR rangeschaltet.
Jetzt muss ich ja noch die Adresse der Register festlegen, wo wird das gemacht?
 
1724134757930.pngaußerdem habe ich das problem das der Wert BUSY Dauerhaft gesetztist. eigentlich müsste der ja an und aus gehen und DONE ja auch immer am Ende einer Modbusübertragung, hat dafür jemand auch eine Lösung?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
und wie erteile ich den leseauftrag so, dass ich auch die register auslese die ich haben will?
Jetzt muss ich ja noch die Adresse der Register festlegen, wo wird das gemacht?
Wie ich bereits im Beitrag #14 schrieb: schau dir die Baustein-Beschreibung des MB_CLIENT in der TIA Hilfe an, da werden alle deine Fragen ausführlich beantwortet.
Wie du angibst, welche Register du lesen willst, siehe das Hilfe Thema MB_CLIENT > Parameter MB_MODE, MB_DATA_ADDR und MB_DATA_LEN

außerdem habe ich das problem das der Wert BUSY Dauerhaft gesetztist. eigentlich müsste der ja an und aus gehen und DONE ja auch immer am Ende einer Modbusübertragung, hat dafür jemand auch eine Lösung?
Die Signale gehen normalerweise ständig "an und aus", allerdings sind DONE und ERROR nur einen Zyklus lang aktiv (das kannst du eher nur zufällig beobachten) und BUSY ist nur kurz nach jedem REQ, der bei dir mit 10Hz aktiviert wird (das kannst du wahrscheinlich auch nicht sehen, nimm mal nur 1Hz). Tipp: die Signale auf je einen Zähler geben, wenn der Zählerstand sich ändert (gößer wird), dann hat sich das Signal geändert - war also (kurz) aktiv.
 
theoretisch muss ich doch auch die Slave ID angeben, allerdings finde ich nirgendswo etwas dazu in der MB_Client Hilfe.
Tja, da müsstest du in der MB_Client Hilfe einfach mal ungefähr einen Bildschirm weit runterscrollen. :cool:
Direkt nach der Bescheibung der Aufrufparameter kommt die Bescheibung weiterer statischer Variablen von MB_CLIENT (die man in "Static" = in der Instanz findet). Da gibt es die Variable MB_Unit_ID , die entspricht der Slave ID bei Modbus RTU. Die wird bei Modbus TCP eigentlich nicht benötigt, manche Modbus Server erwarten da aber trotzdem einen bestimmten Wert (fest oder zur Adressierung von (teilweise virtuellen oder logischen) Teilgeräten). ModbusTCP-zu-ModbusRTU-Gateways erwarten da die Adresse des Modbus Slaves hinter dem Gateway. MB_Unit_ID hat von TIA den Standard/Startwert 255 - wenn das Gerät einen anderen Wert will, dann einfach den gewünschten Wert zuweisen, z.B. "MyInstance".MB_Unit_ID := 1;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Hilfe. Leider komme ich trotzdem nicht richtig weiter. ich verstehe auch nicht so ganz was die zusammensetzung von MODE DATA_ADDR und DATA_LEN bedeutet. also ich kann es lesen ja aber verstehe den sinn dahinter in der hilfe leider nicht.

Mit Simply Modbus kann ich das Register 1516 in welchem die Temperatur steht auslesen. also funktionsfähig ist es.

STATUS gibt den Wert 16#7006 was in der hilfe heißt, dass Daten empfangen werden.
allerdings bleiben BUSY weiterhin auf true und DONE auf false. (habe die clock auf 1HZ geändert).

ich bin langsam mit meinem latein am ende.
 
Danke für die Hilfe. Leider komme ich trotzdem nicht richtig weiter. ich verstehe auch nicht so ganz was die zusammensetzung von MODE DATA_ADDR und DATA_LEN bedeutet. also ich kann es lesen ja aber verstehe den sinn dahinter in der hilfe leider nicht.

Mit Simply Modbus kann ich das Register 1516 in welchem die Temperatur steht auslesen. also funktionsfähig ist es.

STATUS gibt den Wert 16#7006 was in der hilfe heißt, dass Daten empfangen werden.
allerdings bleiben BUSY weiterhin auf true und DONE auf false. (habe die clock auf 1HZ geändert).

ich bin langsam mit meinem latein am ende.

MB_MODE: This is a USINT input that designates what type of communication request should be sent. Generally, a value of 0 is used for reading data from the server, and a value of 1 or 2 is used for sending (writing) data to the server. The exact breakdown of this parameter, along with the MB_DATA_ADDR and MB_DATA_LEN parameters and how they correspond to Modbus function codes can be found in the block documentation (which can be accessed by pressing `F1` on your keyboard while the MB_CLIENT block is highlighted in TIA Portal).
MB_DATA_ADDR: This input is a UDINT for the location of the start of the data being read or written. A common start value for Modbus holding registers is often 40,001, but it will vary based on your data setup and server. The exact breakdown of this parameter, along with the MB_MODE and MB_DATA_LEN parameters and how they correspond to Modbus function codes can be found in the block documentation (which can be accessed by pressing `F1` on your keyboard while the MB_CLIENT block is highlighted in TIA Portal).
MB_DATA_LEN: This input is a UINT that represents the numbers of bits or words of data being handled by this request. The exact breakdown of this parameter, along with the MB_MODE and MB_DATA_ADDR parameters and how they correspond to Modbus function codes can be found in the block documentation (which can be accessed by pressing `F1` on your keyboard while the MB_CLIENT block is highlighted in TIA Portal).

Es verweist immer alles auf die Hilfe zum Mb_Client, wie hier @PN/DP auch jedes mal wiederholt. Lies diese bitte.
 
ich verstehe auch nicht so ganz was die zusammensetzung von MODE DATA_ADDR und DATA_LEN bedeutet.
Nach deiner Registerliste von Beitrag #17 mit Modbus Funktion 03 (Halteregister lesen) 10 REAL Werte (sind 20 Register) ab Register 1500 lesen --> das ergibt folgende MB_CLIENT Auftragsparameter:
MODE = 103
MB_DATA_ADDR = 1500
MB_DATA_LEN = 20

alternativ:
MODE = 0
MB_DATA_ADDR = 41501
MB_DATA_LEN = 20

Ja nach Modbus Gerät kommen die Werte eventuell um 1 Register versetzt, dann einfach den Wert an DATA_ADDR um 1 erhöhen/erniedrigen.

STATUS gibt den Wert 16#7006 was in der hilfe heißt, dass Daten empfangen werden.
allerdings bleiben BUSY weiterhin auf true und DONE auf false. (habe die clock auf 1HZ geändert).
rufe mal MB_CLIENT nicht mit einem Taktmerker auf, sondern nur einmalig (z.B. unbenutzten Merker verwenden und manuell steuern).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nach deiner Registerliste von Beitrag #17 mit Modbus Funktion 03 (Halteregister lesen) 10 REAL Werte (sind 20 Register) ab Register 1500 lesen --> das ergibt folgende MB_CLIENT Auftragsparameter:
MODE = 103
MB_DATA_ADDR = 1500
MB_DATA_LEN = 20

alternativ:
MODE = 0
MB_DATA_ADDR = 41501
MB_DATA_LEN = 20

Ja nach Modbus Gerät kommen die Werte eventuell um 1 Register versetzt, dann einfach den Wert an DATA_ADDR um 1 erhöhen/erniedrigen.


rufe mal MB_CLIENT nicht mit einem Taktmerker auf, sondern nur einmalig (z.B. unbenutzten Merker verwenden und manuell steuern).
ich habe jetzt die verschiedene Parametereinstellungen durchprobiert, leider kommen immer noch keine Daten an. Könnte eventuell doch die Möglichkeit bestehen, dass der Datentyp falsch ist? In den Videos die ich mir angeschaut habe, werden immer Word oder Byte benutzt.
 
ich habe jetzt die verschiedene Parametereinstellungen durchprobiert, leider kommen immer noch keine Daten an.
Welche Werte hat der STATUS-Ausgang? Gibt es auch Fehler-Nummern 16#8xxx? Wenn der Ausgang ERROR = TRUE dann mal den Wert von STATUS in eine Speicher-Variable wegspeichern/kopieren. Ggf. ist es auch innvoll, das Lesen immer nur einmal auszuführen.

Könnte eventuell doch die Möglichkeit bestehen, dass der Datentyp falsch ist?
Liegt dein Datenpuffer an MB_DATA_PTR in einem "optimierten" DB? Dann muss der Datenpuffer ein Array (oder eine einzelne Variable) mit elementaren Datentypen sein.
Bei einem DB mit Standard-Zugriff sind alle möglichen Datentypen und Strukturen möglich. siehe TIA Hilfe zu MB_CLIENT > Parameter MB_DATA_PTR
 
Welche Werte hat der STATUS-Ausgang? Gibt es auch Fehler-Nummern 16#8xxx? Wenn der Ausgang ERROR = TRUE dann mal den Wert von STATUS in eine Speicher-Variable wegspeichern/kopieren. Ggf. ist es auch innvoll, das Lesen immer nur einmal auszuführen.


Liegt dein Datenpuffer an MB_DATA_PTR in einem "optimierten" DB? Dann muss der Datenpuffer ein Array (oder eine einzelne Variable) mit elementaren Datentypen sein.
Bei einem DB mit Standard-Zugriff sind alle möglichen Datentypen und Strukturen möglich. siehe TIA Hilfe zu MB_CLIENT > Parameter MB_DATA_PTR
der Status-Ausgang hat unverändert den Wert 16#7006 = Daten werden empfangen.
der Baustein ist optimiert und der Dattenpuffer ist ein Array [0...9] of Real welches an MB_DATA_PTR liegt.
 
Das Ergebnis ist unabhängig vom Datentyp. MB_CLIENT liest Register (Word) und kopiert die in den Empfangspuffer. Was für eine Datentyp-abhängige Bedeutung die empfangenen Bitmuster der Words haben, sieht man erst, wenn man die Variablen im Empfangspuffer beobachtet.

der Status-Ausgang hat unverändert den Wert 16#7006 = Daten werden empfangen.
Das schließt du aus einfacher Programmbeobachtung oder speicherst du den STATUS-Wert so, dass du später den Wert in Ruhe lesen kannst?
Da sollten zwischendurch auch ganz kurz andere Werte angezeigt werden.
In #23 schrieb ich bereits:
Die Signale gehen normalerweise ständig "an und aus", allerdings sind DONE und ERROR nur einen Zyklus lang aktiv (das kannst du eher nur zufällig beobachten) und BUSY ist nur kurz nach jedem REQ, der bei dir mit 10Hz aktiviert wird (das kannst du wahrscheinlich auch nicht sehen, nimm mal nur 1Hz). Tipp: die Signale auf je einen Zähler geben, wenn der Zählerstand sich ändert (gößer wird), dann hat sich das Signal geändert - war also (kurz) aktiv.
Ändern sich DONE und ERROR? Erhöhen sich die Zählerstände?
Speichere den Wert von STATUS, wenn MB_CLIENT den Leseauftrag beendet hat. Üblicherweise macht man das zumindest bei ERROR und hat damit die Fehlernummer 16#8xxx des letzten Fehlers. Der STATUS bei DONE ist eher uninteressant, der sollte da immer 0 sein:
Code:
                                                  +----------+
 "MB_CLIENT_DB".ERROR                             |   MOVE   |
---------| |--------------------------------------|EN     ENO|-
                                                  |          |
                           "MB_CLIENT_DB".STATUS--|IN     OUT|-"DBxyz".STATUS_ERROR
                                                  +----------+

                                                  +----------+
 "MB_CLIENT_DB".DONE                              |   MOVE   |
---------| |--------------------------------------|EN     ENO|-
                                                  |          |
                           "MB_CLIENT_DB".STATUS--|IN     OUT|-"DBxyz".STATUS_DONE
                                                  +----------+

Zeige uns mal ein Bild von deinem MB_CLIENT-Bausteinaufruf beim online beobachten des Programms.
 
Das Ergebnis ist unabhängig vom Datentyp. MB_CLIENT liest Register (Word) und kopiert die in den Empfangspuffer. Was für eine Datentyp-abhängige Bedeutung die empfangenen Bitmuster der Words haben, sieht man erst, wenn man die Variablen im Empfangspuffer beobachtet.


Das schließt du aus einfacher Programmbeobachtung oder speicherst du den STATUS-Wert so, dass du später den Wert in Ruhe lesen kannst?
Da sollten zwischendurch auch ganz kurz andere Werte angezeigt werden.
In #23 schrieb ich bereits:
Die Register sind aber nicht im Datentyp Word sondern in float, double, I32, I64. jen ahcdem welche Registeradresse man hat.
1500-1518 float
1600-1638 double
...

Ich beobachte den Datenbaustein mit der "Brille", dort kann ich sehen, welchen Wert der STATUS hat.
Der Wert ist dauerhaft 16#7006. Dieser ändert sich auch nicht kurz.

ich probiere das mit dem Code aus. danke
 
Das sieht so aus, als ob du das Doppel-Halteregister 1516 + 1517 (Temperatur) lesen willst, und der Wert würde bei deiner Beschaltung in "Messwerte speichern"."Register auslesen"[0] landen (%DB5.DBD0) (erster Wert des REAL-Arrays)
Da passt aber die Parameter-Kombination Registernummer 1516 an MB_DATA_ADDR nicht zum MODE 0
Wofür habe ich mir eigentlich die Mühe gemacht, dir in Beitrag #28 zwei Varianten zu nennen, wie du deine Register lesen kannst?
Das TIA Hilfe Thema "MB_CLIENT > Parameter MB_MODE, MB_DATA_ADDR und MB_DATA_LEN" hast du anscheinend auch nicht gründlich gelesen...

Bei MODE = 0 musst du 40001 zur gewünschten Registernummer addieren, oder MODE = 103 verwenden, da passt MB_DATA_ADDR = 1516

Wieso steht in deinem Bild am MB_DATA_PTR bei "Messwerte speichern"."Register auslesen" P#DB5.DBX0.0 ? In #31 hast du geschrieben, der DB wäre "optimiert"!?? Das stimmt also gar nicht ... das ist aber nicht der Grund, warum dein Lesen nicht richtig funktioniert...
der Baustein ist optimiert und der Dattenpuffer ist ein Array [0...9] of Real welches an MB_DATA_PTR liegt.

Verwendest du die bei CONNECT angegebene Connection ID 1 noch bei anderen Kommunikationsbausteinen für andere Verbindungen?

PS: Gewöhne dir mal ganz schnell wieder ab, in Variablennamen und DB-Namen Leerzeichen zu verwenden, auch wenn TIA solchen Unfug zulässt. In üblichen internationalen Nicht-Siemens Programmiersprachen sind Leerzeichen nicht zulässig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
sorry aber ich probiere die ganze zeit herum. deswegen ist das nicht immer auf dem zuletzt besprochenen stand.
ich habe deinen beiden varianten ausprobiert für mode addr und len, beides hat nicht funktioniert.
ebenfalls habe ich es mit einem optimierten und nicht optimierten baustein probiert. hat ebenfalls nicht funktioniert.

nein in meinem programm gibt es bis jetzt nur diesen einen baustein.
allerdings gibt es ja auch noch die "alte" sps die mit dem moxa kommuniziert. welche connect ID dort verwendet wird, weiß ich nicht.

ja sorry für die leerzeichen.


0A 03 06 40 00 04 44 2E muss man diese ID nicht auch irgendwo verwerten in dem Datenbaustein?
 
1724306739295.png

mit dieser parametereinstellung wechselt er im sekundentakt die Variable ERROR zwischen true und false. Dabei sind die Werte der Variable Status wechselnd zwischen 16#7004 und 16#8200.

Parameter STATUS (S7-1200, S7-1500)
  • Eine andere Modbus-Anfrage wird zur Zeit über den Port verarbeitet.
  • Eine weitere Instanz von MB_CLIENT mit den gleichen Verbindungsparametern bearbeitet eine bereits bestehende Modbus-Anfrage
 
Zurück
Oben