Jump to content

Empfohlene Beiträge

Geschrieben

Hallo und gruesse aus Australian, 
melde mich mal wieder, ist ja ne weile her dass ich einen stand meines programms gepostet habe. Ich habe immer mal wieder weitergebaut und seit NEO die neue schnittstelle angekuendigt hat, habe ich dann mein konzept angepasst, bzw. erweitert. Ich habe in der zwischenzeit so gut wie alle grundfunktionen fertiggestellt, insbesondere die gesamte funktionalitaet rund um die objektidentifikation und block erkennung. Bin immer mal wieder fuer einige zeit unterwegs in unserem grossen land und habe dann immer nur
begrenzt zeit weiterzubauen. Aber es ist ja hobby und ich habe keinen deadline. 
Habe ein dokument angeheftet worin die die ziele des programms festgehalten sind und kurze uebersicht mit screen shoots vom jetzigen stand. Ich halte das immer fest und erweitere das document, da dadurch nach laengeren pausen ein erneutes einarbeiten erleichtert wird. Habe detaillierte documentation direkt im programm, was dann auch nach einer pause hilft.

 
Die wesentliche neue richtung des ansatzes kommt nicht zuletzt durch die neue schnittstelle, aber auch durch meine neugier und interesse einen AI (KI) einzusetzen und zu trainieren das layout einer riesenanlage automatisch zu erkennen und dann die steuerung mit fahrplaenen durchzufuehren. 
Grundfunktionen und datenstrukturen sind soweit fertig um ein modell zu erstellen und die ersten tests mit einem AI zu machen. Klar muss ich da noch einiges lernen, aber das ist ja der sinn der sache. 

Die neue funktionen in der V9, z.b. eine vielzahl neuer beleuchtungsmoeglichkeiten, macht eine weitere automatisierung wuenschenswert.
Meine grosse testanlage hat ueber 64,000 objekte und ist manuell nicht zu betreiben oder auch mit algorythmen nicht mehr zu steuern. Da braucht es schon etwas mehr flexibilitaet.
Aber nachdem jetzt die grundfunktionen stehen kann ich ueber weitere automatisierung der erkennung nachdenken und wenn ich das modell fertig habe spielt die datenmenge nicht wirklich eine rolle. 
Jedenfalls hoffe ich dass die "alte schnittstelle" bleibt, da ich sie fuer die gesamte objektidentifikation benutze.
Gruss
Gmd
 
 

MBS Companion V2.pdf

Geschrieben (bearbeitet)

Hallo und gruesse aus Australien,

35 grad heute, aber nur heute, morgen wieder kuehler. Also heute ein tag fuer den computer :) mit klimaanlage an.
Habe meine behandlung von variationen und deren bilder vervollstaendigt. Kann jetzt auch alle variationen eines objektes verwalten und abbilden. Damit kann ich dann auch alle zugvarianten bilden und auf dem MBS plazieren. 

Das Beispiel unten ist der Siemens Vectron mit seinen 16 varianten.

variationen_erkennen.thumb.jpg.3f7b83deb95ee6c1a9da6fbc486c6f76.jpg

Nicht dass das wirklich wichtig ist, aber gelegentlich mache ich einfach ein paar einfachere erweiterungen bevor ich mich dann wieder an etwas muehsamere aspekte heranwage. 

Habe jezt auch das kapitel betriebsansichten weitergefuehrt. Darunter verstehe ich visualisierungen bestimmter logischen aspekte bei denen eine gruppierung von ereignissnachrichten und kommandos, sowie variableninhalte, hilfreich sind eine steuerung zu ueberwachen oder auch scripte zu testen.  Ok, das klingt abstrakt, hier ein beispiel eines widgets blockmonitor, das fuer jeden block auf der anlage dynamisch eingerichtet werden kann und dann die wichtigsten informationen anzeigt. Gleiches gibt es dann auch fuer andere betriebs aspekte, zb. ampeln and grosser kreuzung, gueter verladung oder generell animationen.

blockmonitor.thumb.jpg.eb41c4dc23bc379ee41803c2bfbb3551.jpg 

Hier das filmchen dazu.

Blockmonitor Widget

Noch einen schoenen Sonntag.
Gruss
Gmd


 

Bearbeitet von gmd
Geschrieben

Hallo an alle,

Habe jetzt die datenstruktur  zum fuettern der ersten stufe des AI fertiggestellt. Es gibt eine Json version alsauch eine version in der datenbank auf der der AI arbeitet.  

Hier nur ein kleiner Ausschnitt weiter unten als beispiel. Da groessere Json strukturen nicht sehr freundlich zu lesen sind hat mein programm auch eine einfache visualisierung fuer einen block mit seinen moeglichen komponenten.

Das sieht dann so aus:

block_erkennen.thumb.jpg.e273eb08b275f537e2541d8085274846.jpg

Hier sind alle elemente zunaechst eindeutig benannt. Dafuer gibt es andere funktionen. 
Ein endgueltiger name wird vorgeschlagen und kann uebernommen werden. 
Der prefix des namens ist das segment und der postfix ist die blocknummer.
Die weichen sind alle erkannt in welcher richtung sie liegen und wie sie befahren werden, als einfahrt oder abzweig usw.
Fuer einen block koennen im eigenschaftsfenster einige parameter gesetzt werden, die dann im betrieb relevant werden. 

Beispiele von blockkonfigurationen, die verschiedene nutzung ermoeglichen.  Weichen zu beginn, am ende, oder auch in der mitte sind optional und haben unterschiedliche verwendungsregeln, je nach blocktyp. Einfahr-,Brems-,Halte- und Ausfahrgleise sind markiert. 
Die absicht ist, den AI in der ersten stufe all blockvarianten erkennen zu lassen ohne alle kontakte und signale gesetzt zu haben. Sind vorschlaege vorhanden habe ich funktionen kontakte und signale automatisch zu plazieren und die erkennung fortzusetzen oder zu wiederholen, bis die gesamte anlage erkannt und definiert ist. Dabei wird die tracer lock vom AI gesteuert und die weichen geschaltet.
Der AI ist nun in der lage verknuepfungen zwischen den bloecken herzustellen und zu erkennen wo bloecke mit weichen verbunden sind. Daraus ergeben sich notwendige schutzeinrichtungen  (signale) es sei denn ein abschnitt is zu kurz (minimum zuglaenge erforderlich plus sicherheitsbereiche), dann bleibt er ungeschuetzt und wird als solches im betrieb beruecksichtigt.    

block_konfiguration.jpg.30bfc295307819c813d5411a7c55ae13.jpg

 

Unten ein kleines beispiel der Json struktur zur blockdefinition. Damit lassen sich alle elementaren fahrwege beschreiben. Die definition von routen ist der naechste schritt.

{
    "BlockComponents": [
        {
            "type": "track",
            "timestamp": "2024-11-26T11:31:54Z",
            "vehicle": {
                "name": "Tracer",
                "type": "Loc",
                "speed": "na",
                "rotation": "121.9843"
            },
            "track": {
                "name": "6001@64-JK_S01",
                "segment": "JK_S01",
                "guid": "{47D517F6-AC25-4E62-BEA3-E7DA7149A435}",
                "rotation": "31.98428",
                "use": "8",
                "length": "20.4",
                "type": "11",
                "state": "DU"
            }
        },
        {
            "type": "switch",
            "timestamp": "2024-11-26T11:31:55Z",
            "vehicle": {
                "name": "Tracer",
                "type": "Loc",
                "speed": "na",
                "rotation": "121.9842"
            },
            "track": {
                "name": "6070-1@53-JK_S01",
                "segment": "JK_S01",
                "guid": "{5732350C-F049-4BEB-8F22-7D83282EAD0C}",
                "rotation": "-31.98427",
                "use": "EIW",
                "length": "16.81355",
                "type": "4",
                "switchState": "1",
                "direction": "ER",
                "state": "EIW"
            }
        },
        {
            "type": "signal",
            "timestamp": "2024-11-26T11:31:56Z",
            "vehicle": {
                "name": "Tracer",
                "type": "Loc",
                "speed": "na",
                "rotation": "121.9844"
            },
            "signal": {
                "name": "Formvorsignal 2@5-JK_S01",
                "segment": "JK_S01",
                "guid": "{7E4AAF26-0023-408F-8F42-C8D781AFD241}",
                "rotation": "-148.0157",
                "use": "1",
                "position": "1",
                "type": "1",
                "state": "VS"
            }
        },
       {
          	"type":"contact",
			"timestamp":"2024-11-26T11:32:11Z",
			"vehicle":{
				"name":"Tracer",
				"type":"Loc",
				"speed":"na",
				"rotation":"-48.26498"
			},
			"contact":{
				"name":"Gleiskontakt@56-JK_S01",
				"segment":"JK_S01",
				"guid":"{E2A3CA8B-50A7-4247-9C02-4DC0306E1ED6}",
				"rotation":"-138.6383",
				"use":"2",
				"value":"0",
				"type":"0",
				"state":"BK"
			}
         }
    ]
}

gruss
Gmd

 

 

Geschrieben

Hallo, 
wen es interessiert die derzeitige liste der block eigenschaften, die ich verwalten kann und auf den der AI fuer die steuerung aufbaut. Habe wert darauf gelegt, dass viele parameter fuer den betrieb als defaults definiert werden koennen, das reduziert erst mal den definitionsaufwand drastisch, erlaubt aber den stueckweise ausbau und verfeinerung des betriebs fuer unterschiedliche zugtypen und strecken. Realistische geschwindigkeitsunterschiede zwischen zugtypen koennen damit abgebildet werden  und auch spontan zu entscheidende ausweichmanoever werden moeglich bzw. notwendig, damit hat der betrieb auch eine art zufaelligkeit trotz fahrplaene.
Ist moeglicherweise noch nicht vollstaendig , werde das aber bei der schrittweisen implementierung des control AIs merken. 
 

Gruss
Gmd

 

Blockeigenschaften in Datenbank
Identification Attributes       User defined and partially traced
ulong Id                       Unique Id of the record                   
ulong? SectionId               The section the block is located in
ulong? StationId               The station the block is located at
ulong? DepotId                 Block may belong to a Depot not a station
string BlockKennung            Comprises segment name and block number
int    BlockNummer             Just the block number, unique on the set
short? Konfiguration           The main purpose of the block, see Enum
short? BlockRichtung           Start direction of block
string BlockStartGleis          Name of the first track or switch of the block
string BlockEndGleis           Name of the last track or switch of the block
string Beschreibung            Dscription of the block
short? IstEndblock             If the block ends with no other connection  
Block Charactersistics          Determined with block tracing
float? Blocklaenge             Total length of the block
float? Bremsweg                Length from brake contact to stop contact
float? AusfahrtLaenge          Length from stop contact to end track
float? Bremsbereich            Distance stop contact to signal – safety zone
float? MaxZugLaenge            Maximum length of train safely in block
float? HalteLaenge             Length between last switch and stop contact
Block Track Elements           Determined with block tracing
short? AbzweigungVoraus         Turnoff ahead of braking contact
short? EinfahrtVoraus           Incoming Lane ahead of braking contact
short? KreuzungVoraus           Crossing ahead of braking contact
ulong? EingangsweicheId         Switch at start of block – foreign key
float? EingangsweichePosition   Distance from first track to switch
short? EingangsweicheVorhanden  Flag if entry switch is present
string EingangsweicheName       Name of entry switch
ulong? EinfahrtweicheId         Merge in switch – foreign key
float? EinfahrtWeichePosition   Distance from first track to switch
short? EinfahrtweicheVorhanden Merge in switch exists
string EinfahrtWeicheName       Name of merge in switch 
ulong? AbzweigweicheId          Turn off switch – foreign key
float? AbzweigweichePosition    Distance from first track to switch
short? AbzweigweicheVorhanden   Flag if turn off switch exists
string AbzweigweicheName        Turn off switch name  
ulong? AusgangsweicheId         Exit switch – foreign key
float? AusgangsweichePosition   Distance from first track to switch
short? AusgangsweicheVorhanden  Flag if exit switch exists
string AusgangsweicheName       Exit switch name
Block Connections              Determined with route tracing
ulong? VorgaengerId1           Block connected to start track or switch lane1    
ulong? VorgaengerId2           Block connected to entry switch lane2
ulong? VorgaengerId3           Block connected to entry switch lane3
ulong? NachfolgerId1           Block connected to end track or switch lane1
ulong? NachfolgerId2           Block connected to end switch lane 2
ulong? NachfolgerId3           Block connected to end switch lane 3
ulong? AbzweigId1              Block connected to turnoff lane 1
ulong? AbzweigId2              Block connected to turnoff lane 2
ulong? AbzweigId3              Block connected to turnoff lane 3
ulong? EinfahrtId1             Block connected to merge in lane 1
ulong? EinfahrtId2             Block connected to merge in lane 2
ulong? EinfahrtId3             Block connected to merge in lane 3
Block Operation Conditions      User defined characteristics
short? DoppeltraktionErlaubt    Two coupled locomotives may enter
short? AntriebErlaubtDampf      Steam engines are allowed on the track
short? AntriebErlaubtElektrisch Track is ready for electrical locomotives
short? AntriebErlaubtDiesel     Track can be used by diesel locomotives
short? LokWechselErlaubt        Lokomotive change permitted
short? RichtungswechselErlaubt Switch of train direction permitted
short? GegenverkehrErlaubt      Two way traffic permitted
short? AbzweigMitHalt          Turnoff second train while train stops
short? KreuzfahrtMoeglich       Train can cross block
short? KreuzfahrtWaehrendHalt   Train can cross block while other train stops
short? BlocksperrungMoeglich    Block can be locked
short? AusweichErlaubt          Use of a siding permitted
short? AusweichVorhanden        Siding exists
short? UseBlockDefaults         Flag if block defaults should be activated
short? UseVehicleDefaults       Flag if vehicle defaults should be activated
Block Default Types            User defined types and values for operation
sbyte? IsBlockDefault          Default valid for a block
sbyte? IsBlocktypeDefault       Default valid for a block type
sbyte? IsSetDefault            Default globally valid for the set
sbyte? IsVehicleDefault         Default for a vehicle
sbyte? IsTrainDefault           Default for a train
string VehicleType             Vehicle type for vehicle default
string TrainOpNumber           Train operation number for train default
Block Default Values
float? VerzoegerungEk           Deceleration at entry contact
float? VerzogerungBk           Deceleration brake contact
float? BeschleunigungHk         Acceleration stop contact
float? BeschleunigungAk         Acceleration exit contact
short? GeschwindigkeitEg        Speed at entry contact track
short? GeschwindigkeitBg        Speed at brake contact track
short? GeschwindigkeitHg        Speed at stop contact track
short? GeschwindigkeitAg        Speed at exit contact track
short? MingeschwindigkeitBk     Minimum speed at brake contact track
short? MingeschwindigkeitEk     Minimum speed at entry contact track
short? GeschwindigkeitHp        Speed at stop contact when leaving
short? WartezeitHg             Waiting time at stop track
short? WartezeitHk             Waiting time at stop contact  
short? HatHaltepunkt           Has short stop point
float? HaltepunktVerzoegerung   Deceleration at brake contact
float? HaltepunktBeschleunigung Acceleration at stop contact
short? HaltepunktHatvorsignal   Short stop has pre signal
short? HaltepunktHatrangiersignal  Short stop has shunting signal
short? WartezeitHp             Waiting time short stop signal 
short? WartezeitHkg            Waiting time at short stop wait track
Block Train Type Permissions
short? ZugtypGueter            Cargo train allowed
short? ZugtypLokal             Local train
short? ZugtypRegional           Regional train
short? ZugtypFern              Long distance train
short? ZugtypSpezial           Special train
short? ZugtypServive           Service train
 

 

 

 

Geschrieben
Am 22.11.2024 um 16:26 schrieb gmd:

Jedenfalls hoffe ich dass die "alte schnittstelle" bleibt, da ich sie fuer die gesamte objektidentifikation benutze.

Langfristig wird die alte Steuerschnittstelle entfernt, weil die neue Schnittstelle mit direktem Zugang zur EV flexibler ist (alles was die EV kann, kann auch die Steuerschnittstelle). Was fehlt dir bei der neuen Schnittstelle für die Objektidentifikation?

Geschrieben

Neo,

habe noch nicht den versuch gemacht die funktionen der alten schnittstelle umzustellen, fuer steuerung benutze ich die neue schnittstelle. 
Ich habe bisher nur folgenden wissensstand: 
Ich erkenne bisher nur meist steuerfunktionen und nach deinen eigenen worten ist das ja auch das ziel der schnittstelle. 
Die alte schnittstelle verwende ich zum einlesen aller objekte oder selektierter objekte, coordinaten, rotationen, plazieren von objekten, lesen guid, umbenennen objekte, duplizieren von objekten, alles funktionen die mit dem anlagenbau zu tun haben und nicht primaer mit der steuerung. 
Verbergen objekte, ersetzen objekte usw. also alles konstruktionsfunktionen.

ich weiss dass ich mit layout.xxx viele der funktionen ersetzen kann, also coordinaten, transformation (rotation), aber ich habe noch nicht rausgefunden wie ich 100,101,130,131,134,135,136,143,144 auf einfache art ersetzen kann. Einiges geht bestimmt ich habe es nur noch nicht gefunden.
Wenn du mir da helfen kannst waere das gut, dann kann ich sagen ob was fehlt. Derzeit waere das falsch, da mein wissen noch nicht gesichert ist um zu sagen ob etwas fehlt. Die ereignisse sind ja kein thema, die sind ohnehin viel detaillierter mit der neuen schnittstelle. 

Ich lasse zwei offene windows mit beiden ports laufen, da kann man die beiden schnittstellen gut vergleichen und die parsersoftware anpassen. Mit
Json sind die kommandos nicht mehr so einfach abzusetzen, die muss man dann vorbereiten und bei bedarf pasten zum testen. 

Gruss
Gmd
logging.thumb.jpg.28464ba32fbd181b03485f3bfab80f40.jpg

Geschrieben

Hallo,

wird wieder etwas langsamer werden. Ab morgen einpacken und dann wieder unterwegs auf dem naechsten trip fuer 4 monate . Nut ein paar stunden pro woche am computer. Hoffentlich ein paar fortschritte wenn ich ich zurueck bin .
Habe nur umstrukturiert, etwas klarere linien geschaffen im program und an einem punkt ueber 600 fehler produziert :) .. hat ne weile gadauert das wieder aufzuraeumen, hat sich ber gelohnt wenn ich nach vorne schaue. Jeder der programmiert kennt ja solche punkte, an denen sich ein konzept totlaeuft und aenderung braucht. Wenn eine tabelle 50 attribute hat, dann muss man das halt teilen. 
gruss
Gmd

  

  • 1 Monat später...
Geschrieben

Hallo aus Australien,
Hoffe alle hatten gute Festtage und etwas zeit zum spielen :) . Wir hatten den kaeltesten 24ten Dezember in Perth seit Aufzeichnung, 23 Grad. Auch hier im Sueden, wo ich mich zur zeit aufhalte, aber da ist es ja sowiso kuehler, aber auch hier war es ein Record. Zwei tage vorher waren es 43 Grad in Perth. Ist halt ziemlich weit weg von Deutschland :) . Weihnachten bei 42 Grad is halt schwer vorstellbar wenn man auf der Norhalbkugel lebt.
Ich habe immer mal etwas zeit un habe an meinem programm weiter gebastelt. 


gbs_sample.thumb.jpg.88bc1aa45c7d9eeab5efc5cd751135c6.jpg

Zunaechst mal am Gbs, allerdings habe ich ja nicht vor damit den verkehr zu steuern, sondern nur zu ueberwachen. Noch ein paar kleine kosmetische aenderungen muessen gemacht werden, dann gehe ich and die automatische streckenerzeugung basierend auf den erkannten bloecken. Eine manuelle nachbearbeitung is natuerlich moeglich. Ich sehe derzeit nicht dass ich das layout vollautomatisch erstellen kann, jedenfalls noch nicht in naechster zeit. Die referenzen zu den aktuellen gleisen, weichen und signalen werden dann automatisch erzeugt. Die farben bedeuten derzeit noch nichts, dahinter verbergen sich verschiedenste einstellungen, die dann zur visualisierung der zustaende verwendet werden. Zugnummern anzeigen usw. koennen gesetzt werden. 

Meine grosse Anlage laesst sich damit nicht wirklich vernueftig abbilden. das GBS wird einfach zu gross und unuebersichtlich und macht ja auch nicht wirklich sinn, da ja lange strecken nicht wirklich ein gbs brauchen, sondern nur teile and die verzweigter sind. 

Das fuehrt dann zu einer abschnitteinteilung, die jeweils einen relevanten abschnitt darstellt und moegliche teilabschnitte als detailsichten. Die verkuepfungspunkte im bild oben verbinden dann zum naechste abschnitt, falls vorhanden.

AbschnittEditor.thumb.jpg.06512946788654a82951008ca94237cd.jpg
 

Fuer die definition von abschnitten und ihrer beziehung untereinander habe ich ein eigenes diagramm gebaut. Bilder von der anlage sind vorbeitet und als abschnitte und teilabschitte vorsortiert. Diese koennen geladen  und verknuepft werden und dienen dann im betrieb zum schnellen zugriff auf die gleisbilder und die zugeordneten fahrplaene falls vorhanden. 
So allmaehlich habe ich alle grundfunktionen und anzeigen fertig. Als naechstes geht es dann mehr und mehr and die tatsechliche erkennung und definition einer anlage. Bisher habe ich nur mit testdaten gearbeitet. Das ganze ist aber immer noch eine mehr experimentelle entwicklung, da ich immer wieder auch teile verwerfe, die mir nicht gefallen oder unpraktisch sind. Ich probiere funktionen aus und wenn sie mir gefallen, nehme ich sie ins konzept auf. Mit einer kommerziellen entwicklung ist das anders, das arbeitet man mehr direkt auf ein ziel hin. 

Alles gute zum neuen Jahr
Bis bald und gruesse
Gmd

 

Geschrieben

Hallo nochmal im alten Jahr,

mein naechster schritt:
layout2D_monster.thumb.jpg.5c01714081c412d64dfd670d2bc6ee3a.jpg

Fuer verschiedene funktionen benoetige ich kleinere, definierte anlagenteile und nicht immer das gesamte bild.
Ein beispiel sind die abschnitte im stellpult (siehe oben). Diese sind mehr fuer den betrieb gedacht. Ich habe aber auch 
funktionen, die auf die gestaltung von teilen der analge wirken.
Beispiel:
Ein Laubwald, in einem bestimmten teil der anlage,  soll langsam von Sommer nach Herbst umgewandelt werden.
Ein modul der anlage soll complett dynamisch ersetzt werden.
In einem teil der anlage (z.B. vor einem bahnhof) soll der fussgangerbetrieb tageszeitbedingt ersetzt werden.
Objekte in einem teil der anlage sollen auf ebenen aufgeteilt werden.
Ein wanderzirkus soll auf verschiedenen teilen der anlage auf- und abgebaut werden und zwischen den standorten
transportiert werden. 
Baustellen sollen eingerichtet und wieder abgebaut werden.
Ebenen sollen ein/ausgeblendet werden.
usw.

Fuer gestaltungsbedingte einteilung habe ich area und segment. Area ist eine teilanlage mit klaren, nicht zu vielen verbindungen
zu anderen teilen. Segmente sind teile von areas mit bestimmten bedeutungen/funktionen und koennen, mussen aber nicht, einen
gbs abschnitt darstellen.
Um diese aufteilung effizient zu definieren und auch gleichzeitig alle objekte innerhalb eines teils zu finden bedarf es weiterer
automatismen, sonst wird das muehsam.
area1.thumb.jpg.95692d4d5e7be31fb3146a892aae19ca.jpg

 Ich verwende benannte Fluchtstaebe, um die ecken einer Area zu definieren und kann diese einlesen. Ich verwende
ein layout bild wie oben als hintergrund eines diagramms und kann dann die areas als polygone zeichnen, basierend 
auf der position der fluchtstaebe. Die koordinaten werden transformiert zwischen dem diagramm in der analage 
und damit kann ich alle objekt innerhal einer area finden.
Gleiches kann innerhalb der areas fuer segment geschehen, ich kann aber auch umgekehrt im diagramm segmente
festlegen, wenn einmal die koordinaten des diagrams in bezug auf die anlage festgelegt sind.

Gruss und alles gute zum neuen Jahr
Gmd

 

  • 2 Wochen später...
Geschrieben

Hallo mal wieder,
habe an meinem abschnitteditor weitergebastelt.
AbschnittEditor2.thumb.jpg.ac7d3ac0ded4d778988cb1f514ce7fd3.jpg

Zu jedem abschnitt koennen teilabschnitte und eigenschaften zugeordnet werden (die bilder unten an der gruppe). Teilabschnitte sind separate sichten auf teile des gbs fuer diesen abschnitt. Ein bahnhof oder ein haltepunkt kann zugeordnet werden (oben rechts), und auch ein stellwerk (oben links).
Alle anderen symbole sind plan- und steuerbare ablaeufe. Jedes bild representiert eine darstellung von daten mit moeglicher eingabe. Fuer jeden ablauf wird eine schablone vorgeneriert (templates) die vom "GBS pult" abgerufen werden koennen, mit hilfe der gleichen symbole wie hier im diagramm.
Ist einem Abschnitt ein bahnhof oder haltepunkt zugeordnet, steht er fuer einen fahrplan zur verfuegung. 
Die linke gruppe stellt den derzeit maximalen umfang and definitionen dar. Mit funktionen wie schliessen und oeffnen koennen die gruppen verkleinert werden. 
Das diagramm kann beliebig gross werden. Die anordnung der komponenten ist vollautomatisch, man braucht also nicht lange mit "ordnen" verbringen.
Fuer die meisten abschnitte werden natuerlich nicht alle variationen verwendet, die anordnung wird dann automatisch angepasst, man kann aber immer auf die grundanordnung zurueckgehen. 
Damit lassen sich grafisch sehr schnell die strukturen festlegen mit denen das GBS verwaltet werden soll. Ist ein stellwerk zugeordnet dann wird die steuerung aktiv moeglich. Ist kein stellwerk zugeordnet ist nur eine ueberwachung gedacht. 
Dies alles gehoert zu den strukturen auf denen der AI einmal arbeiten soll. Fuer das AI-Modell braucht man ja eine gute abbildung der "welt" in der die entscheidungen getroffen werden sollen und alles soll ja in einem wohl definierten rahmen ablaufen.
Zugeordnete funktionen koennen jederzeit wieder weggenommen oder hinzugefuegt werden.
Es folgen noch weitere details zu den bahnhoefen, wodurch einzelne gleise bestimmten aktivitaeten zugeordent werden koennen. Ich brauche dazu keine kontakte, nur eindeutige gleisnamen in den bloecken. Auf bestimmten gleisen sind dann nur bestimmte aktivitaeten moeglich, wie anhalten eines personenzuges, oder durchfahrt eines gueterzuges.     
Wenn keine zugliste fracht zugeordnet ist, kann kein gueterzug in dem abschnitt fahren. Damit is das automatisch definiert.. und so weiter. Es lassen sich noch eine vielzahl von eigenschaften oder funktionen denken, deshalb sind die einzelnen digrammelement auch nicht fest definiert, sondern koennen erweitert werden. 
Die editierungsfunktionen sind jetzt soweit fertig, jetzt kommt noch das abspeichern und laden des diagramms. Dann gehts mit einer anderen komponente weiter. 
Ich muss ja noch die blockerkennung weitermachen und die automatische generierung der bloecke im Gbs fertigstellen. 
Ein solches diagramm mach natuerlich mehr aufwand bei der programmerstellung als eine einfache texttabelle, ist aber in der anwendung unvergleichlich schneller und uebersichtlicher. 
Mit der neuen schnittstelle kann ich ja sogar lua code hinter solchen symbolen verbergen und bei bedarf laden.  Damit kann ich schneller auf einzelnen script komponenten zugreifen und diese nach meinen kriterien ordnen.
Gruss
Gmd
 

  • 3 Wochen später...
Geschrieben

Hallo,

Heute mal etwas ueber die schnittstelle. Habe mich eine weile damit beschaeftigt, allerdings noch nicht mit der neuen funktion von kuerzeln. 
Jedenfalls ist einiges an vorbereitung noetig die neue schnittstelle bequem zu bedienen. Mit der alten ist es ja einfach ein kommando per telnet abzusetzen, man tippt es einfach ein und das parsing war auch wesentlich einfacher. Die neue schnittstelle ist geschwaetzig (zu viele zeichen werden uebertragen fuer das was wirklich passiert), aber das ist halt die konsequenz wenn man Json strukturen baut, die auch noch lesbar sein sollen. Ich bin kein freund von json als protokoll format, ok zum abspeichern und laden von strukturdaten aber als schnittstellenprotokoll nicht geeignet, wenn man hohen durchsatz erreichen will. Nun ja das ist halt meine meinung.

Da ich das nun mal nicht aendern kann und die alte schnittstelle ja irgendwann verschwinden soll, habe ich mir erst mal eine umgebung gebastelt mit der ich die schnittstelle etwas bequemer bedienen und testen kann, auch als vorbeitung aines laufzeitsystems fuer die ereignisauswertung und steuerung die dem AI als schnittstelle dienen soll. 

Lua_Action_Center.thumb.jpg.d3e3d5892ffa3cd9b36ff919351bb9b3.jpg

Hier ein fenster, das ich Lua Action Centre nenne. Es dient verschiedenen zwecken.
Begonnen hat alles mit dem problem lua scripte ueber die schnittstelle zu schicken. Das ist muehsam, mit einem editor die nachricht erstellen, ok man kann copy und paste benutzen, und dann per telnet zu senden und als antwort einen nicht so aussagefaehigen parameter error zu bekommen. Das kann nerven ..
Also erster schritt: Lua zu installieren und scripte zu erstellen mit syntax check, und wenn wir schon dabei sind mit komplettierungsfunktion fuer syntax , funktionen und objekte.
Dann eine funktion das script zur uebertragung vorzubereiten ( kommentare entfernen und zue pruefen dass konventionen eingehalten werden), die nachricht zu erzeugen, zu schicken und die antwort anzuzeigen.
Ausserdem zum test von steuerungen is es ja gut die protokollierung zu haben, hier natuerlich ueber die schnittstelle, und verdichtete darstellung oder original nachricht zu sehen und zu filtern nach event und auch nach objekt or mehrfach fuer mehrere objekte, und die gefunden nachrichtenteile auch hervorzuheben, zur leichteren erkennung.
Das hilft alles beim testen von komplexeren steuerungen.
Und weil das alles so gut geht dann noch eine bibliothek an scripten die dann fuer verschiedene zwecke verwendet werden koenen, zur laufzeit dynamisch parametrisiert werden, oder auch einfach in den editor geladen werden koennen um tiparbeit zu sparen.
Damit ist erst mal das muehsal der schnittstelle drastisch reduziert und ich kann mich der tatsaechlichen steuerung widmen. 
Ich kann Lua innerhalb meines programms ablaufen lassen, d.h. die steuerscripte kann ich in Lua schreiben oder generieren, allerdings mit erweiterter funktionalitatet. Das Mbs implementiert funktionen fuer fahrstrassen, die ja auf einer "hoeheren" ebene ablaufen als ein signal or gleis event. Ich habe funktionen definiert die auf bloecke wirken und kann sie direct in Lua ansprechen. Dies wird durch einen preprozessor realisiert, der dann die entsprechende laufzeitfunktion aufruft, da das kommando nicht direkt von Lua in meiner app verarbeitet werden kann. Das gilt ja auch fuer alle funktionen die das Mbs betreffen und ueber die schnittstelle gesteuert werden. Dafuer sind die script snippets gemacht die dann vom laufzeitsystem verwendet werden um diese Lua funktionen auszufuehren, indem ein script ueber die schnittstelle geschickt wird und die antwort and Lua zurueckgegeben wird. Im grunde kann ich die gesamte event behandlung des Mbs damit nachbilden und in meiner app verwenden und ablaufen lassen, und natuerlich weitere komplexere funktionen anstossen.
Ich habe noch keine entgueltiges bild vor augen, wie die aufteilung zwischen Lua im Mbs und Lua innerhalb der app aussehen wird. Wenn ich kann werde ich viele generische scripte im Mbs hinterlegen, die dann zur laufzeit verwendet werden. Dies sind allerdings nicht objekt oder evnet gebunden, sondern sind generisch, typgebunden und werden zur laufzeit parametriesiert.
Gruesse und frohes schaffen.
Gmd


   
 

Geschrieben

Nochmal Hi,

anbei ein kleines benutzerhandbuch fuer mein Lua Action Center.
Ich habe generell begonnen programmdokumentation mit dem AI zu machen. Das funktioniert gut, fuer code sowohl fuer handbuch,
nicht perfect aber gut genug fuer mein schwaches gedaechtnis :)..
Ich diktiere ein paar schlagworte mit spracheingabe und der AI macht daraus ein handbuch in jeder sprache, ich fuege ein paar bilder hinzu und done !.
Was auch hilft sind die posts hier, ich mache sie teil der eingabe und sie bereichern die ausgabe.
Das deutsch klingt etwas geschwollen, aber das liegt vielleciht an meiner wahrnehmung da ich eigentlich sehr wenig deutsch lese oder schreibe ausser hier.
Gruss
Gmd

 

LuaActionCenter_Manual_Deutsch.pdf

Geschrieben
15 hours ago, Phrontistes said:

Das finde ich nicht. Es ist erstaunlich gutes IT-Deutsch, wie man es von deutschsprachigen Dokumentationen gewohnt ist.

ok, dann ist es meine wahrnehmung, ich habe kein "Siemens"-deutsch mehr seit vielen vielen jahren gelesen und erst recht kein IT-deutsch. So, wenn du das sagts dann ist das ja eine positive aussage, die ich dann danked annehme und lerne :) .

Ich habe mein Lua Action Center jetzt mit den gleichen oberflaechen mechanismen in die main app integriert (Docking Panels) und mal ein bildschirm layout ausprobiert fuer die konstruktionsphase, nicht die betriebsphase. Ich will eine automatische fensteranordnung fuer verschiedene situation vorsehen, dann ist das weniger aufwand die fenster zu positionieren. Die fenster sind von oben links im uhrzeigersinn: Abschnitteditor, MbsAnlage in arbeit , GBS editor, Main App mit blockerkennung etc. , Zugdesigner und Lua Action Center. Das sind die hauptkomponenten mit ihren teilsichten. Jetzt geht es an die weitere verfeinerung der einzelnen funktionen und em runtime system fuer die scripts.

konstruktionslayout.thumb.jpg.37fa1f9afd733b5cef85a2856ac0e0a8.jpg 
Gruss
Gmd


 

Geschrieben (bearbeitet)

Hallo,
eine woche ueber 40 grad zu hause und ich bin froh dass ich hier im sueden bin, milde 24, leichtes lueftchen durch den caravan, sehr angenehm.
Heute nun mal ein paar erklaerungen zum thema animationen. Ich mach das hier um den anderen thread nicht zu sehr belasten. Die diskussion hat mir gezeigt dass ich erst mal einiges erklaeren muss zum verstaendnis was ich eigenlich mit den animationen beabsichtige .
Das Mbs und die EV sind auf ereignisse ausgerichtet und alles passiert nur ueber ereignisse, timer, schalter usw. Wenn man also etwas bewegen oder blinken lassen will dann ordnet man das einem oder mehreren ereignissen zu. Wenn man flexible sein will dann macht man sich ein paar scripte die verschiedene animation zusammenfassen und bei bestimmten ereignisse getriggert werden. So weit so gut. Das ganze passiert aber auf einer sehr niedrigen ebene und benoetigt ziemlich viel definitionsaufwand, insbesondere wenn die animationsnamen verschieden sind fuer verschiedene objekte im grunde aber das gleiche tun, also ein mapping stattfinden muss.
Die definition im Mbs ist was man bottom up nennen kann, also elementare ereignisse verknuepfen zu einem groesseren ablauf.
Ich hoffe das ist erst mal soweit klar.
Ich denke aber prinzipiell anders, da mir der definitionsaufwand einfach zu hoch ist fuer dutzende, wenn nicht hunderte von animationen die steuerung zu definieren. Bei einer belebten anlage, und das sollen sie ja sein, kann das sehr umfangreich werden.
Also ist die idee eine andere. Wenn man ein bestimmtes produkt kaufen will und jedes geschaeft oder website abklappern muss, dann kann das muehsam sein. Betrachten wir mal nicht die bots oder portals sondern nur den fall, dass alle produktanbieter innerhalb von kurzer zeit (sagen wir 1 stunde) ein angebot in gleichem format an uns schicken, sodass wir einfach nach bedingungen auswaehlen koennen, preis, lieferbarkeit etc. Nennen wir das mal top down.
Nun uebertragen auf das Mbs und die steuerung bedeutet das, wir definieren virtuelle ereignisse, z.b. zug haelt am personenbahnsteig, das kann eine summe von elementaren ereignissen sein, zug betritt gleis, kontakt ausgeloest, antrieb ausgeschaltet usw.
Nun haben wir definitionen vorbeitet, die eine folge von aktionen beinhalten die ausgeloest werden sollen wenn ein bestimmtes virtuelles ereignis stattfindet. Diese definitionen sind zunaechst einmal prinzipiell vom fahrzeug, lok oder wagen unabhaengig, und muessen auch nicht and jeden bahnhof, gleis oder fahrzeug angehaengt werden. Da wir einen typ definiert haben der wiederum typen von animationen enthaelt, koenen die automatisch ablaufen wann immer die bedingungen fuer das gegebene virtuelle ereignis eintritt.
Nun sind nicht alle animationen bei allen objekten vorhanden oder heissen unterschiedlich. Dafuer haben wir einen mapper der die animationsnamen je nach objekt uebersetzt oder auch falls nicht vorhanden auf eine andere animation umlenkt.
Prinzipiell kann ich damit generalisiert alle moeglichen situationen beschreiben und das laufzeitsystem interpretiert die elementaren ereignisse und waehlt aus welche animationstypen anwendbar sind. Theoretisch kommt man allein mit typen aus und braucht keine einzelfaelle zu definieren, aber auch das will ich moeglich machen fuer meine app.  
Also wenn nun die animationsnamen vereinheitlicht werden dann ist dass toll, ist aber fuer mich keine vorraussetzung. Ich passe mich and den status quo an und wenn die dadurch gewonnen erkenntnisse zur standardisierung helfen, umso besser.

Hier mal einen auszug aus meiner spezifikation fuer das animation management, naemlich die eigenschaften eines fahrzeuganimationstyps und dazu erweiterte timing parameter.

General Attributes for Vehicles                                                

 float?  Duration             Approximate duration of animation  
 sbyte?  IsNight                 Used during night hours (Default Y)
 sbyte?  IsDay                 Used during daylight hours (Default Y)
 sbyte?  HasSound             Animation creates sound (Default N)
 sbyte?  MovingOnly             Only played while vehicle is moving (Default N)
 sbyte?  StoppedOnly             Only played when vehicle has stopped
 sbyte?  CompleteBeforeMoving     Animation has be to completed before vehicle moves (Default n/s)
 sbyte?  StartAfterEngineOff         Animation starts after engine was switched off (Default n/s)
 string  Direction              Specifies directional use of animation  (Default F+B)
 sbyte?  HasRepeat             Specifies if extended timing information is required (Default N)
 string? Delay                Delay(h.m.s.ms) after event before animation is started (Default n/a)

Timing Parameters
sbyte?  IsLoop                 Automatic replay of animation (Default N)
sbyte?  IsRandom                Random start of animation when loop is specified (Default n/s)
float?  MinPause                Minimum pause between random start (Default 0)
float?  MaxPause                Maximum pause between random start (Default 0)
sbyte?  IsInterval            Specifies fixed repeat interval (Default N)
float?  PauseInterval            Time between starts when fixed interval (Default 0.0.100.0)
int?       Count                Defines number of repeats (Default 0)
string? Period                      Defines the maximum time span for Count of repeats (Default 0.10.0.0)
sbyte?  Timed                Defines if the animation is started at a specific time
string? Days                Defines days of the week (Default M,T,W,T,F,S,S)
string? Time                Defines the time of the animation start (Default hh:mm:ss)
float?  Duration                The length of played animation or repeats of animation if shorter (Default 0.0.0 hh:mm:ss)


This makes the churchbell ring every hour for 5 minutes starting at 12 noon, every day
IsLoop = "Y", IsInterval="Y", PauseInterval="0.1.0.0", Count="12", Period = "0.24.0.0", Timed="Y", Days="M,T,W,T,F,S,S" , Time="12:0:0" Duration="0.5.0"  

Ob das ausreicht wird sich zeigen, aber damit habe ich begonnen.
Und hier noch ein bildchen, habe kein strenges ER diagramm gezeichnet, etwas weniger wissenschaftlich :)

 

animation_data_Structure.thumb.jpg.84c0d52e991566abcb46bf0b29df1b5f.jpg

Ich hoffe dass das nachvollziehbar war und vielleicht auch meine prioritaeten erklaert.
Gruss
Gmd
 

 

Bearbeitet von gmd

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