Alle erstellten Inhalte von gmd
-
MBS Companion V2
Atrus, beachte bitte folgendes: Direct hinter dem ausgang des depot's ist ein weiss/schwarzer kontakt der das fahrzeug direkt wieder zurueck in das depot schickt. Das ist zum test, da das routen modul noch nicht angeschlossen ist. Man kann die verschiednen modi ausprobieren .. the event is unter VO_1 Gleiskontakt wird ausgeloest. Gruss Gmd
-
MBS Companion V2
Hallo Atrus, Kein problem .. BDBF09FC-82AD-4535-B4D6-6EF60584E054 entwurf der demo mit dem code fuer das depot release, signal und signal crossing.. depot release ist etwas knapper dokumentiert als die anderen beiden module .. Ereignismodul ist "Vehicle Origin" Naechstes modul ist routing .. uebernimmt ein fahrzeug vom depot und fuehrt es zum zugeordneten ziel .. gruss Gmd Noch ein tip: wenn ihr den code an ChatGPT verfuettert, am besten nur jeweils ein modul, dann koennt ihr das auch in deutsch uebersetzen lassen oder erweiterungen machen, falls gewuenscht. In meiner derzeitigen arbeit verwende ich 3 AI's, Juny und Sonnet von Jetbrains, und ChatGPT. ChatGPT liefert gute ergebisse mit LUA ihr muesst nur aufpassen, denn MBS hat keine standard LUA implementierung, sondern weicht ab. In der source gibt es dazu eine beschreibung, die ihr auch dem AI fuettern koennt, dann kann er das beruecksichtigen. Und fuer die skeptiker: In den letzen 4 monaten habe ich eine sehr umfangreiche "full stack", client server anwendung implementiert, wen es interessiert: NextJs, React mit Tailwing und Daisy, auf MySQL. Derzeit roughly 80K lines of code, no chance without an AI ..
-
MBS Companion V2
Hallo, habe mal wieder einen schritt weiter gemacht .. bugs aus der amplesteuerung enfernt und die crossing funktionen mit ampel fertiggestellt. Dieses modul betreibt beliebige fahrzeuge and einer ampelkreuzung inclusive linksabbieger und blinker der fahrzeuge. Warten auf fussgaenger ist noch noch nicht enthalten. Das naechste modul is das depot .. hier werden fahrzeuge nach verschiedenen kriterien nach verschieden ausgesuchten zielen gestartet. Die fahrzeuge haben ziele und koenen am ende in andere depots transportiert werden .. damit regele ich die virtuelle verbindung zwischen anlagen auf verschiedenen rechnern. Die ausfahrenden fahrzeuge werden an ein streckenmodul uebergeben dass die zielsetzung mit den MBS restriktionen uebernimmt und dafuer sorgt dass die fahrzeuge in die richtige richtung fahren. Kreuzungsmodule arbeiten unabhaengig und die fahrzeuge verhalten sich an kreuzungen gemaess den bedingungen des jeweiligen moduls behalten aber ihr ziel. Ich habe noch ein paar weitere module zu erstellen bevor ich die meisten situationen abgedeckt habe. Parkplatzverwaltung Buskontenpunkt Einfacher busbetrieb und noch etliche speziellere module, die ich auch fuer fuessgaenger und radfahrer verwende. Die tasten im bild sind zum test .. die verschiedenen modi koenen auch per script gesetzt werden und natuerlich auch von meinem programm. Jedes der depots hat eine eigene definitionstabelle mit spezifischen zielen und rueckkehrkontakten. Die scripte sind allerdings generisch, wie alle anderen. Das ganze ist dann ein netzwerk von eigenstaendigen modulen mit spezifischen eigenschaften, die die jeweiligen fahrzeuge kontrollieren gemaess den definierten bedingungen. Spaeter werd ich dann auch animationen integrieren. Zunaechst mal nur die grundfunktionen, damit ich einen autonomen betrieb erreiche . Hier noch ein bildchen der anlage, die ich derzeit als pilot projekt zusammenstelle. Ist noch nicht ganz fertig .. Sie hate viele schnitstellen, portale und depots unter den bergen .. zu einem linken und rechten teil, der jeweils auf einem anderen rechner laeuft.. Gruss gmd
-
virtuelle pc connection ..
Hallo alle, habe lange nicht mehr gepostet, was aber nicht bedeutet dass ich nicht an meiner idee weitergearbeitet habe. Ich habe diesen post unter feature request, ist aber mehr eine frage an Neo als ein request. Ich habe drei straenge in meiner entwicklung ... meine c# app fuer die externe verwaltung und steuerung .. die Lua standard componenten fuer die steuerung von complexen scenarien und den aufbau von groesseren modulen. Diese sind nicht "komplette" anlagen, d.h. kreise sind nicht geschlossen jedenfalls nicht im herkoemmlichen sinne, sondern starten und enden in portalen und depots .. diese module sollen dann ueber tcp/ip verbunden werden, d.h. ueber die externe schnittstelle und das steuerprogramm. Soweit zum thema. Nun die frage: Ist geplant oder daran gedacht die virtuelle verbindung ueber portale ueber pc grenzen hinweg zu ermoeglichen, d.h. wenn auf einem pc ein fahrzeug in ein protal einfaehrt, dass das gleiche fahrzeug auf einer anlage auf einem anderen pc aus einem portal herausfaehrt. Das kann local (LAN) oder auch ueber remote verbindung geschehen. auf der zweiten anglage koennte/muesste das gleiche fahrzeug existieren. Falls an eine solche loesung gedacht wird brauche ich da nicht weiter zu implementieren. Mein programm kann auf mehr als einem rechner laufen und kommunizieren, also fuer mich ist das kein riesen problem, aber falls das MBS so etwas "nativ" macht brauche ich da keine gedanken verschwenden. Natuerlich lassen sich viele weiter scenarien denken, wenn erst mal so eine moeglichkeit besteht. Ein solches konzept ist erforderlich, wenn man groessere anlagenstrukturen mit vernuenftigen bildraten implementieren will und ein einziger PC selbst mit high end gpu nicht reicht, insbesondere mit hi-res displays (5K+). Gruesse aus Australien Gmd
-
Script Library Support
Nur weil du dir das nicht vorstellen kannst, solltest du mich nicht als spinner bezeichnen. Denke mal ein bischen nach .. hier etwas hilfe Logische Abstraktion und Generalisierung bezeichnet den Prozess, Funktionalität oder Verhalten auf eine generalisierte, kontextunabhängige Weise zu spezifizieren – ohne Bezug auf einzelne Instanzen oder konkrete Vorkommnisse. Im Mittelpunkt steht die Definition von Prinzipien, Regeln oder Beziehungen, die breit anwendbar sind. Dies ermöglicht Wiederverwendbarkeit und flexibles Denken in unterschiedlichen Situationen. Dieser Ansatz fördert Modularität, Skalierbarkeit und ein klareres konzeptionelles Verständnis, indem beschrieben wird, was geschehen soll – nicht wie oder wo es im Einzelnen geschieht. Schau dir meine ampelsteuerung and, vielleicht bekommst du ein paar ideen. Gruss Gmd
-
Script Library Support
Das wuerde ich anders loesen. Ueber schlagworte, damit wird deine steuerung generisch und kann an verschiedene modelle angepasst werden, auch dynamisch. Libraries mit objektbezuegen machen fuer mich keinen sinn. Gruss Gmd
-
MBS Companion V2
Hallo, mal wieder ein update ... werde wegen neuer umstaende in zukunft etwas langsamer vorankommen. Erstens bin ich wieder in einem alten kommerziellen projekt engagiert (springe fuer einen notfall ein) und zweitens bin ich mal wieder fuer den kommenden winter (ab mitte juni) mit meinem motorrad im Norden unterwegs (etwas waermer ). Die verschiedenen module repraesentieren anwendungsbereiche, die ich gedenke zu automatisieren. Tabellendefiniert mit generischen scripten. Tabellen koennen von hand erstellt werden, bzw. ich plane diese mit meinem programm zu generieren. Derzeit ist das modul SignalCrossing (sollte eigentlich traffic light crossing heissen), laufbereit. VehicleOrigin und CrossingRoutes haben anfaenge, aber noch keine wirklich sinnvolle anwendung. Die scripte sind sehr umfangreich dokumentiert und aufgeteilt in stufen der bedeutung, generisch, generalisiert und spezifisch. Beispiel fuer generalisiert: Phasendefinitionen fuer kreuzungen sind wiederverwendbar und sind nicht spezifisch fuer bestimmte kreuzungen, sondern fuer kreuzungstypen (hier SC) Beispiel fuer spezifisch: Signaldefinitionen fuer eine bestimmte kreuzung auf der anlage gruppiert in modulen, hier z.b. SC_1 Generisch: Generell verwendet in the ampelsteuerung Die rot/blauen kontakte sind nicht teil der ampelsteuerung, diese werden verwendet fuer den kreuzungsverkehr, auch ungesichert. Ist teilweise implementiert. Fussgaengerampeln, linksabbieger mit blinklicht ist teil der definition. Doppelspur mit separater linksabbiegerampel ist noch nicht teil der loesung, sowie andere spezielle faelle. Die taster sind mehr oder weniger nur als test vorhanden. Kettenfunktion (gruene welle) zwischen ampeln ist auch definierbar. Eine freundschaftliche warnung : Die scripte sind nicht geeignet fuer Lua anfaenger fals jemand sich fuer die implementierung selbst interessiert. Fuer die verwendung muss man diese aber nicht verstehen, es bedarf nur der sorgsamen definition der tabellen. Man kann variablen setzen in "Ereignisse" modul um debug ausgaben zu aktivieren. Ich habe nicht getestet die scripte zu kopieren in eine neue anlage. Ein timer mit 2s ist erforderlich fuer die ampelschaltung. In der demo ist alles enthalten, was man braucht um die scripte zu verwenden. Allerdings: Alle kommentare in English. hier die entwurfsanalage CA450BCA-57D8-4960-B0CA-4FA356B4C269 Falls jemand fragen hat, bitte nicht sofortige antwort erwarten. Gruss Gmd
-
Script Library Support
Hallo Neo, wahrscheinlich wirst du wieder sagen dass dies nicht fuer die allgemeinheit nuetzlich ist, aber ich poste es dennoch. Meine scripte wachsen, alles generisch und modularisiert. Ich kann natuerlich beliebig viele module mit je einem globalen script definieren um meine scripte besser zu strukturieren, aber das macht dann bei der wiederverwendung aufwand. Ich faende ein "include" statement wie in anderen sprachen sehr nuetzlich, womit ich abgeschlossene geteste scripten einbinden kann ohne dass das ganze unuebersichtlich wird. Eine alternative waere, wenn du mehr als ein globales script pro modul zulassen koenntest. Das ist zwar nicht das gleiche aber ein kompromis. Vielleicht noch nicht dieses jahr relevant, aber wen mehr und mehr benutzer lua verwenden und nicht nur die EV koennte das auch andere betreffen. Hier ein typisches beispiel: Es sind hilfsfunktionen fuer den zugriff auf eine datenstruktur, die ampelinstallationen an kreuzungen beschreibt. -- ################################################################################################## -- 📄 PhaseAccess.lua -- 🔵 Purpose: -- This module defines helper functions to access and manipulate the signal phase data structures. -- -- 🔵 Why: -- 1. Encapsulates the structure of phase definitions (offPhase, blinkPhase, phases, steps, triggers). -- 2. Allows changes to the internal data layout later without rewriting all core logic. -- 3. Centralizes repetitive lookup patterns (finding phase groups, steps, triggers). -- 4. Makes higher-level functions like AdvancePhase shorter, cleaner, and easier to maintain. -- -- 🔵 When to use: -- - Whenever signal states, phase groups, step triggers, green times, or emissions must be accessed. -- - Whenever crossing timing or switching behavior must depend on the phase definition. -- -- 🔵 Advantages: -- - Reduces repeated code in phase handling logic. -- - Isolates possible data format changes into one place. -- - Improves code readability and debuggability. -- -- ################################################################################################## -- 🔵 Find full phase data for a given crossing type -- Used whenever a crossing needs to load its signalPhases by type function GetPhaseDataForType(signalPhases, crossingType) for i = 1, #signalPhases do if signalPhases[i].type == crossingType then return signalPhases[i] end end return nil end -- 🔵 Return offPhase array ("lights off" state) from a phase definition -- Used when initializing crossing or setting all signals off function GetOffPhaseFromPhaseData(phaseData) return phaseData and phaseData.offPhase or nil end -- 🔵 Return blinkPhase array ("blinking" state) from a phase definition -- Used for crossings set to flashing yellow or emergency blinking function GetBlinkPhaseFromPhaseData(phaseData) return phaseData and phaseData.blinkPhase or nil end -- 🔵 Get the list of phase groups ("main", "leftTurn_2", "leftTurn_4", etc.) -- Needed whenever you want to find specific signal behavior groups function GetPhaseGroupsFromPhaseData(phaseData) return phaseData and phaseData.phases or nil end -- 🔵 Find a single phase group by its name -- Used to access steps for "main" or special leftTurn phases function FindPhaseGroupByName(phaseGroups, groupName) if not phaseGroups then return nil end for i = 1, #phaseGroups do if phaseGroups[i].name == groupName then return phaseGroups[i] end end return nil end -- 🔵 Get the list of steps from a phase group -- Needed whenever advancing or processing signal switching function GetStepsFromPhaseGroup(phaseGroup) return phaseGroup and phaseGroup.steps or nil end -- 🔵 Return the triggers table if defined -- Needed when checking if a special trigger (left turn, etc.) is active function GetTriggersFromPhaseData(phaseData) return phaseData and phaseData.triggers or nil end -- 🔵 Return the timing table if defined -- Needed when adjusting timing between signal phases function GetTimingFromPhaseData(phaseData) return phaseData and phaseData.timing or nil end -- 🔵 Return the greenTimeMultiplier table inside timing -- Needed for setting dynamic green times depending on phase group function GetGreenTimeMultiplierFromTiming(timing) return timing and timing.greenTimeMultiplier or nil end -- 🔵 Return the specific green multiplier array for a group ("main", "leftTurn_2", etc.) -- Needed to adjust how long each signal group stays green function GetGreenMultiplierForGroup(greenMultipliers, groupName) return greenMultipliers and greenMultipliers[groupName] or nil end -- 🔵 Return the next signal state array for a group at a given step -- Used to update multiple signals in one logical step function GetNextStateForSignalGroup(phaseGroup, stepIndex) local steps = GetStepsFromPhaseGroup(phaseGroup) return steps and steps[stepIndex] or nil end -- 🔵 Return the next single signal state at a step (e.g., for S1, S2, etc.) -- Used if only a single signal needs to be checked or updated function GetNextStateForSignal(phaseGroup, stepIndex, signalIndex) local step = GetNextStateForSignalGroup(phaseGroup, stepIndex) return step and step[signalIndex] or nil end -- 🔵 Check if a trigger is defined for a specific step -- Used to see if phase switching should wait for external events function IsTriggerDefinedForPhase(triggers, stepIndex) if not triggers then return false end local entry = triggers[stepIndex] return entry and (entry.trigger ~= nil) end -- 🔵 Check if a phase group auto-advances (no waiting) -- Used to decide if the crossing should immediately continue to next step function IsGroupAutoAdvance(phaseGroup) return phaseGroup and phaseGroup.autoAdvance == true end -- 🔵 Return the target phase name triggered at a given step -- Used to switch into left turn phases, etc. function GetTriggerPhaseName(triggers, stepIndex) if not triggers then return nil end local entry = triggers[stepIndex] return entry and entry.trigger and entry.trigger.phase or nil end -- 🔵 Return the emitted phase name when step emits a change -- Used when leaving special triggered phases (back to "main" etc.) function GetEmitName(triggers, stepIndex) if not triggers then return nil end local entry = triggers[stepIndex] return entry and entry.emit or nil end -- 🔵 Advance the phase index safely (wrap around if overflow) -- Used at the start of every AdvancePhase to move to the next step function AdvancePhaseIndex(crossing, steps) crossing.phaseIndex = (crossing.phaseIndex or 0) + 1 if not steps[crossing.phaseIndex] then crossing.phaseIndex = 1 end end -- 🔵 Create a readable string of current step signal states -- Used mainly for debug outputs ("3, 1, 3, 1") function DumpSignalState(step) local text = "" for i = 1, #step do if i > 1 then text = text .. ", " end text = text .. tostring(step[i] or "nil") end return text end Und viele andere gruppen von generischen fuktionen Gruss Gmd
-
Zeilennummern bei fehlern sind nicht sehr nuetzlich
Ja der syntxfehler war leicht zu beheben wie du sagst, hatte das nur gepostet als beispiel.. Die mehrzahl meiner fehler waehrend der entwicklung sind nils irgendwo und da bekomme ich ja meist keine zeilennummer. Und wie du bestaetigst, die zusammenfuehrung der globalen scripte ist die ursache fuer die "schraegen" zeilennummern. Werden die scripte immer in der gleichen reihenfolge zusammengefuegt ? Gruss Gmd
-
Junction issue
Hi Pete, You didn't get an answer yet, and to be honest, I do not quite understand what you are actually asking ? The picture does not help me either. Maybe you can elaborate a bit and you may get some answers. Regards gmd
-
Zeilennummern bei fehlern sind nicht sehr nuetzlich
Neo, Hier ein beispiel Anlage als entwurf 5CE7EEC1-B2C1-4D6B-A261-B660D70133CB Und hier die navigationshilfe Das event script Die FehlerMeldung Das ist das erste mal in einem event script, sonst hatte ich das nur in globalen scripten Gruss gmd
-
Gleiskontakt richtung abfragen
die ereignisee sind mir bekannt, dennoch wie kann ich die position abfragen oder geht das nicht ? und bitte nicht wieder die diskussion dass das ereignis das ja bereits enthaelt Gruss Gmd
-
Gleiskontakt richtung abfragen
Hallo, in the ereignisprotokollierung bekomme ich duplikate direkt hintereinander Ich nehmen an betreten und verlassen aber warum beide male -1 [7:32:08 PM] Gleiskontakt wird ausgelöst -> CR_1-TK_4, Caddy, -1 [7:32:09 PM] Gleiskontakt wird ausgelöst -> CR_1-TK_4, Caddy, -1 und wichtiger -- Wie kann ich in Lua abfragen ob der kontakt betreten oder verlassen wurde, oder auch natuerlich fahrzeugmitte ? gruss Gmd
-
Gibt es einen "Animation gestartet" event ?
Hallo, danke fuer die posts. Hatte aber gerade einen lichtblick, zugegebenermassen werden diese weniger Ich kann ja die animation per schnittstelle starten, da reicht ein miniprogramm und ich verwende einfach nicht den play und pause button. Damit kann ich ja einen benutzerevent starten, der alles tut was ich brauche. Gruss gmd
-
Gibt es einen "Animation gestartet" event ?
Wolfgang, danke fuer den post. Fuer den erststart ist das ok (gute idee), allerdings ja nicht wenn die anlage pausiert war. Naja, man kann ja auf dem standpunkt stehen, dass pausieren ja nichts veraendern sollte, das ist aber nicht so. Mir geht es hauptsaechlich auch um das testen von initialisierungs scripten, die testen ob komponenten fehlen etc. Die sollen nach jedem start oder nach pause ablaufen. Derzeit loesche ich ein flag der sagt, dass die initialisierung erfolgt ist. Aber jedesmal wenn ich aenderungen mache (nicht am script) moechte ich checks ablaufen lassen, deshalb die frage nach einem event bei "Start Animation". Gruss Gmd
-
Ampel mit linksabbiegerpfeil
wow danke das ging schnell.. sobald verfuegbar springe ich drauf vielen dank gruss gmd
-
Ampel mit linksabbiegerpfeil
grueneWelle.zip Kleiner movie, linksabbieger mit gruener welle Seitenhalter ist eingebaut gruss gmd
-
Ampel mit linksabbiegerpfeil
wow, vielen dank, war mal wieder nicht gruendlich genug gruss gmd
-
Ampel mit linksabbiegerpfeil
Hallo, ich verwende ampel und einzelnen pfeil. Gibt es eine loesung bei der die kleine ampel einrastet ? Ich habe keine gefunden, vielleicht nimmt das jemand als anregung. Gruss Gmd
-
Gibt es einen "Animation gestartet" event ?
oder einen der dafuer verwendet werden kann. Also einen trigger bevor irgendetwas anderes auf der anlage passiert. Ich weiss dass ich einen taster oder irgendein manuelles ereignis verwenden kann und alle module aktiviere/deaktiviere. Ich haette aber gerne einen "automatischen trigger" den ich dann nach belieben einbinden kann, der auch nach wiederstart der anlage nach pausierter animation greift. Gruss gmd
-
Zeilennummern bei fehlern sind nicht sehr nuetzlich
Muss erst wieder einen geignet fehler produzieren. Bei einfachen nil fehlern wird keine zeilennummer ausgegeben. Es passiert nur in globalen scripten, also modul scripten die nicht in event scripts liegen. Fehler direct in event scripts haben die korrete zeilennnummer. Werde ein beispiel schicken sobald ich ein vernuenftiges erzeugt habe. Gruss gmd
-
MBS Companion V2
Hallo, mal wieder ein update. Habe mein erstes "road modul" fertig.. Eine generische ampelsteuerung fuer beliebige anzahl von ampeln ind definierbaren konfigurationen. Viele features, inclusive gruene welle. Beinhaltet noch keine fussgaegerampel. Das kommt spaeter wenn ich die grundlagen fertig habe. Bisher erkunde ich moeglichkeiten und die integration mit meinem tool. In diesem fall gibt es eine reihe von hilfsfunktionen, die auch plugins sein koennen um die definition der tabellen zu uebernehmen. Das pdf mit allen scripten ist zu gross, kann es nicht attachen, also habe ich die beschreibung ohne scripte geladen. Falls jemand die demo und scripte moechte bitte PM. gruss Gmd SC_Dokumentation_noscript.pdf
-
tabelle mit non numerical key
Das beispiel ist etwas anders gelagert local modul = layout:getEventsByName("SC_1")[1] -- Original structured table local testState = { shortPhase = { "Vo1" }, longPhase = { "Vo2" }, currentMode = "countDown" } -- Store in module variable modul.variables["BrokenState"] = testState -- Also store in global variable _G.goodState = testState -- Later access (simulate after a timer or defer callback) local broken = modul.variables["BrokenState"] local good = _G.goodState -- Display both print("From modul.variables:") for k, v in pairs(broken) do print(" " .. tostring(k), v) end print("From _G:") for k, v in pairs(good) do print(" " .. tostring(k), v) end Ich habe das auf ein minimum reduziert. Pack das in einen event wo der print funktioniert. Gruss Gmd
-
tabelle mit non numerical key
Es ist etwas aufwand das zu isolieren.. werde es versuchen gruss Gmd
-
tabelle mit non numerical key
Ihr hattet euch irgendwie auf das X eingenordet, deswegen der satz. gruss Gmd