Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
Hallo,
ich habe zwar schon einige THemen hier gefunden, die sich mit dem Metronom beschäftigen, aber eine Lösuing habe ich bis jetzt nicht gefunden. Ich stehe vor folgendem Problem.
Das LabVIEWProgramm steuert 3 unterschiedliche Schleifen bzw Prozesse.
Wichtig ist, dass diese Prozesse mindestens auf Sekunde genau getimed sind. Es gab bis jetzt ein Program von einem mir nicht bekannten ehem. Angestellten mit dem "wait" zur Synchronisation jedes Zyklus selbst, aber nachdem das Messgerät wesentlich mehr Schleifen ausführt, während der Probennehmer wartet, fängt das Teil an nachzuhinken (Weil die 100ms nicht immer 100ms sind sondern auch mal 105ms bis ein Zyklus zu Ende ist).
Jetzt habe ich versucht das mit dem Metronom (Wait Until Next ms Multiple) zu takten. Das funktioniert zwar, wenn ich zb. eine While-Schleife zum Starten warten lasse, bis er das erste Mal auf 1000ms kommt und dann mit 1000ms die Schleife takte.
Es ist aber nötig, dass mal die Schleife 1000ms läuft, dann 5000ms, dann 7000ms und dann wieder 1000ms. Da stellt sich aber dann das Problem auf: Wartet der erste Zyklus noch auf 1000ms (also eine Sekunde), wartet dann zB. der zweite Zyklus auf 5000ms-Pitch. Die Differenz aber sind nur 4000ms (Bzw ein anderer Wert, je nach dem wo die Schleife gestartet hat).
Somit stehe ich vor dem Problem: Wie kann ich drei Schleifen so takten, dass alle zeitgleich schalten, wobei die Zyklen unterschiedlich sein können und die Laufzeiten ebenso (Messegerät im ms bis s Bereich, Probennehmer im 10min-Bereich und Thermostat im h-Bereich).
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
' schrieb:Es ist aber nötig, dass mal die Schleife 1000ms läuft, dann 5000ms, dann 7000ms und dann wieder 1000ms. Da stellt sich aber dann das Problem auf: Wartet der erste Zyklus noch auf 1000ms (also eine Sekunde), wartet dann zB. der zweite Zyklus auf 5000ms-Pitch. Die Differenz aber sind nur 4000ms (Bzw ein anderer Wert, je nach dem wo die Schleife gestartet hat).
5x eine 1-Sekunden-Schleife laufen lassen, wobei in 4 Durchläufen halt nichts passiert (oder wird das bisher anders gemacht?).
Oder:
Größtes gemeinsames Vielfaches ermitteln.
Oder:
Timed-Loops verwenden, die du aufeinander synchronisierst.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
' schrieb:Somit stehe ich vor dem Problem: Wie kann ich drei Schleifen so takten, dass alle zeitgleich schalten, wobei die Zyklen unterschiedlich sein können und die Laufzeiten ebenso (Messegerät im ms bis s Bereich, Probennehmer im 10min-Bereich und Thermostat im h-Bereich).
Kann ich das auch so ausdrücken:
Zu einem bestimmten Zeitpunkt, der z.B. von einem vierten Prozess festgelegt wird, sollen die 3 Prozesse innerhalb eines Fensters von (z.B.) 10ms eine bestimmte Aktion durchführen. Der Zeitpunkt kann z.B. pro Sekunde, alle 2 Sekunden oder auch alle 7 Sekunden sein.
Ist es das, was du willst?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
10.08.2010, 18:10 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2010 09:43 von Lucki.)
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
Die Lösung ist doch hier: Erzeuger-Verbraucher-Struktur mit Queues zum Datenaustausch. Die Schleifen synchronisierein sich immer ganz von selbst. Die Queues sind auch für mehrere Verbraucher und einen Erzeuger oder mehrere Ezeuger und einen Verbraucher konfigurierbar. Also drei Schleifen wären da auch kein Problem.
Bei der einfachen Erzeuger-Verbraucher Struktur funktioniert die Synchronisation so:[list=1]
[*]Verbraucher schneller als Erzeuger (Normalfall). Das Queelement in der Verbraucherschleife wartet solange, bis wieder ein Datenelement in der Queue ist.<>
[*]Ezeuger schneller als Verbraucher: Die Queue füllt sich zumächst immer mehr auf. Wenn sie voll ist, wartet das Queueelmenent in der Erzeugerschleife so lange, bis in der Queue wieder Platz für 1 Datenelement ist.<>
[st]In jedem Fall bestimmt die langsamte Schleife die Geschwindigkeit, und Daten gehen keine verloren.
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
' schrieb:5x eine 1-Sekunden-Schleife laufen lassen, wobei in 4 Durchläufen halt nichts passiert (oder wird das bisher anders gemacht?).
Oder:
Größtes gemeinsames Vielfaches ermitteln.
Oder:
Timed-Loops verwenden, die du aufeinander synchronisierst.
Gruß, Jens
Das ist etwas, was ich vermeiden möchte. Eine Schleife soll genau so lange laufen, wie angegeben wurde. Deswegen, weil ich über den Index der jeweiligen Schleife mein Array auslesen möchte, in dem der Benutzer seine Messdauer bzw Probenzugabe-Dauer eingibt. Ausserdem ist eine Sekunde etwas kritisch, da die Messpunkt-Abnahme bei Langzeitmessungen so ist, dass 4 Messpunkte alle 500ms genommen dann gemittelt werden. Somit ist die Dauer eines Messpunktes mindestens 2 Sekunden (Diode vorher einschalten und Vorbelichten sind dann nochmal normalerweise 2 Sekunden, wodurch sich das Aufnehmen eines Messpunktes auf min. 4 Sekunden erstreckt.
Bei Timed-Loops kenne ich mich nicht aus, die hatte ich glaub ich in der Version 7 (die ich bis vor 8 Tagen hatte) noch nicht (glaub ich jedenfalls). Kann ich das die einzelnen Durchgänge der Loops unterschiedlich timen? Es geht drum, dass ich eben dass der erste Zyklus eines Loops 10 Minuten dauert, die folgenden 5 Loops dann 5 Minuten, der folgende 7 Minunten und dann geht das ganze wieder von vorne los.
' schrieb:Kann ich das auch so ausdrücken:
Zu einem bestimmten Zeitpunkt, der z.B. von einem vierten Prozess festgelegt wird, sollen die 3 Prozesse innerhalb eines Fensters von (z.B.) 10ms eine bestimmte Aktion durchführen. Der Zeitpunkt kann z.B. pro Sekunde, alle 2 Sekunden oder auch alle 7 Sekunden sein.
Ist es das, was du willst?
Nein, nicht ganz. Ich hab das mal versucht zu Visualisieren.
Während Zyklus A alle 1 Sekunden (bzw 5 Sekunden oder 30 Sekunden oder 60 Sekunden) einen Messpunkte aufnimmt, regelt Schleife B die Analytzugabe. Zuerst kommt zB 10 Minuten lang eine Nullwert-Zugabe, dann wird die Konzentration bis zum Maximum in 5 Schritten a 7 Minuten erhöht. Ist das Fertig, regelt Schleife C den Thermostat, da einmal eine Messkurve bei 10°C und einmal bei 25°C aufgenommen werden soll. Somit läuft eine Schleife schnell und die andere langsam (und zwar im Unterschied von Größenordnungen, A läuft alle 5 Sekunden, während C alle 45 Minuten nur läuft.
' schrieb:Die Lösung ist doch hier: Erzeuger-Verbraucher-Struktur mit Queues zum Datenaustausch. Die Schleifen synchronisierein sich immer ganz von selbst. Die Queues sind auch für mehrere Verbraucher und einen Erzeuger oder mehrere Ezeuger und einen Verbraucher konfigurierbar. Also drei Schleifen wären da auch kein Problem.
Bei der einfachen Erzeuger-Verbraucher Struktur funktioniert die Synchronisation so:[list=1]
[*]Verbraucher schneller als Erzeuger (Normalfall). Das Queelement in der Verbraucherschleife wartet solange, bis wieder ein Datenelement in der Queue ist.<>
[*]Ezeuger schneller als Verbraucher: Die Queue füllt sich zumächst immer mehr auf. Wenn sie voll ist, wartet das Queueelmenent in der Erzeugerschleife so lange, bis in der Queue wieder Platz für 1 Datenelement ist.<>
[st]In jedem Fall bestimmt die langsamte Schleife die Geschwindigkeit, und Daten gehen keine verloren.
Das mit dem timen der langsamsten Schleife ist etwas kritischt, da das Programm Modular aufgebaut sein soll, und durchaus mal Messungen ohne Schleife B oder C stattfinden sollen können. Wenn ich aber mit C timen will, dann aber kein C habe gibt das wohl Probleme.
Es kommt dann noch ein ganz anderes Problem auf mich zu, nämlich dass Schleife C sozusagen Schleife B pausieren kann. Und das wird für mich noch blöder. Ist eigentich ein einfacher Gedanken: Schleife C (Thermostat) wechselt die Temperatur. Und Schlefie B (Probenzugabe) soll erst dann wieder von vorne beginnen, wenn Schleife C sagt, dass die nächste Messtemperatur auch erreicht wurde (Der Thermostat ist ein bisserl älter und braucht ein wenig um sich einzustellen.
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
' schrieb:... weil ich über den Index der jeweiligen Schleife mein Array auslesen möchte...
Dafür nimmt man einfach ein Shiftregister und erhöht im entsprechenden Fall den Zähler. In den Durchläufen in denen nichts ins Array kommt, erhöht man auch nicht den Zähler. So bist du unabhängig vom schleifeninternen Zähler.
Gruß SeBa
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
' schrieb:Dafür nimmt man einfach ein Shiftregister und erhöht im entsprechenden Fall den Zähler. In den Durchläufen in denen nichts ins Array kommt, erhöht man auch nicht den Zähler. So bist du unabhängig vom schleifeninternen Zähler.
Gruß SeBa
Okay, an das hab ich nicht gedacht. Das ist eigentlich eine stinkeinfache Lösung. Danke. Hilft mir noch nicht ganz bei der Synchronisation, aber ich bin mal vom Schleifenzähler unabhängig.
11.08.2010, 11:56 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2010 11:58 von IchSelbst.)
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
' schrieb:Synchronisation
Stell dir folgendes vor:
Jeder der drei Prozesse hat intern ein Raster von (z.B.) 10ms. Jeder Prozess würde also eine Schrittkette sein, die ihren Ablauf im 10ms-Raster macht. Jeder einzelne Schritt darf also nur maximal 10ms dauern (aus diversen Gründen darf die maximale Dauer nur 5ms sein). Nach jedem Schritt muss gewartet werden, bis die 10ms um sind. Das würde Prozessintern gehen mit z.B. Wait oder Metronom.
Das Warten kann aber auch über einen Melder gemacht werden. Ein vierter Prozess macht nichts weiter, als im Raster von 10ms in einen Melder (z.B. einen inkrementieren Zähler) zu schreiben. Die drei (Arbeits-)Prozesse werten den Melder aus => die drei laufen synchron mit einer Ungenauigkeit von 10ms.
Oder kuck dir mal Rendezvous an auf der Palette - Synchronisierung.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
23.08.2010, 12:42 (Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2010 13:36 von jg.)
Zeitliche Synchronisation mehrere Prozesse mit unterschiedlichen Laufzeiten
' schrieb:Dafür nimmt man einfach ein Shiftregister und erhöht im entsprechenden Fall den Zähler. In den Durchläufen in denen nichts ins Array kommt, erhöht man auch nicht den Zähler. So bist du unabhängig vom schleifeninternen Zähler.
Gruß SeBa
So, das hab ich jetzt auch gemacht. Ich hab hier mal ein Schaltbild angehängt:
<strike>/img824/3177/thermo.th.png</strike>
Das ganze läuft jetzt über zwei Shiftregister. Das eine erhöht sich jede Sekunde um 1, während das zweite bei 0 anfängt um den ersten Array-Wert auszulesen. Ist die Zeit abgelaufen springt dieses Shift-register um eins hoch, um den zweiten Array-Wert auszulesen. Der Boolean-Operator steckt drinnen, um das hochspringen zu steuern sowie auch den Case "Temperatur ändern" im Thermostaten zu aktivieren. (somit wird nicht bei jeder Sekunde der Thermostat neu angesprochen).