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!
ich möchte zu einer ganz bestimmten Zeit (Zeitstempel) etwas ausführen, aber so dass er vorab nicht extra Ressourcen verschwendet, gibt es sowas?
Konkret:
Ich habe mehre Schleifen, welche miteinander verbunden sind (also eine Schleife, die ein paar andere steuert die wiederum eine andere Schleife steuern).
Diese Schleifen haben unterschiedliche Ausführungszeiten, auch je nachdem in welchem Zustand sie gerade sind (State-Maschine).
Die Aufgabe ist nun, dass die "Masterschleife" der "Slaveschleife" einen Auftrag über gibt (mittels Highspeedstrem), welcher zu einer gewissen Zeit gestartet werden soll.
Was man machen könnte wäre ja:
1. Von der Hauptschleife einen Wert für eine "Warten [ms]" Funktion an die "Slaveschleife" ausgeben.
Problem sehe ich hier, dass die "Slaveschleife" evtl. erst verzögert gestartet wird, weil die anderen Schliefen gerade ausgeführt werden (und x Millisekunden zum beenden Ihrer Ausführung noch brauchen), so dass der "Warten [ms]" falsch ist.
2. Einen Zeitstempel an die Slaveschleife übergeben und diese in einem While-loop laufen lassen bis die aktuelle Zeit, dem übergebenen Wert entspricht, dies bedeutet aber auch dass hier sinnlos Resourcen gebunden sind, die zur Auführung der anderen Schleifen genutzt werden könnten....
Von daher gibt es eine Funktion, welche zu einer bestimmten Zeit einen Aktion starten kann?
(Die gibt es doch bestimmt :-))
(17.11.2020 11:25 )LV-New schrieb: 2. Einen Zeitstempel an die Slaveschleife übergeben und diese in einem While-loop laufen lassen bis die aktuelle Zeit, dem übergebenen Wert entspricht, dies bedeutet aber auch dass hier sinnlos Resourcen gebunden sind
Wait blockiert den Prozessor nicht. Du kannst also immer eine Sekunde warten und prüfen, ob du in Reichweite deiner Zeit bist. Das hat außerdem den Vorteil, dass die Schleife nicht blockiert und du andere Abbruchbedingungen (zB vom Nutzer) prüfen kannst.
(17.11.2020 11:25 )LV-New schrieb: Von daher gibt es eine Funktion, welche zu einer bestimmten Zeit einen Aktion starten kann?
Nein.
Wenn deine Schleifen nur in irgendeiner Form synchronisiert werden müssen, braucht es dafür auch kein "Ausführen zu bestimmter Zeit".
Die Unterschleife fragt einen Notifier ab, der für jede Vorbedingung einen Boolean enthält. Diese können von anderen Schleifen gesetzt werden und wenn alle erfüllt sind, legt die Unterschleife los.
Wenn du eh schon StateMachines einsetzt und den State einer Schleife auch von außerhalb der Schleife setzten kannst, kannst du die Synchronisierung auch über States erreichen.
@th13
Dank für deine Rückmeldung!
Das die Wait Funktion, nicht blockiert ist mir bekannt. Allerdings reden wir in meinem Beispiel nicht von Sekunden, die gewartet werden sollen, sondern von ms!
(Der Prozess muss in bestimmten Millisekundenwerten gestartet werden, da es sich um eine Drehmaschine handelt (mit hohen Drehzahlen.
D.h. Wenn ich von der Hauptschleife den Wert in ms an die Unterschleife gebe und diese Ihn aus welchen Grund auch immer zuspät bekommt, habe ich ein Problem an der Drehmaschine...)
Der von dir besagte Notifier hat eine sehr ähnliche Funktion wie der Highspeedstream. Das Problem, dass ich wie gesagt sehe ist, dass wenn die anderen (Unter)schleifen gerade die Prozessorleistung belegen, kann diese spezielle Unterschleife nicht ausgeführt werden.
Daher hätte ich gern eine Funktion die quasi zu einer ganz bestimmten Zeit aus dem "Standby" aufwacht und dann mit der höchsten Priorität zunächst die Ihr zugewiesen Aufgaben erledigt.
(Anmerkung: Die Schleife ist bereits in ein SubVI eingebunden mit der höchsten Priorität :-))
(18.11.2020 07:55 )LV-New schrieb: Das Problem, dass ich wie gesagt sehe ist, dass wenn die anderen (Unter)schleifen gerade die Prozessorleistung belegen, kann diese spezielle Unterschleife nicht ausgeführt werden.
Dieses Problem sehe ich etwas differenzierter: LV Ist ein Multitasking-System. Alles, was nicht sequenziert ist, läuft parallel.
Hast du mal gekuckt, ob du mit Semaphoren oder Occurrences was anfangen kannst?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
18.11.2020, 09:39 (Dieser Beitrag wurde zuletzt bearbeitet: 18.11.2020 09:45 von GerdW.)
Zitat:Allerdings reden wir in meinem Beispiel nicht von Sekunden, die gewartet werden sollen, sondern von ms!
(Der Prozess muss in bestimmten Millisekundenwerten gestartet werden, da es sich um eine Drehmaschine handelt (mit hohen Drehzahlen.
D.h. Wenn ich von der Hauptschleife den Wert in ms an die Unterschleife gebe und diese Ihn aus welchen Grund auch immer zuspät bekommt, habe ich ein Problem an der Drehmaschine...)
Daher hätte ich gern eine Funktion die quasi zu einer ganz bestimmten Zeit aus dem "Standby" aufwacht und dann mit der höchsten Priorität zunächst die Ihr zugewiesen Aufgaben erledigt.
Nenne mal bitte ganz konkrete Zahlen zu deinen "Millisekunden"!
Was genau sind denn die Aufgaben, die du dann starten willst?
Unter Windows wird dein Vorgehen von vornherein zum Scheitern verurteilt sein: dort bekommst du keine verlässliche Ausführung zu exakten Millisekunden-Abständen garantiert. Also solltest du ein anderes System verwenden…
Wie wäre es mit einem Hardware-Trigger, z.B. durch eine Lichtschranke o.ä.? Dieser Trigger könnte bei jeder Umdrehung auslösen und einen anderen Hardwaretask starten/fortschreiten lassen. (Fnktioniert bei mir bei Anwendungen wie Verbrennungsmotormessungen ganz prima.)
Die besagte Unterscheife soll an einem bestimmten Winkel eine Aktion ausführen. (Leider geht es nicht Hardware getriggert :-().
Die Drehmaschine läuft mit ca. 150 Umdrehungen pro Minute. D.h. ca. 1ms dauert es bis 1° Winkel gedreht hat.
Die Hauptschleife bekommt alle 200ms die Daten wann welcher Winkel zu welchem Zeitpunkt erreicht wurde.
Damit kann man vorausrechen wenn der neue Sollwinkel kommt, bei dem die Aktion ausgeführt werden soll.
Zu der berechneten Zeit/Zeitpunkt soll dann also in der Unterschleife die Aktion ausgeführt werden.
Daraus ergeben sich folgende Ansprüche:
1. Die Aktion soll mit einer Toleranz von 2° (2ms) meistens ausgeführt werden
(Wenn Windows hier hin und wieder mal dazwischen funkt ist dies okay, wird dokumentiert!)
2. Der Sollwinkel kann vorausberechnet werden d.h: es ist okay, wenn er mal 3 Umdrehungen braucht bevor er dann die Aktion ausführt, nur der Winkel muss stimmen
3. Die Unterschleife sollte Resourcenschonend laufen, damit die anderen Unterschleifen Ihre Arbeit verrichten können :-)
Hat jemand Ideen
23.11.2020, 11:43 (Dieser Beitrag wurde zuletzt bearbeitet: 23.11.2020 11:46 von rolfk.)
(18.11.2020 13:17 )LV-New schrieb: Okay, noch ein paar Hintergründe....
Die besagte Unterscheife soll an einem bestimmten Winkel eine Aktion ausführen. (Leider geht es nicht Hardware getriggert :-().
Die Drehmaschine läuft mit ca. 150 Umdrehungen pro Minute. D.h. ca. 1ms dauert es bis 1° Winkel gedreht hat.
Die Hauptschleife bekommt alle 200ms die Daten wann welcher Winkel zu welchem Zeitpunkt erreicht wurde.
Damit kann man vorausrechen wenn der neue Sollwinkel kommt, bei dem die Aktion ausgeführt werden soll.
Zu der berechneten Zeit/Zeitpunkt soll dann also in der Unterschleife die Aktion ausgeführt werden.
Daraus ergeben sich folgende Ansprüche:
1. Die Aktion soll mit einer Toleranz von 2° (2ms) meistens ausgeführt werden
(Wenn Windows hier hin und wieder mal dazwischen funkt ist dies okay, wird dokumentiert!)
2. Der Sollwinkel kann vorausberechnet werden d.h: es ist okay, wenn er mal 3 Umdrehungen braucht bevor er dann die Aktion ausführt, nur der Winkel muss stimmen
3. Die Unterschleife sollte Resourcenschonend laufen, damit die anderen Unterschleifen Ihre Arbeit verrichten können :-)
Hat jemand Ideen
1) Das ist unter Windows ganz sicher nicht und auch unter einem Linux Desktop System kaum machbar. Windows nimmt sich das Recht heraus um einen Prozess jederzeit für eine beliebig lange Zeit aufs Eis zu setzen. Solche Zeitvorgaben sind allenfalls in Kerneltreibern zu realisieren wo man sehr nah an der Hardware programmieren kann aber selbst da gibt es keine 100% Garantie. Programmierung von Kerneltreibern is aber eine sehr aufwendige und peinliche Angelegenheit die nur mit C(++) (und allenfalls Assembly)-Programmierung machbar ist.
Fazit ist, dass solche Spezifikationen eigentlich nur mit einem Echtzeitbetreibsystem einigermassen sinnvoll zu realisieren sind! Selber würde ich sogar noch weiter gehen und das Ganze gleich in FPGA implementieren.
@rolfk:
Das ich kein Echtzeitsystem bekommen kann ohne Echtzeitsystem (Rio etc.) ist mir bewusst.
Der Versuch ist hier, mit den vorhandenen Mittel so nah "ans Ziel zu kommen" wie möglich. (Aus dem Grund habe ich bewusst von meistens gesprochen).
Und die große Struktur sieht gar nicht mal so schlecht aus, es sei denn Sie belügt mich :-)
Ich habe den ganzen Schleifen wie bereits erwähnt Prioritäten zugewiesen. Mit der untersten Priorität habe ich eine Schleife versehen,. welche mir in regelmäßigen Zeitabständen über eine längere Zeit in eine TDMS Ihre Durchlaufzeit reinschreibt. Das Ergebnis mit 1...2ms sieht sehr viel versprechend aus (Klar sind auch Ausreißer drin, aber das ist okay.)
Was Ich wie gesagt nun suche ist eine mögliche Funktion, die an einem vorgegeben Zeit ausgeführt wird und ansonsten ruht, so dass keine Ressourcen verschwendet werden.
Aktuell mache ich es mit einem Highspeedstream(ähnlich einer Queue bzw. Notifier) der übergeben wird, aber ich denke mit einer "Zeitstempel-Funktion" (die genau zum Zeit Stempel etwas unternimmt) ist es besser.
Gibt es sowas? Quasi, wie die Ereignisstruktur, nur dass es nicht über das Frontpanel kommt, sondern über den Zeit Stempel ausgelöst wird.
ANMERKUNG: Genau und Exakt ist hier umgangssprachlich zu sehen, mir ist bewusst dass es mit einem Windows-System hier Komplikationen gibt!
(24.11.2020 08:46 )LV-New schrieb: Gibt es sowas? Quasi, wie die Ereignisstruktur, nur dass es nicht über das Frontpanel kommt, sondern über den Zeit Stempel ausgelöst wird.
Eventuell könntest du die Timeout-Funktion der Event-Struktur dafür verwenden. Wenn du die momentane Uhrzeit und die Zeit wann der Trigger ausgelöst werden soll weißt, dann füttere den Trigger mit der Zeitdifferenz. Allerdings könnte da Windows - wie schon anderweitig erwähnt - das Ganze zum Scheitern bringen, da (nach meinem Verständnis) Hintergrundprozesse das tatsächliche Auslösen des Events verzögern können.