Jump to content
Zum Start hinzufügen

Weitere Informationen

3D-Modellbahn Studio

Eine Vollbild-App auf Ihrem Startbildschirm mit Push-Benachrichtigungen und mehr.

So installieren Sie diese App auf iOS und iPadOS
  1. Tippen Sie auf das Teilen-Symbol in Safari
  2. Scrollen Sie durch das Menü und tippen Sie auf Zum Startbildschirm hinzufügen.
  3. Tippen Sie oben rechts auf Hinzufügen.
So installieren Sie diese App auf Android
  1. Tippen Sie auf das 3-Punkte-Menü (⋮) in der oberen rechten Ecke des Browsers.
  2. Tippen Sie auf Zum Startbildschirm hinzufügen oder App installieren.
  3. Bestätigen Sie durch Tippen auf Installieren.

Empfohlene Beiträge

Geschrieben

Liebe Programmierer und MBS-Freunde,

ich habe mir ein/e Gleis/Spur gebastelt, die mir mit einem Skript ein Fahrzeug auf eine bestimmte Geschwindigkeit bringen soll:

Fahrzeug betritt ein Gleis/Straße mit Schlagwort "Signalgleis"

local l       --LgRad
local sp = 0  --Speed

if track.variables["Signal"].state == 2 then
  sp = track.variables["Signal"].variables["Tempo"]
end

if track.variables["Alpha"] ~= 0 then --[[Kurve--]]
  l = math.pi / 180 * track.variables["LgRad"] * track.variables["Alpha"] * $("Ereignisse").variables["Massstab"]
else
  l = track.variables["LgRad"] * $("Ereignisse").variables["Massstab"]
--  l = track.size.y
end

$("Bremsen"):invoke(0, vehicle, l, sp)

-----------------------------------

benutzerdefiniertes Ereignis

--[[Parameter:
Delta = ev. Bremswegverlängerung
Fahrzeug = auslösendes Fahrzeug
Laenge = auslösende Spurlänge
Zieltempo
--]]
local v = Fahrzeug.currentSpeed / 3600 * 1000  --Umrechnung in m/s
local s = Laenge - Delta
local a = (v ^ 2) / (2 * s)

Fahrzeug.deceleration = a
Fahrzeug.targetSpeed = Zieltempo

Nun habe ich zwei Fragen.

1. Kann man die Variablen, die ich in den Gleisen/Strassen eingebunden habe, wie LgRad oder Alpha (Geometrie: Lg/Rad bzw Winkel) oder den Maßstab, per Programm auslesen?

2. Wie kann man eine LUA-Funktion erstellen und benutzen? Ich habe das LUA-Tutorial von Goetz gelesen und mir eine Funktion in einem benutzerdefiniertem Ereignis erstellt. Aber wie könnte ich eine Variable bestücken mit dem Wert aus der Funktion? Ich habe ja nur den Namen des benutzerdefinierten Ereignisses und nicht der Funktion.

In freudiger Erwartung auf Antworten

BauerHeinz

Geschrieben

Ich verstehe nicht ganz ... um eine Fahrzeug auf eine bestimmte Geschwindigkeit zu bringen gibt es einen einfachen Befehl:

vehicle.targetspeed = v   -- v ist die gewünschte Geschwindigkeit

Oder willst du etwas ganz anderes?

Geschrieben
  • Autor

Es geht darum, ein Fahrzeug an einem bestimmten Punkt zum Stehen zu bringen.

Geschrieben

Aha. Das Thema wurde hier schon mal ausführlich behandelt. Ich suche gleich mal danach und schick dir den Link. Muss jetzt erst einkaufen. Kannst aber auch schon mal selbst danach suchen.

Geschrieben

Schau mal in diesen Faden. Da findest du einiges.

Klick

Geschrieben
vor 2 Stunden schrieb BauerHeini:

Wie kann man eine LUA-Funktion erstellen und benutzen?

Du erstellst eine Funktion mit dem Schlüsselwort function.

Und du benutzt sie, indem du ihren Namen samt den Klammern dahinter schreibst

function benutzMich()          -- Funktionsdefinition
  print("Ich werde benutzt")
end

benutzMich()                   -- Funktionsaufruf

 

Aber jedes Ereignis, dass du mit einem Lua Skript versiehst, ist ein Funktionsaufruf.
Und alles, was du in dieses Skript schreibst, bildet deine Funktionsdefinition.

Ich verstehe noch nicht, was dir fehlt.

 

vor 2 Stunden schrieb BauerHeini:

Kann man die Variablen, die ich in den Gleisen/Strassen eingebunden habe, wie LgRad oder Alpha (Geometrie: Lg/Rad bzw Winkel) oder den Maßstab, per Programm auslesen?

Ja, das geht.

$("Objektname").variables["meinVariablenname"]

Aber genau das hast du in deinem Skript schon verwendet. Meinst du mit "per Programm" etwas anderes als die EV im MBS?

Bearbeitet von Goetz

Geschrieben
  • Autor

Ok, was ich meine ist:

1. Meine Funktion habe ich als benutzerdefiniertes Ereignis mit Namen "Kreisbogen" angelegt:

function Laenge(Alpha, Radius)
local l = Alpha / 360 * 2 * math.pi * Radius
  return l
end

Die Testabfrage per Taster lautet:

$("Beschriftung").text = Laenge(90, 10)

Die Fehlermeldung lautet:

[11:05:14] Ereignis-Protokollierung gestartet
[11:05:18] Schalter wird betätigt -> Taster, 0
[11:05:18]     Schalter wird betätigt
[11:05:18]         Skriptfehler (9): attempt to call a nil value (global 'Laenge')

2. Um die Länge eines Objekt auszulesen geht...

$("Beschriftung").text = $("G01").variables["Lg/Rad"]

auch nicht. "G01" ist ein Gleis.

Geschrieben

Schreib die Funktion mal nicht in ein Benutzerdefinierte Ereignis, sondern in ein SCRIPT, das Du ganz oben im Ereignisbaum unter EREIGNISSE einfügst.

Gruß
Thomas

Geschrieben

Zu HaNNoveraNers richtigem Vorschlag liefere ich die Begründung nach.

Mit function Laenge() legst du eine Funktion an. Du müsstest also dein benutzerdefiniertes Ereignis aufrufen, um die Funktion zu erzeugen. Du willst sie aber benutzen. Also musst du sie vorher erzeugt haben. Und dafür ist das Skript, welches du gleich oben in der EV über das + erstellst. Dieses Skript wird während des Anlagenstarts einmal ausgeführt. Das ist der richtige Zeitpunkt, um eine Funktion zu erstellen.

 

Geschrieben
vor 3 Stunden schrieb BauerHeini:

2. Um die Länge eines Objekt auszulesen geht...

$("Beschriftung").text = $("G01").variables["Lg/Rad"]

auch nicht. "G01" ist ein Gleis.

Und dafür solltest du dir was anderes ausdenken, denn das wird nix! Die Länge eines Gleises kannst du nicht auslesen. Jedenfalls nicht bei einem gebogenen Gleis. Ich glaube, man kann die Ausdehnung in x- und y-Richtung auslesen, du brauchst für dein Vorhaben aber die Länge der Spur, nicht die x/y-Dimension. Die Länge der Spur ergibt sich aus Radius und Winkel. Diese Werte sind nicht auszulesen, jedenfalls ist mir keine Methode dafür bekannt.

Geschrieben
  • Autor

Dankeschön. Das mit der Funktion funktioniert:)

Jetzt fehlt nur noch die Lösung auf die Frage mit den Objektvariablen. Obwohl es ja keine Variablen sind, sondern konstante Werte, wie "Lg/Rad" oder "Winkel". Interessant für mich wäre auch "Maßstab" aus dem Modelleditor

Geschrieben
  • Autor

Hallo Timba, ich kann sie berechnen aus "Lg/Rad" und "Winkel". Dafür habe ich ja die Funktion "Laenge" erstellt. Nur hierzu müßte ich eben die Konstanten aus dem Modelleditor auslesen können. Das wäre jetzt mal eine Frage an den "Erbauer" des Programms Stefan Werner. Denn wenn die Daten im Modelleditor zu finden sind, dürfte es ja nicht allzu schwer sein sie auch per Funktion auszulesen.

Bearbeitet von BauerHeini

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Push-Benachrichtigungen konfigurieren

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.