Bekommst Du nicht Fehlermeldungen, weil Du die dofile-Anweisungen durch require ersetzt hast? Und das Format der Pfadangaben kann ja so auch nicht stimmen.
Möchte jemand meine Anlagensteuerung zu verwenden?
!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
-
-
Hallo Paul,
Bekommst Du nicht Fehlermeldungen,
ich bekomme keine Fehlermeldungen, alle Skriptmodule von Norbert funktionieren bei mir.
Ich habe ja alle Skriptmodule von Norbert in einen Unterordner im Ordner LUA drin.
Mache ich aber immer so, für jede Anlage gibt es einen Ordner im LUA-Ordner, damit kann ich die Anlage überall abspeichern. Und den LUA-Ordner nehme ich von EEP-Version nach höherer EEP-Version mit.
-
Ich habe ja alle Skriptmodule von Norbert in einen Unterordner im Ordner LUA drin.
Mache ich aber immer so, für jede Anlage gibt es einen Ordner im LUA-Ordner, damit kann ich die Anlage überall abspeichern. Und den LUA-Ordner nehme ich von EEP-Version nach höherer EEP-Version mit.
Gute organisation. Ich will das auch so machen damit nichts verloren geht. Danke Tufftuff
-
Ich verstehe nur nicht, dass Du dofile durch require ersetzt, und es funktioniert...ich bekomme da nur Fehlermeldungen...
-
Hallo Paul,
dass Du dofile durch require ersetzt, und es funktioniert
ich habe nicht einfach ausgetauscht, das habe ich aber in meinen Beiträgen auch erwähnt, wie ich es mache.
Dann habe ich die Demo_Main.lua abgeändert.
LUA Source Code- -- *********
- --
- -- Steuerung der Anlage Demo_Steuerung
- -- Version 1.01.
- --
- -- Autor Dr. Norbert Aust, Schopfheim
- --
- -- *********
- require("PrintToFile_BH2") --Die Ausdrucke im Ereignisfenster werden in einer Textdatai mitgeschrieben. Kann deaktiviert werden.
- I = 0
- clearlog() --Ereignisfenster leeren.
- print ("Anlage Demo 1.02")
- -- **********
- --
- -- die Zeitausgabe von EEP gefällt mir nicht. Es fehlt die führende Null.
- -- und um die "Mitternachtsproblematik" auszuschalten, funktioniert der Timer auf "Spielzeit"
- --
- -- **********
- function MyTime ()
- locH = string.format ('%02i',EEPTimeH)
- locM = string.format ('%02i',EEPTimeM)
- locS = string.format ('%02i',EEPTimeS)
- cZeit = locH..":"..locM..":"..locS
- return cZeit
- end
- function Spielzeit ()
- loiIsTime = EEPTime - gliStartzeit
- if EEPTime < gliStartzeit then loiIsTime = loiIsTime + 24 * 3600 end -- Zeit über Mitternacht hinaus weiterzählen
- return loiIsTime
- end
- gliStartzeit = EEPTime
- -- **********
- --
- -- Laden der externen Programmteile
- --
- -- **********
- --glcPfad = "D:/EEP 16/Resourcen/Anlagen/Demo_Steuerung/" -- <<--Hier den Pfad zum Demo-Ordner eintragen !!!entfällt!!!
- --require("\\Demo_Steuerung_BMWFan\\Demo_Main") --In das Lua-Skript schreiben
- require("BetterContacts_BH2")
- require("\\Demo_Steuerung_BMWFan\\Demo_DKWs")
- require("\\Demo_Steuerung_BMWFan\\Demo_Fahrplan")
- require("\\Demo_Steuerung_BMWFan\\Demo_Bremser")
- require("\\Demo_Steuerung_BMWFan\\Demo_FDL")
- require("\\Demo_Steuerung_BMWFan\\Demo_Zuege")
- require("\\Demo_Steuerung_BMWFan\\Demo_Lokfuehrer")
- require("\\Demo_Steuerung_BMWFan\\Demo_Stellwerk")
- require("\\Demo_Steuerung_BMWFan\\Demo_Fahrbefehle")
- require("\\Demo_Steuerung_BMWFan\\Demo_Fahrstrassen")
- require("\\Demo_Steuerung_BMWFan\\Demo_Signale")
- require("\\Demo_Steuerung_BMWFan\\Demo_SaveStatus")
- require("\\Demo_Steuerung_BMWFan\\ID_WeichenSignale") -- Modul von Tufftuff
- -- **********
- --
- -- Laden der Anlagendaten und Funktionen
- --
- -- **********
- loiIsOkay = GetMySignals()
- loiIsOkay = GetMyPaths()
- loiIsOkay = GetMyBefehle()
- loiIsOkay = GetMyZuege()
- loiIsOkay = GetMyDKWs()
- -- **********
- --
- -- Händich vorzunehmende Einstellungen zum Programm
- --
- -- **********
- gliStatus = 0 -- 1: früherer Status wird übernommen, verfügbar erst ab EEP 16 Plugin 1, nur im Fahrplanbetrieb wirksam
- -- 0: Definierter Ausgangszustand: Fahrstraßen aufgelöst, Signale Halt, Bahnsteigsignale Fahrt, Datenspeicher gelöscht.
- gliUpdate = 1 -- 1: Updates des Status werden aufgezeichnet, 0: nicht, nur im Fahrplanbetrieb wirksam
- gliIsMonitor = 1 -- 1: Meldungen über Schaltvorgänge, etc. 0: Nicht.
- gliBetriebsart = 3 -- 0: keine Zugfahrten,
- -- 1: nur ein Zug (definieren in FDL), weiter unten in glcEinzelzug und glcEinzelbefehl spezifizieren.
- -- 2: Derzeit keine gescheite Funktionm
- -- 3: Fahrplansteuerung
- glrTAnfang = 10 -- Wartezeit in Sekunden bis FDL den ersten Zug ablaesst (bei gliBetriebsart = 1 oder 2)
- glrNextTime = EEPTime + glrTAnfang -- nächster Zeitpunkt für Abfahrt eines Zuges aus Depot
- glrDTime = 90 -- Zeit zwischen den Zügen bei Betriebsart 2
- glcFahrplan = "1H_Betrieb" -- Anzuwendender Fahrplan
- glcEinzelzug = IndZug_212_02 -- händisch editieren: IndZug_(+Zugname); Beispiel: "IndZug_23_01" für Zug "23_01" (jeweils ohne ")
- glcEinzelbefehl = Befehl_WH_H05_SH -- händisch editieren: Befehl_(+Name des Fahrbefehls); Beispiel "Befehl_SH_H04_WH" für Befehl "SH_H04_WH" (jeweils ohne ")
- -- **********
- --
- -- Weitere Daten einlesen
- --
- -- **********
- loiIsOkay = GetMyFahrplan()
- loiIsOkay = SetTimes()
- -- **********
- --
- -- Initialisierung diverser Variabler und Physikalische Daten
- --
- -- **********
- glrAStark = 1.5 -- Bremsverzögerung in m/s^2 für extrem starke Bremsung
- glrARegel = 0.75 -- dito für Regelbremsung
- glrASchwach = 0.3 -- dito für leichte Bremsung
- gliFACount = 0 -- zählt, wie viele Züge sich in geschalteten Fahrstraßen befinden, s. Lokfuehrer
- glTimeList = {} -- Tabelle zur Zeitsteuerung von Befehlen
- Tacho = {} -- Messung der Zuglänge über Geschwindigkeit und Zeit
- math.randomseed(os.time())
- Anfahren = {}
- glrGPZ = 0.8 -- Masse in Tonnen pro Meter Zuglänge für Personenzüge, Näheres siehe "Bremser"
- glrGGZ = 1.8 -- Masse in Tonnen pro Meter Zuglänge für Güterzüge
- glrMue = 0.2 -- Reibbeiwert Rad/Schiene
- glrWGZ = 0.003 -- Grund-Widerstandszahl für Güterzüge kN/kN
- glrWDGZ = 0.006 -- Dynamische Widerstandszahl Güterzüge
- glrWPZ = 0.002 -- Grund-Widerstandszahl für Personenzüge kN/kN
- glrWDPZ = 0.002 -- dynamische Widerstadszahl Personenzüge
- glrTRamp = 10 -- Rampenzeit bis zur vollen Beschleunigung in Sekunden
- glrVLim = 60 -- bis zu dieser Geschwindigkeit [km/h] steuert dieses Programm die Anfahrt
- -- **********
- --
- -- Zur Kontrolle durch den Nutzer
- --
- -- **********
- if gliIsMonitor == 1 then
- print (MyTime()," -- Startzeit")
- end
- print ("---")
- if gliBetriebsart == 0 then print ("KEIN ZUGVERKEHR") end
- if gliBetriebsart == 1 then
- print ("EINZELZUGBETRIEB, Start nach ",glrTAnfang," Sekunden.")
- print (" Zug ", MyZug[glcEinzelzug].Name)
- print (" Fahrbefehl ", MyBefehl[glcEinzelbefehl].Name)
- end
- if gliBetriebsart == 2 then print ("ZUFALLSSTEUERUNG") end
- if gliBetriebsart == 3 then
- print ("FAHRPLANVERKEHR")
- if gliStatus == 1 then
- print (" -- Status aus früherem Lauf wird übernommen:")
- else
- print (" -- Status aus früherem Lauf wird NICHT übernommen.")
- end
- if gliUpdate == 1 then
- print (" -- Statusänderungen werden aufgezeichnet")
- else
- print (" -- KEINE Aufzeichnung der Statusänderungen")
- end
- end
- if gliBetriebsart ~= 0 then
- print ("---")
- print ("--> Weiter mit 'P'")
- print ("---")
- loiIsOkay = EEPPause (2)
- end
- loiIsOkay = GetStatus ()
- function EEPMain()
- -- **********
- --
- -- Funktionen aufrufen
- --
- -- **********
- ID_WeichenSignale.Abfrage() -- zeitliche Abfrage der Signal- und Weichen-Stellungen
- loiIsOkay = FDL () -- Steuern der Zugfolge
- loiIsOkay = ZugBremse () -- Kontrollierte Zugbremse
- loiIsOkay = TimeLine () -- Timer
- loiIsOkay = SetPath() -- Einstellen von Fahrstraßen
- loiIsOkay = Gauge () -- Längenmessung
- if #Anfahren ~= nil then Start() end -- Anfahren von Zügen aus dem Stillstand
- return 1
- end
Und im EEP-Skript-Editor steht dann nur noch.
Die Anlagen-Dateien können dann überall abgelegt sein.
Ich hoffe, es war jetzt verständlich.
-
Nach Löschen der Zeilen 62 und 190 hat alles funktioniert. Vielen Dank.
-
Danke für deine tolle Beschreibung, aber das meine ich nicht. Mit dem Pfad habe ich kein Problem.Ich lege meine LUA-Scripte immer zur Anlagendatei, und so sieht das Script aus:
Code- ----------------------------------------------------------------------------------------------
- -- Pfad der .anl- Datei aus Dateiexplorer kopieren und hier einfügen
- ----------------------------------------------------------------------------------------------
- a = [[D:\00 Programmdaten\20 EEP\16 EEP16\Anlagen\Abstellbahnhof_04]] , [[\]] -- aus Dateiexplorer kopieren und hier einfügen
- myAnlPath = string.gsub(a, [[\]], "/") -- Backslash durch Slash ersetzen
- print(myAnlPath)
- dofile (myAnlPath.."/".."Funktionen.lua")
- --dofile (myAnlPath.."/".."FunktionenTest.lua")
- dofile (myAnlPath.."/".."Bahnhof.lua")
- dofile (myAnlPath.."/".."Blockstrecken.lua")
- dofile (myAnlPath.."/".."main.lua")
Wenn ich aber, wie in Deinem Beispiel-Code für die Demo_steuerung die Anweisungen dofile durch require ersetze, gibts den Fehler:
Code- require("BetterContacts_BH2")
- require (glcPfad.."Demo_DKWs.lua")
- dofile (glcPfad.."Demo_Fahrplan.lua")
- dofile (glcPfad.."Demo_Bremser.lua")
- dofile (glcPfad.."Demo_FDL.lua")
- dofile (glcPfad.."Demo_Zuege.lua")
- dofile (glcPfad.."Demo_Lokfuehrer.lua")
- dofile (glcPfad.."Demo_Stellwerk.lua")
- dofile (glcPfad.."Demo_Fahrbefehle.lua")
- dofile (glcPfad.."Demo_Fahrstrassen.lua")
- dofile (glcPfad.."Demo_Signale.lua")
- dofile (glcPfad.."Demo_SaveStatus.lua")
Wenn ich dofile verwende, funktionierts!
Warscheinlich übersehe ich da was, aber ich komm nicht drauf...ich täts nur gern verstehen..
-
Ich denke, du musst das ".lua" am Ende weglassen, wenn du require verwendest.
Zur Erklärung: dofile erwartet einen Dateinamen (bzw. Dateipfad), während require einen Modulnamen erwartet.
Lua geht dann eine Liste von "Vorlagen" für mögliche Dateipfaden und -namen durch, setzt darin den Modulnamen ein, und schaut nach, ob es diese Datei gibt. Wenn es für keine dieser Vorlagen eine passende Datei findet, kommt die gezeigte Fehlermeldung. Darunter (in deinem Screenshot abgeschnitten) listet Lua nochmal genau auf, an welchen Stellen es gesucht hat.
Die Dateiendung .lua ist dabei schon in den Vorlagen enthalten. Wenn du es nochmal in den Modulnamen reinschreibst, sucht Lua nach einer Datei namens xyz.lua.lua (das sollte auch in der Fehlermeldung stehen), und die gibt es nicht.
Solange die Dateien in einem Pfad liegen, an dem Lua von sich aus nachschaut (also z.B. im LUA-Ordner), brauchst du übrigens auch nicht den kompletten Pfad angeben.
Viele Grüße
Benny
-
Hallo Benny, danke Dir für die Erlärung! (Die Beschreibung der Befehle hab ich natürlich auch gelesen). Habs natürlich gleich ohne .lua ausprobiert. Aber leider der gleiche Fehler. Wie gesagt, mit dofile funktionierts. Die Dateien liegen nicht im Trend/EEP16/LUA-Pfad. Ich hab sie auf einer extra Platte, vom System getrennt, deswegen der ganze Pfad. Hier die komplette Meldung:
-
Wenn du dir die Suchpfade in der Fehlermeldung genau anschaust, wirst du feststellen, dass alle Pfade mit C:\Trend\ oder mit .\ anfangen (der einzelne Punkt steht für das aktuelle Arbeitsverzeichnis).
require ist eben für Modulnamen gedacht, nicht für ganze Pfade. Wenn du unbedingt absolute Pfade verwenden willst/musst, bleib doch einfach bei dofile.
Viele Grüße
Benny
-
dofile verlangt komplette Pfadnamen zur Datei - daher wird im Skript die Konstante glcPfad, die den Pfad enthält, vor den Dateinamen gestellt.
Ein Dateiname umfasst auch die Endung .lua
require erwartet einen Modulnamen (ohne Endung .lua) und versucht, damit an verschiedenen Stellen eine passende Datei zu finden. Dabei sucht require (im Standard) immer relativ zum aktuellen Lua-Verzeichnis von EEP (in deinem Fall: C:\Trend\EEP16\lua). Man kann und darf also keinen absoluten Pfad angeben (insbesondere nicht die Konstante glcPfad).
Die Fehlermeldungen sehen in deinem Bildschirmfoto dann so aus:
Wenn die Dateien im Lua-Verzeichnis liegen (in deinem Fall also C:\Trend\EEP16\lua) , dann steht bei require also nur der Modulname.
Wenn die Dateien in einem Unterverzeichnis des Lua-Verzeichnisses liegen (in deinem Fall also z.B. C:\Trend\EEP16\lua\DEMO) , dann steht bei require der relative Pfad plus der Modulname, also DEMO\Demo_DKWs.
Wenn die Dateien ganz woanders liegen wird es schwierig, denn require bastelt sich die Pfade immer selber zusammen. Man muss dem Befehl also extra sagen wo er suchen soll. Das macht man mit der Variablen package.path.
Wie das geht hatte Benny (BH2) in einem anderen Thread in 2016 beschrieben:
Ist LUA require () mit absoluter Pfadangabe möglich?
Damit komme ich für dein Beispiel zu folgendem Vorschlag zur Ersetzung von dofile durch require:
package.path = package.path..";D:\\00 Programmdaten\\20 EEP\\16 EEP16\\Anlagen\\?.lua"
require("Demo_Steuerung_V1\\02\\Demo_DKWs")
...
-
@Benny und Frank: Vielen vielen Dank für eure Ausführungen! Jetzt kenn ich mich aus!
-
Kleines Update:
Inzwischen habe ich an dem Anfahr- und Bremsskript gearbeitet. Das ist inzwischen soweit fertig, eine Demo-Anlage steht auch (in EEP13.2). Jetzt muss ich nur noch eine verständliche Anleitung dazu verfassen. Ich denke, im Laufe des WE werde ich damit fertig. Ich werde dann einen neuen Thread eröffnen, aber hier informieren, wenn es soweit ist.
Viele Grüße
und bleibt auch in 2021 gesund.
Norbert
-
Es ist geschafft. Ich habe soeben den Zip-Ordner mit meinem Skript zur Anfahr- und Bremssteuerung zusammen mit einer kleinen Demo-Anlage an den Admin geschickt. Zum Thema dieses Skripts habe ich einen neuen Thread gestartet, der hier zu finden ist: Lua-Skript zur Anfahr- und Bremssteuerung (ABS)
Schönen Sonntag noch.
Norbert
-
Jetzt fehlt nur noch das automatische Einlesen der Daten der Züge, so dass man nicht alle Zugdaten von Hand eintragen muss :)
-
fehlt nur noch das automatische Einlesen der Daten der Züge
Daten einmalig im Tag-Text der Züge speichern und an geeigneter Stelle automatisch auslesen. Wie? Zum Beispiel wie in dieser Demo von mir gezeigt,
Auch hier empfiehlt sich - wie fast immer - zuerst die Beschreibung lesen.
-
Daten einmalig im Tag-Text der Züge speichern
Auch diese Variante ist mir bekannt, löst aber nicht das Problem des AUTOMATISCHEN Einlesens :)