Jump to content

Recommended Posts

Posted

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

Posted

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?

Posted

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.

Posted (edited)
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
Posted

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.

Posted

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.

 

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

Posted

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

Posted (edited)

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

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...