Problem mit "$MSG_T.VALID"

  • Hallo zusammen,
    ich habe ein Problem mit der Nachrichtenfunktion von KRL.

    Von Zeit zu Zeit bleibt das Programm in folgender Schleife hängen:

    Code
    WHILE $MSG_T.VALID == TRUE
    WAIT sec 0.05
    ENDWHILE


    Kann mir da vieleicht jemand weiterhelfen?

    Danke, M. Hübner

  • Hallo, ich hatte das Problem auch schon öfter, bei mir hat dass, mit der Zeit hochsetzen nichts gebracht. Ich hab $MSG_T.VALID dann immer von Hand auf True gesetzt damit war das Problem wieder behoben. Alerdings wüsste ich auch mal gerne was da die Ursache ist.
    mfg elias

    IF ROBOTER_STEHT AND SPS_VORHANDEN THEN<br />&nbsp; WHILE NOT ROBOTER_LAEUFT<br />&nbsp; &nbsp; &nbsp; $LOOP_MSG[]=&quot;SPS IST SCHULD!&quot;<br />&nbsp; ENDWHILE<br />&nbsp; $LOOP_MSG[]=&quot;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;<br />ENDIF<br /><br />Geld ohne Arbeit! Keine Arbeit ohne Geld!

    Edited once, last by ().

  • Das Problem ist auch bei Kuka bekannt, denn im Beispiel von Kuka sieht das so aus:

    COUNTER=0
    WHILE (($MSG_T.VALID==TRUE) AND (COUNTER&lt;20))
    ;because sometimes valid does not change to false
    COUNTER=COUNTER+1
    WAIT SEC 0.2
    ENDWHILE
    WAIT SEC 0.2
    IF COUNTER&gt;=20 THEN
    GOTO NOCHM

  • Sorry, dachte das wäre klar:
    Halt ganz am Anfang der Ausgaberoutine. wichtig ist dass
    danach zuerst mal $MSG_T.Valid auf false gesetzt wird.
    Also ungefähr so:
    DEF MSGTXT (NR :IN)
    DECL INT NR

    DECL INT ANSWER
    DECL INT COUNTER
    DECL INT OFFSET
    DECL STATE_T STATE
    DECL MSG_T EMPTY_MSG
    DECL INT I

    NOCHM:

    EMPTY_MSG={MSG_T: VALID FALSE,RELEASE FALSE,TYP #NOTIFY,MODUL[] " ",KEY[] " ",PARAM_TYP #VALUE,PARAM[] " ",DLG_FORMAT[] " ",ANSWER 0}

    $MSG_T.VALID=FALSE
    $MSG_T=EMPTY_MSG
    $MSG_T.MODUL[]=" "

    ;copy input-string, to make sure, that .key gets 40 characters
    FOR I=1 TO 58
    $MSG_T.KEY[i]=ERR_TEXT[NR].TEXT[i]
    ENDFOR


    $msg_t.param[]=" "

    $MSG_T.KEY[59]=" "
    $MSG_T.KEY[60]=" "
    $MSG_T.PARAM_TYP=#VALUE
    $MSG_T.VALID=TRUE

    COUNTER=0
    WHILE (($MSG_T.VALID==TRUE) AND (COUNTER&lt;20))
    ;because sometimes valid does not change to false (KUKA-Live !!)
    COUNTER=COUNTER+1
    WAIT SEC 0.2
    ENDWHILE
    WAIT SEC 0.2

    IF COUNTER&gt;=20 THEN
    GOTO NOCHM
    ENDIF

  • Danke!!!!
    mffg elias

    IF ROBOTER_STEHT AND SPS_VORHANDEN THEN<br />&nbsp; WHILE NOT ROBOTER_LAEUFT<br />&nbsp; &nbsp; &nbsp; $LOOP_MSG[]=&quot;SPS IST SCHULD!&quot;<br />&nbsp; ENDWHILE<br />&nbsp; $LOOP_MSG[]=&quot;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;<br />ENDIF<br /><br />Geld ohne Arbeit! Keine Arbeit ohne Geld!

  • Hallo,


    der Thread ist nun schon ein wenig älter, dennoch ist das Thema aktuell.

    Ich habe ähnliche Probleme mit der Meldungsausgabe. Ist die Wartezeit in der Schleife zu gering oder werden kurz hintereinander Meldungen ausgegeben, so kommt es vor, dass die Variable $MSG_T.VALID nicht mehr auf FALSE zurück fällt. Daher habe ich mir im sps.sub eine kleine Routine geschrieben und wollte fragen, ob das jemand schon so gelöst hat bzw. ob das auf diesem Wege zulässig ist. Die SW-Version ist 5.2.19 auf einem KRC2.



    Wird eine Meldung ausgegeben und fällt der Wert der Variable $MSG_T.VALID nicht innerhalb einer Sekunde auf FALSE, wird der Wert von sps.sub auf FALSE gesetzt. Syntaxfehler gabs keine, ausprobieren konnte ich es allerdings auch noch nicht. Evtl. hat da jemand Erfahrung mit gemacht.


    Gruß
    iRobot

    Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith<br /><br />Ich leide nicht an Realitätsverlust... ich genieße ihn.

  • Hallo iRobot,


    Deine Lösung beinhaltet folgende Probleme :denk::


    1) Wenn es sich um eine Quittierungsmeldung oder eine Dialoganfrage handelt, wird ja $MSG_T.VALID auf FALSE gesetzt, um anzuzeigen, daß die Meldung quittiert wurde. Dein Programm macht das dann automatisch...


    2) Angenommen, daß bei einer Hinweismeldung das automatische Zurücksetzen funktioniert. Na, dann rattert Dein Timer trotzdem weiter :cry:. Und bei der nächsten Meldung, setzt er VALID sofort auf FALSE.


    Also, Idee interessant, die Programmierung sollte verbessert werden.


    Viele Grüße,
    Tilman/Frankreich

  • Hi Tilman,


    zu 1) sollte kein Problem, da ich keine Quittierung benötige. Das sind lediglich Statusmeldungen, die in einem externen Programm abgespeichert werden. Also kein Problem, wenn die Meldung direkt wegquittiert wird.


    zu 2) Ich habe den Code dahingehend angepasst, dass ein Umschalten der Variablen auf FALSE innerhalb der IF-Abfrage abgefangen wird und der Timer nicht bis zum Nimmerleinstag weiterläuft. Entweder schafft es die Systemsoftware den Wert auf FALSE zu setzen, dann wird der Timer gestoppt und resettet. Oder der Timer läuft ab, da es die Systemsoftware nicht schafft, und setzt die Variable zurück und dann wird der Timer resettet.


    Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith<br /><br />Ich leide nicht an Realitätsverlust... ich genieße ihn.

  • Hallo iRobot,


    Du schreibst folgendes:



    Hatten gerade eine lustige Diskussion darüber, ob das überhaupt möglich ist... Ich glaube aber, daß es nicht das ist, was Du willst. Also, die innere Verschachtlung gehört vor/hinter den ersten Test.


    Viele Grüße,
    Tilman

  • Guck mal! So könnte man das machen.


    Code
    IF NOT $MSG_T.VALID THEN ;zeit initialisieren
    $TIMER[2]=-1000
    ENDIF
    $TIMER_STOP[2]=NOT $MSG_T.VALID ;timer on waehrend valid==true
    IF $TIMER_FLAG[2] THEN ;nach 1s, valid zuruecksetzen
    $MSG_T.VALID=FALSE
    ENDIF


    Anmerkung: den Timer könnte man auch die ganze Zeit rattern lassen. Oder man könnte zusätzlich die Bedingung stellen, daß der Typ der Message #NOTIFY ist...


    Ob das wirklich Sinn macht (die Lösung von Hermann funktioniert ja), steht auf einem anderen Blatt...


    Viele Grüße,
    Tilman/Frankreich

    Edited once, last by Tilman ().

  • Du bist mir mit der zweiten Antwort zuvor gekommen :uglyhammer_2:


    Warum sollte das nicht möglich sein? Wenn ich in die äußere IF-Abfrage reinkomme und mein Timer ist größer als 1000, dann setzt er mir die Variable auf FALSE und dann gelange ich in den inneren zweiten Zweig wo der Timer resettet wird. Das einzige Problem dabei ist, wenn mir die Variable außerhalb der IF-Abfrage vom System zurück gesetzt wird, da gebe ich Dir Recht.


    Mögliche Konstellationen:


    1. Die Variable ist zu Beginn des Programmblocks FALSE => der Block wird übersprungen.
    2. Die Variable ist zu Beginn des Programmblocks TRUE => der Block wird betreten, der Timer gestartet, sonst passiert erstmal nichts. Beim nächsten Mal ist die Variable immer noch TRUE, der Block wird wieder betreten, der Timer ist evtl. immer noch nicht so weit. Es passiert wieder nichts. Beim nächsten Mal wird wieder der Block betreten, der Timer hat den Wert überschritten, die Variable wird auf FALSE gesetzt und der Timer dadurch resettet.


    JETZT PROBLEM:
    3. Die Variable ist TRUE, der Block wird betreten, der Timer gestartet. Die Variable wird außerhalb der IF-Abfrage auf FALSE gesetzt: der Block wird nicht mehr betreten und der Timer läuft weiter.


    Ich habe wie von Dir empfohlen die Abfrage hinter den Block gesetzt, damit sollte eigentlich alles erschlagen sein. Dann wird er zwar ständig den Timer stoppen und resetten wollen wenn die Variable FALSE ist, allerdings sollte das ja kein Problem sein.



    Besten Dank schon mal :biggrins:
    iRobot

    Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith<br /><br />Ich leide nicht an Realitätsverlust... ich genieße ihn.


  • Ob das wirklich Sinn macht (die Lösung von Hermann funktioniert ja), steht auf einem anderen Blatt...


    Nein, Sinn würde es machen wenn der Mechanismus funktioniert und man sich über sowas keine Gedanken machen müsste :mrgreen:

    Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith<br /><br />Ich leide nicht an Realitätsverlust... ich genieße ihn.

  • Hallo,


    wieso machst es nicht so?
    Einfach im Hauptprogramm. Du wills es sowieso automatisch quittieren.


    IF $MSG_T.VALID THEN
    WAIT SEC 1.0
    $MSG_T.VALID = FALSE
    ENDIF


    Gruß
    Twister

    Kleinere Wunder werden sofort erledigt... größere nach der Mittagspause...

  • Hi,


    weil ich im Normalfall keine Sekunde warten will. Die Routine in der sps.sub zielt auf den Anwendungsfall ab, dass die Variable nicht wie vorgesehen nach 0,2 (oder weniger) Sekunden vom System auf False gesetzt wird.


    Gruß
    iRobot

    Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith<br /><br />Ich leide nicht an Realitätsverlust... ich genieße ihn.

    Edited once, last by iRobot ().

  • Guten Morgen,


    Twister, das halte ich für keine gute Lösung. :evil: :) Warum?


    In der Dokumentation "Programmieren von Anwendermeldungen" Version 02.97.01 [Gibt es da eigentlich was neueres?] , kann man lesen, wie Hinweismeldungen programmiert werden sollen:



    Was im Hintergrund abläuft, ist nun nicht so einfach... nicht zuletzt, da derselbe Mechanismus auch vom System genutzt wird und sogar sprachabhängig Meldungen aus einer Datenbank gelesen werden können (hat mir Berrad vor kurzem erklärt). Weiterhin muß die Meldung vom Realtime-Kernel über die Cross-Schnittstelle dem BOF übermittelt werden, also vermutlich mit einer Windows Message.


    Das Bewegungsprogramm sollte warten, bis dieser Vorgang abgeschlossen ist. Deswegen die Schleife

    Code
    WHILE $MSG_T.VALID
    WAIT SEC 0.05
    ENDWHILE


    Bis hierhin ist alles ok. Nun aber die Feststellung, daß sich der Roboter sich manchmal in dieser Schleife aufhängt. Deswegen zwei Korrekturen: 1) ein zusätzliches "WAIT SEC 0.2", vor oder hinter der Schleife, so klappt es bei mir 2) ein Counter, um die Meldung noch einmal abzufeuern, falls die Rückmeldung dann doch nicht ankommt.


    Die Idee von iRobot war, den Counter zu vermeiden, und dieselbe Arbeit im Submit-Interpreter auszuführen. Ziel ist es, daß der Roboter sich nicht aufhängt, sondern weiter arbeitet. Ich weiß allerdings nicht (das könnte der Haken an dieser Lösung sein), ob die Meldung dann auch wirklich angezeigt wird.


    Deine Lösung, "Twister", entspricht überhaupt nicht der Spezifikation von Kuka. Bei jeder Meldung wird 1s gewartet (das ist sicher zu lange), und selbst dann ist man sich noch nicht sicher, ob es wirklich geklappt hat.


    Ich mache es jedenfalls so, wie Hermann (und Kuka) es vorgeschlagen haben. Man kann das ganze ja in einer Funktion programmieren, so daß die Anwender die Details dieser Prozedur ignorieren können.



    Schönen Tag,
    Tilman/Frankreich



    PS:


    1) Wolfram würde dann auch noch das GOTO raushauen :D, aber das ist eine andere Diskussion.
    2) Diesmal war iRobot schneller als ich :applaus:

    Edited once, last by Tilman ().

  • Hi,


    ok, da habt ihr mal wieder recht.
    Also wenns auch noch zeitkritisch ist und man solche Probleme hat dann könnte
    man im Hauptprogramm auch nur einzelne Bits setzen und diese im SUBMIT
    zu einer Message wandeln. Dann hättest nie einen Taktzeitverlust.


    Gruß
    Twister

    Kleinere Wunder werden sofort erledigt... größere nach der Mittagspause...

  • Hallo,


    ich hätte noch eine Lösung für das "Teilproblem" des Beendens von nicht stoppen wollenden Schleifen.


    PULSE($OUT[1007],TRUE,1.0) ;nicht benutzter Ausgang
    WAIT FOR (($OUT[1007]==FALSE) OR ($MSG_T.VALID==FALSE))


    Gruß
    Twister

    Kleinere Wunder werden sofort erledigt... größere nach der Mittagspause...

  • @ Tilman


    Hättest du eine Version deiner "veralteten" Doku zur Meldungsprogrammierung? :mrgreen:


    Gruß
    iRobot

    Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith<br /><br />Ich leide nicht an Realitätsverlust... ich genieße ihn.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account
Sign up for a new account in our community. It's easy!
Register a new account
Sign in
Already have an account? Sign in here.
Sign in Now