Jump to content

Hilfe beim Erstellen eines Scripts


mroschk

Empfohlene Beiträge

Hallo,

ich brauch mal eure Hilfe bei einem Script.

Also folgendes Beispiel:
Es gibt 3 Züge auf der Anlage. Wenn ich nun einen Schalter einschalte, dann soll bei dem Zug, der sich gerade auf einem bestimmten Gleis befindet die Kupplung geöffnet oder geschlossen werden.
Bei welchem Zug das geschieht kann ich aber nicht vorher ( zB mit einem Schlagwort oder Namen ) festlegen.
Es muss sich immer auf den Zug, egal welcher es gerade ist, beziehen.

Wisst ihr wie man das machen kann ?

Danke schon mal

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 29 Minuten schrieb mroschk:

Wisst ihr wie man das machen kann ?

Hallo Mroschk.
der einfachste Weg kommt ganz ohne EV aus:

Nimm ein Entkuppler Gleis (bei Märklin C-Gleis das Modell 24997) 
Dann setze einen Taster auf die Anlage und suche in den Eigenschaften Verbindung

Da weist du das Entkuppler Gleis zu.

EntkupplerGleis.thumb.jpg.31f644a3bd3a2d04b2c7ba67aac4136a.jpg

Fertig!

Jetzt kannst du im richtigen Moment den Entkuppler per Knopfdruck aktivieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

danke für den Vorschlag, aber meine Frage hatte einen Grund.
Ich steuere MBS mit Traincontroller. 
Über das Interface/Schnittstelle kann ich aber die Kupplung der Lok nicht steuern.
Das mit dem Entkuller hab ich gerade in Benutzung, das ist aber nicht wirklich praktisch, da man nicht 100% genau festlegen kann wo der zug steht, ausserdem muss er nach dem Entkuppeln ein bisschen vorziehen. Wenn er dann aber nicht 100% genau auf dem Entkuppler steht, dann geht der Lokwechsel schief.

Deswegen möchte ich es gerne anders machen und über einen Schalter, den ich über Traincontroller steuern kann, die Kupplung der Lok steuern.
Dieser Weg wäre in der kombination eleganter.

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

danke für die Antwort.

Ich habe bisher noch nicht wirklich viel mit der internen Ereignisverwaltung gemacht.
Aber wie du geschrieben hast, 

"und mit der Auswertung, welches Fahrzeug"

...hier ist das Problem, wie kann ich denn feststellen, welches Fahrzeug gerade das Gleis betritt ohne das vorher festzulegen?
Ich suche also nach einer Möglichkeit mit dem Script herauszufinden welches Fahrzeug gerade das gleis betritt oder aktuell auf dem Gleis ist.

Keine Ahnug ob das überhaupt geht ohne das vorher festzulegen?

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @mroschk,

Gerade eben schrieb mroschk:

Keine Ahnug ob das überhaupt geht ohne das vorher festzulegen?

Das geht.

Es gibt das Ereignis "Fahrzeug betritt Gleis". Dieses Fahrzeug merkt man sich in einer Variablen (z.B. in einer Objektvariablen des Gleises). Auf Tastendruck deaktivierst Du dann die Kupplung genau dieses gemerkten Fahrzeuges.

Ich kann Dir das ausformulieren, aber nicht jetzt gleich, sondern erst heute Abend.

Beste Grüße

Phrontistes

Link zu diesem Kommentar
Auf anderen Seiten teilen

OK, ich kenne mich noch nicht so sehr gut mit der Scriptsprache aus.

Aber "ich verstehe ja nicht, warum ihr das alles so kompliziert macht?"

Ich glaube weil es nicht ganz so einfach zu sein scheint....warum?

Also die Aufgabe was bei dem zug (irgend einer), der gerade auf dem Gleis ist die hintere Kupplung deaktiviert wird, wenn ich auf einen Schalter drücke.
Also muss ich ja erst mal wissen welcher Zug gerade auf dem gleis ist, also darf die Action nicht ausgeführt werden wenn der Zug das gleis betritt, sondern nur wenn ich den Schalter drücke. Dabei muss das aber unabhängig vom Zug der gerade auf dem Gleis ist passieren.

Also irgend ein Zug befindet sich auf einem bestimmten Gleis.
Wenn dann der Schalter gedrückt wird, dann soll die hintere Kupplung deaktiviert werden.

Ich bin am testen :-)

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb Roter Brummer:

Dann schaltest du eine Bedingung vor. Die Kupplung wird nur dann gelöst, wenn der Schalter gedrückt ist.

Und ein bisschen netter wäre auch nicht schlecht.

Hallo,

netter ?
Also ich wollte wirklich nicht unhöflich sein, sorry falls das so rüber kam.
Ich hab nur versucht das so kurz und knapp wie möglich zu schreiben.

Also dann mal kurz zum Hintergrund:

Es geht im Grunde darum, das das ganze mit dem Traincontroller funktionieren muss.
Also möchte ich so wenig wie möglich scripte oder Ereignisse im MBS erstellen, damit nichts durcheineander kommt.

Nun ist es so, das ich bei dem derzeitigen Interface von MBS zu TC oder umgekehrt :-) bei den Lok's die Kupplung nicht ansteuern kann.
Das ist ein Grund, warum ich die Funktion so erstellen möchte, das sie mit jeder Lok die gerade auf dem Gleis ist funktioniert.

Das ganze soll so funktionieren:

Im TC gibt es eine Betriebsstelle genannt Lokwechsel.
Dabei schickt man eine Lok auf ein bestimmtes gleis und dann funktioniert alles automatisch, gesteuert von TC.
Die Lok mit wagen hält an, dann wird die Kupplung deaktiviert, die Lok zieht etwas vor, dann fährt sie in ein anderes gleis.
Dann kommt eine ander Lok und fährt an die abgestellten Wagen heran, kuppelt und fährt dann mit den Wagen weiter.

Da ich ja die kupplung der Lok vom TC aus nicht direkt ansteuern kann muss ich das auf einem kleinen Umweg machen.

Also irgendeine Lok wird von TC auf ein Gleis mit eindeutigem Namen geschickt.
Wenn nun TC die Kupplung deaktiviert, dann lasse ich einen Schalter in MBS schalten und die Kupplung der Fahrzeuges welches gerade auf dem Gleis steht soll deaktiviert werden.

Ist ein bisschen umständlich, geht aber leider noch nicht anders.

Desweitern hätte ich das ganze gerne so, das ich zB. wenn ich eine neue Anlage in MBS erstelle nicht alles wieder anpassen muss, oder so wenig wie möglich.

Ich hoffe das war jetzt etwas freundlicher, ich geb mir wirklich Mühe und sorry nochmal, falls ich unhöflich rüber gekommen bin.

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb mroschk:

Also irgendeine Lok wird von TC auf ein Gleis mit eindeutigem Namen geschickt.
Wenn nun TC die Kupplung deaktiviert, dann lasse ich einen Schalter in MBS schalten und die Kupplung der Fahrzeuges welches gerade auf dem Gleis steht soll deaktiviert werden.

Hallo Matthias,
das Beste ist, du speicherst in dem Moment, wenn der Zug das Gleis betritt, seine Lok in einer Variablen im Schalter.
Damit der Schalter ab diesem Augenblick weiß, welche Lok er beeinflussen soll.
Und bei Verlassen des Gleises musst du die Variable wieder löschen, weil der Zug sonst weiterhin vom Schalter beeinflusst würde wenn er schon längst auf der Strecke fährt.

Jetzt kannst du auf Knopfdruck nachschauen, welche Lok im Schalter hinterlegt ist und die beeinflusst du dann wie gewünscht.

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine kleine Beispielanlage dazu:   Entkuppeln per Taster.mbp

BeispielanlageEntkuppler.thumb.jpg.a5d021f59984c2df7d6d444cc36068c3.jpg

Beachte bitte, dass ich bei den drei Loks die Bremskraft auf ca. 3 heruntergesetzt habe, damit sie sanft abbremsen.
Außerdem ist das automatische Abbremsen aktiviert. Damit dockt eine Lok mit aktiver Kupplung sanft an den Waggons an. Steht die Kupplung hingegen auf "abstoßen", dann stoppt die Lok kurz vor den Waggons und es bleibt eine Lücke.

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Matthias,

Du kannst das so machen, wie Götz gerade geschrieben hat. Wenn Du ohne Variablen auskommen willst, kannst Du es auch so machen:

Skript1.thumb.jpg.d87a9a7f66bf901c8b703c443aa85bbc.jpg

Gleis 1 ist das Entkupplungsgleis und "Taste entkuppeln" ist der Schalter (Steuerelemente->Schalter, Taster-><letztes Element mit Bezeichnung Taste..>
Betritt also ein Zug das Entkupplungsgleis UND der Taste steht auf "An", dann wird die hintere Kupplung der Lok gelöst. Danach wird der Schalter wieder auf "Aus" gestellt. Falls Du das über TC machst, kann der Punkt hier entfallen.

Da Du von TC keinen Zugriff auf die Kupplungen hast, benötigst Du ein zweites Ereignis, das die Kupplung wieder aktiviert. Dazu dient das zweite Ereignis, das ausgelöst wird, wenn ein Zug das Entkupplungsgleis verlässt. (Falls die Kupplung schon/noch aktiviert war, ist das auch egal):

Skript2.thumb.jpg.2016407661b124416739cbf87b382e7b.jpg

Ich will Dich nicht entmutigen. Aber denke auch mal über folgendes nach:

Wenn es sich um eine Tenderlokomotive handelt, soll wohl die hinter Kupplung des Tenders gelöst werden. In diesem Fall kommst Du nicht um eine Objektvariable herum. Dann solltest Du bei der Lok eine Objektvariable einfügen (Rechter Mausclick auf die Lok, Auswahl Schlagworte/Variable, Neu einfügen eine Objektvariable mit Namen Tender und als Inhalt den Tender). Dann müsste zusätzlich eine Abfrage eingefügt werden, ob die Lok eine Variable "Tender" besitzt. Falls ja, wird die hintere Kupplung des Tenders gelöst, ansonsten die der Lok. Die selbe Abfrage muss dann auch beim zweiten Ereignis eingefügt werden.

Weiterhin muss bisher sichergestellt sein, dass die Lok nicht gedreht den Zug zieht, da dann die vordere Kupplung deaktiviert werden muss.

Viele Grüße,
    Wolfgang

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Minuten schrieb prinz:

Betritt also ein Zug das Entkupplungsgleis UND der Taste steht auf "An", dann wird die hintere Kupplung der Lok gelöst.

Tut mir leid, Wolfgang, aber das ist nicht das, was Matthias will.

Er will mit dem Taster die Kupplung an und ausschalten. Und zwar bei der Lok, die auf dem Gleis steht.

Um das ohne Variable zu machen, müsste man bei Tastendruck untersuchen, wer auf dem Gleis steht.
Das geht auch, mittels Wiederholungen. Ist aber komplizierter, ...

EntkuppelnperTaster.jpg.9f7aa18454965502dfeb3a19946a4a10.jpg

... weshalb ich der Variable den Vorzug gegeben habe.

Viele Grüße
Götz

Bearbeitet von Goetz
Bild hinzugefügt
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

danke euch ALLEN für die Antworten !!

@Götz, ich versuche das gerade nachzubauen ... nicht ganz einfach. Wie gesagt, ich mach gerade meine ersten Schritte mit so einem Script.
Das erste hab ich hinbekommen.
Das zweite ( Für alle Fahrzeuge in einem Zugverband) noch nicht.
Wie hast du das erste @Fahrzeug, Mit Antrieb, @Lok, @Ori    hinbekommen ?

Sorry für die blöde Frage :-)

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 23 Minuten schrieb mroschk:

Wie hast du das erste @Fahrzeug, Mit Antrieb, @Lok, @Ori    hinbekommen ?

Das findest du in der Liste von Wiederholungen.
Da gibt es einmal für alle Fahrzeuge auf einem Gleis
und zum zweiten für alle Fahrzeuge in einem Verbund

Wenn du mit der Schleife alle Fahrzeuge in einem Zugverband durchläufst, dann kannst du diese Liste auf die motorisierten Fahrzeuge beschränken.
Das ist ein umständlicher Weg um sicherzustellen, dass ich nicht auch die Waggonkupplungen im Zug anspreche.

 

Diese Dinge sind mit Lua wirklich viel einfacher zu stemmen.

Unter den Tutorials habe ich dieselbe Anlage mit einem bisschen Lua drin veröffentlicht:   AB4CC825-FF3A-45D7-B64C-D71F1CA65792

Du musst bitte verstehen, dass das MBS dir nicht die Lok nennen kann, die auf dem roten Gleis steht.
Weil es mehr als ein Fahrzeug sein könnte, liefert das MBS dir immer eine Fahrzeugliste. Die enthält dann wahrscheinlich nur ein Fahrzeug.

Wenn ich also schon ein Fahrzeug aus der Liste wählen muss, dann doch am besten das mit eingeschaltetem Motor.
Das wird die Lok sein und kein Waggon.

local t = layout:getVehiclesOn($("rotes Gleis 24172"))

for i, v in ipairs(t) do
  if v:hasEngine() and v.engine.active then
    v.couplers[1].enabled = state
    break
  end
end

 

Außerdem muss ich den Knopf "primen", wenn eine Lok aufs Gleis fährt.
Ich möchte ja gerne an und aus optisch unterscheiden können.

Ich prüfe deshalb bei Betreten des Gleises, ob die hintere Kupplung des Auslösers aktiv ist oder nicht.
Für diese Prüfung benutze ich eine Skript-Bedingung:

return  vehicle.couplers[1].enabled 

Die gibt einfach den Zustand der Kupplung 1 (= hintere) als wahr (= aktiv) oder falsch zurück.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wow, habs hinbekommen, funktiniert echt super, danke euch !!

Um das jetzt nicht jedesmal ändern zu müssen würde ich das gerne so machen, das es einen Bezug zu dem Scriptnamen gibt.

--[[
local t = layout:getVehiclesOn($("Entkuppelgleis_001"))
for i, Fahrzeug in ipairs(t) do
  local t, t2 = layout:getVehicleGroup(Fahrzeug, 1)
  for i, Lok in ipairs(t) do
    local Ori = t2[i]
    Lok.couplers[1].enabled = state
  end
end

--]]

local t = layout:getVehiclesOn($(""))
for i, Fahrzeug in ipairs(t) do
  local t, t2 = layout:getVehicleGroup(Fahrzeug, 1)
  for i, Lok in ipairs(t) do
    local Ori = t2[i]
    Lok.couplers[1].enabled = state
  end
end

Das Script heißt Entkuppelgleis_001

Ich hätte gerne, das in dieser Zeile:
local t = layout:getVehiclesOn($("Entkuppelgleis_001"))

das Entkuppelgleis_001 immer durch den Script namen ersetzt wird.
Also wenn ich das Script für ein zweites Entkuppelgleis einfach kopiere, dann müsste in der Zeile ein bezug auf den Scriptnamen genommen werden.

Der scriptname sollte self.name sein, ich bekomme nur immer einen Fehler angezeigt.
Das liegt bestimmt nur an dem Shyntax ich weiß nicht genau wie man 

Entkuppelgleis_001 durch self.name ersetzen kann ?

Matthias

Bearbeitet von mroschk
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 32 Minuten schrieb mroschk:

Ich hätte gerne, das in dieser Zeile:
local t = layout:getVehiclesOn($("Entkuppelgleis_001"))

das Entkuppelgleis_001 immer durch den Script namen ersetzt wird.

Tja, was da wie ein Name aussieht, ist leider keiner.
Mit dem vorangestellten $ Zeichen ist das im Studio eine Objektadresse,
Nur im Editor wird dir das Objekt namentlich genannt (damit du erkennen kannst, um welches Objekt es sich handelt).

Das musst du dann bitte anders angehen:
Lege eine Modulvariable "Entkuppelgleis" an. Diese referenzierst du in jedem deiner Skripte
Und in jeder Anlage hinterlegst du in dieser Variablen das tatsächliche Objekt.

Namen sind zur Identifizierung von Objekten ungeeignet, weil viele Objekte identische Namen haben dürfen.
Aber Objektadressen sind immer eindeutig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm, also nur um sicher zu gehen das ich das richtig verstanden habe.

Wie im Bild zu sehen würde ich gerne das die Variable:
local t = layout:getVehiclesOn($("Entkuppelgleis_001")) immer auf den Namen des Ereignisses verweist
Also wenn das Ereignis Entkuppelgleis_001 heißt soll das hier ersetzt werden 

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm, also wenn ich das richtig verstehe, dann geht das nicht so wie ich mir das vorgestellt habe.

Ich wollte, wie im Bild zu sehen, das der Name Entkuppelgleis_001 einfach durch den Namen des ereignisses ersetzt wird.
local t = layout:getVehiclesOn($("Entkuppelgleis_001")) -> local t = layout:getVehiclesOn($("Entkuppelgleis_002"))

Das scheint nicht zu gehen, wollte nur noch mal sicher gehen das ich das richtig verstanden habe

entkuppler.jpg

Bearbeitet von mroschk
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 21 Minuten schrieb mroschk:

also nur um sicher zu gehen das ich das richtig verstanden habe.

Sagen wir mal so: Ich habe dich richtig verstanden.
Und dir die Lösung für deinen Wunsch genannt, samt Erklärung, warum die so aussehen muss.

Du kannst dazu ein Skript anlegen, das bei Anlagenstart selbständig nach dem Objekt mit deinem Wunschnamen sucht und dieses Objekt in der Variablen hinterlegt. Warum dieser Umweg? Weil das Studio dafür die Namen aller Objekte der Anlage mit deinem Wunschnamen vergleichen muss. Das macht man nach Möglichkeit nur einmal und nicht bei jedem Tastendruck.

$("Ereignisse").variables["Entkuppler 001"] = layout:getEntityByName("rotes Gleis 24172")

Aber ehrlich? Das kannst du auch beim Anlagenbau händisch eintragen. Oder?

Mit dieser Modulvariablen sieht dein Skript für den Taster dann so aus:

local entkuppler = $("Ereignisse").variables["Entkuppler 001"]
local t = layout:getVehiclesOn(entkuppler)

for i, v in ipairs(t) do
  if v:hasEngine() and v.engine.active then
    v.couplers[1].enabled = state
    break
  end
end

 

Bearbeitet von Goetz
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...