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