Laden...

Abfragen eines Geräts/Schalters im Millisekunden-Intervall

Erstellt von mcneal vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.300 Views
M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren
Abfragen eines Geräts/Schalters im Millisekunden-Intervall

Hallo,

ich hab folgendes Anliegen:

Ich habe ein Fußtaster, der vom Computer erkannt wird bzw wird bei betätigem des Tasters ein Bit auf 1 gesetzt und dieses kann dann ausgelesen werden. Genau genommen ist am Computer über eine zusätzliche Messkarte ein Gerät angeschlossen und an diesem Gerät hängt der Fußtaster.

Jetzt möchte ich natürlich wissen wann bzw. ob der Schalter gedrückt wurde. Dazu muss ich dann also ständig überprüfen ob dieses Bit auf 1 oder 0 steht.

Da das möglichst exakt registriert werden soll dachte ich mir, ich sollte diese Abrfrage schon im Millisekundentakt machen.

Bisher kann ich die Abfrage des Bits mit der Tastatur machen...also wenn ich den Taster betätige und kurz darauf Enter drücke, dann sehe ich, dass das Bit auf 1 steht und wenn ich dann nochmal Enter drücke ist es wieder auf 0. Ist quasi kein andauerndes Signal in dem externen Gerät, sondern nur ein kurzes.

Ja nun also an euch die Frage wie ich diese Abfrage in so einem Zeitintervall hinbekomme?

Z
403 Beiträge seit 2007
vor 13 Jahren

Ein eigenen Thread erstellen der das überwacht, wobei du wohl nicht genau in den Millisekundenbereich kommen wirst,soll heissen, dass es auch mal 2-3 ms pro abfrage dauern kann.

Edit: Es kommt natürlich auch darauf an wie teuer die Abfrage ist.

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

Ja 2-3 oder auch 5 ms sind denke ich ok vll übertreib ich da auch und die Toleranz könnte noch größer sein...

und wenn ich dass dann extra habe und der das dann erkennt, kann ich dann von dort aus quasi in mein Hauptprogramm springen und die Dinge ausführen die nach dem betätigen geschehen sollen?

mit threading hab ich noch nicht wirklich gearbeitet..aber wenn du sagst damit komme ich am besten zum ziel dann guck ich mir das an

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo mcneal,

per Polling wirst du keine Genauigkeiten besser als 15-50ms erreichen können. Das Thema Echtzeit(fähigkeit) wurde - insbesondere im Zusammengang mit der Genauigkeit von Timern - schon öfter besprochen. Bitte benutze die Forumssuche und poste die besten Treffer hier. Vielen Dank!

herbivore

5.742 Beiträge seit 2007
vor 13 Jahren

Ja nun also an euch die Frage wie ich diese Abfrage in so einem Zeitintervall hinbekomme?

Hänge am besten einen Microcontroller dazwischen mit dem du einfacher kommunizieren kannst. Dieser kann dann Pollen und sich merken, wenn der Schalter mal gedrückt war.

185 Beiträge seit 2005
vor 13 Jahren

Was willst du mit dem Fußtaster erreichen? Du wirst mit Sicherheit Probleme mit dem Prellen des Tasters bekommen. Eine Verzögerung von 200ms für das ausblenden der Prellimpulse must du schon rechnen.
Auch wird der Fußtaster ja nicht im ms-Bereich an- und ausgeschaltet vermute ich mal.

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

also nur zur vollständigkeit:
Der Computer hängt zwischen 2 Elementen.

Maschine 1: Steuerelement an dem der Taster ist
Maschine 2: Pumpe

vorher war die Pumpe direkt an M1 aber nun soll die Pumpe über den Rechner konfigurierbar sein.

Der Taster wird quasi weiterhin alles starten aber er wird bestimmt nicht im ms bereich gedrückt. Jedoch sollte ich schon sicher sein können, dass ich dieses Event nicht verpasse.

Sich zu merken, wann der Schalter gedrückt war ist ne sehr gute Sache also werd ich das mal mit dem Controller veruschen. Danke!

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

Also hier mal zur weiteren Vollständigkeit einiges, was sich ebenfalls mit dem Thema befasst:

[erledigt] Bestimmte Aktion exakt alle 20ms ausführen

Echtzeit und C# ? Genauer Timer ?

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

puh also viel hab ich leider noch nicht hinbekommen....kann mir mal rasch einer helfen

ich denke bzw. hoffe es reicht, wenn ich mit System.Timers.Timer arbeite

wollte dann das Timer.Elapsed Event nehmen und dann jedes mal mein Bit abfragen nur iwi bekomme ich es nicht hin

ich bekomme zwar in der Main Methode mein Bit ausgelesen und kann den Wert dann in ner Variablen speichern aber in meiner Timer_Elapsed Methode kann ich nicht drauf zugreifen??
...hab wohl grad nen Baum vorm Kopf

Für das nicht statische Feld, die Methode oder die Eigenschaft "TestConsole_meIOSingleReadAnalog_CS.TestConsole_meIOSingleReadAnalog.str" ist ein Objektverweis erforderlich.

btw...@winSharp93: Was genau meinst du denn wenn du von Microcontrollern sprichst? Hab ein wenig gesucht aber wusste auch nicht direkt wonach und mit dem was ich gefunden habe, konnte ich nur wenig anfangen. Hast du nen Link oder so, was du genau meinst? oder sprichst du von Hardware?

Gelöschter Account
vor 13 Jahren

@Fehler siehe: [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

@Problem: Verwende keinen Timer sondern einen Thread mit einer Schleife und einem Spinwait. Das dürfte einfacher und vor allem präzieser sein. Zudem hast du dann nicht die Gefahr, das deine Messagepumpe unter umständen voll läuft.

5.742 Beiträge seit 2007
vor 13 Jahren

oder sprichst du von Hardware?

Ja - google mal z.B. nach Arduino. Die lassen sich z.B. mit C programmieren und via SerialPort ansteuern.
Die "eigentliche" Steuerung der Pumpe könnte dann dieser Microcontroller übernehmen, während der PC nur "grobe" Befehle gibt (z.B. Pumpe alle 10ms an- und ausschalten).

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

sag ich doch..baum vorm kopf 😛

Verwende keinen Timer sondern einen Thread mit einer Schleife und einem Spinwait.

wie sage ich denn einer Schleife, dass sie sich alle paar millisekunden wieder aufrufen soll? Die erwartet doch ne Anzahl an durchläufen oder nicht? und das kann ich ihr ja gar nicht geben.

Sobald das prog läuft soll der thread(in dem der Taster überwacht wird) rattern und er soll erst aufhören, wenn der benutzer meint, er ist fertig und das programm beendet.

@ winsharp:

also die Steuerung der Pumpen ist ohnehin schon sehr grob^^ weil viel können die nicht und das ganze geschieht über die RS232 Schnittstelle

Nun möchte ich eig nichts anderes als diese Steuermaschine wieder dazwischen klemmen (bzw hängt jetzt ja der PC zwischen der Maschine und der Pumpe) und meinen Button, den ich habe um den Vorgang zu starten über den Taster auslösen. Dazu muss man vll wissen, dass pumpe+Maschine halt nicht dort stehen wo der PC ist. Quasi erst alles am Rechner einstellen...rüber zu der Pumpe und feuer frei für den Taster 😉

Da jetzt noch neue Hardware zu besorgen und die dann auch wieder zu programmieren halte ich für overhead

Gelöschter Account
vor 13 Jahren

wie sage ich denn einer Schleife, dass sie sich alle paar millisekunden wieder aufrufen soll? Die erwartet doch ne Anzahl an durchläufen oder nicht?

Schon mal was von "do-while" gehört?

R
103 Beiträge seit 2009
vor 13 Jahren

Argh. höre ich da rs232 ?

Schau dir mal die SerialPort Schittstelle in c# an, das kann man doch ganz komfortabel über Events regeln.

Die seriellen Schnittstellen in PCs lösen schon seit gefühlten Jahrhunderten Interupts aus, wenn Daten anliegen. In c# läuft das dann auf Events heraus.

Selbst auf Embedded Prozessoren gibts für sowas Interrupts. Pollen über rs232 ist schon seit 2400 Baud Modems out 😉

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

hmm also das mit der Pumensteuerung läuft auf jeden Fall und bei der Übertragung gibt es auch keine Probleme. Es hat mich auch genügend Schweiß gekostet, sodass ich daran auch letztendlich nichts mehr ändern möchte.

Aber danke für den Hinweis, so weiss ich für die Zukunft, dass es bessere Wege gibt.

Schon mal was von "do-while" gehört?

Ja 8o

und wie müsste dann sowas aussehen?

jetzt mal bisl pseudocode mäßig:

do (alle paar ms){ 
x=tasterbit.getValue()
if (x=1) run()
while(program is running)} 

ich bekomme halt dieses..."mach alle paar ms was" statement vor allem nicht formuliert

Gelöschter Account
vor 13 Jahren

vielleicht mit einem Spinwait?

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

manchmal muss man sich halt erst wiederholen bevor der andere versteht was man will..

jedenfalls hoffe ich,dass ich dich richtig verstehe

soll also so werden:

spinwait s= new spinwait()
do{
testeBit();
s.spinOnce();
}
while ( prog is running)

und das ganze dann in nem extra Thread halt..

sollte es in die Richtung gehen?

Gelöschter Account
vor 13 Jahren

ja, pseudocode mäßig ist das schon richtig so. Beachte aber, das du die SpinWait methode der Threadklasse nutzt.

M
mcneal Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

Schön, jetzt hauts hin. Danke für die Hilfe!