TIA S7-1200 Modbus

Stefan3107

Level-1
Beiträge
21
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, bitte um Eure Hilfe.

Ich versuche schon seid einigen Tagen meinen PV-Wechselrichter Fronius Symo mit einer s7 1200 über Modbus zu verbinden, leider bekomme ich keine Daten.
Kann jedoch die Register über Android sowie PC auslesen, nur mit der SPS klappt es nicht.
Habe momentan zwei PLC miteinander über PUT und GET verbunden, die eine ist eine 3.0 Version die andere eine 4.1 Version. Da die MB Clienten bei verschiedenen Versionen unterschiedlich sind habe ich es auch auf beiden PLC probiert, leider wie gesagt ohne Erfolg. Im Status bekomme ich jedoch abwechselnd 7005 7006 und dann kurz wieder ein Error.
Habe auch schon eine Verbindung zwischen zwei anderen PLC Versuchsweise gemacht, da funktionierte alles.

LG Stefan
 
Hallo
Leider funktioniert es immer noch nicht, vielleicht kann mir doch noch wer helfen.
Mit dem Programm ModbusMaster am PC kann ich problemlos auf meinen Wechselrichter zugreifen, und auch die Register auslesen.
Mit meiner S7 1200er eben nicht. Ich habe mal Bilder von meinen Einstellungen gemacht.
Jetzt (es ist finster) ist der WR in standby, und am Status habe ich 7002 ( Zwischenaufruf. Verbindung wird aufgebaut.) was logisch für mich ist, er antwortet ja nicht auf die Modbusanfrage.
Fehler jetzt:
180C4Temporärer Kommunikationsfehler: Die Schnittstelle empfängt gerade neue Parameter oder die Verbindung wird gerade aufgebaut bzw. das H-System befindet sich im Ankoppeln und Aufdaten.

Und im Tagbetrieb eben Error....
838302Fehler beim Lesen oder Schreiben der Daten oder Zugriff außerhalb des Adressbereichs von MB_DATA_PTR.
Der Fehler kann sowohl lokal als auch bei der Anweisung "MB_SERVER" auftreten.

Baustein_MB.jpg
Baustein_FC.jpg
Baustein_MB1.jpg

Hat wer eine Idee was ich da übersehen habe?

Danke für Eure Hilfe LG. Stefan
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Als erstes solltest du da mal ein ARRAY OF WORD platzieren, aus einem globalen DB ... dann nochmal schauen.
Wenn du ein einzelnes Merkerwort verwenden willst dann musst du das vermutlich als PTR übergeben, also im Stile P#M10.0 WORD 1

Mfg
Manuel
 
Habe ich schon alles probiert DB mit Array und Baustein Attribute Hacken raus... es will einfach nicht.
Schon langsam glaube ich Modbus ist nicht gleich Modbus.

LG
 
Hallo Gemeinde

Hätte zu meinen Problem nochmals eine Frage:
Warum sendet die SPS am Modbus wenn ich Register 40083 eingebe nur die 83 aus?
Im Bild habe ich mit einen Modbustestprogrmm dies gemacht und da ist dies ersichtlich bei receive steht nur 52HEX für 82, und nicht HEX9C92 für 40082.
Kann ich da etwas Ändern? Oder kann ich es irgendwo in der SPS sehen was dort ausgegeben wird, den Empfangenen Wert sehe ich ja im MB_Client DB unter
TEMP.DATA.

Danke Stefan

Modbus2.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin über das Forum auf Stefan gestoßen, und hab ihn per PN angeschrieben. Herzlichen Dank an Stefan, der mir mit viel Zeitaufwand per Mail und Telefon geholfen hat, die Abfrage vom Fronius Symo zu schaffen.
Damit es der nächste der das versucht leichter hat, schreib ich hier die Besonderheiten rein.

Fronius stellt die Wechselrichterdaten ab Holdingregister 40070 zur Verfügung. Grundsätzlich wäre mit dem "MB Client" der S7-1200/1500 bei TCP Abfrage keine Eingabe einer "Unit ID" erforderlich. Allderdings hat der Wechselrichter Nach dem "TCP Netz" ein "RTU Subnetz", was die Eingabe der richtigen ID zwingend erfordert. Sonst geht nix.

Diese läßt sich aber nicht beim "MB Client" eingeben, sondern muß beim vom "MB Client" erzeugten Baustein (im Beispiel unter Systembausteine/Programmressorcen: MB_Fronius_Lesen, MB_Fronius_SM_lesen) eingeben werden. Im konkreten Fall "1" für den Fronius selbst, und "240" bzw. "F0" für das Fronius Smartmeter, welches mit dem Fronius im RTU Subnet verbunden ist.

Die zweite Besonderheit ist, das die Holdingregister nicht mit 40070 sondern mit 440070 abgefragt werden müssen. Diese Einstellung passiert aber beim "MB Client" Baustein.
Dann wurden noch die Timeouts verändert, wobei ich das nicht mehr überprüft habe, ob es mit den original Werten auch geht.

Da hier zwei "MB Clients" für die zwei ID Abfagen verwendet werden, brauchen die zwei "MB Clients" in der TCP Verbindungseinstellung verschiedene Connection IDs. (Einstellung beim MB Client Baustein).

Im Anhang die Bilder:

DB_Fronius.jpg Systembausteine-Programmressourcen-MB_Fronius..markiert.jpg FC_Fronius.jpg
 
Hallo,

hätte vielleicht jemand ein Beispielprogramm für die Kommunikation zwischen Fronius Symo und s7-1200. Würde das gerne mal ohne viel Aufwand probieren.
Vielen Dank schon mal.
 
Hallo
Ja kann ich machen, welche Version von der 1200er hast du? Bei den neueren sind die Modbusbausteine anders.
Und Mailadresse oder so.
LG Stefan
 
Hallo Stefan.

hast du schon was gechickt? Hab noch nix bekommen und hätte jetzt am WE Zeit mich damit zu beschäftigen.
Danke
Lg Mike
 
Hallo JoGi65,

Vielen Dank für deine Hinweise, habe lange versucht, erst mit einer Logo8 und jetzt dann doch mit einer S7-1200, eine Verbindung Modbus zum Fronius WR und Smart Meter herzustellen. Dank deines Beitrages ist es jetzt auch gelungen.
Jetzt zu meinem Problem, habe jetzt Werte im DB, die aber nicht mit den Werten aus dem Smart Meter übereinstimmen. Muss da noch was sklaliert werden?
In meinem Fall will ich den Wert auslesen, die Leistung die ich abzüglich vom Eigenverbrauch ins Netz schiebe.
Finde nicht das richtige Register. Hast du da vielleicht eine Idee.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann am Abend nachschauen.
Denke es ist 40088 (440088 ) und Skalierung für den Wert ist 40092 (440092) vom Smartmeter. Im Smartmeter Modbus Protokoll ist die Berechnung sicher beschrieben.
 
Hallo,

Wenn Du das genau so programmiert hast, schaut die Zeile für die vom Smartmeter gemessene Leistung so aus:

Code:
// Wenn neue Daten vom Smartmeter kommen, diese aufbereiten
IF "DB_Modbus_SM_lesen".Ausgang_Takt_REQ = TRUE THEN
            
            "DB_Fronius".SM.P_W_G := ROUND(INT_TO_REAL("DB_Modbus_SM_lesen".Holdingregister[18]) * 10 ** INT_TO_REAL("DB_Modbus_SM_lesen".Holdingregister[22]));

END_IF;

"DB_Fronius".SM.P_W_G - ist dann die gesamt Leistung - Bezug oder Einspeisung und der Code für die Webseite die den Wert aufbereitet schaut so aus:

Code:
//Smartmeter und Haus Werte färben
jQuery.fn.farbeSM = function () {
if ($(this).html() < 0) {
		var color = "#00cF00";
		var Text = parseInt($(this).html());
		$(this).html(Text * -1);
		var Richtung =('Einspeisung ');
	} else if ($(this).html() > 0) {
		var color = "#cF0000";
		var Text = parseInt($(this).html());
		$(this).html(Text);
		var Richtung =('Netzbezug ');
	} else {
		var color = "#ffffff";
		var Text = parseInt($(this).html());
		$(this).html(Text);
		var Richtung =('Netzbezug ');
	}
	$("#Netzbezug").html(Richtung);
	$(this).css({"color": color});
	return ($(this));
}
 
Super, dann funktioniert es eh schon.
Das javascript Zeugs war nur, falls Du es auf einer Webseite anzeigen willst, zum Text- und Farbe ändern, zwischen Einspeisung und Bezug so wie hier:

05-Energie Fronius-500.jpg

wo die Farbe der Anzeige bei Bezug und Einspeisung zwischen rot und grün wechselt, oder hier,

01-Index-500.jpg

wo noch der Text zwischen Netzbezug und Einspeisung mitwechselt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gib mir mal noch einen Tipp. Ich habe jetzt die Real Zahl. Wie bekomme ich da noch einen richtigen wert raus?

Die Zahl die in "DB_Fronius".SM.P_W_G steht, sollte die Summenleistung in Watt am Smartmeter sein.
Das ist der Wert! Siehe Bild-oberster Wert - momentaner Bezug in Watt.

Smartmeter.jpg

Edit: Ist vielleicht ein Register verschoben?
 
Zuletzt bearbeitet:
Du hast nochmal ein Extra DB erstellt und dann in einem Struct (Real). Ich habe dein SCL Netzwerk in eine Zeile in DB geschrieben. Wahrscheinlich muss ich da noch ne Struct draus machen.
 
Wie die Bezeichnung von dem Ausgabewert ist und in welchem DB er steht ist egal. Das hat auf das Ergebnis keinen Einfluß. Die richtigen Register sind wichtig.

Bei Dir heißt es halt:

Code:
"DB_Modbus_Fronius_SM_lesen".P_W_G := ROUND(INT_TO_REAL("DB_Modbus_SM_lesen".Holdingregister[18]) * 10 ** INT_TO_REAL("DB_Modbus_SM_lesen".Holdingregister[22]));

Edit: Ich hab es nur wegen der Übersichtlichkeit in einem eigenen DB.
 
Zuletzt bearbeitet:
Zurück
Oben