Problem mit $MSG_T Message

  • Hallo zusammen,
    ich hab mal wieder ein Frage und zwar zu $MSG_T. Ich habe eine Routine KCPDialog(...) geschrieben, mit welcher ich die vier möglichen Meldungsarten (NOTIFY, STATE, QUIT, DIALOG) am KCP ausgeben kann (abgespeckte Version siehe unten). Desweiteren habe ich eine Routine KCPDialogClear() geschrieben, mit welcher ich eine STATE (Zustandsmeldung) wieder löschen kann (siehe unten). Soweit so gut, das funktioniert ganz gut, bis auf seltene Fälle: Wenn ich den Roboter ausschalte (Hauptschalter) und wieder hochfahre, steht die letzte angezeigte Zustandsmeldung noch da. Starte ich nun mein Programm und will die Meldung mit KCPDialogClear() löschen, hängt er sich manchmal in der Zeile WAIT FOR $MSG_T.VALID==FALSE auf, weil die Variable $MSG_T.VALID nicht auf FALSE geht, obwohl ich in der Zeile davor $MSG_T.RELEASE=TRUE gesetzt habe.
    Hatte das bei einer IBN auch schon mal, hab mir aber nichts bei gedacht und hab die Zeile mal eben übersprungen. Da lief es weiter. Nun ist es beim Kunden aufgetreten, und das ist natürlich nicht so toll.


    Was kann ich da unternehmen um da wieder raus zu kommen? Oder wie macht ihr das um eine Zustandsmeldung wieder zur löschen?


    Gruß HarryH



    GLOBAL DEF Hauptprogramm()
    KCPDialog ("Dieser Text wird ausgegeben", #STATE, #NoDialog)
    END



    GLOBAL DEF KCPDialog (stText[]:IN, eMSGType:IN, eKeyType:IN)
    DECL CHAR stText[]
    DECL enumMSGType eMSGType
    DECL enumKeyType eKeyType
     
    KCPDialogClear()
    $MSG_T.RELEASE=FALSE

    SWITCH eMSGType
    CASE #NOTIFY
    ; HINWEISMELDUNG
    ;
    CASE #STATE
    ; ZUSTANDSMELDUNG
    $MSG_T.TYP=#STATE
    $MSG_T.KEY[]=stText[]
    $MSG_T.VALID=TRUE
    ;
    CASE #QUIT
    ; QUITTIERMELDUNG
    CASE #DIALOG
    ; DIALOGMELDUNG
    ENDSWITCH
    END



    GLOBAL DEF KCPDialogClear()
    DECL BOOL bDummy
     
    $MSG_T.RELEASE=TRUE
    WAIT FOR $MSG_T.VALID==FALSE
    WAIT SEC 0.2
    $MSG_T.RELEASE=FALSE
    $MSG_T.KEY[]=" "
    $MSG_T.DLG_FORMAT[]=" | "
    END

  • Schritt für Schritt zum Roboterprofi!
  • Bekannte Problem, dass sich durch alle KRC Versionen zieht.


    Beheben kann mann es zum Beispiel dadurch indem mann die Sache einfach nochmal probiert, wenn $MSG_T.Valid <> False.
    Zum Beispiel in einer Zaehlschleife mit kleiner Wartezeit, aus der man ausspringt, wenn $MSG_T.Valid=True wird.


    Gruss Stefan

  • Das ist ja toll :down:



    Zum Beispiel in einer Zaehlschleife mit kleiner Wartezeit, aus der man ausspringt, wenn $MSG_T.Valid=True wird.


    Meintest du $MSG_T.Valid=FALSE ?


    Also könnte ich das so machen?:


    GLOBAL DEF KCPDialogClear()
     
    $MSG_T.RELEASE=TRUE


    WHILE $MSG_T.VALID==TRUE
    $MSG_T.RELEASE=FALSE
    WAIT SEC 0.1
    $MSG_T.RELEASE=TRUE
    WAIT SEC 0.1
    ENDWHILE


    $MSG_T.RELEASE=FALSE
    END

    Einmal editiert, zuletzt von HarryH ()

  • Genau so!
    Eine Fehlerbehandlung, wenn $msg_t.Valid nie mehr false wird wuerde ich auch noch einbauen (ich weis nicht,ob das jemals passiert - man weis ja nie).
    Kuka eben - immer kleine Ueberaschungen!


    Gruss Stefan

  • Ich hab da noch was im Forum gefunden:



    hier wird vorgeschlagen, nach Fehler die Meldung nochmal loszuschiessen.


    Gruss Stefan

  • Auch auf die Gefahr hin mich lächerlich zu machen würde mich interessieren wo der Umgang mit Meldungen dokumentiert ist. Das Einzige, was ich bisher gefunden habe ist die Aufzählung im Dokument Systemvariablen.


    Inzwischen wende ich Dialogmeldungen zur Interaktion und Zustandsmeldungen recht sicher an, allerdings nur, da ich das Glück hatte Beispielsprogramme zu sehen und mir den Rest aus den Fingern sog.


    Kurz gesagt: Gibt oder gab es mal ein solches Dokument? Die Dokumentationen werden subjektiv ja immer knapper.

  • Hallo allerseits.


    Ich glaube eine einfache, saubere und definitive Lösung zum Problem gefunden zu haben. Zumindest funktioniert sie an meiner KRC1 (v4.1.7 SP08) tadellos. Die Lösung mit dem COUNTER hat bei mir nämlich gar nichts gebracht. Das Programm ist damit einfach nur endlos in der Zählerschleife gelaufen, da $MSG_T.VALID auch nach x Aufrufen der Meldung nie FALSE wurde.

    Was aber bei mir geholfen hat, ist einfach ein WAIT SEC 0.2 hinter dem Setzen des Meldungstyps. Also z.B.:



    Code
    $MSG_T.TYP=#STATE
    WAIT SEC 0.2


    Zusätzlich solltet ihr bei Statusmeldungen ein WAIT SEC 0.5 hinter $MSG_T.RELEASE=TRUE setzen, denn meiner Analyse nach bleibt das Programm immer dann in der WHILE-Schleife hängen, wenn der Release einer Statusmeldung nicht geklappt hat oder einfach im Programm fehlt. Dies erkennt man daran, dass die Statusmeldung im Meldungsfenster nicht verschwindet wenn sie sollte. Die Wartezeit hinter dem Release verringert die Häufigkeit mit der das Release ausfällt. Sollte es dennoch passieren löst die Wartezeit hinter $MSG_T.TYP das Problem.


    Auf die Lösung bin ich gekommen, weil mir aufgefallen ist, dass die original MSG_DEMO.src aus dem TP-Verzeichnis in der Ablaufart "Inkremental Step" einwandfrei lief. In den anderen Ablaufarten dagegen funktionierte das Programm nicht zuverlässig. Ich schlussfolgerte, dass der Steuerung irgendein Schritt zu schnell ging und setzte einfach hinter jede Zeile ein WAIT SEC 0.2 und siehe da das Problem war gelöst. Anschließend habe ich die Wartezeiten Schritt für Schritt wieder entfernt und beim $MSG_T.TYP tauchte das Problem wieder auf.

    Hier also meine Version der MSG_DEMO.src. Wäre cool zu wissen ob das auch bei anderen funktioniert.


    2 Mal editiert, zuletzt von Loulli ()

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden