Kopplung von Siemens SIMATIC SPS S1500 mit Modbus TCP/RTU für große Datenmengen: Beste Vorgehensweise und DB-Struktur?

mista

Level-2
Beiträge
137
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Liebe Community,ich stehe vor der Herausforderung, eine Siemens SIMATIC SPS S1500 mit Modbus TCP/RTU zu koppeln, und zwar für eine große Anzahl von Datenpunkten. Ich frage mich, wie man dabei am besten vorgeht, insbesondere in Bezug auf Coils, Input Register, Holding Register und Status Bits.

Bisher habe ich festgestellt, dass Siemens zwar Beispiele für kleinere Verbindungen zwischen einer 1500er und einer 1200er Steuerung bietet, aber nichts für komplexere Szenarien mit mehr als 2000 Datenpunkten. Gibt es vielleicht einen Baukasten oder bewährte Methoden, die mir hierbei weiterhelfen könnten?

Konkret bin ich unsicher, ob es sinnvoller ist, eine Instanz zu nehmen und die Parameter von Modbus\_Client zu ändern oder ob es besser ist, für jeden Aufruf eine neue Instanz zu erstellen. Zudem würde mich interessieren, wie die zugehörige DB am besten aufgebaut werden sollte, um die Effizienz zu maximieren und Fehler zu minimieren.

Ich wäre sehr dankbar für eure Erfahrungen, Ratschläge und Hinweise zu diesem Thema!

Vielen Dank im Voraus!
 
Bei RTU kannst du normalerweise nicht mehrere Instanzen gleichzeitig aktiv haben, von daher müsstest du mehrere Instanzen gegenseitig verriegeln, einfacher wird es dann üblicherweise eine Instanz zu verwenden und die zu lesenden/schreibenden Daten "umzuschalten". Bei TCP sind prinzipiell oft mehrere Zugriffe parallel möglich, das hängt aber wieder von mehreren Faktoren ab, im Zweifelsfall hat jedes Gerät andere Limits. Zudem ist je nach Leistung des Teilnehmers nicht sicher, ob es dann unterm Strich schneller wird, da kann auch das Gegenteil der Fall sein. Von daher bist du auf der sicheren Seite, wenn du immer sequentiell liest/schreibst.
Dann gilt generell: möglichst Daten kombinieren, es ist effektiver/schneller 5 Werte gemeinsam zu lesen/schreiben als 5 mal separat, selbst wenn da kleinere Lücken mit nicht relevanten Daten dazwischen liegen.
Generell würde ich empfehlen, einen passenden UDT zu bauen, davon ein Array anzulegen und dann das ganze in einer Schleife nacheinander abzuarbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für TCP würde das gehen:

IF #PLC_Operation THEN

#MB_Client_Instance(REQ := #Control.Request,
DISCONNECT := false,
MB_MODE := #Queries[#Control.Query_No].mb_mode,
MB_DATA_ADDR := #Queries[#Control.Query_No].mb_addr,
MB_DATA_LEN := #Queries[#Control.Query_No].mb_data_len,
DONE => #Control.State.done,
BUSY => #Control.State.busy,
ERROR => #Control.State.error,
STATUS => #Control.State.status,
MB_DATA_PTR := #Queries[#Control.Query_No].buffer,
CONNECT := #Connection);

IF #Control.State.done OR #Control.State.error THEN
#Control.Query_No += 1;
IF #Control.Query_No >= #No_Queries THEN
#Control.Query_No := 0;
END_IF;
END_IF;

#Control.Request := NOT #Control.State.busy;
END_IF;
 
Zurück
Oben