# Wago Codesys Modbus über RS485 Kommunikation nur Probleme



## vollmi (3 Februar 2012)

Hallo zusammen

Ich versuch grad verzweifelt eine Modbuskommunikation von einer WAGO auf ein CEAP Fahrstreifensignalumsetzer aufzubauen.

Die Kommunikation steht soweit ich kann also Register senden und empfangen ohne das der Treiber einen Timeout meldet. Aber das schreiben und Empfangen von Werten will irgendwie noch nicht so richtig klappen.
Ich habe das was ich bis jetzt habe mal auf Online gestellt wenn jemand mal reinschauen will.
http://www.vollmi.ch/sps/Modbus_120203.zip

Und auch mal einen Seriallog aufgezeichnet.
http://www.vollmi.ch/sps/CEAP_LOG.zip

Der Modbus Slave arbeitet mit 32Bit Registern.
In der WAGO habe ich also ebenfalls 32Bit Strukturen gebildet. Dem Modbustreiber übergebe ich diese 32Bit Struktur an eine 16Bit Struktur mit 

```
SysMemCpy(ADR(typModBus_Status[1]), ADR(typSlaveData[1].Response_Data[0]), SIZEOF(typModBus_Status[1]));
```
zum lesen
und 

```
SysMemCpy(ADR(typSlaveData[1].Write_Data[0]), ADR(typModBus_Init[1]), SIZEOF(typModBus_Init[1]));
```
Schreiben. 
Das funktioniert soweit. Also ich kann online in den typSlaveData sehen das kopiert wurde.

Aber obwohl ich testweise in Register 1 schreibe und genau von da auch wieder lese und auch mit dem terminal direkt auf dem Slave zugreife sehe ich keine veränderung des registers.

Dem Treiber selber sage ich er soll Startadresse 2 nehmen und Quantity 2 also zwei 16Bit wörter übertragen. Das heisst für mich er muss auf Register 1 schreiben.

mache ich einen Denkfehler?

mfG René


----------



## Oberchefe (3 Februar 2012)

Die Pollzeit von 50ms sind evtl. etwas sportlich, zumal (zumindest auf den ersten Blick) ohne Bedingung zum nächsten Datensatz gewechselt wird, egal ob Übertragung erfolgreich oder Timeout. Habe kein passendes Target auf dem Rechner, gehe aber davon aus dass die Übertragung über den K-Bus zu einer 750-6xx Klemme geht? Je nach Klemme gehen da pro Klemmenzyklus nur 5 Bytes auf einmal rüber!


----------



## vollmi (5 Februar 2012)

Sollte es wirklich nur sowas simples sein? Daran das die Pollzeit zu kurz ist habe ich überhaupt nicht gedacht, da ich annahm der Treiber fängt das selber ab. Ich werde das gleich morgen früh ausprobieren. Danke für den Denkanstoss.

mfG René


----------



## vollmi (6 Februar 2012)

Grml. Wenn ich die pollzeit erhöhe (400ms), kriege ich vom Treiber (MB_Error) einen Timeout vom Teilnehmer ID3 

Addendum: Timeout auf 1s erhöht jetzt gibts keinen Timeout mehr mit 500ms Pollzeit. Leider trotzdem keine funktionierende Uebertragung.

mfG René


----------



## vollmi (6 Februar 2012)

Gibt es irgendeine Software mit der ich mich über einen NPort RS485 direkt auf den Modbus klemmen kann und dann direkt sämtliche Telegramme die da rübergehen sehe?

mfG René


----------



## Matze001 (6 Februar 2012)

Geht es vielleicht mit Hyperterminal?

Grüße in die Schweiz

Marcel


----------



## vollmi (6 Februar 2012)

Leider ist Hypertherminal dazu leider ungeeignet. Listet irgendwelche Sonderzeichen auf zeigt die Steuerzeichen nicht richtig an etc. 
Ich habe jetzt Docklight installiert das scheint den Datenfluss korrekt anzuzeigen. Aber die Pakete scheinen nicht korrekt zu sein.
Jetzt kriege ich von Wago mal ne neue Lib, hoffentlich funktioniert das jetzt.

Interessanterweise kann ich Coils lesen. Aber immernoch nicht beschreiben.

mfG René


----------



## Oberchefe (6 Februar 2012)

zum Testen von Slaves geht das hier:
http://www.chipkin.com/cas-modbus-scanner


----------



## vollmi (6 Februar 2012)

Das geht leider nur für Modbus RTU


----------



## vollmi (9 Februar 2012)

So hab ein tolles Programm gefunden zum Modbus richtig gut zu testen.
http://modbustools.com/

Das funktioniert toll um Slave und Master zu Simulieren und gleichzeitig den Datenstrom aufzuzeichen.
Als Modbusadapter nutze ich jetzt den Nientech Nano 485
http://www.nientech.de/index.php?pa...&category_id=3&option=com_virtuemart&Itemid=2

Funktioniert genial.
Dann habe ich auch den Fehler gefunden. Im Modbusbeispiel von Wago wird der typSlaveData.WriteData Bereich nicht auf den typQuery.Write_Data gemappt. 
Und da ich dachte das Beispiel sei funktionell habe ich darauf leider nicht geachtet.

Jetzt funktioniert also sowohl Lesen als auch Schreiben von Registern.

Wenn ich jetzt allerdings z.B. 6 Worte Lesen will. geht das allerdings nicht kontinuierlich. Ich habe in regelmässigen Abständen einen Timeout beim Lesen drin.
Woher könnte das kommen?

mfG René


----------



## Oberchefe (9 Februar 2012)

> Das geht leider nur für Modbus RTU



wo ist das Problem, das kann jeder Modbus-konforme Busteilnehmer? Würde dringend empfehlen, Modbus RTU zu nehmen, bei ASCII brauchst Du für die gleichen Daten mehr Bytes, insbesonders mit dem Flaschenhals K-Bus auf der Wago und den besagten 5 Bytes pro Klemmnezyklus (bzw. auch SPS-Zyklus!) kommt es bei größeren Datenmengen unweigerlich zu größeren Verzögerungen, da können 1000 Bytes schon mal 5 Sekunden brauchen.


----------



## vollmi (10 Februar 2012)

Die Slaves die ich anbinden will. Können leider kein RTU.
Ausserdem wird bei der Initialisation eigentlich der grösste Teil einmal übertragen das wären dann 22 Wörter.
Ansonsten sind es maximal 4 Wort Schreiben und 6 Wort Lesen.

mfG René


----------



## Oberchefe (10 Februar 2012)

> Die Slaves die ich anbinden will. Können leider kein RTU.



dann würde ich dem Hersteller der Dinger auf die Füße treten. Wenn da Modbus drauf steht, müssen die das können. Siehe Modbus Spzifikation.


----------

