Jump to content

LUA Funktionen und Objektdaten


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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