Stack des Warrios leeren?

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Christoph Jung »

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?
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
MichaelV
Posts: 32
Joined: Mon May 30, 2011 4:16 pm

Re: Stack des Warrios leeren?

Post by MichaelV »

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

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;
}
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Christoph Jung »

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.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
MichaelV
Posts: 32
Joined: Mon May 30, 2011 4:16 pm

Re: Stack des Warrios leeren?

Post by MichaelV »

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
Attachments
CWorkerThread.zip
(3.51 KiB) Downloaded 193 times
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Christoph Jung »

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?
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
MichaelV
Posts: 32
Joined: Mon May 30, 2011 4:16 pm

Re: Stack des Warrios leeren?

Post by MichaelV »

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
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Guido Körber »

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.
MichaelV
Posts: 32
Joined: Mon May 30, 2011 4:16 pm

Re: Stack des Warrios leeren?

Post by MichaelV »

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
MichaelV
Posts: 32
Joined: Mon May 30, 2011 4:16 pm

Re: Stack des Warrios leeren?

Post by MichaelV »

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
Attachments
P2182101.jpg
P2182101.jpg (169.61 KiB) Viewed 8940 times
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Guido Körber »

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.
MichaelV
Posts: 32
Joined: Mon May 30, 2011 4:16 pm

Re: Stack des Warrios leeren?

Post by MichaelV »

Hallo,
Über die ca 0.5 m langen Kabel, an die diese 15 poligen Stecker angeschlossen sind. kommen die Signale.
Michael
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Guido Körber »

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?
MichaelV
Posts: 32
Joined: Mon May 30, 2011 4:16 pm

Re: Stack des Warrios leeren?

Post by MichaelV »

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
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Christoph Jung »

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.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Stack des Warrios leeren?

Post by Guido Körber »

OK, Problem auf der Hardwareseite ist damit sehr unwahrscheinlich.
Post Reply