Timer



  • Ich versuche mal mein gesammtes Problem zu beschreiben, vielleicht könnt ihr mir dann besser helfen.

    Ich muss das Node Guarding Protokol, welches durch den CANopen Application Layer spezifiziert wird, implementieren.

    Dabei muss ich an 0...127 Netzwerkknoten innerhalb eines Zeitintervalls (Guard Time, UINT16, Millisekunden) einen Request abschicken. Dabei kann jedoch die Guard Time der Netzwerkknoten von Knoten zu Knoten unterschiedlich sein.

    Ich habe geplant eine Warteschlange zu erstellen bei der immer beim vorderen Element ein Wert von 0 jede Millisekunde um 1 incrementiert wird (aufruf von void Increment()). Sobald dieser Wert den Wert der Guard Time erreicht hat, wird der Request geschickt und das Element abhängig von seiner Guard Time neu in die Warteschlange eingefügt wird. Beim Einfügen wird die Guard Time relativ zu den Elementen berechnet, die sich davor in der Warteschlange befinden.

    Nun wird beim nächsten Element dieser Wert incrementiert. usw.

    Hättest ihr vielleicht einen anderen VOrschlag zur Lösung meines Problems ? Freue mich über Vorschläge.



  • Windows ist kein Echtzeit-OS. Selbst in Assembler gibt es irre Reaktionszeiten
    auf Interrupts die nicht prognostizierbar sind (liegt an den Prozessoren). Es gibt
    Ansätze für Realtime ...

    Aber 1ms ist sehr knapp, das löst Windows nicht auf (macht nur 18 Ticks/sec).



  • Okay nach kurzem Überlegen konnte ich meinen Ansatz verbessern.

    Ich könnte immer für das erste Element in der Warteschlange (hier habe vor die Klasse vector zu verwenden) einen TImer starte, der mit einem Wert von 1...65535 in Millisekunden initialisiert wird. Dann löse ich pro Element nur ein Event aus. Der Nachteil ist dann aber glaube ich, dass zwischen dem Event und dem starten des neuen Timers Zeit vergeht und die Nachricht6en nicht zeitgenau versendet werden.

    Kann mir jemand einen Timer empfehlen ? Ich bin eigentlich eher der JAVA Fan und kann für C++ keine Dokumentationsplattform wie JAVADOC von SUN finden und stehe deshalb etwas auf dem Schlauch.

    Gruß



  • Klar kann ich Dir einen Timer empfehlen:

    UINT SetTimer(

    HWND hWnd, // handle of window for timer messages
    UINT nIDEvent, // timer identifier
    UINT uElapse, // time-out value
    TIMERPROC lpTimerFunc // address of timer procedure
    );

    erhältlich im Helpfile.

    Ich verstehe aber Dein Problem nicht. Wenn ich 128 Dinger überwachen will, sende
    ich in einer Schleife an Alle etwas ab und warte auf die Ergebnisse. Laß die
    Netzwerkkarte / Schnittstelle einen Interrupt auslösen der den Status dann
    aktualisiert - das wäre bestimmt einfacher.

    Die Windows-Timer kannst Du dabei vergessen, ich glaube da gibt's eh nur 3 ...



  • Scheppertreiber schrieb:

    Die Windows-Timer kannst Du dabei vergessen

    präzises timing ist schon immer ein sorgenkind im hardware und softwaredesign gewesen. ich würde dabei aber nicht so weit gehen, und dies als "das kannst du vergessen" abstempeln 🙂



  • Leider doch. Spezioell die 86er-Prozessoren brauchen da ewig, dann hängt noch der
    ganze Windows-Overhead hintendran. In diesem Fall würde ich das nicht so aufziehen.

    Es gibt nunmal bei Windows keine garantierten Antwortzeiten (dafür wurde es auch
    nicht gemacht, Linux nebenbei auch nicht).

    Aber: braucht er das überhaupt ? Wenn's das OS/die Hardware nicht hergit würde
    ich das anders aufziehen (s.o.).
    Gruß Joe.



  • Hallo,

    das Node Guarding das ich implementieren muss, hat eben diese Zeitanforderungen. Ich muss jeden der 0...127 Netzwerknoten im Netz abpollen, ob die Knoten noch verfügbar sind und diese müssen innerhalb eines Zeitintervalls (Life Time) antworten. Zudem erwarten die Netzwerkknoten dass ich sie ebenfalls innerhalb der Life Time abpolle, damit die sicher gehen können, das ich nicht abgestürzt bin.

    Bei dieser Zeitanforderung kann ich sicherlich noch etwas Genauigkeit herausnehmen, wenn es auf die MIllisekunde genau nicht zu realiseren ist.

    Ich habe mir überlegt dass der Nutzer, der den Node Guarding Service verwendet die Guard Time nicht als 16 bit Wert in Millisekunden angeben kann, sondern z. B. als 12 bit-Wert. Ich müsste den Wert dann immer mit 16 multiplizieren. Dann wäre der Wert der Guard Time immer ein Vielfaches von 16 Millisekunden.

    Gruß



  • Also, wenn ich das richtig verstanden habe geht es um eine permanente
    Verbindungserhaltung und -prüfung. Jedes Teil schaut dauern nach ob alle
    anderen noch leben.

    zB Teil A sendet an B "Huhu" und erwartet innerhalb einer festgelegten Zeit
    eine Antwort. Kommt die nicht gibt's eine Fehlermeldung.

    Dein Programm schickt dabei an alle eine Aufforderung, die Teile immer nur
    eine an Dein Programm.

    Das Senden der Aufforderung ist keinn Problem, einfach senden und die Zeit
    merken. Die Antwortzeit sollte dann ein IRQ in diese Tabelle schreiben. Ein
    parallel laufendes Programm schaut da nach ob ein timeout überschritten wurde
    und mault ggfls.

    Beim Empfang in einem IRQ würde ich direkt ein Echo absetzen.

    In C geht das relativ einfach, ich habe diese Konstruktion mal in einem RS485
    Netz eingesetzt. Einfach in die Tastatureingabe geklemmt und gut ist es.



  • Hallo,

    du bist nah drann.

    Die Software due ich schreiben soll ein Hardware-Steuergerät das über den CAN-Bus mit anderen Steuergeräten kommuniziert per Software simulieren.

    Dabei stellt eine Instanz der Software ein Steuergerät dar.

    Ein Hardware-Steuergerät (hier eine Instanz der Software) kann entweder die Rolle des Masters oder die eines Slaves annehmen und kann einen bestimmten Zustand besitzen. Dabei gibt es vier verschiedene Zustände und max 128 Steuergeräte, wober nur einer der Master sein kann.

    Der Master sendet jetzt periodisch (Periode = Guard Time), einen Request über den CAN-Bus an einen Slave. Der CAN-Bus wird durch ein spezielles USB-Device (CANcase XL von Vector).

    Jeder Slave der ein Request vom Master erhält muss einen Resonse an den Master senden. Diese Response enthält unter anderem den Status des Slaves. Dieser muss mit dem vom Master erwarteten Zustand übereinstimmen:

    Folgende Fehler können auftreten:

    Master:

    Slave antwortet nicht innerhalb Life Time
    Slave meldet falschen Zustand

    Slave

    Master schickt keine Request innerhalb der Life Time.

    Hmm mit IRQ kenn 9ich mich gar nicht so gut aus. Zum Senden und Empfangen muss ich die Treiber Bibliotheke des oben genannten USB-Geräts verwenden. Über eine empfangene Nachricht werde ich z. B. über einen Handle informiert.

    Gruß



  • hehehe ...

    Genau diesen Kram wollte ich ins Mopped einbauen weil's mich halt interessiert.
    Wären diese CAN-Dinger nicht so teuer hätte ich das schon drin.

    Einfach eine geile Vorstellung: CAN-Bus in der Dnepr, alles auf einen kleinen
    Webserver und per Händi live von der linken Spur *gröööööl* *prost* !

    Im Ernst: Im CAN-Protokoll müßte die Verbindungsunterhaltung drinnen sein, sonst
    wäre der Mist nicht nur teuer sondern unbrauchbar.



  • Hallo,

    welchen Header benötige ich denn für den von dir genannten Timer ? Ist das <windows.h> ?

    Gruß



  • grep SetTimer *.h



  • also jetzt bin ich irgendwie überfordert 🙂 Wenn ich so Linux Kommandos sehe kommen bei mir ganz böse Erinnerungen hoch ... Könntest du mir bitte den Namen der Datei nennen ? 🙂 Vielen Dank 🙂



  • grep.exe

    Es geht auch die "Suche und finde was"-Funktion des Windows Explorers.
    Mannomann, das ist doch nun wirklich einfach. Ich arbeite auch nur mit
    Windows. grep ist bei jedem C-Compiler dabei.





  • Scheppertreiber schrieb:

    grep.exe

    Es geht auch die "Suche und finde was"-Funktion des Windows Explorers.
    Mannomann, das ist doch nun wirklich einfach. Ich arbeite auch nur mit
    Windows. grep ist bei jedem C-Compiler dabei.

    Wir sind hier bei Windows, nicht in der Frickelküche, also lass deine Tools von 1960 in der Hosentasche stecken!



  • Was bedeutet eigentlich "selbstherrlicher Dummkopf" auf Deutsch ?
    Oder was willst Du damit sagen ?



  • Scheppertreiber schrieb:

    grep SetTimer *.h

    lol wie dumm is der Vorschlag bitte?



  • Scheppertreiber schrieb:

    Was bedeutet eigentlich "selbstherrlicher Dummkopf" auf Deutsch ?
    Oder was willst Du damit sagen ?

    Lasse mich raten, du trägst Hosenträger und hast einen Vollbart und ein System V T-Shirt an. Sprich der durchschnittliche Unix Nerd. Aber nun hören wir doch auf hier den Thread zuzuspammen.



  • Als nachdenkliches Indiviuum rätsele ich noch über "Frickelküche". Was könnte
    der vereehrte Herr Vorposter damit meinen ?


Anmelden zum Antworten