-> Hier kostenlos registrieren
Hallo,
ich bin gerade dabei eine Kommunikation zwischen zwei Modbus TCP Partnern (S7-1500 6ES7 515-2AM01-0AB0 und einem Modbus-TCP-TN) zu realisieren. Hierbei ist die SPS mein MB-Client. Hierzu verwende ich den MbClient-Baustein von Siemens. Der Datenaustausch ist gegeben, jedoch wird auf die Datenadresse beim Schreiben ein UINT und beim Lesen ein UDInt verlangt.
Generell wird ein FB geschrieben, der mehrfach aufgerufen werden soll und somit multiinstanzfähig sein muss.
Darum blieb mir nichts anderes übrig als über einen Pointer den entsprechenden Datenbereich anzusprechen wenn ich lese oder schreibe.
Hierbei will ich über den AnyPointer auf die jeweilige Variable in meinem statischen Variablen / Instanzdatenbaustein zeigen lassen und den Wert entsprechend ablegen und anschließend weiterrangieren.
Das Schreiben und Lesen auf einen globalen DB funktioniert, jedoch will ich diesen ja flexibel machen damit ich bei einem Mehrfachaufruf nicht die DB-Nr immer ändern bzw. angeben muss.
Bisher habe ich die Einstellung des Speicherbereichs auf 16#85 = Instanzdatenbaustein gelegt, was jedoch nicht funktioniert hat bzw. ich nicht weiß welche DB-Nr hier gefordert wird.
Hat jemand eine Idee wie ich diese Problematik lösen kann?
Hier ist mein aktueller Quellcode zum Lesen der Daten mit Hilfe eines globalen Datenbausteins.
Vielen Dank für eure Hilfe
ich bin gerade dabei eine Kommunikation zwischen zwei Modbus TCP Partnern (S7-1500 6ES7 515-2AM01-0AB0 und einem Modbus-TCP-TN) zu realisieren. Hierbei ist die SPS mein MB-Client. Hierzu verwende ich den MbClient-Baustein von Siemens. Der Datenaustausch ist gegeben, jedoch wird auf die Datenadresse beim Schreiben ein UINT und beim Lesen ein UDInt verlangt.
Generell wird ein FB geschrieben, der mehrfach aufgerufen werden soll und somit multiinstanzfähig sein muss.
Darum blieb mir nichts anderes übrig als über einen Pointer den entsprechenden Datenbereich anzusprechen wenn ich lese oder schreibe.
Hierbei will ich über den AnyPointer auf die jeweilige Variable in meinem statischen Variablen / Instanzdatenbaustein zeigen lassen und den Wert entsprechend ablegen und anschließend weiterrangieren.
Das Schreiben und Lesen auf einen globalen DB funktioniert, jedoch will ich diesen ja flexibel machen damit ich bei einem Mehrfachaufruf nicht die DB-Nr immer ändern bzw. angeben muss.
Bisher habe ich die Einstellung des Speicherbereichs auf 16#85 = Instanzdatenbaustein gelegt, was jedoch nicht funktioniert hat bzw. ich nicht weiß welche DB-Nr hier gefordert wird.
Hat jemand eine Idee wie ich diese Problematik lösen kann?
Hier ist mein aktueller Quellcode zum Lesen der Daten mit Hilfe eines globalen Datenbausteins.
Code:
LAR1 P##AnyPointer
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [ AR1 , P#0.0 ]
L W#16#7 //Typ 7 = DINT
T LB [ AR1 , P#1.0 ]
L 1 //Anzahl Bytes
T LW [ AR1 , P#2.0 ]
[B] L 1002 //Quell-DB 1002 = globaler DB[/B]
T LW [ AR1 , P#4.0 ]
L 0 //Anfang der Quelle
SLD 3
T LD [ AR1 , P#6.0 ]
[B]L B#16#84 //Speicherbereich (hier DB) 84 = DB / 85 = IDB[/B]
T LB [ AR1 , P#6.0 ]
...
CALL #MbClient01
REQ :=#xReq01
DISCONNECT :=0
MB_MODE :="MbKonfig".ModeOut01
MB_DATA_ADDR :="MbKonfig".Data_AddrOut01
MB_DATA_LEN :=1
DONE :=#xDone01
BUSY :=#xBusy01
ERROR :=#xError01
STATUS :=#wStatus01
MB_DATA_PTR :=[B]#AnyPointer[/B]
CONNECT :="MbKonfig".Connect01
Vielen Dank für eure Hilfe