# Modbus-Kommunikationsproblem



## Spritkopp (15 August 2016)

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?




Vielen Dank im Voraus
Spritkopp


----------



## Thruser (15 August 2016)

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ß


----------



## Spritkopp (16 August 2016)

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.


----------



## Spritkopp (16 August 2016)

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?


----------



## Thruser (16 August 2016)

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ß


----------



## Spritkopp (16 August 2016)

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


----------



## mallrich (16 August 2016)

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.


----------



## holgermaik (16 August 2016)

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


----------



## Thruser (16 August 2016)

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ß


----------



## Spritkopp (18 August 2016)

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


----------



## wolfi-sps (18 August 2016)

Hallo Spritkopp,

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

Weiterhin viel Eerfolg.

Wolfgang


----------



## Spritkopp (18 August 2016)

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


----------



## wolfi-sps (18 August 2016)

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


----------



## Spritkopp (2 September 2016)

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


----------



## Thruser (2 September 2016)

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ß


----------



## Spritkopp (2 September 2016)

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

Ansicht Modbus Adresse:



Ansicht Kommunikation:



Ansicht Codegenerator:



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


----------



## Thruser (2 September 2016)

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ß


----------



## Spritkopp (2 September 2016)

Es lag an der falschen Byte-Reihenfolge. Jetzt funktioniert es.
1000 Dank für eure Hilfe.


----------



## Spritkopp (7 September 2016)

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).




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.




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


----------



## Peter-Pan (7 September 2016)

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.


----------



## Thruser (7 September 2016)

Hallo,

wie Peter-Pan geschrieben hat. Siehe PLC_PRG. 





Hier wird bei setzen eines Eingangs an der 881 ein Ausgang an der 881 und am 352 gesetzt.

Achtung, kann sein das PLC_PRG nicht mehr automatisch aufgerufen wird und als weiterer Task definiert werden muß. Weiß ich nicht mehr so genau. Das Beispiel habe ich vor einiger Zeit getestet mit einer 881 und und einem Koppler 352 für Remote I/O.





Gruß


----------



## Spritkopp (8 September 2016)

[Dieses Problem wurde geklärt während weitere Antworten folgten.
Siehe unten]


----------



## Thruser (8 September 2016)

Hallo,

zeige mal bitte Deine Taskkonfiguration.

Wenn man verschiedene Tasks hat, muß man festlegen, welcher Task beim Debuggen verwendet/beobachtet werden muß. In der Taskkonfiguration, links im Baum mit rechter Maustaste auf den Task und dann Debug Task festlegen wählen.

Gruß


----------



## Spritkopp (8 September 2016)

Hallo zusammen,

ich danke euch für eure Hilfe, nun bekomme ich auch ein Ergebnis angezeigt.
Anhang anzeigen 33930

@Thruser wie du bereits geschrieben hast war es nötig dafür ein neuen Task zu erstellen.


Nun zu meinem letzten Punkt:
Die Variable "begrenzungP_in_Prozent" wird im Programm durch eine  Kennlinie ermittelt. Die Kennlinie ist aktiv und ändernt sich  kontinuierlich durch Spannungsschwankungen, somit ändert sich auch der  Wert der oben genannten Variable stetik.
Dieser sich ständig ändernde Wert soll automatisch immer an den  Wechselrichter gesendet werden der die Wirkleistung aktualisiert. Bisher  war es immer notwendig den Wert vorher zu forcen damit der  Wechselrichter diesen Wert umsetzt. 
Kann ich es umgehen, den Wert manuell zu forcen und diesen Schritt automatisieren?

_________________________________________________________________________________________________________________________________________________________________
*Edit:

*Nach einigem herumprobieren läuft es nun.
Um den Wert variabel zu halten und nicht immer geforct werden muss (außer einmal zu Begin), habe ich eine Rechnung als endschritt vor meine ausgangsvariable "MBCFG_UnidID3.begrenzungP_in_Prozent" gesetzt. Zu Begin muss ich den Wert 100 forcen, da sonst die Variable mit 0 initialisiert wird, und der Wechselrichter komplett heruntergefahren wird (dauert ein wenig, bis dieser wieder hochgefahren ist). Danach muss ich dass forcen aufheben und  dann bleiben die Werte variable.
Auch wenn es vielleicht eine Schwergeburt mit mir war :lol:, möchte ich mich nochmals bei allen die mir geholfen haben bedanken. Ein besonderer Dank gilt dabei Thruser für sein großes Interesse mir zu helfen.
Gruß
Spritkopp


----------

