Jump to content

Subroutine simulation in Lua


Empfohlene Beiträge

I would like to :

Be executing an event ( "event A" ), and while in the middle of that event ....

Jump to "user event B" .... presumably by using "script condition"

then    ....

return to "event A" and continue while "event A" was paused and waiting.

effectively ...  causing  "event A" to pause until return, which could very in time depending on a condition.

If it can be accomplished I'm missing the technique syntax.

Any help will certainly be appreciated.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo / hello @hmclay,

aufgrund Deines Beitrags habe ich ein kleines Beispiel mit dem Aufruf eines Benutzer-definierten Ereignisses gebaut, ...
Based on your post, I have built a small example with the call of a user-defined event, ...

00Buttons.jpg.fcc7159c54864d74b2b895b52c631866.jpg

User Event Synchronization.mbp

... bei welchem Du die nachfolgende Beschreibung direkt nachstellen kannst. Die Anlage besteht nur aus 2 Tastern, welche beim Drücken Ereignisse auslösen, die ihrerseits ein Benutzer-definiertes Ereignis aufrufen. Die Ereignisse bestehen aus Trace-Einträgen, mit welchen der Ablauf der Ereignisse visualisiert wird. Deshalb muss vor dem Drücken der Tasten die Ereignis-Protokollierung (<F12>) aktiviert sein, um den Ablauf der Ereignisse verfolgen zu können.
... with which you can directly reproduce the following description. The layout consists of only 2 buttons, which trigger events when pressed, which in turn call up a user-defined event. The events consist of trace entries with which the sequence of events is visualized. Event trace (<F12>) must therefore be activated before the buttons are pressed in order to be able to trace the sequence of events.

02Events.jpg.43520bd3452d64fa2216e6925a7266d0.jpg

 

Mit dem linken roten Taster werden die Ereignisse aus der Gruppe  Example1 zum Ablauf gebracht.
The events from the Example1 group are triggered with the left red button.

12FehelrhaftesWarten.jpg.38df732641be700c27cc740f5cf8811d.jpg

Das Drücken des roten Tasters löst das Ereignis "Main Event A1" aus (in den obigen Abläufen gelb unterlegt), welches seinerseits das Benutzer-definierte Ereignis "User Event B1" aufruft (rosa unterlegte Abschnitte). Vor und nach dem Aufruf des Ereignisses B1 ist im Ereignis A1 jeweils eine kurze Zeitverzögerung eingebaut, welche den Gesamtablauf dieser Ereignis-Konfiguration nicht beeinträchtigt.  Wird der rote Taster eingeschaltet, realisiert die Ereignisdefinition B1 einen Durchlauf ohne Unterbrechung (im obigen Bild links), während der Ablauf beim Ausschalten durch eine Verzögerung unterbrochen wird (im obigen Bild rechts).
Pressing the red button triggers the event "Main Event A1" (highlighted in yellow in the sequences above), which in turn calls the user-defined event "User Event B1" (highlighted in pink). A short time delay is built into event A1 before and after event B1 is called, which does not affect the overall sequence of this event configuration. If the red button is switched on, the event definition B1 realizes a cycle without interruption (in the above image on the left), while the sequence is interrupted by a defer execution when it is switched off (in the above image on the right).

Enthält allgemein eine Ereignisdefinition eine Verzögerung, wird die Ereignisdefinition selbst an dieser Stelle abgebrochen (tatsächlich beendet) und nach Ablauf der in der Verzögerung hinterlegten Wartezeit durch einen neuen Ereignis-Anstoß durch das Modellbahn-Studio selbst an dieser Stelle fortgesetzt. Daher können dazwischen andere Ereignisse abgearbeitet werden. Im obigen Beispiel rechts ist dies einerseits der weitere Ablauf des Hauptereignisses A1 (das aufgerufene Benutzer-Ereignis B1 ist ja "beendet" - wenn auch nicht abgeschlossen) und andererseits die Fortsetzung (Fertigstellung) des Benutzer-Ereignisses B1 in der zweiten Pause des Hauptereignisses A1.
If an event definition generally contains a defer execution, the event definition itself is aborted at this point (actually ended) and continued at this point by a new event trigger by the Train Studio itself after the waiting time stored in the defer execution has expired. Other events can therefore be processed in between. In the above example on the right, this is on the one hand the further execution of the main event A1 (the called user event B1 is "finished" - even if not completed) and on the other hand the continuation (completion) of the user event B1 in the second pause of the main event A1.

Während im Beispiel links ohne die Unterbrechung des Ereignisses B1 die Gesamtkonfiguration wie geplant durchlaufen wird (die Unterbrechungen im Ereignis A1 haben hier keine negative Auswirkung), wird der Gesamtablauf im Beispiel rechts durch die Unterbrechung des Ereignisses B1 korrumpiert. Leider gibt es keine Möglichkeit, den durch die Verzögerung unterbrochenen Ablauf des Ereignisses durch einen anderen Auslöser als die abgelaufene Wartezeit fortzusetzen.
While in the example on the left, the overall configuration runs through as planned without the interruption of event B1 (the interruptions in event A1 have no negative effect here), the overall sequence in the example on the right is corrupted by the interruption of event B1. Unfortunately, there is no way to continue the event sequence interrupted by the defer execution using a trigger other than the elapsed waiting time.

 

Mit dem rechten grünen Taster werden die Ereignisse aus der Gruppe Example2 zum Ablauf gebracht.
The events from the Example2 group are triggered using the right-hand green button.

34FehlerfreiesWarten.jpg.7b3a93e3b68311874d1bdb1f369a7658.jpg

Im Prinzip ist hier derselbe Gesamtablauf realisiert wie beim Beispiel aus der Gruppe Example 1. Hier wird jedoch wie von @Goetz in seiner Antwort vorgeschlagen der Ablauf des Haupt-Ereignisses A2 in zwei Teile "Main Event A2 (Part 1)" und "Main Event A2 (Part 2)" aufgeteilt, wobei der erste Teil mit dem Aufruf des Benutzer-Ereignisses B2 ("User Event B2") beendet wird und der zweite Teil innerhalb des Ereignisses B2 an dessen Ende als eigenständiges Benutzer-definiertes Ereignis aufgerufen wird.
In principle, the same overall flow is realized here as in the example from the Example 1 group, but here, as suggested by @Goetz in his answer, the flow of the main event A2 is divided into two parts "Main Event A2 (Part 1)" and "Main Event A2 (Part 2)", whereby the first part is ended with the call of the user event B2 ("User Event B2") and the second part within the event B2 is called at its end as an independent user-defined event.

Auch hier unterscheidet sich der Ablauf rechts beim Ausschalten des grünen Tasters vom linken Ablauf beim Einschalten des Tasters durch die zusätzliche Unterbrechung durch die Verzögerung im Benutzer-Ereignis B2. Durch die Aufteilung des Hauptereignisses A2 in 2 Teile und die dadurch mögliche definitive Hintereinander-Reihung des ersten Teils von Ereignis A2, des Ereignisses B2 und des zweiten Teils von Ereignis A2 wird hier auch bei einer Unterbrechung von Ereignis B2 durch eine Verzögerung die im vorangegangenen Beispiel vorhandene Korrumpierung des Gesamtverlaufs vermieden.
Here too, the sequence on the right when the green button is switched off differs from the sequence on the left when the button is switched on due to the additional interruption caused by the defer execution in user event B2. By dividing the main event A2 into 2 parts and thus enabling the first part of event A2, event B2 and the second part of event A2 to be sequenced one after the other, the corruption of the overall sequence that occurred in the previous example is avoided even if event B2 is interrupted by a defer execution.

 

Noch ein Hinweis an / An addtional note to @Neo:
Es wäre zwar möglich, im Benutzer-Ereignis B2 einen Parameter "Event" vom Typ "Ereignis/Modul" zu definieren und dann beim Aufruf von B2 durch den ersten Teil von A2 als Parameter den zweiten Teil des Hauptereignisses A2 mitzugeben. Es gibt aber beim Aufruf des Benutzer-definierten Ereignisses nicht die Möglichkeit, das Ereignis als Variable zu spezifizieren (man kann hier das zu startende Ereignis nur explizit angeben). Wäre es eventuell möglich, hier auch eine Variable zuzulassen, sodass man beispielsweise in diesem konkreten Fall den im Aufruf von B2 durch A2 erhaltenen Parameter beim Aufruf des zweiten Teils von A2 als "Auslöser" referenzieren könnte? Das Benutzer-definierte Ereignis B2 wäre dann auch bei der Verwendung mit verschiedenen Hauptereignissen vom "Typ A2" flexibler einsetzbar (man müsste nicht mit Fallunterscheidungen und jeweiliger expliziter Referenz des zweiten Teils von "A2" arbeiten).
It would be possible to define a parameter "Event" of the type "Event/Module" in the user event B2 and then pass the second part of the main event A2 as a parameter when B2 is called by the first part of A2. However, when calling the user-defined event, it is not possible to specify the event as a variable (you can only explicitly specify the event to be started here). Would it perhaps be possible to allow a variable here as well, so that in this specific case, for example, the parameter received in the call of B2 by A2 could be referenced as a "trigger" when calling the second part of A2? The user-defined event B2 would then also be more flexible when used with different main events of "type A2" (you would not have to work with case distinctions and explicit reference of the second part of "A2" in each case).

 

Viele Grüße / many greetings
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...