TIA S7-1200 Modbus RTU Fragen zur Kommunikation

themasterchris

Level-2
Beiträge
73
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich hätte hier ein kleines Problemchen mit einer S7-1200 und einer Modbus RTU Kommunikation. Und zwar möchte ich Energiedaten an einen Anbieter senden. Nun ist meine Frage, auf welches Register ich hier richtig senden und empfangen kann. Leider finde ich das bei der Modbus Kommunikation immer sehr schwierig oder ich begreif es einfach nicht 🙈

Hier mal ein Auszug aus dem Datenblatt, was der Anbieter möchte:

Bus-ProtokollModbus-RTU
Baudrate9600 Baud
Datenbits8
Stoppbits1
Paritätkeine

Format der Messwerte32Bit, FLOAT nach IEEE 754
Spannung L1-L2[kV]
InReg 4360
[kV]
InReg 4362
Spanung 1311[kV]
InReg 4364
Wirkleistung[kW]
InReg 4884
Blindleistung[kvar]
InReg 4886

Messgerät:
Modbustyp Slave
Modbus-Adresse 1


Jetzt wäre meine konkrete Frage, wie krieg ich die Daten in die Register?

Wäre schön, wenn ihr mich hier ein bisschen unterstützen könntet.

Vielen Dank schon mal.
LG Chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
TIA Hilfe zu MB_MASTER, oder Kapitel MODBUS (RTU)
da ist auch ein Beispielprogramm für einen Modbus-Master

zwei Sendeaufträge abwechselnd (z.B. mit Schrittkette):
- Sendeauftrag 1: 6 Register ab Register 4360 (bis 4365)
- Sendeauftrag 2: 4 Register ab Register 4884 (bis 4887)
 
Danke erst einmal für die wirklich schnellen Antworten. Soweit so klar. Das Beispielprogramm daran hab ich mich auch gehalten und es so umgesetzt. Was mir jedoch nicht klar ist mit den Registern senden. Sprich lege ich mir einen DB an mit Real oder DINT und sende die dann? Da häng ich eigentlich. Sprich wenn ich 6 Real Zahlen hab wie ich die dann in die Register 4360 - 4361 krieg. Oder denk ich zu kompliziert?
 
Du denkst zu kompliziert. Und Hilfe lesen hilft anscheinend auch nicht viel?
Kurz: erstelle ein ARRAY of REAL oder ein STRUCT mit (mindestens) 3 aufeinanderfolgenden REAL in einem DB mit Standard-Zugriff und verschalte dieses Array oder Struct am Parameter DATA_PTR vom MB_MASTER und sende zu den Registern 4360 bis 4365.

1 Modbus-Register ist ein 16-Bit-Word. 32-Bit-Datentypen belegen 2 aufeinanderfolgende Register.
"Spannung L1-L2" soll ein FLOAT-Wert = REAL-Wert sein ab Register 4360 - belegt also die Register 4360 + 4361.
Du könntest also eine REAL-Variable zu den 2 Registern 4360 .. 4361 senden, oder gleich 3 aufeinanderfolgende REAL-Variablen (Array oder Struct) zu den 6 Registern 4360 .. 4365 senden.

MB_MASTER Auftrags-Parameter:
MODE : 1 oder 2
DATA_ADDR : 4360 + 40000 = 44360 (oder + 40001 ? ausprobieren!)
DATA_LEN : 6
DATA_PTR : ein Array oder Struct mit (mindestens) 3 REAL-Werten
 
Dann musst du die Anweisung Modbus_Slave verwenden und einen Modbus-Halteregister-DB erstellen und die Werte in die Adressen der gewünschten Register schreiben. Siehe auch noch die Variable HR_Start_Offset im Instanz-DB von Modbus_Slave.
Man kann schön faul den Modbus-Halteregister-DB als Array of Word deklarieren und muss dann bei jedem Wert, den man in den Register-DB schreibt, den jeweiligen Datentyp (z.B. REAL) in Words splitten und auf die Words mappen (REAL_TO_DWORD. dann 2x DWORD_TO_WORD und die Words kopieren) oder man erstellt den Register-DB in der gewünschten Struktur und kopiert einfach die aktuellen Werte der Variablen in den Register-DB.
 
Umso mehr ich darüber lese umso schwieriger wird es irgendwie für mich 🙈😔

Also ich hab mir jetzt einen DB angelegt (SlaveData) dieser hat ein Array mit 5 Elementen als Real. Somit würde ich meine Spannungswerte L1-L2, L2-L3 und L3-L1 einfach kopieren, da es ja ebenfalls Reals sind. Dann würde ich Wirkleistung in Element 4 und Blindleistung in Element 5 kopieren.

Dann wären meine Daten schon mal am Modbus-Slave Baustein. Mit dem HR_Start_Offset kapier ich leider überhaupt nicht. Aber hab in der Hilfe was gefunden zwecks: "Zugriff auf Datenbereiche in DB's anstelle des direkten Zugriffs auf Modbus-Adressen"

Hier wäre es laut Erklärung so wenn ich folgendes angebe:
data_type = 3, db = 1, start 4360, length = 6

Somit würde folgendes passieren: Die Holding Register (data_type =3) werden im Datenbaustein 1 (was mein SlaveData Datenbaustein ist) abgebildet. Die Modbus-Adresse 4360 (start=4360) befindet sich an Datenwort 0. Die letzte gültige Modbus-Adresse 4365 (length = 6) befindet sich an Datenwort 5.

Wäre das soweit korrekt? Bzw geht das so?

Und wenn ja müsste ich dann für den zweiten Bereich noch mal einen Extra Modbus-Slave Baustein-Aufruf inkl DB generieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah ok ich glaub jetzt check ich den HR_Start_Offset. Wenn ich bei HR_Start_Offset 4360 eintrage, dann liest er auf Adresse 4360 das MW100. Dann müsste ich ja auf das MW100 meine Daten kopieren, sodass es funktioniert richtig?
 
Nein, ganz falsch.
Weil dein Partner "freundlicherweise" auf so blöden Registernummern die Informationen lesen will, müsstest du (sinnfrei) ein Array mit ca. 528 Words anlegen, nur damit er 5 Werte daraus lesen kann: die Register 4360 bis 4365 und 4884 bis 4887. Besser du gibst vor, dass die 5 Werte direkt nacheinander liegen und machst den Halteregister-DB nur so groß wie nötig.

Für MB_SLAVE ist das erste Word im Halteregister-DB das Register mit der Nummer aus HR_Start_Offset, und nummeriert die Words im Halteregister ab dieser Nummer.
Für die Register 4360 bis 4365 und 4884 bis 4887 könntest du Minimum ein Array [4360..4887] of Word anlegen und HR_Start_Offset = 4360 festlegen (oder vermutlich HR_Start_Offset = 44360 oder 44361 ? ). Dann kopierst du
"Spannung L1-L2" (REAL) in DB_Hold.Register[4360] + DB_Hold.Register[4361]
"Spannung L2-L3" (REAL) in DB_Hold.Register[4362] + DB_Hold.Register[4363]
"Spannung L3-L1" (REAL) in DB_Hold.Register[4364] + DB_Hold.Register[4365]
"Wirkleistung" (REAL) in DB_Hold.Register[4884] + DB_Hold.Register[4885]
"Blindleistung" (REAL) in DB_Hold.Register[4886] + DB_Hold.Register[4887]

PS: ich habe mit dem MB_SLAVE noch nie gearbeitet. Ich weiß jetzt nicht, wie man die MB_SLAVE-Anweisung einstellt, damit der Partner nicht in den SPS-Ausgängen Ax.y und Eingängen Ex.y rumschmieren kann... das sollte unbedingt erforscht und abgestellt werden.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal ein Auszug aus dem Datenblatt, was der Anbieter möchte:

Bus-ProtokollModbus-RTU
Baudrate9600 Baud
Datenbits8
Stoppbits1
Paritätkeine

Format der Messwerte32Bit, FLOAT nach IEEE 754
Spannung L1-L2[kV]
InReg 4360
[kV]
InReg 4362
Spanung 1311[kV]
InReg 4364
Wirkleistung[kW]
InReg 4884
Blindleistung[kvar]
InReg 4886

Messgerät:
Modbustyp Slave
Modbus-Adresse 1
Hast du schon einmal probiert mit einem Modbus Tool die Register anzubieten oder zu schreiben, nach deiner Beschreibung ist mir nicht ganz klar wer nun der Master oder der Slave ist. Es gibt ja Master und Slaves, mit denen man auf dem PC die Kommunikation vortesten kann.
 
also bei mir funktioniert schon der Modbus_Comm_LOAD nicht. Sprich hier müsste ja ein Done kommen aber es tut sich gar nichts und der Status bleibt bei 7000 stehen. Wenn ich einen Request mit einem Merker setze tut sich am Baustein aber nichts, sprich es kommt kein Error und auch kein Done. Woran liegt das
 
1. Stimmt die Physik? Leitungen etc.
2. Wie hast Du die Hardware konfiguriert?
3. Was hast Du im DB des Modbus_Comm_load definiert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@themasterchris Das beantwortet die Frage ja nicht. Wenn man über die Tools vortestet, dann weiss man dann zumindest was man für den Modbus selbst genau machen muss damit die Kommunikation funktioniert, und als zweites muss man dann nur noch die Ansteuerungsproblematik der Siemens Bausteine lösen. Es sind meiner Ansicht nach in deinem Fall eben sehr viele offenen Punkte zu lösen was es dann über das Forum schwierig macht konkret alle Punkte durchzugehen, auf die es ankommt. Wenn beim Datenblatt steht
Messgerät:
Modbustyp Slave
Modbus-Adresse 1
dann brauchst du auf der SPS Seite einen Master sprich man kann mit einem Modbus Master Tool testen welche Funktionscode mit welchen Parametern funktionieren.

Zum Modbus_Comm_LOAD ist hier der Übergabeparameter MB_DB korrekt mit dem Daten des MB_Master oder MB_Slave verbunden.Unbenannt.JPGHier ein Beispiel einer 1500 er SPS.
 
Also kurze Erklärung dazu. Wir haben auf der anderen Seite eine Steuerung die bei uns Daten auslesen möchte. Modbus Adresse 1 sind wir. Hier sollen dann Daten zur Verfügung gestellt werden. Leider Bekomme ich nun am Modbus Slave die Fehler 81EA und 81E2 im Wechsel.
 
So habe nun leider das Problem, dass mein Modbus-Baustein sagt Fehler 8280.
Aus der TIA Hilfe:
16#8280 Negative Quittung beim Lesen des Moduls
• Überprüfen Sie die Eingabe am Parameter PORT
• Setzen Sie vor dem 1. Aufruf den Parameter COM_RST

Vielleicht fängst du am besten nochmal ganz vorne an und lieferst uns genaue Informationen:
Welche TIA Version verwendest du?
Welche S7-1200 verwendest du? Welche Firmware-Version hat die?
Genau welches Kommunikationsmodul verwendest du in deiner S7-1200?
Steckt das Modul an der zentralen S7-1200 oder in einem dezentralen Gerät (z.B. ET200..)? Wo genau?
Ist das Modul korrekt in der Gerätekonfiguration projektiert?
Welche "HW-Kennung" hat das Modul in der Gerätekonfig?
Wie sieht dein Aufuf der Anweisung Modbus_Comm_Load aus?

Soll deine SPS Modbus-Master oder Modbus-Slave sein? Wer ist der aktive Part bei der Kommunikation? Deine SPS oder der "Anbieter"?
Welche Kommunikationsanweisung verwendest du: Modbus_Master, Modbus_Slave, MB_MASTER, MB_SLAVE?
Was ist das im Beitrag #1 erwähnte "Messgerät / Modbustyp Slave / Modbus-Adresse 1"?
Wenn da mehr als 2 Modbus-Geräte im Spiel sind, dann am besten mal eine Skizze des Aufbaus zeigen.

Wie ist die Kommunikationsleitung verdrahtet? Falls RS485: hast du mal testweise bei einem Teilnehmer die Leitungen A und B vertauscht?


also bei mir funktioniert schon der Modbus_Comm_LOAD nicht. Sprich hier müsste ja ein Done kommen aber es tut sich gar nichts und der Status bleibt bei 7000 stehen. Wenn ich einen Request mit einem Merker setze tut sich am Baustein aber nichts, sprich es kommt kein Error und auch kein Done.
Wird das Programm mit dem Modbus_Comm_Load auch ausgeführt? (SPS in RUN, Programmcode auch aufgerufen?)
Tipp: gib Error und Done mal auf zwei Zähler und schau, b sich der Zählerstand ändert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aus der Siemens Hilfe.
Fehlermeldungen (S7-1200, S7-1500)
16#81E2Telegramm abgebrochen: ZeichenrahmenfehlerÜberprüfen Sie die Einstellungen für Startbit, Datenbits, Paritätsbit, Datenübertragungsgeschwindigkeit und Stoppbit(s).
Fehlermeldungen (S7-1200, S7-1500)
16#81EAModbus-Telegramm zu kurz (nur Kommunikationsmodule, die Modbus unterstützen)Unterschreitung der Minimallänge des Modbus-Telegramms. Überprüfen Sie den Kommunikationspartner.

Das klingt nach Problemen in der seriellen Übertragung, Verdrahtung, Länge des Kabels RS232 RS485, Baudrate, Parity?
 
Also ich habe nun mal das Beispielprojekt von Siemens oben einspielt.
Folgendes ist verbaut:
S7-1214 (6ES7 214-1AG40-0XB0)
CM1241 verbaut
TIA V17
HW-Kennung: 262

Wie gesagt ist einfach das oben genannte Beispielprogramm von Siemens und hier die Slave Variante. Dort wurde nur die CPU gegen die S7-1214 getauscht und danach eingespielt
 
Welches genau? RS232 oder RS485? Welche Schnittstelle hat der Partner? Wie ist verdrahtet?
Wie sieht dein Aufuf der Anweisung Modbus_Comm_Load aus?
Welche Kommunikationsanweisung verwendest du: Modbus_Master, Modbus_Slave, MB_MASTER, MB_SLAVE?

Schreib ruhig mal ein paar mehr und vollständige Informationen - du willst hier Hilfe haben ...
 
Zurück
Oben