Modbus-Kommunikationsproblem

Spritkopp

Level-1
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen,

ich würde gerne Daten von meinem Wechselrichter in CoDeSys via Modbus einlesen und dort weiter verarbeiten.
Das Ganze soll mit einer Wago 750-880 umgesetzt werden, als Baustein habe ich mir den ETHERNET_MODBUSMASTER_TCP (WagoLibModbus_IP_01.lib) ausgesucht. Dank der Hilfe im CoDeSys-Thread steht die Kommunikation zur SPS.

Mein derzeitiges Problem ist, dass ich keinen Wert als Antwort erhalte, sondern einen Fehlercode 150 (Server not available) und da wurde mir im CoDeSys-Thread geraten mal hier nachzufragen.
Könnt ihr mir da weiter helfen?

screenshot1.jpg

Vielen Dank im Voraus
Spritkopp
 
Hallo,

setz mal die tCON_WATCHDOG, bei Dir die Variable DONE, hoch auf 2s. Was passiert dann? Die IP Adresse des Wechselrichters stimmt auch?

Dann setze auch erst einmal die wREAD_QUANTITY runter oder willst Du wirklich 100 Register auf einmal lesen?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Thruser,

danke für deine Antwort.
Ich habe deinen Rat befolgt, habe tCON_WATCHDOG auf 2s gesetzt und die wREAD_QUANTITY mal runter auf 15 und nachher auf 10 gesetzt, aber leider besteht der Fehler weiterhin.
Zur IP-Adresse des Wechselrichters: Die IP-Adresse ist von der sog. Webbox, die eine Gateway-IP besitzt. Dass ist nötig, da es sich um Zwei Wechselrichter handelt. Diese beiden Wechselrichter sind via Modbus (RS485) mit der Webbox verbunden.

screenshot2.jpg
 
Zuletzt bearbeitet:
Nach weiterem rumtüfteln bekomme ich nun einen Wert ausgelesen, mitdem ich jedoch leider nichts anzufangen weiß. Abgefragt wurde in diesem Fall die Netzspannung der ersten Phase. Egal welchen Funktionscode ich auswähle (z.B Seriennummer-Abfrage) bleibt die Dezimalzahl am ADR Baustein gleich.
Hat jemand noch eine Idee, wie ich den korrekten Wert auslesen kann?
scrrenshotUDP2.jpg
 
Hallo,

der Wert muß ja auch so bleiben. Das ist die Adresse wo das Array beginnt.

Versuche es mal mit awReceifeBuffer(0), da sollte Dein ergebnis stehen. Kannst Du auch ansehen wenn Du auf das kleine Pluszeichen oben in Zeile 3 klickst.

Bei der Adresse mußt Du wahrscheinlich auch noch 30001 oder 30000 abziehen. Das ist immer unterschiedlich implementiert.

Sonst auch mal die Doku unter modbus.org ansehen.

Gut ist es auch erstmal mit einem der dort aufgeführten Tools von einem Windows PC aus zu testen.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
in den Arrays bekomme ich leider keinen Wert angezeigt, die sagen alle von 1-99 den Wert 0.
Die Adresse 30057 habe ich mal als 57 und als 56 angegeben, bekomme aber trotzdem keine Antwort in Form eines Werts der beispielsweise meiner Seriennummer des Wechselrichters entspricht, nur den besagten TRUE-Ausgang :confused:
 
Hallo,

stell mal die Unit-ID auf 1.
Siehe Technische Beschreibung. Wenn es die SMA-Box ist.

http://files.sma.de/dl/2585/WEBBOX-MODBUS-TB-de-19.pdf

Ah. Sorry. Sehe gerade das ist die des Gateways.
Vielleicht mal versuchen:
Unit-ID auf 1 (Gateway !), Adresse 30057 auslesen --> Seriennummer der Webbox.
readQuantity auf 2 (Daten-Typ U32), im Index 0 und 1 des Array sollte dann die Seriennummer ausgelesen werden.
 
Zuletzt bearbeitet:
Die Seriennummer an Adresse 300057 ist sehr ungünstig zum Testen, da nur 2 Worte zur Verfügung stehen. Ob die die Register davor oder danach auch lesen kannst ist der Doku leider nicht zu entnehmen. Eventuel wird die Anfrage dann komplett ignoriert.
Versuche mal aus laufenden Registern zu lesen. Unit ID = 1 (Gateway) Adresse = 42109 oder 2109 Anzahl = 10 Modbusfunktion = 3. Sollte folgende Antwort liefern: 1 Wort Garät 1 ID, 2 Worte Seriennummer Gerät 1,1 Wort Unit ID Gerät 1, dann das selbe für Gerät 2, 3 ...

Vorrausgesetzt die oben verlinkte Doku ist auch dein Gerät
Holger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

1. bitte nich das gleiche Thema in zwei Threads weiterverfolgen. Das nächste Mal den Thread von einem Moderator verschieben lassen oder wenn ein zweiter Thread aufgemacht wird im ersten davon schreiben und bitten nur noch im zweiten zu antworten. Sonst wird alles doppelt gemacht/geschrieben.

2. wie mallrich schreibt am besten erstmal versuchen, ob die Kommunikation mit der Webbox richtig funktioniert, als ID 1.

3. dazu versuche es auch mal mit dem Program qModMaster von einem Windows PC aus. Da lassen sich auch die Adressen schneller testen und die Bytereihenfolge.

4. nach dem Link von mallrich wird die Adresse die Du angeben mußt wohl wirklich 30057 sein und nicht 56. Da wurde mal wieder falsch implementiert bzw. interpretiert. Modbus müßte eigentlich verboten werden.

Wenn Du bei qModMaster Slave Id=1, Function Code = 0x03 (Read Holding Registers) und Number of Registers = 2 angibst solltest Du die Seriennummer der Webbox erhalten.

Ansonsten solltest Du wirklich mal den Modbuskonfigurator zum Testen ausprobieren.

Gruß
 
Guten Morgen,
habe mich für den Modbus-Konfigurator entschieden und konnte das Problem lösen, dieser gab mir die korrekten Werte nach Anpassung der Byte-Register aus.

Vielen Dank für eure Hilfe
Spritkopp
 
Hallo Spritkopp,

Ich habe auch so meine Schwierigkeiten gehabt. Der Modbos-Konfigurator ist wesentlich einfacher zu handhaben.

Weiterhin viel Eerfolg.

Wolfgang
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo wolfi-sps,

das Auslesen klappt wirklich sehr gut wenn man einmal die richtige Byte-Reihenfolge gefunden hat.
Momentan beschäftige ich mich mit dem schreiben von Daten an die Webbox, dass scheint jedoch nicht ganz so simpel zu sein.
Bin mir unschlüssig, ob dies an der Webbox, oder an meinen Einstellungen in CoDeSys liegt. Ich habe eine Generische Variable hinzugefügt und als schreibend deklariert. Als Byte-Reihenfolge habe ich die selbe wie beim lesen genommen (B3, B4, B1, B2). Um dies zu testen, möchte ich eine Wirkleistungsbegrenzung (in %) vornehmen, die ich als Modbus-Addresse angegeben habe. Folglich deklariere ich während ich online bin 50 in die schreibende Variable. Aber leider ändert sich nichts an meiner Wirkleistung. Könnte mir vorstellen dass die Webbox eine Begrenzung nicht zulässt. Aber ist meine Vorgehensweise mit der deklaration so richtig?

Gruß
Spritkopp
 
Hallo Spritkopp,
Habe da noch nicht so viel Erfahrung.
Ist das die SUNNY WEBBOX?
Lässt die Webbox auch ein "schreiben" zu ? Must Du das freigeben bzw. ein PW setzen?
Bei meinem Kessel ist das schreiben intern gesperrt. Macht auch Sinn :)

Wolfgang
 
Hallo zusammen,
ich möchte das Thema nochmal gern aufgreifen, da ich immer noch keine Lösung gefunden habe.
Kurze Zusammenfassung: Ich möchte ein Programm entwerfen, mit dem ich meinen Wechselrichter über Modbus-Befehle anspreche und die Wirkleistung sowie den cosPhi-Wert ändere.
Ich bin auf Empfehlung des Herstellers von meiner Webbox abgestiegen und habe mir ein „Web-Connect“-Modul zulegt, das laut Herstellen meine Anforderung erfüllen sollte. Dazu habe ich die richtigen Modbus-Register erhalten.
Mit dem Programm „simply Modbus TCP client“ funktioniert das Schreiben der Wirkleistung auch einwandfrei. Dieselben Werte habe ich in mein CoDeSys 2.3 Modbus-Master Konfigurator übertragen. Leider fährt der Wechselrichter sofort von nach Programmstart auf 0W Wirkleistung, auch wenn ich in meiner Variabel beispielsweise 20% eingebe bleibt er trotzdem bei 0W. Ich habe bereits andere Byte-Reihenfolgen, Datentypen, Vorzeichen vor meinen Variablen und sonstiges probiert aber ich bin mit meinem Latein am Ende. Hersteller und auch die WAGO-Hotline konnten mir leider auch nicht weiterhelfen.
Das Schreiben von Daten via Modbus ist in der Weboberfläche des Web-Connect-Moduls freigegeben. (schließlich funktioniert es ja mit simply Modbus TCP client).
Das Lesen von Daten via Modbus funktioniert über den Modbus Master Konfigkurator weiterhin einwandfrei.

Ich würde mich freuen, wenn Ihr noch eine Idee habt, wie ich dieses Problem lösen könnte.

Vorab vielen Dank
Spritkopp
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

zeig doch mal einen Screenshot des Konfigurators und des Programmteils, wo Du die Werte setzst. Am besten während Du online bist.

Ansonsten müßtest Du die Kommunikation mal mitschneiden, z.B. mit wireshark. Da ist natürlich etwas umständlich, da Du den Verkehr der SPS über den Rechner umleiten mußt. Dann könntest Du die Daten, die die SPS sendet mit den Daten des „simply Modbus TCP client“ vergleichen.

Gruß
 
Danke für deine Antwort.
Hoffe so geht es´:

Ansicht Modbus Adresse:
Ansicht Modbus Adresse.jpg

Ansicht Kommunikation:
Ansicht Kommunikation.png

Ansicht Codegenerator:
Ansicht Codegenerator.png

Ansicht Programm mit eingegebener Variable (20%) die per Doppelklick auf "begrenzungP" eingegeben wurde (Das "%" wird automatisch nicht mit übernommen)
Ansicht Programm mit eingegebener Variable.png
 
Hallo,

im letzten Bild ist begrenzungP = 0 ! Du mußt mit F7 den Wert dauerhaft forcen oder mit Strg+F7 einmal schreiben. Bei letzterem sollte der Wert dann auch dauerhaft auf 20 wechseln. Falls er 0 wird, wird die Variable irgendwo anders überschrieben.

Das erstmal auf die Schnelle. Muß mir jetzt mal die neue Version installieren, da wenn ich es richtig mitbekommen habe der Konfigurator geändert wurde.

Gruß
 
Hallo zusammen,
ich muss euch nochmals um eure Hilfe bitten.
Das Auslesen und schreiben von Werten funktioniert ja mitlerweile manuell über den Konfigurator einwandfrei.
Nun möchte ich aber meine Variablen vom Konfigurator weiter in anderen Objekten benutzen und in eine Regelung einbinden.
Auf dem folgenden Bild ist unter „WirkleistungAktuell“ die derzeitige Leistung zu sehen, die der Wechselrichter generiert (dieser Wert ist Aktiv und schwankt kontinuierlich).

Modbus.png

Um zu kontrollieren, wie ich die Variable deklarieren muss, um diese verwenden zu können, habe ich ein GT-Baustein gesetzt und geguckt, ob dieser mir ein TRUE ausgibt. Dies ist leider nicht der Fall.

Baustein.png

Durch einen Kollegen habe ich erfahren, dass vor der Variable „MBCFG“ stehen muss, aber nach vielen herumprobieren bin ich auch da zu keinem Ergebnis gekommen.

Des Weiteren stellt sich mir die Frage, wie ich nachfolgend das ständige manuelle forcen umgehen kann, sodass die Regelung selbstständig bei überschreiten eines Werts dem Wechselrichter eine Wirkleistungsbegrenzung schreibt. Gibt es hierfür einen Baustein?

Würde mich freuen, wenn Ihr mir nochmals weiterhelfen könntet.
Vielen Dank im Voraus.

Mit freundlichen Grüßen
Spritkopp
 
Hallo,
im Baustein für die Variable "WirkleistungAktuell" einfach EINTIPPEN: MBCFG_UnidlD3 - jetzt "." eintippen - und dann aus dem Pulldown-Menü die passende Variable auswählen.
 
Zurück
Oben