INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

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!

10.08.2010, 14:42
Beitrag #1

lennox_mcdough Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Aug 2010

2012
2010
EN

8010
Oesterreich
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.

Schleife A: Messgerät
Schleife B: Probennehmer
Schleife C: Thermostat

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).

Ich finde keine einfach Lösung.

Danke
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
10.08.2010, 15:00
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2010, 15:34
Beitrag #3

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2010, 18:10 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2010 09:43 von Lucki.)
Beitrag #4

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.08.2010, 10:49
Beitrag #5

lennox_mcdough Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Aug 2010

2012
2010
EN

8010
Oesterreich
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.

   

Schleife A: Messgerät
Schleife B: Probenzugabe
Schleife C: Thermostat

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.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.08.2010, 11:04
Beitrag #6

SeBa Offline
LVF-Guru
*****


Beiträge: 2.025
Registriert seit: Oct 2008

09SP1 & 10 FDS
2008
DE

65xxx
Deutschland
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!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
11.08.2010, 11:16
Beitrag #7

lennox_mcdough Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Aug 2010

2012
2010
EN

8010
Oesterreich
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.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.08.2010, 11:56 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2010 11:58 von IchSelbst.)
Beitrag #8

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2010, 12:42 (Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2010 13:36 von jg.)
Beitrag #9

lennox_mcdough Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Aug 2010

2012
2010
EN

8010
Oesterreich
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).

Was meint ihr, ist die Lösung schlecht oder gut?
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  2 Parallele While-Schleifen mit unterschiedlichen Timer beenden Tomate27 3 2.935 18.08.2020 13:29
Letzter Beitrag: GerdW
  DAQ Datenoutput an zwei Ziele mit unterschiedlichen Intervallen moTo 4 4.387 06.05.2016 20:05
Letzter Beitrag: GerdW
  Synchronisation mehrerer Geräte BenW 1 3.366 03.04.2016 11:19
Letzter Beitrag: IchSelbst
  For-Scheife zu unterschiedlichen Zeitpunkten unterbrechen? Stefan_r 6 4.841 03.11.2014 10:12
Letzter Beitrag: Stefan_r
Question Y-Achse mit unterschiedlichen Farben im Label LazyBoNe 2 3.760 02.07.2014 08:28
Letzter Beitrag: LazyBoNe
  "Ringbuffer overflow" bei Synchronisation von analog und digital Signal MNLF 14 11.528 20.01.2014 12:15
Letzter Beitrag: MNLF

Gehe zu: