Capture Timer

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

Moderator: Guido Körber

Post Reply
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Capture Timer

Post by KPF-Zeller »

Hallo Forum

Seit 8 Jahren verwende ich in meinen Produkten den IO-Warrior.
Und jetzt ploetzlich bin ich mir ziemlich sicher, dass ich mein dazugehoeriges Programm falsch erstellt habe.


Es ist wohl die einfachste Aufgabenstellung, die man von einem IO-Warrior abrufen mag:
Eine an PIN 0.0 angeschlossene Lichtschranke sendet I/0-Signale.
Die Taktfrequenz betraegt dabei maximal ca. 200 Hz

Alles was ich dazu wissen muss, ist:
Wie viele Impulse hat der IO-Warrior in einer gewissen Zeit registriert?

Ich rufe also zum Beispiel alle 0,5 Sekunden den IOW mit IowKitReadNonBlocking ab und erhalte dann….und jetzt kommt’s:
Was erhalte ich denn da eigentlich?
Ich habe naemlich keine Ahnung!

Was ich bisher mache:
Ich rufe diesen Status alle 10 ms per Timer ab und entscheide dann, ob sich der Status zum vorigen Status geaendert hat.
Ist dies der Fall, gehe ich davon aus, dass ein Impuls von der Lichtschranke ankam.
Aber ich erkenne doch nicht, ob es sogar zwei oder mehr Impulse waren!

Wisst ihr, was ich meine?

Momentan……..und das ergibt meine grobe Schaetzung……haenge ich an den 125 Hz maximaler Uebertragungsfrequenz von USB ab.

Wie also schaffe ich es, die Anzahl der Impulse auszulesen, die zwischen den beiden *Auslesungen* stattgefunden haben.
Stichwort Datenpuffer?

Diesen Satz habe ich noch im Forum gefunden:

Beim IO-Warrior24 bietet sich dafür aber sicher die "Capture Timer" Funtkion an.
Damit werden Zeiten wischen den Flankenwechseln gemessen. Einfach mal ins Datenblatt schauen (Kapitel 5.10.8)



Leider habe ich viel zu wenig Ahnung davon und bin wahrscheinlich auf echte Hilfe angewiesen.
Gerne zeige ich mich diesbezueglich erkenntlich.

Sie koennen mir direkt eine Email senden an service@kpf-zeller.de


Allerbesten Dank!

Matthias Zeller
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Capture Timer

Post by Guido Körber »

Also grundsätzlich sendet der IOW24 maximal alle 8 ms ein Datenpaket, aber nur dann wenn sich der Status geändert hat.

Gepuffert wird auf der PC Seite. Wie viele Datenpakete hängt vom Betriebssystem ab. Aber auf keinen Fall kann man damit mehr als die 8 ms Auflösung erzielen. Zählen von Flankenwechseln ist als Funktion im IOW24 nicht drin.

Der Capture Timer ist eigentlich ganz einfach. Im IOW24 befindet sich ein 24 Bit Zähler der mit 250 kHz getaktet ist, also alle 4 µs um eins hoch zählt. Wenn einer der beiden Timer aktiviert ist, dann sendet der bei einer fallenden oder steigenden Flanke den Zählerstand. Die Differenz zwischen zwei Werten ist dann die zwischen den Flanken vergangene Zeit.

Der große Vorteil der Capture Timer ist, dass keine Störeffekte durch Betriebssystem oder andere Programme die Messung beeinflussen können. Und die Messauflösung ist recht ordentlich, man könnte damit zwei Lichtschranken in 50 cm Abstand benutzen um die Geschwindigkeit einer Pistolenkugel zu messen…
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Re: Capture Timer

Post by KPF-Zeller »

Hallo Herr Koerber

Gibt es ein Code-Beispiel, wie ich diesen Capture Timer unter VB.NET anspreche und auslesen kann?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Capture Timer

Post by Guido Körber »

Es gibt im SDK ein Beispiel für MFC, das Prinzip ist ja das gleiche.
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Re: Capture Timer

Post by KPF-Zeller »

Hallo Herr Koerber
Vielen Dank fuer Ihre rasche Antwort.

Ich verwende Microsoft Visual Studio 12 Express.
Mit diesen Dateien, die offensichtlich in C++ geschrieben sind, komme ich nicht klar.

Vielleicht versuche ich es mal auf einem anderen Weg:

Bislang lese ich den IO-Warrior wie folgt ein:

----------------------------------------------------------

read_from_USB = IowKitReadNonBlocking(iowHandles(0), 0, data(0), 3)

' Return 0 erfolgt, wenn keine Daten anliegen.
' daher wird bei 0 keine Aktion ausgefuehrt...ansonsten:
If data(1) = 0 Then
'mach nix, da Null......also keine anliegenden Daten
Else
gelesene_daten = data(1)

-------------------------------------------------------



Kann mir da nun jemand einen korrigierten Code nennen, der mir den Zaehlerstand vom Capture Timer ausliest?
Und wie ich diesen Capture Timer aktiviere.

Totaler Laie, sorry
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Re: Capture Timer

Post by KPF-Zeller »

Mein Plan ist naemlich nun Folgender:

Ich lese nicht die Impulse ein, sondern die ImpulsDAUER - und errechne daraus dann die Umdrehungsgeschwindigkeit.

Vielleicht hilft zum besseren Verstaendnis dieses Video:

https://www.youtube.com/watch?v=8RlLeHucj6E
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Capture Timer

Post by Christoph Jung »

VB ist nicht gerade mein Steckenpferd, aber ich werde mal ein Beispiel erstellen.
Aber ob das mit der Impulsdauer und dem capturetimer funktioniert weiß ich leider nicht.

Würde sich für die Anwendung in dem Youtubvideo nicht ein SpinWarrior besser eignen?
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Re: Capture Timer

Post by KPF-Zeller »

Hallo Herr Jung

Ich habe soeben mit Herrn Koerber telefoniert und erfahren, dass der Spin-Warrior in diesem Fall nicht funktioniert.

Sehr freue ich mich auf Ihren Beispiel-Code!

M. Zeller
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Re: Capture Timer

Post by KPF-Zeller »

Hallo Herr Jung

Mittlerweile habe ich Ihren Code an meine Anwendung angepasst.
Klappte besser, als ich dachte.

Ein extrem ernuechterndes Ergebnis stellt sich bislang jedoch ein:
KEINE Veraenderung zu meiner vorangegangenen Messung.

Im unteren Drehzahlbereich klappt alles einwandfrei...............wie bislang ja auch.
Irgendwann kommt bei steigender Drehzahl der Punkt, wo die 8ms der Auslesung sich mit den 8ms der vorangegangenen Messung ueberlagern.

Ploetzlich spielt die Genauigkeit der Flankenmessung keine Rolle mehr, da ja nun wieder erneut nur DIESE Flanke gemessen wird, die im Moment gerade angelegen hatte.

Anders gesagt: Diese Messung *verschluckt* Flanken, welche zwischen den 8ms-Abrufen auftreten.


Hilft hier ein zweiter Timer?

Schade........ich bin irgendwie ein wenig gefrustet.

Gerne sende ich Ihnen den aktuellen Quellcode zu.

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

Re: Capture Timer

Post by Christoph Jung »

Also ein zweiter Timer bringt da glaube ich nicht viel. An den 8ms vom USB 1.1 ändert das nichts.
Ein IO-Warrior56 ist schnelle, aber hat keinen Capture-Timer und ist Preislich erheblich teurer.

Mir fällt da nur noch ein eine Umdrehung oder Puls auszulassen, also nur jede zweite oder vierte Flanken auszulesen und das dann mit zu berechnen.
Sie bekommen bei der ersten Flanke die Zeit und überspringen einfach 2 order 4 Zyklen und lesen dann erneut die Zeit. Ich weiß nur nicht ob das klappt, ist nur ins blaue geraten.

Oder mechanisch eine Übersetzung 1:2 (oder 2:1?) damit die Pulse langsamer erzeugt werden und das dann auch einzurechnen.

Eine andere Sache, die ich jetzt noch nicht geschaut hatte war, nutzen Sie den normalen Timer oder einen Multimedia-Timer / Thread zum auslesen?
Der normale Timer schafft selten die 8ms. Meist ist bei normaler Systemlast ein Wert zwischen 15-20ms das minimum.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Re: Capture Timer

Post by KPF-Zeller »

Hallo Herr Jung

Auf die Schnelle geantwortet und hinterfragt:

Was bringt die Capture Timer Funktion, wenn sie........wie die Standard-Funktion.......Flankenaenderungen ueberliest?
Diese muss doch vollkommen unabhaengig vom Auslese-Intervall sein.


Da ist doch ein *Fehler im System* ?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Capture Timer

Post by Guido Körber »

Hallo Herr Zeller,
bei sich wiederholenden Ereignissen ist das Problem, dass der Capture-Timer diese nicht mehr über den USB los wird, wenn sie schneller anfallen als sie über den Bus geschickt werden können. Das ist ab 250 Flanken pro Sekunde der Fall. Wird diese Frequenz erreicht, dann ignoriert der IOW24 weitere Flanken bis er jeweils ein Datenpaket los werden konnte.

Es gibt zwei Optionen um das auszutricksen:
Sie können nach jeweils zwei Datenpaketen die Capture-Timer Funktion aus und wieder einschalten. Dann bekommen Sie die Zeiten für drei aufeinander folgende Flanken geliefert, bevor wieder nur dann Daten kommen wenn ein Paket abgeschickt wurde.

Oder Sie verwenden die Daten die kontinuierlich ankommen zusammen mit der Information wie breit der Unterbrecher ist um daraus die Drehzahl zu errechnen.
KPF-Zeller
Posts: 8
Joined: Thu Jan 15, 2015 7:47 pm

Re: Capture Timer

Post by KPF-Zeller »

Hallo Herr Koerber

Ich versuche es mal *auf Deutsch* anstatt auf *Programmiersprache*, was meiner Ansicht nach in dem Programm geschehen sollte:

- starte beide Timer gleichzeitig
- warte mit Timer 1 so lange, bis eine High-to-Low Flanke erkannt wird und merke dir diesen Wert
- Timer zwei laeuft indessen weiter
- warte nun mit Timer 2 auf eine erneute High-to-Low Flanke und merke dir diesen Wert
- berechne nun die Differenz der beiden Werte und gebe sie an das Hauptprogramm weiter

Das Ganze muss meiner Ansicht nach NICHT alle 8ms ausgefuehrt werden. Es wuerde beispielsweise auch jede Sekunde genuegen.
Ich uebertreibe nun absichtlich: Sogar jede Minute einmal abrufen wuerde genuegen.
Es waere derselbe Wert, der gemessen wird.
Lediglich mein Anzeigeintervall wird sich dann aendern. Dies ist aber voellig irrelevant und darf gerne in den Sekundenbereich hineingehen.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Capture Timer

Post by Guido Körber »

Das ist aber nicht wie die Capture Timer funktionieren. Die beiden Timer sind unabhängig voneinander.

Wie gesagt wäre es die einfachste Option die Timer-Funktion immer wieder ein und aus zu schalten, dann bekommen Sie jeweils drei aufeinander folgende Flanken.
Post Reply