Jump to content

Empfohlene Beiträge

Geschrieben

@Goetz

Hallo Goetz, ein gutes und gesegnete neues Jahr.

Nachdem meine Runden wie gewünscht funktionieren geht es weiter, d.h. ich bombadiere Dich mit weiteren Fragen.

Folgende Idee steckt dahinter:
Ich will eine Fahrstrasse aktivieren, falls es möglich ist.
Ist es nicht möglich, so soll nach einer bestimmten Zeit (mehrere Sekunden) ein erneuter Versuch gestartet werden.
Damit ich das aber nicht für jede Fahrstrasse extra machen muss, will ich die Funktion fahrstrasse verwenden.
Nur - es funktioniert mal wieder nicht.
Fahrstrasse3 ist extra belegt und kann nicht funktionieren.
Mit meinem zusammengestückelten String als Abfrage steht zwar in der Variablen das Richtige - was an der Ausgabe sichtbar wird - aber der Inhalt wird nicht abgefragt, denn wenn die Fahrstrasse3 direkt abgefragt wird, erscheint die richtige Antwort.

Folgende Fragen habe ich:
1. Wie erhalte ich den Inhalt einer Variablen?
Die Abfrage in der function 'fahrstrasse (fs, sec)'
  if str1 then
liefert  true  vermutlich weil der String etwas beinhaltet, also nicht leer und damit nil ist

steht fs in der if-Abfrage, word es beim Speichern rausgelöscht, und wenn ich die EV wieder öffne ist es weg:
  aus:  if $("fs"):canActivate() then   wird: if $(""):canActivate() then - wieso?
da ist es egal, ob mit einfachen oder doppelten '
es funktioniert einfach nicht
Fahrstrasse 3 kann nicht aktiviert werden, da dort ein Fahrzeug steht

Danke für Deine zuverlässige Hilfe.

2. das mit der Verzögerung defer... klappt auch nicht -  was mache ich da falsch?

 

t15.mbp

Geschrieben

@Goetz

Sorry, ich habe einen gelben Schalter in die Mitte gesetzt, der die Funktion aufruft.

Die Funktion selbst steht unter <>Skript direkt unter den Variablen

 

Geschrieben (bearbeitet)
vor 5 Stunden schrieb Mobb:

Mit meinem zusammengestückelten String als Abfrage

bist du leider auf dem Holzweg, Mobb.

Im 3D-Modellbahnstudio hast du es mit Objekten zu tun. Und die sprichst du nicht über ihren Namen an, sondern über ihre Objektadresse.

Wenn du per EV eine Fahrstraße aktivierst ...

EVFahrstraeaktivieren.jpg.9ed43a95b943a95e20d00954be2ca6cb.jpg

und dann diese Zeile in ein Lua Skript umwandelst, bekommst du diese Zeile:

$("Fahrstrasse3").active = true    

Das vorangestellte Dollar Zeichen ist kein Lua. Das ist die Art, wie das Studio Objektadressen mit Lua austauscht.
(An den Klammern hinter dem $ erkennst du, dass es sich hier um eine Funktion handelt.)
Wenn du das Skript so lässt und jetzt den Namen der Fahrstraße änderst wirst du beobachten, dass der Name im Skript diese Änderung übernimmt. Der Name soll nur für dich lesbar darstellen, um welches Objekt es sich hier handelt. Angesprochen wird es über seine Adresse, nicht über den Namen.

Übergib die Objektadresse als Argument an deine Funktion.
Das kannst du in Lua tun, indem du im Skript das $-Zeichen schreibst und dann die Fahrstraße in der Auswahlliste selektierst.

SkriptFahrstraeaktivieren.jpg.29453cbfdd75e90b126e65134d862134.jpg

So erhältst du die Objektadresse dieser Fahrstraße (in der Schreibweise mit dem vorangestellten $-Zeichen.)

 

function fahrstrasse (fs, sec)
  if fs:canActivate() then
    print ("Fahrstrasse ", fs.name, " kann aktiviert werden - Sekunden: ", sec)
  else
    print ("Fahrstrasse ", fs.name, " kann NICHT aktiviert werden - Sekunden: ", sec)
  end
  print ' '
end

 

und defer() kannst du im Hauptskript meines Wissens nicht verwenden.
Diese spezielle Funktion triggert ein Ereignis (nach Ablauf der angegebenen Dauer) ein weiteres Mal.
Für das Hauptskript gibt es aber in diesem Sinne kein auslösendes Ereignis.

Wenn du defer() nutzen möchtest, nutzt du besser ein sogenanntes "benutzerdefiniertes Ereignis". Das verhält sich technisch genauso wie die Ereignisse "Zug betritt ein Gleis", "Signal schaltet", "Fahrstraße wird aktiviert" und dergleichen mehr. Das ist deine "Funktion" und die Parameter diese Funktion stehen dir innerhalb dieses Ereignisses als "Auslöser" zur Verfügung.

Viele Grüße
Götz

 

Bearbeitet von Goetz
Geschrieben

@Goetz

Hi Goetz,

das mit der Fahrstrasse funktioniert. Super, Vielen Dank. Woher weißt Du denn das alles? Bist Du Entwickler bei 3d-modellbahn?

Das mit dem Benutzer definierten Ereignis verstehe ich nicht wirklich, denn wo bekomme ich meine Werte her und wie rufe ich das Teil dann auf?

Viele Grüße

Geschrieben (bearbeitet)
vor einer Stunde schrieb Mobb:

Woher weißt Du denn das alles?

Weil ich selbst anfangs all diese Fragen gestellt und gute Antworten bekommen habe.

 

vor einer Stunde schrieb Mobb:

[benutzerdefiniertes Ereignis] wo bekomme ich meine Werte her und wie rufe ich das Teil dann auf?

thumbkleinerEndbahnhof.jpg.a2b7313f4cc45199cda5f60607c53149.jpg
Du kannst dir als Beispiel meine Anlage "kleiner Endbahnhof mit Zufallssteuerung" anschauen.
Content ID:  6C90DC03-A6FA-4468-B153-0112BAC3D86D

Die beiden Ereignisse zufällige Ausfahrt und zufällige Einfahrt sind benutzerdefinierte Ereignisse.
Beide haben einen Parameter namens Startwert

Im Ereignis Ausfahrtknopf wird betätigt findest du den Aufruf für zufällige Ausfahrt.
Und entsprechend in Einfahrtknopf wird betätigt den Aufruf für zufällige Einfahrt.

In dieser Beispielanlage wird als Argument eine zufällige Zahl übergeben.
Aber man kann ebenso gut Objektadressen, Listen und vieles andere für die Argumente einsetzen. So, wie man es eben braucht.

 

thumbLauflicht.jpg.9e4c1d58c403e534b985fe553a420963.jpg
Ein weiteres Beispiel findest du in der Anlage "Lauflicht Liste"
Content ID:  7A0D3A0C-E922-4CCA-A376-FF17E38B8B98

Das Ereignis Lampe an aus ist ein benutzerdefiniertes Ereignis.
Der Parameter ist Lampe
Der Aufruf des Ereignisses steht im Ereignis Timer läuft ab mit einem einzelnen Objekt aus der Liste Rabbit als Argument.

Zweck der Methode ist in diesem Beispiel, dass ich die Leuchtdauer für die Lampen unabhängig von der Laufgeschwindigkeit des Rabbit festlegen kann. Immer, wenn der Timer (für den Fortschritt) abgelaufen ist, bekommt eine Lampe aus der Liste die Befehle, dass sie zuerst an und nach Ablauf einer spezifizierten Dauer (unabhängig vom Timer) wieder ausgehen soll.

 

Schau mal bitte, ob dir das schon zu einem besseren Verständnis verhilft.
Götz

Bearbeitet von Goetz
zweites Beispiel aufgeführt
Geschrieben

@Goetz

Hallo, ich habe mal kurz reingeschaut, aber verstehen tue ich noch nichts. Morgen habe ich mehr Zeit, um es mir nochmal zu Gemüte zu führen.

Was mich überrascht ist, dass bei einer zufälligen Einfahrt nicht geprüft wird, ob das Zielgleis frei ist - oder habe ich das übersehen?

Bei der Ausfahrt ist es ähnlich. Da fahren die Züge nacheinander aus, ohne das geprüft iwrd, ob überhaupt ein Zug in dem Gleis steht, oder?

Viele Grüße

Geschrieben
vor 36 Minuten schrieb Mobb:

habe ich das übersehen?

Hast du.

Bei der Einfahrt wird geprüft, ob die Fahrstraße frei ist. Und wenn ein Gleis belegt ist, dann ist die Fahrstraße in dieses Gleis nicht frei.

Im folgenden Video findest du eine Erklärung zur Funktionsweise von Fahrstraßen:

 

Bei der Ausfahrt findest du die Prüfung in der ersten Bedingung.
Sie lautet "[beliebiges] Fahrzeug steht auf einem Kontakt". Ist die Bedingung wahr, dann wird die Fahrstraße für dieses Gleis angefordert.
Andernfalls wird weitergezählt und der nächste Kontakt geprüft.

Geschrieben

@Goetz

Hallo,

Also das mit der Einfahrt ist klar. Sie erhält einen Startwert und falls die Fahrstraße nicht aktiviert werden kann, dann wird eins addiert und über die modulo-Funktion stellst Du sicher, dass immer ein Wert zwischen 1 und 3 rauskommt usw. und bei der Ausfahrt ist es ähnlich. Da es nur drei Gleise sind, ist diese Lösung recht entspannt. Falls sich ein Zug auf einem Teil der Fahrstrasse befindet, so kann sie nicht aktiviert werden - danke für das Video.
Soweit habe ich es verstanden.

An dem Timer bin ich noch dran.
Melde mich wieder
Viele Grüße

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