# Modbusfunktion ausführen?



## PLVSPOL (13 Oktober 2015)

Hallo,

ich möchte über einen 750-880 Controller die DO's eines weiteren 750-880 Controllers per Ethernetkabel auslesen.
Nach dem durchlesen der WAGO Anwendungshinweise verliere ich etwas den Überblick über Modbus UDP, RTU, TCP/IP etc...
Eine generelle Frage: Ist die Verwendung der Modb_I05.lib für mein Vorhaben richtig?

Ein weiteres Problem: der Baustein MODBUS_EXTENDED_MASTER benötigt in der Struktur ExtQuery die Daten für die Modbus-Anfrage. Wo genau kann ich diese Daten (SlaveAdress, FunctionCode usw.) eintragen?

Letzte Frage: Ich habe öfter gelesen (bzw. es so interpretiert), dass die WAGO-Controller von Haus aus quasi eine Modbus-Slave-Funktion besitzen. Muss ich den auszulesenden Controller jetzt noch mit einem Slave-Baustein programmieren, oder nicht?


----------



## Nost (13 Oktober 2015)

In der neusten Codesys Version von Wago gibt es einen Modbus Konfigurator damit erstellst du spielend leicht die Kommunikation. 
In dem Slave Controller musst du die Variabeln die du übermitteln willst nur so deklarierern das sie in einem bestimmten Merker bereich liegen. Dann kannst du sie auslesen. Gibt eine PDF die das erklärt von Wago


----------



## .:WAGO::015844:. (13 Oktober 2015)

Hallo PLVSPOL,

für die Kommunikation zwischen zwei Wago Geräten per Ethernet wird Modbus UDP (Verbindungslos) oder Modbus TCP (Verbindungsorientiert) verwendet.
Modbus RTU ist ein Protokoll für serielle Kommunikation.
Alternativ wären auch Netzwerkvariablen eine Möglichkeit.

Für die Modbus-Kommunikation wird, wie schon gesagt, die Bibliothek Modb_l05.lib angeboten.
Unter folgendem Link findest du den entsprechenden Anwendungshinweis inkl. Beispielprogramm:

http://www.wago.de/appnoteadmin/app...dium=forum&utm_content=sps-forum&utm_term=APN


Wie Nost schon richtig geschrieben hat kannst du in der aktuellen CoDeSys auch den Modbus-Konfigurator nutzen.
Dieser setzt ebenfalls auf dieser Biliothek auf, mit dem Unterschied, dass die Anwendung nur parametriert werden muss.
Der Code wird automatisch generiert. Diese Vorgehensweise vereinfacht die Modbus Projektierung deutlich.
Den Anwendungshinweis für den Konfigurator kannst du per Mail an support@wago.com beziehen.

Auf dem Wago Gerät, welches als Slave dienen soll, muss keine Modbus Projektierung vorgenommen werden.
Dort müssen ggf. lediglich die Daten in den entsprechenden Registern abgelegt werden.
Eine Übersicht der Modbus Register findest du im Handbuch des entsprechenden Gerätes.
In diesem Fall im Handbuch des 750-880 in Kapitel 12.2.4 

http://www.wago.de/download.esm?fil...dium=forum&utm_content=sps-forum&utm_term=MAN


----------



## PLVSPOL (13 Oktober 2015)

Vielen Dank mit dem Tipp zur Verwendung des Modbus-Konfigurators. Schön, wie der einem das Leben erleichtert!
Jetzt fehlt mir noch folgendes:
Im Konfigurator kann ich angeben, in welcher Art auf die Slave DI's bzw DO's zugegriffen werden kann. Wie konkretisiere ich aber, WAS bei einem schreibenden Zugriff geschrieben werden soll?


----------



## .:WAGO::015844:. (13 Oktober 2015)

Hallo PLVSPOL,

der Konfigurator legt dir im generierten Programm für jeden DI der DO eine Variable als Schnittstelle an. Den Variablennamen kannst du im Konfigurator frei vergeben. Diese Variablen musst du nun, je nach gewünschter Funktion, applikativ weiterverarbeiten.


----------



## PLVSPOL (14 Oktober 2015)

Hallo,

nach einigem Probieren habe ich erneut ein Problem:
Wie schon erwähnt stehen mir ja jetzt die generierten Variablen zur Verfügung. Der MB-Konfigurator hat den Baustein 'MBCFG_ModbusSlave' erstellt. Am Ende dieses Bausteins habe ich eine einfache IF/ELSE-Anweisung geschrieben, die mir den ersten DO bei einer 1 am ersten DI schaltet (mit den generierten Variablen). So weit, so gut. Bei laufendem Programm zeigt mir CoDeSys im Monitoring die richtige Funktion der Schleife an (wenn DI1 = TRUE, dann DO1 = TRUE), jedoch schaltet der DO der Klemme nicht (LED leuchtet nicht). Woran kann das liegen?

Auf dem Slave-Controller befindet sich ein SPS-Programm. Ich habe im RUN- und im STOP-Modus getestet.


----------



## .:WAGO::015844:. (14 Oktober 2015)

Hallo PLVSPOL,

das kann verschiedene Ursachen haben.



Wie ist dein Hardwareaufbau?
Ist im Modbuskonfigurator der automatische Task aktiviert? Wird das generierte Programm in einem Task aufgerufen?
Wird der zu schaltende Ausgang in der Steuerungskonfiguration als geschaltet angezeigt? Ist die Feldebene mit Spannung versorgt?


----------



## Thruser (14 Oktober 2015)

Hallo,

entschuldigt bitte, daß ich mich so mit reinhänge.

@WAGO Support
kann man bei den 880/881 Steuerungen mit Modbus direkt auf die Ein- und Ausgänge zugreifen. Bei der 841 muß man die Ein-/Ausgänge ja explizit für den externen Modbuszugriff freigeben und sie sind dann nicht mehr für den Controller verfügbar. In den Handbüchern zu 880/881 habe ich da nichts finden können. Der Kollege PLVSPOL versuch ja von einer 880 auf die Ein-/Ausgänge einer anderen 880 zuzugreifen.

Gruß


----------



## PLVSPOL (14 Oktober 2015)

Hardwareaufbau von links nach rechts:

750-880
750-430 (8-Kanal DI)
750-530 (8-Kanal DO)
753-647 (DALI-Klemme, 8x)
750-600 (Endklemme)

In der Taskkonfiguration wird der Baustein aufgerufen und die Spannungsversorgung ist auch vorhanden.
Inwiefern ich jetzt in der Steuerungskonfiguration den Schaltzustand des Ausgangs überprüfen kann/soll, weiß ich nicht.


----------



## .:WAGO::015844:. (14 Oktober 2015)

Hallo Thruser,

das Verhalten vom 841 hat sich zum 88x nicht verändert. Allerdings handelt es sich hier eher um eine Zuweisung der EA's, als eine Freigabe.
Es muss Grundsätzlich festgelegt werden, ob der Modbus oder das PLC Programm die Ausgänge schreiben darf um Komplikationen durch Doppelzugriffe zu vermeiden. Bei einem gewollten Doppelzugriff könnte man den Merkerbereich verwenden und Applikativ entscheiden, wer die Ausgänge schreiben darf. 
Bei Eingängen ist dies nicht so Problematisch, hier ist auch ein Lesen vom Modbus parallel zum PLC Zugriff möglich.


----------



## PLVSPOL (14 Oktober 2015)

Ich habe keine explizite Steuerungskonfiguration am Slave-Controller angegeben. Diese Konfiguration wird doch beim Start des Controllers automatisch ermittelt?
Daraus entsteht aber das Problem, dass ich nicht weiß, wie ich im CoDeSys ohne Steuerungskonfiguration dem Controller sage, dass der Modbus und NICHT die PLC die Schreibrechte hat.

EDIT:
Ich habe jetzt die Steuerungskonfiguration selbst erstellt und dem Modbus die Schreibrechte gegeben. Jetzt funktioniert es.
Das ist aber eigentlich nicht das, was ich wollte. 
Wie kann ich den Modbus parallel zur laufenden SPS Ausgänge setzen lassen?


----------



## .:WAGO::015844:. (14 Oktober 2015)

Hallo PLVSPOL,

wie schon beschrieben ist das direkte Schreiben der Ausgänge parallel nicht möglich, da dies zu Komplikationen führen würde.
Alternativ kannst du per Modbus den PFC-Ein/-Ausgangsbereich oder Merkerbereich nutzen und die weitere Auswertung applikativ lösen.

Wenn der Modbus und das PLC Programm einen Ausgang mit unterschiedlichen Werten beschreiben wollen, muss jemand die Entscheidung treffen, wer den Vorrang haben soll.


----------



## PLVSPOL (15 Oktober 2015)

Ich habe das Ganze jetzt über die Lösung mit den Merkern halbwegs zum Laufen bekommen.
Allerdings weiß ich nicht so recht, ob die weitere Verarbeitung innerhalb des vom Modbus-Konfigurator erstellten Bausteins 'MBCFG_ModbusSlave' erfolgen muss, oder ob ich das auch anderweitig lösen kann.
Das Problem ist nämlich, dass CoDeSys in vielen Fällen rummeckert, wenn beim Übersetzen ein Fehler aufgetreten ist. Der Fehler lautet immer: "Fehler 3760: Fehlerhafter Initialwert"
Das komische dabei ist, dass selbst nach dem Löschen des selbst geschriebenen Codes der Fehler auftritt.


----------



## .:WAGO::015844:. (15 Oktober 2015)

Hallo PLVSPOL,

der generierte Code sollte so belassen werden, wie er auch generiert wurde. Alle Änderungen darin, werden bei nochmaligem generieren wieder entfernt.
Die weitere Verarbeitung sollte separat gelöst werden. Den Zugriff kannst du über eine angelegte Schnittstelle oder auch Direktzugriff auf die Lokaldaten des Modbustasks realisieren.
Diese Vorgehensweise ist ebenfalls im Anwendungshinweis des Modbus Konfigurators beschrieben.


----------

