Denkblockade beim Scripten

  • Hallo,


    ich bin gerade dabei die Scripte für mein Fahrzeug zu scheriben. Beim testen kam mir aber ein Problem auf. Da ich jetzt schon seit ein paar Tagen an dem Problem sitze, wollte ich es mal hier präsentieren, in der Hoffnung, dass mir jemand einen Denkanstoß geben kann, oder mir vielleicht erklären kann, was ich bissher in Pascal falsch verstanden habe.


    Also mein Problem ist der Umschalthebel.

    Wenn ich im Scriptplotter, den Trigger "ReverserPlus" betätige, wird meine zu Debugg zwecken entfremdete Oberleitungs-Leuchte (LM_A_DB_Oberleitung) eingeschaltet. (Die Funktion wird also korrekt aufgerufen.)

    Wenn ich jedoch nach dem Aufruf der Prozedur (Umschalthebel_Plus) die Position des Umschalthebels in eine Variable schreibe, so ist diese nur während der Trigger aktiv ist =1 und springt wieder auf 0 zurück sobald ich den Trigger los lasse. (Dies entspricht einem Springload)

    Jedoch soll das ändern der Position des Umschalthebels bestehen bleiben, auch wenn der Trigger losgelassen wird.

    Ich hoffe, mir kann jemand behilflich sein.

    Ja äh, hier irgendwas mit Dingen und so...

  • Nach dem ersten Lesen konnte ich noch keinen Fehler finden. Ich würde den gesamten Quellcode systematisch durchgehen und schauen, wo LM_A_DB_Oberleitung := 0; aufgerufen wird. Das könnte zum Beispiel daran liegen, dass Umschalthebel_Minus beim Loslassen aufgerufen wird. Das wäre mit id =  'ReverserPlus' und value = false der Fall. Eventuell führt das zur Lösung.

  • Danke für die Mühe, hat aber leider nichts gebracht. Ich habe sogar testweise Umschalthebel_Minus komplett geleert, sodass beim aufrufen der Funktion nichts passiert.

    Der Leuchtmelder LM_A_DB_Oberleitung deint mir auch nur zum Test, ob Umschalthebel_Plus überhaupt korrekt aufgerufen wird und das tut es.

    Ich habe eben Testweise Umschalthebel_Plus (_Fahrerstand.Umschalthebel, value); durch Umschalthebel_Set (_Fahrerstand.Umschalthebel, 1); ersetzt. Dabei verlief alles korrekt und Umschalthebel.Pos wurde auf 1 gesetzt. Nur bei Umschalthebel_Plus bleibt der gewünschte Effekt aus.

    Ja äh, hier irgendwas mit Dingen und so...

  • Kurz zur Überprüfung, falls ich dich falsch verstanden habe: Die Lampe geht nach dem Loslassen auch aus? Oder springt nur eine Variable zurück?


    EDIT: Noch zwei Dinge, die mir aufgefallen sind:

    result verhält sich folgendermaßen: Beim Anklicken ist es kurz false, danach aber sofort wieder true. Beim Loslassen bleibtresult = false.

    Mir ist allerdings auch nicht klar, warum Umschalthebel_Plus eine Funktion ist, schließlich wird der Rückgabewert nicht benutzt.

  • Zitat

    Kurz zur Überprüfung, falls ich dich falsch verstanden habe: Die Lampe geht nach dem Loslassen auch aus? Oder springt nur eine Variable zurück?

    Die Lampe bleibt an. (Soll so) Nur die Variable springt wieder zurück auf 0. (Soll nicht so)


    Zitat

    EDIT: Noch zwei Dinge, die mir aufgefallen sind:

    result verhält sich folgendermaßen: Beim Anklicken ist es kurz false, danach aber sofort wieder true. Beim Loslassen bleibtresult = false.

    Mir ist allerdings auch nicht klar, warum Umschalthebel_Plus eine Funktion ist, schließlich wird der Rückgabewert nicht benutzt.

    Das Verwenden einer Funktion anstelle einer Prozedur, war nur der Überrest eines Tests, ob das etwas am Ergebnis ändert. Habe die Funktionen wieder in Prozeduren geändert und die Rückgabe entfernt. Das Ergab leider keine Veränderung.

    Ja äh, hier irgendwas mit Dingen und so...

  • Die Funktionen/Prozeduren sind ja den TechElements aus dem OpenSource-Ordner nachempfunden. Auch da sind diese als Funktion mit boolschem Rückgabewert definiert. Der Vorteil könnte sein, dass ein Tasterklicken nur ausgelöst wird, wenn die Schalterposition sich verändert hat.


    Zur Lösung des ursprünglichen/eigentlichen Problems kann ich leider auch nicht beitragen.

    Dein Ansatz ist nicht falsch, mein Stil würde aber eher so aussehen, dass ich außerhalb der Funktion/Prozedur überprüfe, ob der Sollwertgeber auf 0 ist, weil ich dann im else gleich den Hint-String setzen kann. Aber ich kann verstehen, dass man x-fach verschachtelte ifs vermeiden möchte.

  • Zitat

    Um welche Variable handelt es sich denn?

    Es geht um _Fahrerstand.Umschalthebel.Pos;, bzw. in Umschalthebel_Plus bezeichnet als sw.Pos. Die Positionsvariable des Umschalthebels. Diese bleibt trotz sw.Pos := sw.Pos + 1; (Umschalthebel Zeile 18) nach dem loslassen der Taste nicht auf den neuem Wert sondern fällt wieder auf 0.

    Ja äh, hier irgendwas mit Dingen und so...

  • Zitat

    Um welche Variable handelt es sich denn?

    Es geht um _Fahrerstand.Umschalthebel.Pos;, bzw. in Umschalthebel_Plus bezeichnet als sw.Pos. Die Positionsvariable des Umschalthebels. Diese bleibt trotz sw.Pos := sw.Pos + 1; (Umschalthebel Zeile 18) nach dem loslassen der Taste nicht auf den neuem Wert sondern fällt wieder auf 0.

    Vielleicht kann da jemand weiterhelfen, der von Pointern und Gültigkeitsbereichen in Pascal Ahnung hat und nicht so wie ich sich Pascal nur für LOTUS beigebracht hat. Wird durch das Ändern von sw.Pos überhaupt _Fahrerstand.Umschalthebel.Pos; geändert? Sorry, aber ich bin mit meinem Latein am Ende.

  • Danke trotzdem für deine Hilfe.

    Zitat

    Pointern und Gültigkeitsbereichen in Pascal

    Das klingt nach einem Thema, was ich mir mal angucken sollte. Viellicht komme ich dann ja noch drauf.

    Ja äh, hier irgendwas mit Dingen und so...

  • Ich habe mittlerweile eine Lösung für das Problem gefunden und wollte sie hier Präsentieren, damit kein anderer an der Stelle stecken bleibt.

    Mein Fehler lagt hier:

    procedure A_Fahrerstand_OnButton(_Fahrerstand: TFahrerstand; id: string; value: boolean);

    Richtig müsste es heißen:

    procedure A_Fahrerstand_OnButton(var _Fahrerstand: TFahrerstand; id: string; value: boolean);


    Erklärung:

    Bei den Parametern einer Funktion oder Prozedur bedeutet das var, dass es sich um einen variablen Paramter handelt. Das heißt, das der Parameter verändert werden kann, so das die Veränderung nach der Funktion erhalten bleibt. Würde man an dieser Stelle das var weg lassen, so existieren die Veränderungen des Paramerts nur innerhalb der Funktion. (Sinnvoll, wenn die Parameter eh nicht verändert werden)


    *Thema kann geschlossen werde*

    Ja äh, hier irgendwas mit Dingen und so...

  • Neu erstellte Beiträge unterliegen der Moderation und werden erst sichtbar, wenn sie durch einen Moderator geprüft und freigeschaltet wurden.

    Die letzte Antwort auf dieses Thema liegt mehr als 60 Tage zurück. Das Thema ist womöglich bereits veraltet. Bitte erstellen Sie ggf. ein neues Thema.

    Maximale Anzahl an Dateianhängen: 5
    Maximale Dateigröße: 500 kB
    Erlaubte Dateiendungen: bmp, cfg, ini, jpeg, jpg, lct, ldl, llg, lob, log, lpmtl, lptmt, ltx, pas, pdf, png, railtrack, rar, txt, veh, wav