CX8090 Modbus TCP Server

PaulAtreides

Level-1
Beiträge
34
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe ein CX8090 mit Modbus TCP Server. Auf diesen Server greife ich mit einem CDPX Touch Panel von Festo zu.

Die Festo Visualisierung habe ich mit einem Modbus Server Test Programm geprüft. Alle Register sind richtig eingestellt und die Kommunikation läuft fehlerfrei.
Nun habe ich mein Programm in TwinCat gestartet und dann mit dem CDPX Panel verbunden. Nun werden leider nicht mehr alle Werte abgefragt sondern nur ein Teil.
Pro Sekunde habe ich ungefähr 2 bis 3 Abfragen. Eine Abfrage beinhaltet ein Array mit 12 Elementen, short. Unsighned Integer (DWORD) lassen sich gar nicht abfragen.
Im Modbus Server Test Programm hat das funktioniert.

Hat der CX8090 Modbus TCP Server eine Begrenzung wie viel abfragt werden kann?
 
nur um sicherzustellen dass ich es richtig kapiere. Die Festo Visualisierung fragt den CX8090 ab.

Das Prinzip habe ich vor längerer Zeit mal ausprobiert. Die Performance ging mit der Anzahl der parallen Anfragen runter.
Die Zykluszeit der CX war nicht relevant, die Auslastung des CX habe ich nicht betrachtet (lief quasi kein Programm).
Allerdings hatte ich von Anfrage Programm im externen Rechner bis Antwort dort eine Reaktionszeit von 5 (eine Anfrage) bis 50msec.

Deine grottenschlechte Performance kann ich nicht erklären. Was für eine Auslastung hat denn der CX8090 (der Profiler Baustein ist hier fast einfacher als die Anzeige anzuschalten - die zudem im Grenzbereich dann nicht mehr sehr sauber läuft).

Prinzipiell prinzipiell alle Daten hintereinander in die Adressen mappen - was allerdings über eine Struktur/Array schon gegeben ist.
Modbus kennt nur Coils (Bits) bzw. Register (16Bit). Ich gehe davon aus das deine Festo-Visualisierung aber ohne Probleme ein DWord als 2 Words ausliest.
Das ist das kleine 1x1 und sollte beherrscht sein.

Ansonsten kommst du wohl um ein Wirshark Aufzeichnung (gegebenenfalls mit einem Hub zwischen Visualisierung und CX8090) nicht herum.

Ach ja: Modbus ist begrenzt mit (ich vereinfache jetzt mal) max 100 Register. Aber so wie du es schreibst liegt das Problem irgendwo anders.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Getestet habe ich die Register Abfrage vom Festo Display mit einem ModBus Simulator (http://www.plcsimulator.org/). Da hat alles funktioniert. Ich hatte auch keine Performance Probleme. Im TwinCat und auf dem CX8090 kann ich einzelne Register abfragen und auch DWORDS. Jemand von Beckhoff hat auch gesagt das ich mich damit nicht mehr an den Standard halten würden. Die Abfrage funktioniert erst dann nicht wenn ich TwinCat direkt ( noch nichtmal auf dem CX8090 ) verbinde. Einzelne Seiten im Festo werden gar nicht mehr richtig abgefragt andere schon. DWORDS funktionieren gar nicht. Im Modbus Simulator war das alles kein Problem.

Ein Performance Problem kann es nicht sein. Zum testen habe alles einmal ausgeklammert und nur den ModBus Teil drin gelassen. Gleiches Ergebnis.

Das ist kein Netzwerk Problem. Wäre schön wenn man die Modbus Abfragen im TwinCat irgendwie loggen könnte.
 
Wireshark spuckt folgendes aus:

Neben ein paar erfolgreichen Auswertungen

Read Input Registers: Exception returned:

Read Input Registers: Exception Illegal data value
Function Code: Read Input Registers(4)
Exception Code: Illegal data value(3)

Der Fehler kommt vereinzelnd wenn versucht wird ein DWORD abgefragt wird. Komischerweise klappt es aber ab und zu
 
erklär bitte noch einmal der Reihe nach wer was machst und wo was nicht geht.
Ich werde aus dem bisher geposteten nicht schlau.
Und wenn du schon Wireshark laufen hast lassen kannst du ja auch diesen einmal mitliefern incl. Info wer welche IP-Adresse ist.
Die Abfrage funktioniert erst dann nicht wenn ich TwinCat direkt ( noch nichtmal auf dem CX8090 ) verbinde. Einzelne Seiten im Festo werden gar nicht mehr richtig abgefragt andere schon. DWORDS funktionieren gar nicht. Im Modbus Simulator war das alles kein Problem.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für das Festo Touch Panel habe ich ein kleines Test Programm erstellt wo nur 2 DWORD's abgefragt werden. Das Programm auf TwinCat habe ich nicht verändert.

Tag1
Memory Type: Input Registers
Offset: 301000
DataType: unsignedInt

Tag2
Memory Type: Input Registers
Offset: 301100
DataType: unsignedInt

Wenn ich nur 1 Tag abfrage läuft alles.
Query Anfrage:
Referenz Nummer: 1000
Word Count: 2

Bei zwei Tags scheiert schon die erste Abfrage
Query Anfrage:
Referenz Nummer: 1000
Word Count: 102

Also ein Software Fehler oder mach ich was falsch?
 
Naja, wenn du Post #2 durchliest siehst du die Begrenzung von Telegrammen auf max 100 Register (Word). Du fragst aber >100 ab um in einen Rutsch zwei Variablen zu holen.
Deshalb: Alle Variablen im Speicher optimiert (hintereinander) ablegen damit du mit einem Telegramm viele/alle holen kannst.

Was du aber jetzt noch mal klipp und klar sagen darfst. Welcher Teilnehmer ist nun der aktive Teilnehmer (und sendet die Modbus Telegramme) und welcher Teilnehmer antwortet nur.

Guga
 
Die Register liegen nur von den Zahlen her weit auseinander um sie nach Themen zu ordnen. Insgesamt sind es weniger.
Wäre so etwas falsch um DWORD's abzufragen?

<InputRegisters>
<!-- AIRBOX Status-->
<MappingInfo>
<AdsPort>801</AdsPort>
<!-- Modbus input registers -->
<StartAddress>1000</StartAddress>
<EndAddress>1001</EndAddress>
<VarName>.Wert1</VarName>
</MappingInfo>

<!-- AIRBOX Actions-->
<MappingInfo>
<AdsPort>801</AdsPort>
<!-- Modbus input registers -->
<StartAddress>1100</StartAddress>
<EndAddress>1101</EndAddress>
<VarName>.Wert2</VarName>
</MappingInfo>
</InputRegisters>

Das Festo Display ist der aktive Teilnehmer und sendet die Modbus Telegramme.
TwinCat antwortet nur.

Es macht jedenfalls kein Sinn, dass das Festo Display bei einem DWORD zwei WORDs abfragt und wenn ich zwei DWORD's abfragen will auf einmal die Abfragegröße für das erste DWORD zu groß wählt obwohl beide als einzelne Variablen angelegt wurden und nicht als Array.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
uuuuf. Ich habe noch nie jemanden gesehen der seine Variablen einzeln in der XML definiert hat. Auf die Idee muss man erst mal kommen.
Und deine Themensortierung ueber die Adressen ist Performance-maessig der GAU für Modbus.


Ich kenne zwar Leute die das ModbusMapping über die XML umbiegen, ist aber trotzdem selten.
Aber mal zurück zu Modbus - und hier mal nur die Register Kommunikation. Ein Modbus-Telegramm sagt:
Lies/schreib im Bereich xxx, Offset yyy die folgenden zzz Werte. zzz ist wie gesagt begrenzt.
D.h. dein Festo muss 2 Telegramme absetzen.
Jetzt könnte es sein (weiss ich nicht auswendig) dass für Input-Register die Zahl von zzz theoretisch bei 120 liegt, nur TwinCAT das nicht kann.

Warum gehst du nicht den Weg den alle gehen und definierst deine Variable in dem Adressbereich
z.B.
Wert1 AT %M0 : DINT;
Wert2 AT %M2 : DWORD;

Und von aussen fragt man eben 4 Modbus-Register ab. Modbus kennt nämlich keine Datentypen. Ein DWORD wird immer im Modbus zwei Register sein.
Du brauchst bei Modus so oder so eine Excel-Liste wo welche Werte liegen. Und in der Festo musst du dies auch exlizit eingeben.

Guga

P.S. Ach ja: Die Begrenzung kommt übrigends daher dass ein Telegramm per Definition <=255 Bytes ist.
 
Sorry, das versteh ich nicht. Wenn ich über Modpoll in TwinCat die Offsets 1000 und 1100 abfrage funktioniert es.

In Wireshark sieht man wenn ich nur eine Abfrage im Festo aktiv habe folgendes Abgefragt wird.
xxx = Bereich 300000 (Input Register)
yyy = Offset 1000
zzz = Werte 2
Funktioniert

oder halt

xxx = Bereich 300000 (Input Register)
yyy = Offset 1100
zzz = Werte 2
Funktioniert.

Wenn ich jedoch beide "gleichzeitig" Abfrage ( Ich habe sie im Festo nicht als Array deklariert) wird für den ersten Wert auf einmal eine Größe von 102 angenommen.
 
Ich hab die Lösung! In der Config für den Modbus Server vom Festo gibt es die Einstellung Max Read Block die standardmäßig auf 250 steht. Wenn jetzt also zwei Register abgefragt werden die in dem Bereich von 250 (hier 102, 1000-1100) liegen geht das Festo davon aus das der gesamte Bereich definiert ist und fragt mit einem Schwung alle Werte von 1000 bis 1102 ab.
 
Zurück
Oben