Computerperipherie zur sofortigen (<5 ms) Erkennung von Zustandsänderungen digitaler Eingänge in C#-Programmen

Die C#-Anwendung, an der ich arbeite, muss in der Lage sein, eine Funktion innerhalb von 5 Millisekunden nach der Zustandsänderung eines digitalen Eingangssignals aufzurufen (0 V = aus, 5 V = ein).

Anstatt Software zu verwenden, um den Zustand dieses Eingangs wiederholt abzufragen, möchte ich, dass eine Hardware einfach eine Softwarefunktion aufruft, wenn die Hardware eine Zustandsänderung erkennt (z. B. wie Hardware-Interrupts funktionieren).

Weiß jemand, wie das geht (welche Ports zu verwenden sind) auf einem Standard-PC-Tower? Oder kennt jemand Hardware-Peripheriegeräte, die diese Funktionalität ermöglichen?

Gelegentliche Latenzen sind in Ordnung. Ich brauche <5ms Durchschnitt.

Ich muss grundsätzlich so viele Samples wie möglich von der digitalen Eingangswellenform nehmen. (vorzugsweise im C#-Programm und nicht in einem peripheren Mikrocontroller, obwohl ich für Vorschläge offen bin).

Ich habe zum Beispiel herausgefunden, dass der Labjack U3 seinen digitalen Eingang in weniger als einer Millisekunde abfragen kann. Dies ist eine gültige Antwort auf die Frage, aber ich bin an weiteren Antworten interessiert, insbesondere an solchen, die keine Abfrage verwenden oder schneller als 1 ms abfragen.

Hohe Eingangsimpedanz wäre schön (digitale Eingänge).

2ms harte Echtzeitantwort? Unter Windows?
Auf keinen Fall tust du es. Wenn Sie uns das eigentliche Problem mitteilen , helfen wir Ihnen möglicherweise dabei, eine geeignete Lösung zu finden.
Ich habe bereits verifiziert, dass ich es mit einem LabJack U3 (einem Mikrocontrollergerät) und wiederholtem Abfragen seines Eingangszustands tun könnte (was jede Millisekunde erfolgen kann). Die Frage ist also nicht lächerlich. Ich will mehr Ideen. Beispielsweise treten Tastatur- und Mausunterbrechungen in Nanosekunden auf, nicht in Millisekunden.
Der lächerliche Teil erwartet, dass ein Standard-Betriebssystem Ihnen dieses Maß an Reaktionsfähigkeit bietet. Standardbetriebssysteme sind darauf ausgelegt, Ihnen auf Kosten der Latenz einen Spitzendurchsatz zu bieten. Selbst ein modernes Multi-GHz-System kann gelegentlich Latenzen in der Größenordnung von vielen Mikrosekunden oder länger bis zu Millisekunden mit einem normalen Betriebssystem haben, je nachdem, was läuft. Es gibt spezielle Betriebssysteme, die für Echtzeitprobleme entwickelt wurden (einschließlich einer speziellen Version von Windows). Mikrocontroller haben oft entweder kein Betriebssystem oder verwenden eines dieser Echtzeit-Betriebssysteme, um Ihnen nahezu keine Latenz zu bieten.
@OrangeSherbet Interrupts können in Nullzeit auftreten, aber ihre Behandlung im Betriebssystem ist viel langsamer.
Wie auch immer, Sie können diese Latenz manchmal erreichen. Aber darauf können Sie sich nicht verlassen, da es nicht garantiert ist.
Die Anwendung erfordert keine konstante Latenz. Es ist ein Algorithmus, der entwickelt wurde, um Daten über die sich wiederholende Wellenform der Eingabe zu lernen, und die Leistung des Algorithmus ist grundlegend dadurch begrenzt, wie oft ich etwas über die Eingabe lernen kann. Ich möchte grundsätzlich so viele Proben wie möglich nehmen, egal ob die Proben versetzt und instabil sind.
Wie auch immer, da Sie sagen, dass Sie mit einigen MCU-Sachen vertraut sind, würde ich vorschlagen, das Sampling auf der MCU-Seite zu implementieren, die Daten auf irgendeine Weise zu packen und sie über einen Kommunikationskanal an den Computer zu senden.
Wie ein DAQ? Ich muss einige Codes aufgeben, aber ich glaube, Sie haben wahrscheinlich Recht, Eugene.
Etwas wie das. Stellen Sie einfach sicher, dass Sie die gewünschte Rate erreichen können, indem Sie die Rate berücksichtigen, mit der die Kommunikationsrahmen verarbeitet werden
Weder die Reaktionszeiten der Maus noch der Tastatur liegen auch nur in der Nähe von Nanosekunden. Eine USB-Unterbrechungsantwort bei voller Geschwindigkeit beträgt 1 ms und selbst auf einem 2.0-Hochgeschwindigkeitsgerät ist das Beste, was Sie tun können, 125 us.
Die USB-Paketlatenz ist wahrscheinlich hundertmal größer als die Signal-zu-Interrupt-Zeit.
Was ist die Mindestzeit zwischen zwei Impulsen?
50 Millisekunden (fast besagte Mikrosekunden) für eine volle Periode (etwa 50 % Einschaltdauer) sind das Minimum. Im Idealfall könnte ich innerhalb kurzer Zeit herausfinden, wann das Signal hoch geht. Mit anderen Worten, es könnte etwa 20 Millisekunden hoch sein, gefolgt von etwa 20 Millisekunden niedrig usw. Hoffentlich kann ich in 20 ms mehrere Samples fertigstellen.
hört sich so an, als ob Sie einen Mikrocontroller benötigen, um das Sampling durchzuführen, und dann ein serielles Paket (USB oder klassisches serielles) an ein User-Space-Programm, um zwischen den einzelnen Ereignissen eine Stapelverarbeitung durchzuführen. Das ist auf jeden Fall erreichbar. Holen Sie sich etwas Billiges und Einfaches wie einen Teensy 3.1 für 20 US-Dollar
Ich hatte einen Atmega328P, der ernsthaftes Daten-Sampling und Byte-gepacktes Nachrichten-Spamming an eine C#-Anwendung unter Verwendung eines USB-Serial-Konverters in Windows 7 und auch unter Linux in einem Roboter mit C++ durchführte, und es funktionierte in beiden Fällen wunderbar, da es sehr zeitkritisch war Anwendungen (Encoder des Motors, zur Erfassung des Winkels).
@KyranF du hast etwas falsch gemacht; Garbage Collection-Sprachen sind für "sehr zeitkritische Anwendungen" ungeeignet. Die Verzögerungen können beliebig lang sein.
@ilkhd hast du nicht gelesen, was ich getan habe? Ich habe einen Mikrocontroller für die Datenerfassung verwendet und die Daten in Bursts mit Zeitstempeln an den Computer zur Verarbeitung/Speicherung/Verknüpfung mit LIDAR-Daten gesendet
@ilkhd das C # - oder C ++ - Programm, das versucht, die Datenabtastung und Zeitstempelung durchzuführen, wäre bei der Aufgabe schrecklich gescheitert, wie Sie sagen - aber es hat nichts mit der Garbage Collection zu tun. Es ist das Betriebssystem und die zufälligen Verzögerungen von 10 ms kommen von Operationen auf Betriebssystemebene (Kernel), die die Leistung ruinieren
@KyranF Verstehst du, wie Garbage Collector funktioniert? C# ist für alles ungeeignet, was weniger als 1 Minute zufällige Verzögerungen erfordert.
@ilkhd Sie müssen etwas falsch machen, Kumpel, sorry.
@KyranF, wenn ich auch nur sehr entspannte Echtzeit brauche, würde ich es nicht mit einer Garbage-Collected-Sprache machen; c oder c++ sind in Ordnung, aber nicht C#, "mate".
@ilkhd Meine Erfahrung beweist das Gegenteil, du überschätzt die Verzögerungen. Es kann keine garantierte Leistung sein, aber 1 Minute zufällige Verzögerungen? Nein. Ich hatte eine erstaunliche Geschwindigkeit, keine Verzögerungen UND alles lief in einer Windows Forms-GUI-Anwendung zum Booten.
@KyranF Vielen Dank für Ihre konstruktiven Vorschläge. Der Teensy 3.1 sieht so aus, als würde er großartig funktionieren, außer dass ich Probleme habe, eine .NET-Bibliothek für C # für den Teensy zu finden. Ich denke, im Allgemeinen wäre ein kleines Arduino mit .NET-Funktionalität schön. Aber Labjack ist noch einfacher, obwohl 108 $ ...
Sehen Sie sich .NETduino an. Aber warum wollen Sie eine C#-Bibliothek für den Teensy? Sie programmieren es mit Arduino mit dem Plug-in TeensyDuino für die Arduino IDE und definieren eine einfache serielle Schnittstelle zwischen dem Teensy und einem C#-Programm, wobei das C#-Programm nur serielle Pakete empfängt und verarbeitet.
Ich bin irgendwie verloren in dem, was Sie meinen, "definieren Sie eine einfache serielle Schnittstelle und ein c#-Programm", wie definiere ich so etwas? Gibt es eine Art USB(?)-Kommunikationsbibliothek, um während eines C#-Programms mit dem Teensy zu kommunizieren? Vielleicht System.IO.Ports?

Antworten (3)

Müssen Sie eine bestimmte Echtzeitaktion ausführen oder nur das Ereignis aufzeichnen?

Im ersteren Fall werden Sie dies niemals mit handelsüblicher Hardware und verbrauchergerechten Schnittstellen erreichen. Sie benötigen sowohl einen Signalprozessor in Laborqualität (es wird eine Karte sein, die direkt auf Hardware-Interrupts zugreifen kann) als auch ein Echtzeit-Betriebssystem wie VxWorks. Ein benutzerorientiertes Betriebssystem unterbricht das Schreiben auf eine Festplatte nicht, nur weil der USB-Bus etwas Aufmerksamkeit verlangt.

Wenn letzteres der Fall ist, besorgen Sie sich einen Signalrecorder und bearbeiten Sie den Pufferausgang nach Belieben nach.

Ich muss nichts in Echtzeit tun, ich muss lediglich fallende und steigende Flanken zeitstempeln und aufzeichnen, sobald sie auftreten. Ich bin mir nicht sicher, was Sie mit "Signalrekorder" meinen, aber ich möchte die digitale Leitung wirklich nicht in ADCs stecken, analoge Funktionalität ist nicht wirklich das, was ich will.

Wenn Ihr Signal nicht zu viel Gleichstrom hat (lange Pausen ohne Daten), verwenden Sie die Soundkarte.

Erkläre warum....
@Null was genau soll ich erklären?
Mein Signal hat lange Perioden mit niedrigem Gleichstrom (10 Sekunden niedrig). Eine Soundkarte ist eine innovative Idee, aber ich müsste meinen digitalen Eingang auf 400 mV herunterskalieren, und ich brauche nicht wirklich alle analogen Fähigkeiten, es wäre besser, direkt zu etwas mit einem digitalen Eingangspin zu gehen.
@OrangeSherbet Nun, ein moderner Standard-PC hat keinen gepufferten Digitaleingang. Soundkarte ist die einzige Option. Um das digitale Signal zu begrenzen, benötigen Sie lediglich eine Diode und 3 Widerstände. Wenn Sie sich für den Weg der Soundkarte entscheiden, erkläre ich Ihnen, wie Sie mit DC umgehen.

Am Ende habe ich einen Arduino Uno verwendet, Timer Input Capture Interrupt Service Routineum Daten über USB SerialPortsofort nach der Eingabeerfassung auf ein C#-Objekt zu setzen. Der SerialPortfeuert serialdatareceivedeventhandlerunmittelbar beim Erkennen eines Dateiendezeichens (0x1A) und ein neuer Thread startet, um die Eingabedaten zu verarbeiten (z. B. um ihnen einen Zeitstempel zuzuweisen).

An alle Nachbarn, What the Heck? Offensichtlich hast du dich geirrt, dass es nicht möglich war.

Haben Sie Ihre maximale Latenzzeit von 5 ms überprüft ?
Ich bin mir nicht sicher, wie ich das messen würde (wie man Arduino und Computer synchronisiert ...), aber es scheint, dass ich eine Auflösung von ungefähr 2 Millisekunden habe (nicht Latenz, stattdessen variiert die Latenz so stark). Ich brauchte wirklich eine Latenz, die nicht um mehr als ein paar Millisekunden variierte, eine konstante Latenz war wünschenswert.