Jump to content

Hilfe bei der EV für eine Zuganzeige


Empfohlene Beiträge

vor 27 Minuten schrieb Anlagendesigner:

ist die Liste eine Objektvariable oder eine Programmvariable, falls Objektvariable, dann zu welchem Objekt zugeordnet Bus/S-Bahn oder Anzeigetafel (Gesamte Gruppe oder Einzelelement)?

Das ist dir überlassen.
Letztlich macht das für den Inhalt der Liste keinen Unterschied.
Leg sie dorthin, wo du sie wiederfindest.

vor 28 Minuten schrieb Anlagendesigner:

Bricht aber beim Auslösen die Verarbeitung ab.

Dann gibt es sicher eine Fehlermeldung zum Abbruch.
Kennst du das Ereignisprotokoll? (Taste F12)

Sorry Anlagendesigner, aber ist dir bewusst, dass ich dir nicht zusehen kann?
Wie soll ich erkennen, wo die Ursachen für deine Fehler liegen wenn ich keine Ahnung habe, was du gerade tust?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja sorry, hab den Betrag noch schnell geschrieben, ehe ich das Studio beendet habe.

Schaue morgen mal nach was im Protokoll steht, aber viel war das nicht was da stand.

 

Hab die Variable wie beschrieben als Objektvariable der Gruppe "Zuganzeige" erstellt.

Das befüllen wird von einem Gleiskontakt ausgelöst. Aber wie bereits gesagt, anders als in deinem Bildbeispiel kann ich nur die Listennummer als Variablenname auswählen, nicht die gesamte Liste. Da ist wohl auch der Abbruch drin begründet. Schaue aber spätestens Morgen nach den Details 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Anlagendesigner:

So wie ich das verstehe ist der Fehler ein Index mit einem Nullwert.

Richtig.
Die EV findet das Feld mit dem Index '1' nicht.

So, wie du es geschrieben hast, muss die Tabelle 1 in deiner Zuganzeige einen Eintrag mit dem Bezeichner 1 haben.
Und unter diesem Bezeichner muss eine Tabelle liegen, die ein Element namens "Abfahrtszeit" enthält.

Leider sehe ich nur, dass die Tabelle an Position 1 drei Elemente enthält. Aber ich sehe nicht, welche das sind.
Ich möchte wetten, dass keins der drei Elemente den Bezeichner '1' hat?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich mich 'mal einmischen darf,

die Tabellennamen sind doch 1,2,3,4, oder ?

Namen dürfen nicht mit einer Ziffer beginnen, nicht in Lua und auch in keiner anderen mir bekannten Sprache.

Auf jeden Fall eine Fehlerquelle.

Gruß Eggu

Bearbeitet von Eggu
Korrektur
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb Eggu:

die Tabellennamen sind doch 1,2,3,4, oder ?

Ja, und im Studio ist das gestattet. 
In Lua ebenfalls.
Weil diese Bezeichner keine Zahlen sind, sondern Strings. Eine "1" ist etwas anderes als eine 1

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb Anlagendesigner:

Sehe aber keinen Unterschied zu deinem Screenshot.

Der Unterschied ist, dass ich nur eine Variable habe und du hast vier.

Meine eine Variable hat den Namen Abfahrtzeiten und sie enthält eine Liste.
Deine vier Variablen haben die Namen 1, 2, 3 und 4 und enthalten Tabellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb Goetz:

Weil diese Bezeichner keine Zahlen sind, sondern Strings. Eine "1" ist etwas anderes als eine 1

ich habe es jetzt nicht im Detail getestet,

offiziell müssen Bezeichner meines Wissens nach mit einem Buchstaben beginnen

(Bezeichner (auch Identifikatoren genannt) können in Lua eine beliebige Zeichenkette aus Buchstaben, Ziffern und Unterstrichen sein, dürfen jedoch nicht mit einer Ziffer beginnen.)

https://www.lua.org/manual/5.1/de/manual.html      (Absatz 2.1)

Bei Tabelleneinträgen selbst sieht es anders aus, das sind ja  key/value-Paare, und ein Key kann auch eine Zahl sein,
eine übliche nummerierte Liste ist da nur ein Sonderfall, wobei die keys eben eine Nummernfolge sind 1,2,3,.....

Aber gut, offenbar ist im MBS auch eine Ziffer als Bezeichner möglich.

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Minuten schrieb Anlagendesigner:

Der Index bei Listen wird doch automatisch vorgeben

.. ja, die Einträge in einer Liste selbst sind durchnummeriert,

aber der Name einer Liste oder Tabelle selbst wird doch abgefragt in einem Popup-Fenster,

aber vl. interpretiere ich den Screenshot ja auch nicht richtig.

tabelle_anlegeln.thumb.jpg.f886ea794244c8015db0fb2d80be3856.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Goetz

Während du geschrieben hattest ist genau das mir selbst aufgefallen und ich habe es geändert.
Das Ereignis führt jetzt nicht mehr zu einem Abbruch, es wird aber auch nichts in der Zuganzeige beim Aulösen eingetragen/geändert.

Muss mir den Ablauf morgen noch mal genau im Detail ansehen.

Anbei noch mal ein Screenshot der Ereignisprotokolls:

Screenshot2024-05-29224130.thumb.jpg.905eb6705ddbcb87bfb3387174232fc7.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gerade eben schrieb Eggu:

offiziell müssen Bezeichner meines Wissens nach mit einem Buchstaben beginnen

das ist zu engstirnig und so nicht richtig.
Wird aber gerne so gelehrt, weil man es sich leicht merken kann.

Wenn du einen Variablennamen in deinen Programmtext schreibst und mit etwas anderem als einem Buchstaben oder dem Unterstrich beginnst, dann kann der Interpreter nicht erkennen, dass es sich bei diesem Zeichen um einen Teil eines Variablennamens handelt. Der Interpreter kann die ganzen Zeichen, die wir tippen nur dann richtig zuordnen, wenn wir bestimmte Zeichen für bestimmte Zwecke reservieren.

Das hat aber nichts mit dem eigentlichen Namen der Variablen oder dem Bezeichner einer Zelle zu tun. Die können alles enthalten, wenn du einen Weg findest diese Namen so zu schreiben, dass der Interpreter sie korrekt einordnen kann.

Tabelle.Index und Tabelle["Index"] sind gleichbedeutend. Hier kann der Interpreter den Bezeichner auch in der Schreibweise mit dem Punkt richtig erkennen.

Aber Tabelle.1 geht nicht, Tabelle["1"] hingegen schon und es ist etwas anderes als Tabelle[1]

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Screenshot2024-05-30223307.thumb.jpg.0ca2e44f5f8132841bf9180622b7b13d.jpg

So klappt erstmal soweit  Habe den Auslöser jetzt mal alternativ auf den Taster gelegt. Lässt sich von der Ansicht her besser positionieren.

Für die Anzeige2-4 muss ich den ganzen Teil jetzt jeweils kopieren. Geht das auch generisch? Habe die Modelle "Anzeigetafel (1)" benannt, wobei die 1 sich jeweils ändert. Der Name müsste doch eigentlich auch mit einer hochgezählten Variable erstellt werden können, oder funktioniert das nur in Lua? Selbst bei einer Haltestelle die Nachts nicht angefahren wird und zwei Linien stündlich die Haltestelle passieren kommen ja über 50 Zeilen in der Tabelle zusammen, von denen ja nur die ersten 4-5 auf der Tafel angezeigt werden.

Als nächstes kommt dann das hochzählen.bzw. löschen der obersten Zeile und Nachrücken der folgenden. Zeilen.

Zusätzlich muss ich mir noch überlegen wie ich das ganze z. B. mit Schlagwördern generisch aufbauen kann, damit nicht für jede Station/Zuganzeige ein einzelner Eintrag in der EV erstellt werden muss. Erste Idee wäre es, die Tabelle als Variable an den Gleiskontakt anzuhängen und den Namen der Anzeigetafel ebenfalls als Variable zu hinterlegen. Dann müsste ich in der EV nur jeweils auf die Variable des Auslösers (Gleiskontaktes) verweisen und beim kopieren des Gleiskontaktes nur die Tabelle anpassen und die jeweiligen Namen der Anzeigetafel hinterlegen. Somit könnte ich alle Tafeln mit einem Eintrag in der EV abfertigen, oder ist da ein Denkfehler?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

@Goetz

Ich habe mir noch mal dein Lua-Beispiel vom Anfang angesehen, muss aber gestehen, dass ich nicht wirklich damit zurecht komme.

Zitat

Hallo Anlagendesigner,
um den Inhalt einer Liste zu verschieben oder zu rotieren, musst du bitte Lua bemühen.
Dazu übergibst du zuerst die im Studio angelegte Liste an eine Lua Variable.
Diese Kopie kannst du mit Lua verändern.
Anschließend übergibst du die veränderte Liste wieder ans Studio.

Hier ist ein Beispielskript:

local t = $("Ereignisse").variables["Beatles"]
table.insert(t, table.remove(t, 1))
$("Ereignisse").variables["Beatles"] = t

Die funktion ist mir schon klar, aber ich habe Probleme mit den Bezeichnern. Wofür steht das "Ereignisse"? Ich behme an das "Beatles" steht für den Namen der Objektvariable, oder?

Im Prinzip müsste ja die erste Zeile gelöscht und am Ende wieder angehangen werden.
Ist es möglich, die Nummern der Liste per Script zu ändern, also 1->x, 2->1, 3->2, 4->3, x->4 (wobei x ein Zwischenspeicher ist)

Bearbeitet von Anlagendesigner
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb Anlagendesigner:

Wofür steht das "Ereignisse"?

Schau mal bitte in eine beliebige EV.
Dort siehst du links, dass alles in einem Ordner (richtiger: Modul) namens "Ereignisse" steht. 
In diesem Modul kannst du Variablen hinterlegen.

Beatles ist in meinem Beispiel eine Variable (in diesem Fall eine Liste) im Modul Ereignisse.
Neo nennt es dann eine Modulvariable.
Eine Objektvariable wäre es, wenn die Variable in einem Haus, einem Fahrzeug oder einem anderen Modell stecken würde.

Diese Struktur ist von Neo im 3D-Modellbahnstudio angelegt worden.
Mit Lua hat das nur insofern zu tun, als dass Neo dir ermöglicht mittels Lua darauf zuzugreifen.
Insbesondere die Bezeichner mit dem vorangestellten $ Zeichen sind ein Entwurf außerhalb von Lua. Hinter diesen Bezeichnern stecken Objektadressen. Wenn du den Namen eines Objekts im Studio änderst wirst du feststellen, dass sich auch der Bezeichner im Skript mit ändert. Denn die Objekte werden nicht mittels Namen angesprochen. Die Namen sollen dir nur helfen zu erkennen, welches Objekt hinter dem Bezeichner steckt. Die wahre Objektadresse wäre kryptisch und hätte wenig Aussagekraft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Goetz

Also ich sehe in der EV keinen Eintrag "Ereignisse", nur "Ereignisverwaltung" mit den einzelnen Einträgen bzw. Ordnern. (Siehe Screenshot1)

Meine Liste habe ich an einen Gleiskontakt als Modulvariable hintelegt. Dort gibt es ebenfalls 4 Objektvariablen für die Anzeigeelemente. So bin ich generisch und brauche nur den Gleiskontakt zu kopieren und alles zu editieren. Nur das "durchreihen" nach oben in der Anzeige fehlt noch.

Ich habe deinen Lua-Code 1:1 eingefügt und lediglich das "Beatles" durch "abfahrzeiten" (den Namen der Objektvariable) ersetzt. Aber das bringt wohl nichts wenn sich dies auf eine Modulvariable bezieht statt auf eine Objektvariable. Das "Ereignisse" hat mir Lua komplett gelöscht weil es diesen Namen nicht wohl Screenshot2024-06-07224557.thumb.jpg.71876f04b36c728b3e55ec10b8891dd0.jpgfindet.

Screenshot2024-06-07224435.thumb.jpg.03cce44ee7a26437c962fdd6db997548.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Minuten schrieb Anlagendesigner:

Also ich sehe in der EV keinen Eintrag "Ereignisse"

Starte mal bitte eine frische Anlage und schau, was dort links in der leeren EV steht.
Eventuell hieß das Modul in früheren Versionen anders?

Es ist aber auch ganz egal, wie das Modul heißt solange du nur diesen Namen beibehältst.
Das heißt: Wenn das Modul bei dir einen anderen Namen hat, kannst du meinen Code nicht 1:1 übernehmen, sondern musst den Namen natürlich anpassen.

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Anlagendesigner:

Im Prinzip müsste ja die erste Zeile gelöscht und am Ende wieder angehangen werden.

genau das tut die mittlere Zeile in meinem Beispielskript:

x = table.remove(t, 1)  -- entfernt das erste Element aus der Liste t und übergibt es an x
                        -- alle nachfolgenden Elemente rücken damit automatisch einen Platz nach oben.
table.insert(t, x)      -- hängt x ans Ende der Liste t an

--[[
den Zwischenträger x kann man sich sparen, 
indem man die eine Funktion direkt als Argument in die zweite Funktion einsetzt:
]]

table.insert(t, table.remove(t, 1))

Beachte bitte, das Listen in Lua mit 1 beginnend durchnummeriert werden und nicht ab 0, wie sonst üblich.

Bearbeitet von Goetz
Ergänzungen
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, in einer neuen Anlage steht da tatsächlich nur noch Ereignisse und nicht wie bei mir Ereignisverwaltung. Hab es angepasst und jetzt bleibt es beim speichern auch erhalten. Allerdings ist es ja noch nicht ganz korrekt, da in deinem Beispiel auf eine Modulvariable verwiesen wird.

Ich nutze ja eine Objektvariable, also müsste die ganze Zeile doch eigentlich anders lauten, oder nicht?

Müsste jetzt statt Ereignis/Ereignisverwaltung der Name des Objektes dort stehen?
Also in meinem Fall:

local t = $("Gleiskontakt Beschriftung_S-Bahn-Station (Kaserne)").variables["Abfahrzeiten"]

und fürs zurückschreiben:

$("Gleiskontakt Beschriftung_S-Bahn-Station (Kaserne)").variables["Abfahrzeiten"] = t 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Anlagendesigner:

Müsste jetzt statt Ereignis/Ereignisverwaltung der Name des Objektes dort stehen?

ja, genau.
Schreib einfach nur das $ und nutze dann die Listen, welche dir angeboten werden für die Auswahl des richtigen Objekts.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also der Code läuft Fehlerfrei druch, allerdings ergibt es noch nicht das richtige Ergebnis.

Irgendwie wird anscheinend immer die gleiche Zeile unten angehangen und nicht die oberste aus der Anzeige.

Muss ich Morgen noch mal genauer unter die Lupe nehmen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

So, habe mir mal die Funktion näher angesehen und je, es entsteht keine Fehlermeldung.

Dennoch ist ein Fehler enthalten, denn es wird zwar die erste Zeile gelöscht, die gelöschte aber nicht hinten eingefügt. Das Listenobjekt wird bei jedem Durchlauf eine Zeile kürzer.

Aktuell sieht der angepasste Lua-Code folgendermaßen aus:

local t = $("Gleiskontakt Beschriftung_S-Bahn-Station (Kaserne)").variables["Abfahrzeiten"]
table.insert(t, table.remove(t, 1))
$("Gleiskontakt Beschriftung_S-Bahn-Station (Kaserne)").variables["Abfahrzeiten"] = t

Hat es eigentlich einen besonderen Grund das t als Variable zu nutzen?
Und einmal das t in der Listen-Editierung (Zeile 2) zu verwenden und gleichzeitig in der Ausschneiden/Einfügen-Funktion (Zeile 1 und 3) gibt keine kollisionen?

Wie gesagt ist mein Lua-Wissen recht bescheiden, ich kann nur aus der Erfahrung mit anderen Programmiersprachen Rückschlüsse ziehen.

Gibt es eine Möglichkeit Lua-code Zeilenweise auszuführen oder mit Haltepunkten zu versehen um den Ablauf besser testen zu können?

Bearbeitet von Anlagendesigner
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb Anlagendesigner:

Hat es eigentlich einen besonderen Grund das t als Variable zu nutzen?

t für table

Neo benutzt diesen Namen, wenn man grafische Elemente wandelt. Ich habe einfach seine Schreibweise übernommen, damit das einheitlich ist.

vor 5 Minuten schrieb Anlagendesigner:

Und einmal das t in der Listen-Editierung (Zeile 2) zu verwenden und gleichzeitig in der Ausschneiden/Einfügen-Funktion (Zeile 1 und 3) gibt keine kollisionen?

Warum sollte es?

Es handelt sich an allen Positionen um dieselbe Tabelle. Deshalb muss es derselbe Name sein.

Das hat auch nichts speziell mit Lua zu tun. Kannst du in Python, Java etc, genauso handhaben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Hatte es missverstanden. In Zeile 2 steht das t für die zu bearbeitende Tabelle/Liste und nicht um den einzufügenden Inhalt und somit ist es natürlich richtig.

Aber das Einfügen funktioniert nicht, das kann ich reproduzieren.

Habe zwischenzeitlich mal probiert die Zeile in zwei einzelne Befehle aufzusplitten wie du weiter oben geschrieben hattes:

x = table.remove(t, 1)
table.insert(t, x)

Alternativ habe ich auch versucht einen Index anzugeben, doch dann läuft es wieder in einen Fehler.

Kann es sein, dass es Probleme mit dem Inhalt von X gibt? Das da ein einzelner Wert und keine Listenzeile mit mehreren Werten erwartet wird? In der Codedefinition steht nichts dazu, da ist lediglich von einfügen allgemein die Rede. Aber alles andere funktioniert ja.

Kann es sein, dass der Fehler auch im remove-Befehl steckt? remove löscht die Tabellenzeile und gleichzeitig übergibt er sie an "x"? Was übergibt die Funktion wenn die Werte gelöscht werden? Ist "x" nicht einfach leer und wird deshalb nicht eingefügt?

Gibt es eine Möglichkeit um den Inhalt von X vor dem Einfügen anzeigen zu lassen?

Bearbeitet von Anlagendesigner
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Stunden schrieb Anlagendesigner:

remove löscht die Tabellenzeile und gleichzeitig übergibt er sie an "x"? Was übergibt die Funktion wenn die Werte gelöscht werden?

table.remove() übergibt das, was in der Zelle stand bevor sie gelöscht wird.
Die Funktion legt den Inhalt lokal in einen Zwischenspeicher, löscht die Zelle und gibt dann den Inhalt des Zwischenspeichers aus.
Dabei ist es Lua ganz egal, welchen Typ dieser Inhalt hatte.

Aus dem, was du mir zeigst kann ich leider nicht erkennen, warum es bei dir nicht funktioniert.

Wenn du mir einen Blick auf deine Anlage gewährst, kann ich nach Ursachen wie z.B. Schreibfehlern fahnden.

Viele Grüße
Götz

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