# Kommunikation codesys und S7



## Tom... (16 Dezember 2009)

Hallo zusammen,

ich bin erst seit kurzem stolzer Besitzer und Betreiber einer SABO PLM 707.
Laut dem technischen Support von Sabo kann die Steuerung ( Codesys ) nicht aktiv TCP/IP Telegramme verschicken. Ich habe aber mal irgendwo gelesen, dass man mit einem bestimmten ( codesys- ) Telegrammaufbau von der S7 an die Codesys-Steuerung diese zur "Herausgabe" von Netzvariablen veranlassen kann.
Kennt jemand die richtige Stelle im WWW, wo ich dazu eine Beschreibung finden kann?
Die PLM 707 steuert meine Heizung misst dazu über einen PT 1000 die Außentemperatur. Eine Siemens 314 und eine Vipa CPU sollen nun per TCP/IP erfahren, wie warm bzw. kalt es draußen ist...

bis dann
Thomas


----------



## Grubba (17 Dezember 2009)

Unterstützt Deine Sabo das Modbus-Protokoll?

Dann könntest Du von der S7 oder Vipa Seite damit die Werte anfordern. 

Falls die Sabo das kann, ist nur noch das Problem, das es von offizieller Siemens Seite nichts *kostenloses* an Bausteinen für Modbus gibt. (Mehr Glaube als Wissen )

Aber a) ist das Modbus-Protokoll offen, und man kann überall Dokus finden, und b) gibts bestimmt hier einige Leute die das schon programmiert haben, oder zumindest wissen, wo man sowas bekommt.


----------



## Tom... (17 Dezember 2009)

Grubba schrieb:


> Unterstützt Deine Sabo das Modbus-Protokoll?.


 
Sollte Sie!



Grubba schrieb:


> Dann könntest Du von der S7 oder Vipa Seite damit die Werte anfordern..


 
... habe ich mir so vorgestellt ...



Grubba schrieb:


> Falls die Sabo das kann, ist nur noch das Problem, das es von offizieller Siemens Seite nichts *kostenloses* an Bausteinen für Modbus gibt. (Mehr Glaube als Wissen ).


 
... das ist nicht schlimm ...



Grubba schrieb:


> Aber a) ist das Modbus-Protokoll offen, und man kann überall Dokus finden, und b) gibts bestimmt hier einige Leute die das schon programmiert haben, oder zumindest wissen, wo man sowas bekommt.


 
Genau nach so einem Link suche ich.
Ich habe mal irgendwo ein Beispiel gesehen, wie eine S7 Netzvariablen von einer WAGO ausgelesen hat - finde aber nicht mehr wo?!

Gruß
Thomas


----------



## Grubba (17 Dezember 2009)

Zumindest einen Link kann ich Dir mal geben:

http://www.wagocatalog.com/okv3/index.asp?strBestNrID=7500841&lid=1&cid=1http://www.wagocatalog.com/okv3/index.asp?strBestNrID=7500841&lid=1&cid=1

Dort unter Download die Bedienungsanleitung für die Wago 750-841 nehmen. (ca. 3,3MB)

Dort ist der Protokollaufau erklärt.

Oder auf:

http://www.anybus.de/technologie/modbustcp.shtml

nachsehen.


----------



## Tom... (6 Januar 2010)

Hallo zusammen,

und erstmal allen hier ein Gesundes Neues Jahr!

Die Sache ist offenbar viel einfacher als ich dachte...

Einfach Netzwerkvariablen zum Senden eingestellt und fertig!
UDP Paket mit Wireshark mitgeschnitten...
Die S7 empfängt so etwas mit dem AG_Recv...

Auch wenn ich mir aus dem "Byte-Haufen" dann heraussuchen kann, was ich brauche, bleibt folgendes bis jetzt ungeklärt:

1. Wie ist dieses UDP Paket definiert - also kennt jemand hier den richtigen Link zur Definition?
2. Daraus sollte sich dann ergeben, wo die ID der Variablenliste steht
3. Ebenso die Checksumme und hoffentlich auch wie sie gebildet wird

Dann könnte ich mir die Gegenrichtung in der S7 zusammenbauen und der CoDeSys Steuerung antworten...
Das wäre doch 'was...

bis dann
Thomas


----------



## PGMonster (13 Januar 2010)

Hallo Thomas,

schau dir mal diesen Link an:

http://www.wago.com/wagoweb/documentation/app_note/a1014/a101400d_f.htm

Ich habe damit mal eine Verbindung zwischen einer S7-400 und einem Wago 750-841 gebastelt. Die S7 ist dabei aber der Master und holt sich die Daten aus dem 841.

Grüße
Tobi


----------



## Tom... (13 Januar 2010)

Danke Tobi,

das Beispiel ist super, aber nicht die Lösung...

Am Anfang dachte ich auch, dass ich Modbus benötige, aber ich will ja keine Eingänge von einem Controler lesen, sondern Variablen von einer selbständigen Steuerung.
Das funktioniert auch schon, wobei ich den Aufbau des UDP Paketes mehr errate und ausprobiere.
Für die UDP Antwort funktioniert das natürlich nicht...
Ich brauche die "echte" Spezifikation um den UDP Header und auch die Prüfsumme korrekt erzeugen zu können...

bis dann
Thomas


----------



## PGMonster (14 Januar 2010)

Hallo Thomas,



> aber ich will ja keine Eingänge von einem Controler lesen, sondern Variablen von einer selbständigen Steuerung.


Geht doch auch! Du legst dir die Variablen einfach in den Merkerbereich (mit z.B. AT %MW100) und hast somit Lese- und Schreibrechte von Modbusseite (S7). Die S7 holt sich dann die Variablen bzw. schreibt sie in deinen Wago-Contoller. 
Bei mir funktioniert das seit ca. zwei Jahren problemlos. Natürlich musst du dich noch um einen Watchdog o.Ä. kümmern.

Bezüglich Modbus: Schau mal im Handbuch vom 841 nach Modbusadressen. Da ist das eigentlich ziemlich übersichtlich erklärt.

Bei Interesse suche ich mal das Projekt raus und kann den Code mal posten.

Viel erfolg. 
Tobi


----------



## Tom... (17 Januar 2010)

Danke,

aber ich möchte eigentlich nicht "... in die andere Steuerung schreiben ... "
( Was passier mit dem Modbus-Stack - gibt es das? - wenn der Schreibvorgang zu lange Zeit nicht "ankommt" )

Unabhängig davon habe ich keinen Wago Controler und die Geschichte mit den Merkern schein mir auch eine "Wago Spezialität" zu sein...

Wozu braucht man eigentlich Merker? Habe ich noch nie verwendet...

bis dann
Thomas


----------



## Tom... (20 November 2014)

Hallo zusammen,
auf Nachfrage will ich hier noch mal kurz beschreiben, wie die Lösung schlussendlich aussah ( auch wenn selbige schon länger wieder außer Betrieb ist... ).

Die S7 kann mit "AG RECV" Variablenlisten von CoDeSys Steuerungen empfangen.
ABER ACHTUNG!
Mir ist das nur gelungen mit einer Variablenliste, die nicht Broadcast, condern direkt an die IP Adresse der S7 gerichtet war. ( Irgendwo ist dokumentiert, dass die S7 kein UDP Broadcast empfangen kann... ).
In der S7 habe ich entsprechend eine UDP Verbindung projektiert, mit der IP Adresse der CoDeSys Steuerung als Verbindungspartner ( unspezifiziert ) und dem Port 1202.
In den empfangenen Daten ( Array of Byte 0.. ) findet sich dann z.B. in Byte 14 und 15 die ID der Variablenliste.
Ab 34 stehen die "Nutzdaten".
Achtung!
String und Byte sind unproblematisch und erscheinen 1:1. ( nach einem String wird ein "leer" Byte angefügt )
Bei INT ( also auch der VariablenlistenID ) muss man die Bytereihenfolge umtauschen!
Auf noch längere Datenformate habe ich bewusst verzichtet.

Soll die CoDeSys Steuerung Daten von der S7 empfangen, braucht man eine zweite UDP Verbindung.
Der Verbindungspartner ist diesmal Broadcast mit Port 1202. ( UDP Broadcast senden kann die S7 )
In den Sendedaten ( Array of Byte 0.. ) steht diesmal in Byte 8 und 9 die VariablenlistenID. Ab Byte 20 folgen die Nutzdaten.
Auch hier wieder die Byte Reihenfolge umdrehen.

Herausgefunden habe ich das alles mit Wireshark.
Als erstes die von CoDeSys gesendete Variablenliste. Am besten mit INT Variablen, die als Rundenzähler mit dem Sekundentakt laufen. Da sieht man alles, was man braucht.
In der Rückrichtung sind die Daten im Array verschoben, warum weiss wohl nur Siemens...

Viel Spaß beim Basteln!
Das Beispiel hat bei mir mehrere Jahre sehr gut funktioniert...
Die in den "Versuchsdaten" übertragene Uhrzeit habe ich sogar drin gelassen. An der Sekundenanzeige kann man sehr gut einen Watchdog anbinden, ob die empfangenen Daten glaubwürdig und aktuell sind...

Grüße Tom


----------



## DieBoese0815 (21 November 2014)

Grubba schrieb:


> das Problem, das es von offizieller Siemens Seite nichts *kostenloses* an Bausteinen für Modbus gibt.



Kleine Ergänzung hier: Vipa bietet für seine Produkte auch Bibliotheken für Modbus an, hier: http://www.vipa.com/de/service-support/handbuecher/steuerungssysteme/300s/ _*CPU 31xS(C) - SPEED7 - Bibliothek* (Baustein-Bibliothek Modbus RTU/TCP) _

:TOOL:


----------

