Stack des Warrios leeren?
Moderator: Guido Körber
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Stack des Warrios leeren?
Soweit mir bekannt ist gibt es keine Probleme mit Threads.
Was mich interessiert woran es nun wirklich liegt. Gibts eine Fehlermelgun, Assert oder sonst irgend etwas? Bleibt das Programm nur stehen / friert es ein?
Die DLL selber nutzt intern zum Lesen Threads und Waiting Timer.
Vielleicht wäre eine Testapplikation gut, wo man IowKItWrite() mit der ReportID 0xFF und IowKitRead() nutzten und IowKitSetTimeout() setzt. Also auf IowKitReadNonBlocking() verzichten. Ich kenn die Hardware ja nicht um das irgendwie nachzubilden.
Wäre es möglich den Quellcode für die Lesefunktion der Threads zu Posten?
Was mich interessiert woran es nun wirklich liegt. Gibts eine Fehlermelgun, Assert oder sonst irgend etwas? Bleibt das Programm nur stehen / friert es ein?
Die DLL selber nutzt intern zum Lesen Threads und Waiting Timer.
Vielleicht wäre eine Testapplikation gut, wo man IowKItWrite() mit der ReportID 0xFF und IowKitRead() nutzten und IowKitSetTimeout() setzt. Also auf IowKitReadNonBlocking() verzichten. Ich kenn die Hardware ja nicht um das irgendwie nachzubilden.
Wäre es möglich den Quellcode für die Lesefunktion der Threads zu Posten?
Re: Stack des Warrios leeren?
Hallo,
es gibt keine Fehlermeldung. Der jeweilige Thread bleibt in ReadNonBLocking stehen. Asserts kann ich nicht sehen, weil ich die Anlage nicht unter einem Debugger betreiben kann. Sie steht beim Auftraggeber.
Ich kann ggf. die Warriors abbauen lassen und hier versuchen diese zu betreiben.
Ich werde zunächst nochmal ihren Tip versuchen und mit ReportID 0xFF schreiben um dann zu lesen. Kehrt IowKitRead() nach Schreiben mit ReportID 0xFF mit dem aktuellen Status an den Ports zurück?
gruss Michael
der Lesecode
es gibt keine Fehlermeldung. Der jeweilige Thread bleibt in ReadNonBLocking stehen. Asserts kann ich nicht sehen, weil ich die Anlage nicht unter einem Debugger betreiben kann. Sie steht beim Auftraggeber.
Ich kann ggf. die Warriors abbauen lassen und hier versuchen diese zu betreiben.
Ich werde zunächst nochmal ihren Tip versuchen und mit ReportID 0xFF schreiben um dann zu lesen. Kehrt IowKitRead() nach Schreiben mit ReportID 0xFF mit dem aktuellen Status an den Ports zurück?
gruss Michael
der Lesecode
Code: Select all
bool readSimple(IOWKIT_HANDLE a_iowHandle, BYTE& a_value)
{
bool bReturn(false);
if(a_iowHandle)
{
//Get the IOWarrior-family for writing
switch(IowKitGetProductId(a_iowHandle))
{
case IOWKIT_PID_IOW24:
case IOWKIT_PRODUCT_ID_IOWPV1:
case IOWKIT_PRODUCT_ID_IOWPV2:
{
IOWKIT24_IO_REPORT rep24;
memset(&rep24, 0, IOWKIT24_IO_REPORT_SIZE);
const ULONG rc = IowKitReadNonBlocking(a_iowHandle, IOW_PIPE_IO_PINS, (PCHAR) &rep24, IOWKIT24_IO_REPORT_SIZE);
if(IOWKIT24_IO_REPORT_SIZE == rc)
{
a_value = rep24.Bytes[0];
bReturn = true;
}
}
break;
}
}
return bReturn;
}
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Stack des Warrios leeren?
Der Special-Mode mit 0xFF ist dafür da die IO-Pins/Ports neu zu lesen. Also ist dort auch immer der wirkliche Status der Pins zu sehen.
Müsste im Datenblatt zu finden sein unter "Current Pin Status" oder so ähnlich. Aber das läuft dann unter IOW_PIPE_SPEACIAL_MODE da es sich um einen Special Mode handelt.
Die Funktion an sich sieht sonst gut aus. Wird diese Funktion im Thread als einiges aufgerufen?
Ich würde evtl. die Abfrage der Pid rausnehmen. Da ja nur der IO-Warrior24 genutzt wird ist diese unnötig.
Müsste im Datenblatt zu finden sein unter "Current Pin Status" oder so ähnlich. Aber das läuft dann unter IOW_PIPE_SPEACIAL_MODE da es sich um einen Special Mode handelt.
Die Funktion an sich sieht sonst gut aus. Wird diese Funktion im Thread als einiges aufgerufen?
Ich würde evtl. die Abfrage der Pid rausnehmen. Da ja nur der IO-Warrior24 genutzt wird ist diese unnötig.
Re: Stack des Warrios leeren?
Hallo,
Ich hänge mal den Code des Threads an. Die eigentliche Methode, die was macht ist doWork();
Ich erläutere mal kurz:
-lesen des Warriors (readSimple)
-Warten auf beginn des Messzyklus (signal auf Kurzschlussfehlerport signalisiert das)
-Wenn Zyklusstart, die Signalkette verfolgen, Es kommt von einer SPS eine definierte Signalfolge. Mit der Länge der Signale ist kodiert, ob ein Fehler im Signal vorliegt.
-wenn fertig dann Signalpaket abschicken zum loggen und anzeigenwieder warten auf Zyklusbeginn
-sonst weiterlesen bis Timeout oder fertig und resetten
-10ms pause
Ich hoffe mal das ist verständlich, bis auf das Lesen wird nichts mit dem Warrior gemacht. Es laufen zwei Threads davon fuer die zwei Warrior. Nehme ich readSimple raus und baue den Thread so um, dass alles andere immer gemacht wird, (Pax messen und Logging) laueft das Programm ohne Probleme. Sonst bleibt es irgendwann in ReadNonblocking stehen. Ich kann nicht definiv sagen, ob etwas an den Ports passieren muss, damit es stehenbleibt. Ich lasse das Modul mal ausbauen, dann kann ich debuggen.
Michael
Ich hänge mal den Code des Threads an. Die eigentliche Methode, die was macht ist doWork();
Ich erläutere mal kurz:
-lesen des Warriors (readSimple)
-Warten auf beginn des Messzyklus (signal auf Kurzschlussfehlerport signalisiert das)
-Wenn Zyklusstart, die Signalkette verfolgen, Es kommt von einer SPS eine definierte Signalfolge. Mit der Länge der Signale ist kodiert, ob ein Fehler im Signal vorliegt.
-wenn fertig dann Signalpaket abschicken zum loggen und anzeigenwieder warten auf Zyklusbeginn
-sonst weiterlesen bis Timeout oder fertig und resetten
-10ms pause
Ich hoffe mal das ist verständlich, bis auf das Lesen wird nichts mit dem Warrior gemacht. Es laufen zwei Threads davon fuer die zwei Warrior. Nehme ich readSimple raus und baue den Thread so um, dass alles andere immer gemacht wird, (Pax messen und Logging) laueft das Programm ohne Probleme. Sonst bleibt es irgendwann in ReadNonblocking stehen. Ich kann nicht definiv sagen, ob etwas an den Ports passieren muss, damit es stehenbleibt. Ich lasse das Modul mal ausbauen, dann kann ich debuggen.
Michael
- Attachments
-
- CWorkerThread.zip
- (3.51 KiB) Downloaded 193 times
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Stack des Warrios leeren?
ReadNonBlocking() wurde einst in die DLL eingebaut damit nichts stehen bleibt.
Beim normalen IowKitRead() wird ja gewartet, bis eine Änderung an einem der Ports vorliegt. Da bleibt das Programm / der Thread dann stehen bis was passiert. Daher meine Skepsis das dort was nicht passt. ReadNonBlocking()kehrt immer zurück ob nun mit Daten oder Ohne.
Wie viel Zeit kann den zwischen 2 Ereignissen liegen?
Ich verstehe das ganze als Datenlogger der Fehler loggt.
Auch wenn das in den Posts vorher schonmal geklärt wurde. Wie lang ist denn jetzt im richtigen Aufbau die USB-Leitung und wird denn ein geschirmtes / richtiges USB-Kabel genutzt?
Beim normalen IowKitRead() wird ja gewartet, bis eine Änderung an einem der Ports vorliegt. Da bleibt das Programm / der Thread dann stehen bis was passiert. Daher meine Skepsis das dort was nicht passt. ReadNonBlocking()kehrt immer zurück ob nun mit Daten oder Ohne.
Wie viel Zeit kann den zwischen 2 Ereignissen liegen?
Ich verstehe das ganze als Datenlogger der Fehler loggt.
Auch wenn das in den Posts vorher schonmal geklärt wurde. Wie lang ist denn jetzt im richtigen Aufbau die USB-Leitung und wird denn ein geschirmtes / richtiges USB-Kabel genutzt?
Re: Stack des Warrios leeren?
Sie haben das richtig verstanden, es ist Quasi ein Datenlogger von 2 SPS'en.
Die SPS kodiert verschiedene Fehlercodes als unterschiedliche Flankenlängen und Flankenzahl an den Warriorports. zB. eine Flanke fuer OK ist 100ms lang. Der Thread versucht daher alle ca. 10ms (Sleep(10)) zu lesen. Selbst wenn er die 10ms nicht schafft ist das egal und wird ausgeglichen. Auch ist es kein Beinbruch, wenn eine Flanke nicht erwischt wird, der Thread resettet sich nach einem Timout selber.
Wird ein Zyklusbeginn erkannt, wird ein schneller Timer benutzt, um die Längen der Flanken zu ermitteln. Flanke zu lang = Fehler. Ein Eingang ist quasi das Startsignal fuer einen Zyklus.
Die USB Kabel sehen sehr gut aus, soweit ich das beurteilen kann. Sie sind geschirmt. Der Hardwaremensch hat das sehr solide aufgebaut. Die geschirmten Kabel gehen auf einen Hub, an dem noch 2 Seriell zu USB Wandler hängen. Der Hub hat ein Netzteil. Von da an den Rechner.
Ich kann sicher auch ein IowKitRead zu benutzen, wenn das zurückkehrt wenn es eine Flanke gibt, ist es auch ok. Ausserdem benötige ich dann ein Timeout, damit der Thread weiterläuft und ggf. vernünftig beendet werden kann.
Ich habe das Gerät nun hier. Ich kann gerne mal ein Foto ein Foto machen.
Michael
Die SPS kodiert verschiedene Fehlercodes als unterschiedliche Flankenlängen und Flankenzahl an den Warriorports. zB. eine Flanke fuer OK ist 100ms lang. Der Thread versucht daher alle ca. 10ms (Sleep(10)) zu lesen. Selbst wenn er die 10ms nicht schafft ist das egal und wird ausgeglichen. Auch ist es kein Beinbruch, wenn eine Flanke nicht erwischt wird, der Thread resettet sich nach einem Timout selber.
Wird ein Zyklusbeginn erkannt, wird ein schneller Timer benutzt, um die Längen der Flanken zu ermitteln. Flanke zu lang = Fehler. Ein Eingang ist quasi das Startsignal fuer einen Zyklus.
Die USB Kabel sehen sehr gut aus, soweit ich das beurteilen kann. Sie sind geschirmt. Der Hardwaremensch hat das sehr solide aufgebaut. Die geschirmten Kabel gehen auf einen Hub, an dem noch 2 Seriell zu USB Wandler hängen. Der Hub hat ein Netzteil. Von da an den Rechner.
Ich kann sicher auch ein IowKitRead zu benutzen, wenn das zurückkehrt wenn es eine Flanke gibt, ist es auch ok. Ausserdem benötige ich dann ein Timeout, damit der Thread weiterläuft und ggf. vernünftig beendet werden kann.
Ich habe das Gerät nun hier. Ich kann gerne mal ein Foto ein Foto machen.
Michael
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Stack des Warrios leeren?
Bei den Kabeln wäre noch die Frage nach der Länge, 5 m sind Maximum bei USB, darüber hinaus kann es Probleme geben.
Wo drauf sind die IOW24 aufgebaut? Eigene Platine? Wenn ja, wie sieht die aus? Stromversorgung der Chips ist öfter ein Thema, da geht es nicht nur um die Frage ob eine Verbindung da ist, sondern auch wie die Leiterbahnführung ist und wo der zugehörige Kondensator ist.
Wie viele Signale müssen denn eingelesen werden? Die IOW24 haben ja zwei Capture-Timer, die selbständig Phasenlängen messen können.
Wo drauf sind die IOW24 aufgebaut? Eigene Platine? Wenn ja, wie sieht die aus? Stromversorgung der Chips ist öfter ein Thema, da geht es nicht nur um die Frage ob eine Verbindung da ist, sondern auch wie die Leiterbahnführung ist und wo der zugehörige Kondensator ist.
Wie viele Signale müssen denn eingelesen werden? Die IOW24 haben ja zwei Capture-Timer, die selbständig Phasenlängen messen können.
Re: Stack des Warrios leeren?
Die USB Kabel sind ca 1.2m lang. Dazu kommt ein kurzes vom Hub.
Die Warrior sind auf Ihrem EVA boards aufgebaut- Die Stromversorgung sollte ja eigentlich kein Problem sein. Es wird nur gelesen.
Es werden pro Warrior 5 Eingänge benutzt. Ich mache ein Foto.
Michael
Die Warrior sind auf Ihrem EVA boards aufgebaut- Die Stromversorgung sollte ja eigentlich kein Problem sein. Es wird nur gelesen.
Es werden pro Warrior 5 Eingänge benutzt. Ich mache ein Foto.
Michael
Re: Stack des Warrios leeren?
Hallo,
ich habe heute nochmals die Anlage softwareseitig überprüft. Ich habe auch ein Foto angehängt. (Die Lüsterklemme ist nicht mit den Warriors verbunden, die leitet nur die seriellen Ports der angesprochnen PAX Prozessmeter durch). Den USB - Hub habe ich weggelassen, also die Evaluationboards direkt an meinem Entwicklungsrechner betrieben.
Mit einem Consolen - Testprogramm habe ich die Situation mit nur einem Warrior nachgestellt also ohne Threads. Der Warrior wird initialisiert und dann in einer Endlosschleife Readnonblocking gerufen. Danach ist ein Sleep(10) eingebaut. Die Ausgabe erfolgt auf dem Bildschirm, wenn ein Port nach Masse gezogen wird. Das funktioniert eine ganze Weile. Irgenwann jedoch liefert Readnonblocking keine Ergebnisse mehr, das Programm läuft jedoch weiter. Ziehe ich ein USB Kabel ab, passiert genau dasselbe, was ja auch zu erwarten ist. Für mich sieht das so aus, als ob der Warrior irgendwann die USB Verbindung verliert.
Der restliche USB - Verkehr auf dem Rechner läuft ohne Problem weiter. (Mouse, Tastatur, Festplatte). Das Verhalten habe ich auf drei Rechnern. Auf dem Livesystem läuft Windows XP, auf dem Testrechner Windows 7/64 Vista/64. Ich kann mir ehrlich gesagt nicht vorstellen, dass ich der einzige mit solchen Problemen bin.
Die Anlage soll bei dem Kunden im Dauerbetrieb laufen und Daten loggen.
Haben Sie noch eine Idee?
mfg Michael Vanderheyden
ich habe heute nochmals die Anlage softwareseitig überprüft. Ich habe auch ein Foto angehängt. (Die Lüsterklemme ist nicht mit den Warriors verbunden, die leitet nur die seriellen Ports der angesprochnen PAX Prozessmeter durch). Den USB - Hub habe ich weggelassen, also die Evaluationboards direkt an meinem Entwicklungsrechner betrieben.
Mit einem Consolen - Testprogramm habe ich die Situation mit nur einem Warrior nachgestellt also ohne Threads. Der Warrior wird initialisiert und dann in einer Endlosschleife Readnonblocking gerufen. Danach ist ein Sleep(10) eingebaut. Die Ausgabe erfolgt auf dem Bildschirm, wenn ein Port nach Masse gezogen wird. Das funktioniert eine ganze Weile. Irgenwann jedoch liefert Readnonblocking keine Ergebnisse mehr, das Programm läuft jedoch weiter. Ziehe ich ein USB Kabel ab, passiert genau dasselbe, was ja auch zu erwarten ist. Für mich sieht das so aus, als ob der Warrior irgendwann die USB Verbindung verliert.
Der restliche USB - Verkehr auf dem Rechner läuft ohne Problem weiter. (Mouse, Tastatur, Festplatte). Das Verhalten habe ich auf drei Rechnern. Auf dem Livesystem läuft Windows XP, auf dem Testrechner Windows 7/64 Vista/64. Ich kann mir ehrlich gesagt nicht vorstellen, dass ich der einzige mit solchen Problemen bin.
Die Anlage soll bei dem Kunden im Dauerbetrieb laufen und Daten loggen.
Haben Sie noch eine Idee?
mfg Michael Vanderheyden
- Attachments
-
- P2182101.jpg (169.61 KiB) Viewed 8940 times
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Stack des Warrios leeren?
Solche Probleme treten tatsächlich normalerweise nicht auf, die IO-Warrior laufen in vielen Anwendungen probemlos im Dauerbetrieb. Daher ist es nicht ganz so einfach heraus zu finden woran es liegt.
Wie ist das Eingangssignal an den IO-Warrior angeschlossen? Möglicherweise kommen Störungen über diesen Weg, die dazu führen, dass der Chip aus dem Tritt kommt.
Wie ist das Eingangssignal an den IO-Warrior angeschlossen? Möglicherweise kommen Störungen über diesen Weg, die dazu führen, dass der Chip aus dem Tritt kommt.
Re: Stack des Warrios leeren?
Hallo,
Über die ca 0.5 m langen Kabel, an die diese 15 poligen Stecker angeschlossen sind. kommen die Signale.
Michael
Über die ca 0.5 m langen Kabel, an die diese 15 poligen Stecker angeschlossen sind. kommen die Signale.
Michael
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Stack des Warrios leeren?
Also keine galvanische Trennung?
Was sind das für Maschinen?
Möglicherweise kommt da über den Weg eine leitungsgeführte Störung bei Schaltvorgängen, oder dem Lauf von Antrieben.
Hängt sich der IO-Warrior auch auf, wenn keine Verbindung zur Maschine besteht?
Was sind das für Maschinen?
Möglicherweise kommt da über den Weg eine leitungsgeführte Störung bei Schaltvorgängen, oder dem Lauf von Antrieben.
Hängt sich der IO-Warrior auch auf, wenn keine Verbindung zur Maschine besteht?
Re: Stack des Warrios leeren?
Hallo,
es sind Signale einer SPS die dann auf den nötigen Pegel gewandelt werden.
Es gibt keine galvanische Trennung.
Das Trennen vom Rechner kann ich jedoch hier auf meinem Entwicklungsrechner nachvollziehen. Da ist keine Maschine dran.
Einfach wie beschrieben alle 10ms lesen das ueber einen langen Zeitraum. Immer mal die Eingaenge auf Masse ziehen und irgenwann liest er nichts mehr, ich gehe also davon aus, dass der sich getrennt hat.
Michael
es sind Signale einer SPS die dann auf den nötigen Pegel gewandelt werden.
Es gibt keine galvanische Trennung.
Das Trennen vom Rechner kann ich jedoch hier auf meinem Entwicklungsrechner nachvollziehen. Da ist keine Maschine dran.
Einfach wie beschrieben alle 10ms lesen das ueber einen langen Zeitraum. Immer mal die Eingaenge auf Masse ziehen und irgenwann liest er nichts mehr, ich gehe also davon aus, dass der sich getrennt hat.
Michael
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Stack des Warrios leeren?
Ich habe mir ein kleines Testtool geschrieben (mit Worker-Thread) und auch nach 2 Stunden gab es keine Fehler oder ausstiege.
Ich hab das Tool jetzt mit 2 Threads ausgestattet und lass das ganze bis zum Feierabend laufen, bzw. morgen über den Tag.
Es wäre hilfreich zu wissen, wie viel Zeit ungefähr verstreicht bis der IO-Warrior aussteigt / der Fehler auftritt.
Ich hab das Tool jetzt mit 2 Threads ausgestattet und lass das ganze bis zum Feierabend laufen, bzw. morgen über den Tag.
Es wäre hilfreich zu wissen, wie viel Zeit ungefähr verstreicht bis der IO-Warrior aussteigt / der Fehler auftritt.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Stack des Warrios leeren?
OK, Problem auf der Hardwareseite ist damit sehr unwahrscheinlich.