Jump to content

gmd

Mitglieder
  • Gesamte Inhalte

    670
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von gmd

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. wow danke das ging schnell.. sobald verfuegbar springe ich drauf vielen dank gruss gmd
  10. grueneWelle.zip Kleiner movie, linksabbieger mit gruener welle Seitenhalter ist eingebaut gruss gmd
  11. wow, vielen dank, war mal wieder nicht gruendlich genug gruss gmd
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. Es ist etwas aufwand das zu isolieren.. werde es versuchen gruss Gmd
  18. Ihr hattet euch irgendwie auf das X eingenordet, deswegen der satz. gruss Gmd
  19. Ich habe leider noch ein weiteres beispiel ohne X mit dem gleichen problem. Gruss Gmd
  20. ok, waere shon gut wenn er das fixen koennte fuer die zukunft, macht viele abfragen einfacher und auch definitionen. Ich habe meine generische ampelsteuerung fertig. Nur tabellen fuer beliebige anzahl von kreuzungen. Werde einen post machen Gruss Gmd
  21. Kai, ich denke einfach mal ins unreine und habe auch nicht deine anlage angeschaut. Einfach mein ansatz, den ich verwenden wuerde. Dein aufbau sind fuer mich 5 gesicherte bloecke Umfahrblock hat vorrang und kann ausfahrblock (rechts) belegen, wenn frei (von roter lok noch nicht belegt) Wenn du unbedingt fahrstrassen verwenden willst, dann musst du sie segmentieren wie die bloecke (denke ich) und du kannst ausserdem fahrstrassen fuer die umfahrt anlegen .. du aktivierts die, die der position the loks entsprechen auf jeden fall musst du die ausfahrt der roten lok sichern. Falls die rote lok eine fahrstrasse inclusive ausfahrt verwendet, wird die umfahrt verhindert, du musst diese deaktivieren um eine umfahrstrasse zu aktivieren. Um ehrlich zu sein, ich verwende keine fahrstrassen, ich verwende nur blocksteuerung und ziele, das macht das denken einfacher, da fahrstrassen einfahrten nicht ausreichend sichern. Ausserdem ist eine lange liste von fahrstrassen nicht gut zu handeln und muehsam anzulegen. Ich weiss immer noch nicht wie ich fahstrassen mit lua anlegen kann, weil mir das von hand viel zu aufwendig ist. Ich weiss nicht ob das hilft, aber vielleicht mal ein ansatz ausserhalb der box gruss Gmd
  22. function debugMessage(msg) $("Ereignisse").variables["DebugOutput"] = msg -- Store only the last message will be displayed in the Eventlist end local modulName = "SC_1" local modul = layout:getEventsByName(modulName)[1] modul.variables["SignalLists"] = { X01 = { type = "FourWayStretched", signals = { "SC_1-X01-S_1", "SC_1-X01-S_2", "SC_1-X01-S_3", "SC_1-X01-S_4" }, contacts = { "SC_1-X01-SK_1","SC_1-X01-SK_2","SC_1-X01-SK_3","SC_1-X01-SK_4"}, stopcontacts = { "SC_1-X01-HK_1","SC_1-X01-HK_2","SC_1-X01-HK_3","SC_1-X01-HK_4"} }, X02 = { type = "FourWay", signals = { "SC_1-X02-S_1", "SC_1-X02-S_2", "SC_1-X02-S_3", "SC_1-X02-S_4" }, contacts = { "SC_1-X02-SK_1","SC_1-X02-SK_2","SC_1-X02-SK_3","SC_1-X02-SK_4"}, stopcontacts = { "SC_1-X02-HK_1","SC_1-X02-HK_2","SC_1-X02-HK_3","SC_1-X02-HK_4"} }, } for crossingName, crossingData in pairs(modul.variables["SignalLists"]) do debugMessage("Checking Crossing - SignalLists " .. tostring(crossingName)) end signalTable = { X01 = { type = "FourWayStretched", signals = { "SC_1-X01-S_1", "SC_1-X01-S_2", "SC_1-X01-S_3", "SC_1-X01-S_4" }, contacts = { "SC_1-X01-SK_1","SC_1-X01-SK_2","SC_1-X01-SK_3","SC_1-X01-SK_4"}, stopcontacts = { "SC_1-X01-HK_1","SC_1-X01-HK_2","SC_1-X01-HK_3","SC_1-X01-HK_4"} }, X02 = { type = "FourWay", signals = { "SC_1-X02-S_1", "SC_1-X02-S_2", "SC_1-X02-S_3", "SC_1-X02-S_4" }, contacts = { "SC_1-X02-SK_1","SC_1-X02-SK_2","SC_1-X02-SK_3","SC_1-X02-SK_4"}, stopcontacts = { "SC_1-X02-HK_1","SC_1-X02-HK_2","SC_1-X02-HK_3","SC_1-X02-HK_4"} }, } for crossingName, crossingData in pairs(signalTable) do debugMessage("Checking Crossing - SignalTable " .. tostring(crossingName)) end modul.variables["SignalTable"] = signalTable for crossingName, crossingData in pairs(modul.variables["SignalTable"]) do debugMessage("Checking Crossing - Stored in variables SignalTable " .. tostring(crossingName)) end erzeugt [8:16:51 AM] Modul-Variable wird gesetzt -> SC_1, "SignalLists", {2 Elemente} [8:16:51 AM] Modul-Variable wird gesetzt -> Ereignisse, "DebugOutput", "Checking Crossing - SignalLists 2" [8:16:51 AM] Modul-Variable wird gesetzt -> Ereignisse, "DebugOutput", "Checking Crossing - SignalLists 1" [8:16:51 AM] Modul-Variable wird gesetzt -> Ereignisse, "DebugOutput", "Checking Crossing - SignalTable X01" [8:16:51 AM] Modul-Variable wird gesetzt -> Ereignisse, "DebugOutput", "Checking Crossing - SignalTable X02" [8:16:51 AM] Modul-Variable wird gesetzt -> SC_1, "SignalTable", {2 Elemente} [8:16:51 AM] Modul-Variable wird gesetzt -> Ereignisse, "DebugOutput", "Checking Crossing - Stored in variables SignalTable 2" [8:16:51 AM] Modul-Variable wird gesetzt -> Ereignisse, "DebugOutput", "Checking Crossing - Stored in variables SignalTable 1" hier das beispiel in deiner test anlage 09788E1E-A2F1-4E62-B044-6ECF44105AF6 gruss Gmd
  23. Danke fuer die Muehe. Da sind noch ein paar unterschiede .. Ich werde mal versuchen den teil zu isolieren fuer besseren test. Gruss Gmd
  24. Hallo, noch ein problem mit Lua Ich definiere: local signalLists = { ["X01"] = { ... }, ["X02"] = { ... } } modul.variables["SignalLists"] = signalLists wenn ich zuruecklese bekomme ich modul.variables["SignalLists"] { [1] = { ... data of X01 ... }, [2] = { ... data of X02 ... } } Intern wird wohl serialised und non numeric keys gehen verloren .. ["X01"] = {} OK in plain Lua und lokalen variablen , nicht erhalten in modul.variables { name = "X01", ... } ich muss dies tun um den namen zu behalten Mehrfach getestet gruss Gmd
  25. Danke nochmals, habe verstanden, ich verwende die "Strukturansicht" nicht sehr oft, das ist wohl mein problem hier. Gruss Gmd
×
×
  • Neu erstellen...