Hallo, in meinem Programm benötige ich einen Message Scheduler welcher
Nachrichten in bestimmten definierten Zeitabständen sendet.
Zyklus (ms) Nachricht (Payload)
100 0x00 0x01 0x00 0x01 0x00
100 0xAA 0xFF 0xAB 0xAC 0x11
200 0x01 0x01 0x01 0x01 0x01
1000 0xFF 0xFF 0xFF 0xFF 0xFF
Ich dachte mir einen Timer mit einem Interval von 100ms zuerstellen und
im Timeout Slot eine Variable zu erhöhen und die entsprechenden
Nachrichten zusenden.
Womit ich Verständnisprobleme habe ist, wie ich im Timeout Slot die
entsprechenden Nachrichten filtere, weil bei T100 müssten zwei
Nachrichten gesendet werden, dann bei T200 wären es drei Nachrichten und
bei T1000 wären es vier Nachrichten.
Mir fehlt die Vorstellung und Erfahrung, wie ich das umsetzen kann. Kann
mir jemand ein Tipp geben? Wäre ein QMultimap hier z.B. sinvoll?
Wie filtere ich den am besten die Nachrichten, weil mein Beispiel sind
jetzt 4 Nachrichten, was nimmt man am besten bei >1000 Nachrichten?
Wenn ich die passenden Nachrichten hab übergebe ich diese einem Fifo und
die Senderoutine im einem QThread sendet dann?
Oliver S. schrieb:> Bei > 1000 Nachrichten nimmt man das gleiche wie bei 4 Nachrichten.
Naja, bei > 1000 Nachrichten muss man es ggf. schon etwas anders
angehen. Hier steht leider nicht, um welche Art von Schnittstelle/Bus es
geht, aber es kann z.B. sinnvoll sein, die Nachrichten einigermaßen
gleichmäßig zu verteilen, also wenn z.B. 50 Nachrichten alle Sekunde
gesendet werden müssen, nicht im Zyklus 0, 10, 20 jeweils alle 50 zu
senden, sondern in Zyklus 0 5 Stück, in Zyklus 1 die nächsten 5 u.s.w.,
damit es nicht immer bestimmte Zyklen gibt, in denen alle 1000
Nachrichten auf einmal gesendet werden müssen und andere, in denen nur 5
gesendet werden.
Wozu die festen Zeiten? Bzw. wie sieht denn die Empfängerseite aus? Wenn
es kein Echtzeitsystem ist, kannst du die Timings beim Empfänger ohnehin
nicht garantieren, vor allem, wenn da noch andere Nachrichten über den
Kanal gehen.
Die Nachrichten bei Verfügbarkeit ohne Verzögerung mit Zeitstempel
verschicken und auf Empfängerseite in einer Queue abarbeiten ist keine
Option?
>...um welche Art von Schnittstelle/Bus...
UDP und ich wollte es ähnlich wie beim CAN-Bus machen, deshalb meine
Frage. Also die wichtigen Nachrichten mit niedrigen Zykluszeiten und die
etwas unwichtigeren mit hohen Zykluszeiten, trotzdem müssen alle
Nachrichten zur der Zeit N gesendet werden, wenn die Zykluszeiten ein
vielfaches ist.
>Die Nachrichten bei Verfügbarkeit ohne Verzögerung mit Zeitstempel>verschicken und auf Empfängerseite in einer Queue abarbeiten ist keine>Option?
Das Protokol ist vorgegeben darauf hab ich kein Einfluss.
Thorben schrieb:>>...um welche Art von Schnittstelle/Bus...>> UDP und ich wollte es ähnlich wie beim CAN-Bus machen, deshalb meine> Frage. Also die wichtigen Nachrichten mit niedrigen Zykluszeiten und die> etwas unwichtigeren mit hohen Zykluszeiten, trotzdem müssen alle> Nachrichten zur der Zeit N gesendet werden, wenn die Zykluszeiten ein> vielfaches ist.
Es geht bei den Zykluszeiten weniger darum, wie wichtig die Daten sind,
sondern wie schnell sie aktualisiert werden müssen.
Eine Temperatur kann z.B. wichtig sein (Überhitzung = kaputt), ändert
sich aber in der Regel nicht so schnell, dass es sinnvoll wäre, sie jede
Millisekunde zu übertragen.
Ein einfacher Weg: Für jede Botschaftsart einen Zähler, der bis n zählt,
und immer beim Zurücksetzen auf 0 das Senden auslöst, wobei n der
Quotient aus der Timer-Zykluszeit und der Sende-Zykluszeit ist. Um die
Botschaften etwas gleichmäßiger zu verteilen, kann man die Zähler mit
unterschiedlichen Werten vorbelegen.
>Es geht bei den Zykluszeiten weniger darum, wie wichtig die Daten sind,>sondern wie schnell sie aktualisiert werden müssen.
Ich stimme Dir zu, meine eigentliche Aussage sollte darauf hinauslaufen
und war schlecht formuliert.
>Ein einfacher Weg: Für jede Botschaftsart einen Zähler, der bis n zählt,>und immer beim Zurücksetzen auf 0 das Senden auslöst, wobei n der>Quotient aus der Timer-Zykluszeit und der Sende-Zykluszeit ist.
Ein sehr interessanter Ansatz, welchen ich mir gerne genauer anschauen
würde. Kennst du ein Opensourceprojekt, welches ich zur Studie
heranziehen könnte?