Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Abfragen eines Geräts/Schalters im Millisekunden-Intervall
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

Abfragen eines Geräts/Schalters im Millisekunden-Intervall

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Zicore
myCSharp.de - Member



Dabei seit:
Beiträge: 413

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Zicore am .
private Nachricht | Beiträge des Benutzers
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von mcneal
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.
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

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
Zitat
Für das nicht statische Feld, die Methode oder die Eigenschaft "TestConsole_meIOSingleReadAnalog_CS.TestConsole_meIOSingleReadAnalog.str" ist ein Objektverweis erforderlich.


[email protected]: 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?
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

@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.
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von mcneal
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).
private Nachricht | Beiträge des Benutzers
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

sag ich doch..baum vorm kopf :P
Zitat
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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
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?
rasepretrep
myCSharp.de - Member



Dabei seit:
Beiträge: 105

beantworten | zitieren | melden

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 ;)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von rasepretrep am .
private Nachricht | Beiträge des Benutzers
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

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.

Zitat
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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

vielleicht mit einem Spinwait?
mcneal
myCSharp.de - Member



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 59
Herkunft: Magdeburg

Themenstarter:

beantworten | zitieren | melden

Schön, jetzt hauts hin. Danke für die Hilfe!
private Nachricht | Beiträge des Benutzers