Jump to content
View in the app

A better way to browse. Learn more.

3D-Modellbahn Studio

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

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

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?

  • Author

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

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.

Schau mal in diesen Faden. Da findest du einiges.

Klick

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?

Edited by Goetz

  • Author

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.

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

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.

 

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.

  • Author

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

  • Author

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.

Edited by BauerHeini

Create an account or sign in to comment

Configure browser push notifications

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.