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?
Ein Timer mit 100ms und im Slot eine state machine, die in Abhängigkeit der abgelaufenen Zeit die richtigen Nachrichten sendet. Oliver
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?
Bei > 1000 Nachrichten nimmt man das gleiche wie bei 4 Nachrichten. Wenn’s > 10.000.000 wären, wäre es ein Problem. Oliver
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.
Du brauchst hier keine Threads. Dein I/O ist sicherlich asynchron und rechnen musst du auch nichts.
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?
:
Bearbeitet durch User
>...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?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.