17.11.2020, 11:25
Beitrag #1
|
LV-New
LVF-Grünschnabel
Beiträge: 44
Registriert seit: Apr 2020
2016
2019
DE
|
Ausführen zu bestimmer Zeit
Hi,
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, 16:51
Beitrag #2
|
th13
LVF-Gelegenheitsschreiber
Beiträge: 177
Registriert seit: Oct 2013
2020 SP1
2013
EN
Deutschland
|
RE: Ausführen zu bestimmer Zeit
(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.
|
|
|
18.11.2020, 08:39
Beitrag #4
|
IchSelbst
LVF-Guru
Beiträge: 3.692
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
RE: Ausführen zu bestimmer Zeit
(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.)
Beitrag #5
|
GerdW
______________
Beiträge: 17.467
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: Ausführen zu bestimmer Zeit
Hallo LV-New,
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.)
|
|
|
24.11.2020, 08:46
(Dieser Beitrag wurde zuletzt bearbeitet: 24.11.2020 08:46 von LV-New.)
Beitrag #8
|
LV-New
LVF-Grünschnabel
Beiträge: 44
Registriert seit: Apr 2020
2016
2019
DE
|
RE: Ausführen zu bestimmer Zeit
@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!
|
|
|
30.11.2020, 11:01
Beitrag #9
|
THL
LVF-Gelegenheitsschreiber
Beiträge: 111
Registriert seit: May 2011
2012
2009
EN
Deutschland
|
RE: Ausführen zu bestimmer Zeit
(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.
|
|
|
| |