TIA Holding Register bei S7-1200 als Modbus Server/Slave

TIAnoob93

Level-2
Beiträge
10
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe schon Beiträge gemacht wo es im Prinzip um das selbe Thema ging.

Ich nutze eine S7-1200 die als Modbus Client zum auslesen und schreiben von Registern mittlerweile schon erfolgreich.
Der nächste Schritt ist die Nutzung als Server, speziell möchte ich einen Siemens Sentron PAC2200 "imitieren" und so manipulierbar machen. Der findet bei uns im Betrieb viel Anwendung und wäre deshalb sehr Hilfreich. Das offizielle Dokument zum Sentron habe ich, da habe ich aber noch Probleme mit dem Verständnis was die Register angeht. Das habe ich dann verworfen und bin die Sache anders angegangen.

Ich nutze das offizielle Modbus TCP Demo Programm von Siemens
Darüber habe ich erstmal die Grundeinstellungen für einen Modbus Server/Slave eingestellt und unser Client sieht diesen auch. Das Problematische sind die Werte. Da ich Verständnisprobleme mit der Sentron Anleitung hatte habe ich einfach über Wireshark den Modbus verkehr zwischen den beiden überwacht um einfach abzulesen was den unser Client genau erwartet.
Hier werden im Wechsel 3 verschiedene Anfragen gestellt:
Read Holding Register (Function Code 4): Register Number 1, Word Count 67 (Register 1-67 werden ausgelesen)
Read Holding Register (Function Code 4): Register Number 801, Word Count 4 (Register 801 und 802 werden ausgelesen)
Read Holding Register (Function Code 4): Register Number 209, Word Count 2 (Register 209 und 210 werden ausgelesen)

Ich bekomme immer die gleichen Antworten.
1. 67 mal den Wert 0
2. Illegal Data Adress (2) (das hängt denke ich mit der Größe der Register zusammen da diese jeweils einen 2 Word Count aufweisen sollten)
3. 2 mal den Wert 0

Ausprobiert habe ich folgendes:
1.
Der FB ModbusServer hat grundsätzlich als dataBuffer das HoldingRegisterWrite. Das ist Standardmäßig ein Array of Word von 0-5000.
Egal ob ich die Register beschreibe oder nicht, die Antworten sind wie oben beschrieben.

2. Der Function Code 4 ließt ja ein Holding Register aus. Nach dieser Anleitung wären das die Speicherbereiche 40001-49999. Deshalb habe ich das Array of Word einmal auf diesen Speicherbereich geändert und einmal auf den Speicherbereich 30001-39999. Das Ergebnis bleibt wie oben, obwohl die passenden Register beschrieben waren (40001-40068, 40802...usw). Bei dem 30001er Bereich das selbe Ergebnis.

3. Die Zuweisung des Funktionsbausteins leicht verändert. wie schon gesagt gibt die InOut Variable dataBuffer hier die Zuweisung auf den Datenbaustein. Hier habe ich ausprobiert als Zuweisung die Erste Stelle des Arrays ("HoldingRegisterWrite".holdingRegister[40001]), als auch das Array ohne direkte Zuweisung eines Registers ("HoldingRegisterWrite".holdingRegister). Beides Ohne Erfolg.
Was mir gerade einfällt, würde "HoldingRegisterWrite".holdingRegister[] ggf, funktionieren? Werde ich heute Abend mal ausprobieren.

Ich habe mittlerweile das Gefühl das mein Grundverständnis dieser Registersache mit Modbus TCP bei mir irgendwie harkt. Das beschreiben und ablesen als Modbus Client funktioniert wunderbar aber als Server harkt es.

WIe gehe ich es also richtig an dass die Werte passen? Ist Array of Word die falsche Herangehensweise und bräuchte ich eher ein Struct um verschiedene Datentypen abzubilden? Muss ich z.B. für die Register 801 und 802 dann einen anderen Datentyp verwenden? Aktuell nutze ich nur den Datentyp Word und werte im Hexadezimalen Bereich.

Ich bin um jeden Denkanstoß dankbar. Ich komme leider von der Lehre her aus einem ganz anderen Bereich (Handwerk) und versuche mir das gerade Schritt für Schritt zu erarbeiten. Ich habe bereits Schulungen auf udemy zu RTU und TCP gemacht, werde da aber am Wochenende nochmal reinschauen und dabei speziell auf die Dinge achten die vielleicht mit meinem Problem zusammen hängen.

Vielen Dank für eure Hilfe, bisher konnte ich mit meinen Anfänger Fragen hier immer tolle Ergebnisse und Antworten bekommen. So macht das Lernen Spaß.
 
Zuletzt bearbeitet:
Zurück
Oben