Twincat 3.1 ADS mit C# Problem

Odafuer

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

hat jemand schon mal intensiv mit Twincat 3.1 ADS und c# gearbeitet und kennt vielleicht folgendes Problem: Windows 7 32bit geht komplett fest wenn man zyklisch Variablen pollen moechte um diese in einer .net applikation zu verarbeiten. In meinem Fall frage ich etwa 400 variablen unterschiedlichen Datentyps mit einem Sum-Command (Befehl ReadWrite(0xF080,....) ab. Es macht scheinbar keinen Unterschied ob man dies alle 10ms oder alle 100ms tut. Die Gesamtgroesse des zurueckgelieferten byte-Streams (etwa 1kB) bleibt weit unter der eingestellten Groesse der des ADS Router Memory (2000kB). Es herscht kein Stress auf dem Twincat IPC (keine Wertaenderungen) und die Real-Time-Auslastung liegt bei etwa 4 %, 10ms Takt). Es kann Zufall sein oder auch nicht, es macht ein wenig den Eindruck als ob die Anzahl der gepollten Variablen einen Einfluss hat. Also mit 2 Pollingthreads zu 250 und 150 Variablen scheint das Festgehen von Windows 7 langsamer zu gehen.
Auf dem Visu-PC mit der .net Applikation laeuft Twincat ADS 3.1 64bit auf Windows 7 64bit.

Leider gibt es keinerlei Hinweise auf dem Twincat3.1 PC warum Windows 7 fest geht. Hat jemand einen Idee oder Hinweise wie das Problem weiter einzugrenzen waere?

Vielen Dank!
 
Hallo Odafuer,

ich habe leider keine konkrete Lösung für Dich.
Ich selbst polle grundsätzlich keine Variablen sondern verwende Events.

Grüße, Michael
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
nur mal so am Rande (ich würde das auch über Events machen) :
Wie ist dein VS-Programm denn aufgebaut ? Machst du das Pollen deiner Variablen in einem Thread neben deinem "normalen" Programm her ? Oder hast du dir so eine Art Endlos-Schleife gebaut ?
Wenn du einen Thread verwendest ... gibt es dann auch irgendwo ein Thread.Sleep ?

Am Besten, du schreibst mal ein bißchen mehr dazu ...

Gruß
Larry
 
Ich arbeite fast ausschließlich mit dem Summenkommando beim Lesen von vielen Variablen (wir verwenden eine eigene Kommunikationsklasse, quasi als Wrapper für ads.net). Getestet haben wir das mit über 1000 Variablen und einem Lesezyklus von 200ms. Selbst auf kleinen CXen läuft das ohne Probleme. Allerdings unter TwinCAT 2. TC3 haben wir noch nicht verwendet. Ich tippe aber drauf, das bei dir im Code ein Fehler ist.
ADS Notifications würde ich bei größeren Variablenzahlen nicht verwenden. Die sind echte Recourcenschweine und rumsen einen den Messagerouter in Nullkommanichts voll. Wenn man das Summenkommando nutzt, hindert einem ja niemand dran selber die Variablen auf Änderung zu überwachen und dann einen Event zu feuern.
 
Hallo zusammen!

Vielleicht nur nebenbei: TwinCAT 3 macht in Sachen ADS nichts anderes, als TwinCAT 2 auch. Eine App die mit Tc2 kommuniziert hat, spricht auch genauso mit einer Tc3 Steuerung. Einen effektiven Unterschied gibt es nur beim Speicher-Alignement innerhalb von Strukturen, die ausgetauscht werden sollen. Hier gibt es nicht mehr das klassische, voon Tc2 bekannte, 1-Byte-Alignement, sondern immer passend zur Variable (1-2-4-8 Byte).

mac203
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

also mit Events habe ich es urspruenglich auch versucht. Allerdings ist fuer mein Projekt abzusehen, dass wir mit mehr als 3000 Variablen arbeiten muessen. Aufgrund bestimmter Anforderungen koennen wir auch nicht sehr oft zu Arrays zusammenfassen, was wo es geht, natuerlich trotzdem gemacht wird.
Wie MasterOhh auch riet, scheinen Notifications auch nicht sehr stabil zu funktionieren. Dort konnte ich bei Tests wiederholbar feststellen, dass man bei mehr als 300 Variablen schnell Probleme bekommt: hohe Last auf PLC und auf der Visu.

Zum Thread: ja es wird Zyklisch jeweils das ReadWrite gerufen (welches ein Synchroner Aufruf ist), die gelesenen Werte kopiert und dann mit Thread.Sleep gewartet bis es Zeit fuer den naechsten Ruf an ADS ist. Klingt eigentlich einfach, aber eventuell kann man ja auch dabei etwas falsch machen. Die Resourcen fuer den Command-Stream und der Buffer fuer das Lesen der Werte lege ich nicht neu mit jedem Zyklus an. Also das sollte so auch passen.

Gruss, Odafuer
 
Hallo MasterOhh,

wahrscheinlich mache ich schon irgendwas falsch, denn 400 Variablen sind ja nun wirklich nicht sehr viel. Beckhoff selbst schreibt ja das man mit bis zu 500 Variablen pro Sum-Command arbeiten soll und dann eben n-Rufe machen soll bis man seine Variablen zusammen hat. Aber was koennte der Fehler sein? Es muss ja ein Problem sein, was ADS irgendwie belastet, denn es geht ja Windows7 der PLC fest und nicht der der Visu. Ich fasse aber nicht zyklisch neue Variablenhandles aus oder oeffne und schliese die Verbindung oder aehnliches. Es wird auch immer aus dem gleichen Thread der ReadWrite Ruf an ADS gemacht. Nur die Handles auf die Variables werden ganz am Anfang in einem anderen Thread vom ADS geholt. Das waere vielleicht noch ein Versuch wert dies zu aendern, aber ich kann nicht so recht glauben dass dies das Problem ist.
Lest ihr denn bei euch die 1000 Variablen mit einem Sum-Command aus oder auch mehrere hintereinander? Wenn in Bloecken, wie viele lest ihr dann in einem Ruf aus?

Viele Gruesse,
Odafuer
 
Hallo,
das hört sich für mich erstmal nicht sooo falsch an ... von der Sache mit dem Summen-Kommando mal abgesehen.
Was macht den dein Main-Thread noch so ?

Etwas erstaunt mich allerdings :
Du schreibst, dass deine Visu weiter bedienbar bleibt (das habe ich jedenfalls aus der Antwort an MasterOhh so herausgelesen) - dann sollte Windows selbst auch noch laufen. Oder woran erkennst du, dass deine Visu noch responsiv ist ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

das war vielleicht nicht eindeutig genug: Windows 7 auf dem IPC mit Twincat geht fest (nicht mal maus laesst sich mehr bewegen, komplett eingefroren). Windows 7 auf der Visu mit meiner c# Applikation laeuft. Meine Vius verliert natuerlich die Verbindnung (ADS Fehlercode 0x745, was ja auch alles normal ist wenn die Verbindung weg ist).

Was meinst DU mit "nicht sooo falsch"? Was ist denn falsch? Was ist am Summen-Kommando falsch?

Gruss,
Odafuer
 
An dem Summen-Kommando ist wahrscheinlich nichts falsch - es steht hier nur m.E. nicht als Problem im Fokus sondern eher etwas, das in deinem Main-Thread oder einem anderen noch laufenden Thread passiert.
Wenn du deinen ADS-Unter-Thread mit wenigstens einem Thread.Sleep(0) gewürzt hast dann sollte für den Rest von da her erstmal alles OK sein.
Kommt es allerdings zu keinem Application.DoEvents mehr dann kann ich mir schon vorstellen, dass dir dein Windows einfriert ...

Gruß
Larry
 
Also PLC und Visu laufen auf unterschiedlichen Rechnern? Der PC mit der Visu macht keinen Stress, aber der IPC mit dem SPS-Programm drauf hängt sich auf wenn die Visu auf dem Visu-PC läuft?
Kannst du mal den Code für die Kommunikation aus deinem Visu-Programm posten? Sonst wird das hier nur ein blindes herumgestocher. Das sich die Visu mal aufhängt, wenn ich einen blöden Fehler eingebaut habe, passiert mir regelmäßig (gerade wenn ich bei der Ausnahmen-Behandlung mal wieder etwas schlampig war). Aber mir ist noch die PLC deswegen abgeschmiert....

In meinem aktuellen Projekt bin ich gerade bei ca. 470 Variablen die alle 50ms mit dem Summenkommando geholt werden. Das juckt die CX5010 auf der auch die Visu läuft nichtmal ansatzweise.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau, Visu und Twincat laufen auf unterschiedlichen Rechnern. Die C# Visu macht keine Probleme. Der Twincat IPC geht nach unterschiedlich langer Zeit fest. Scheinbar in Abhaengigkeit von der Anzahl der gepollten Variablen. Mal ueberlebt er 30 Minuten, mal 19 Stunden.
 
Naja, es ist nicht gerade nur eine Hand voll Zeilen Code! Ich versuche jetzt mal Multithreading Zugriffe auf ADS zu vermeiden und die Anzahl der abgefragten Variablen pro Aufruf zu verringern. Den Beckhoff Support habe ich auch angeschrieben, aber ob die antworten ist wohl eher ein Gluecksspiel. Danke euch erstmal, ich melde mich hoffentlich bald mit einer Erfolgsmeldung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So: endlich habe ich Antwort von Beckhoff support erhalten und will das Ergebnis natuerlich nicht vorenthalten. Es war tatsaechlich ein Fehler in dem Beckhoff Twincat Release! Ich hatte die beschriebenen Probleme bei 3.1.4009.0 festgestellt. In Version 3.1.4014.0 geht Windows dann nicht mehr fest. Ich musste am Code nichts ändern.
 
Na das ist doch mal was! Dann weiter viel Spaß bei schreiben deiner Visu in C#. Sitze auch gerade an einer und muss mich tierisch bremsen die nicht mit Features voll zu pflastern. (nur weil ich es könnte ;) )
 
Zurück
Oben