20. Januar 2019, 19:13:37
Roboterforum.de - Die Industrieroboter- Anwender und Experten Community

 Problem mit "$MSG_T.VALID"


hot_post Autor Thema:  Problem mit "$MSG_T.VALID"  (Gelesen 4738 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

27. Januar 2005, 09:37:05
Gelesen 4738 mal

mhuebn

Gast
Hallo zusammen,
 ich habe ein Problem mit der Nachrichtenfunktion von KRL.
 
 Von Zeit zu Zeit bleibt das Programm in folgender Schleife hängen:
  WHILE $MSG_T.VALID == TRUE
 WAIT sec 0.05
 ENDWHILE  
Kann mir da vieleicht jemand weiterhelfen?
 
 Danke, M. Hübner
  • gefällt mir    Danke

Heute um 19:13:37
Antwort #1

Werbung

Gast

28. Januar 2005, 18:57:16
Antwort #1
Offline

waldbauernbua


Hi, das Problem müßte vom Vorlaufzeiger kommen, Verlängere einfach die Wartezeit.
 wait sec 0,5
 oder evtl. höher
 
 Gruß
  • gefällt mir    Danke

31. Januar 2005, 13:22:41
Antwort #2
Offline

elias


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
  • gefällt mir    Danke
IF ROBOTER_STEHT AND SPS_VORHANDEN THEN
   WHILE NOT ROBOTER_LAEUFT
      $LOOP_MSG[]="SPS IST SCHULD!"
   ENDWHILE
   $LOOP_MSG[]="                              "
ENDIF

Geld ohne Arbeit! Keine Arbeit ohne Geld!

06. Februar 2005, 18:32:14
Antwort #3
Offline

Hermann


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<20))
 ;because sometimes valid does not change to false
 COUNTER=COUNTER+1
 WAIT SEC 0.2
 ENDWHILE
 WAIT SEC 0.2
 IF COUNTER>=20 THEN
 GOTO NOCHM
  • gefällt mir    Danke

07. Februar 2005, 12:14:32
Antwort #4

mhuebn

Gast
Wo ist
  :NOCHM  ?
  • gefällt mir    Danke

Heute um 19:13:37
Antwort #5

Werbung

Gast

07. Februar 2005, 23:32:54
Antwort #5
Offline

Hermann


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=ERR_TEXT[NR].TEXT
 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<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>=20 THEN
 GOTO NOCHM
 ENDIF
  • gefällt mir    Danke

08. Februar 2005, 11:01:43
Antwort #6
Offline

elias


Danke!!!!
 mffg elias
  • gefällt mir    Danke
IF ROBOTER_STEHT AND SPS_VORHANDEN THEN
   WHILE NOT ROBOTER_LAEUFT
      $LOOP_MSG[]="SPS IST SCHULD!"
   ENDWHILE
   $LOOP_MSG[]="                              "
ENDIF

Geld ohne Arbeit! Keine Arbeit ohne Geld!

28. Februar 2011, 08:40:24
Antwort #7
Offline

iRobot


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.

        ;***************************************
        ; $MSG_T.VALID Fehler korrigieren
        ;***************************************
        IF ($MSG_T.VALID == TRUE) THEN
            IF ($TIMER_STOP[2] == TRUE) THEN
                $TIMER_STOP[2] = FALSE
            ENDIF
           
            IF ($TIMER[2] > 1000) THEN
                $MSG_T.VALID = FALSE
                $TIMER_STOP[2] = TRUE
                $TIMER[2] = 0
            ENDIF
        ENDIF

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
  • gefällt mir    Danke
Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith

Ich leide nicht an Realitätsverlust... ich genieße ihn.

28. Februar 2011, 09:28:03
Antwort #8

Tilman

Gast
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
  • gefällt mir    Danke

Heute um 19:13:37
Antwort #9

Werbung

Gast

28. Februar 2011, 13:21:41
Antwort #9
Offline

iRobot


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.

        ;***************************************
        ; $MSG_T.VALID Fehler korrigieren
        ;***************************************
        IF ($MSG_T.VALID == TRUE) THEN
            IF ($TIMER_STOP[2] == TRUE) THEN
                $TIMER_STOP[2] = FALSE
            ENDIF
           
            IF ($TIMER[2] > 1000) THEN
                $MSG_T.VALID = FALSE
            ENDIF
           
            IF ($MSG_T.VALID == FALSE) THEN
                $TIMER_STOP[2] = TRUE
                $TIMER[2] = 0
            ENDIF
        ENDIF
  • gefällt mir    Danke
Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith

Ich leide nicht an Realitätsverlust... ich genieße ihn.

28. Februar 2011, 13:36:59
Antwort #10

Tilman

Gast
Hallo iRobot,

Du schreibst folgendes:

IF ($MSG_T.VALID == TRUE) THEN

               ...

IF ($MSG_T.VALID == FALSE) THEN
....
ENDIF

ENDIF

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
  • gefällt mir    Danke

28. Februar 2011, 14:14:09
Antwort #11

Tilman

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

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
« Letzte Änderung: 28. Februar 2011, 14:35:08 von Tilman »
  • gefällt mir    Danke

28. Februar 2011, 14:38:59
Antwort #12
Offline

iRobot


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.

        ;***************************************
        ; $MSG_T.VALID Fehler korrigieren
        ;***************************************
        IF ($MSG_T.VALID == TRUE) THEN
            IF ($TIMER_STOP[2] == TRUE) THEN
                $TIMER_STOP[2] = FALSE
            ENDIF
           
            IF ($TIMER[2] > 1000) THEN
                $MSG_T.VALID = FALSE
            ENDIF
        ENDIF
       
        IF ($MSG_T.VALID == FALSE) THEN
            $TIMER_STOP[2] = TRUE
            $TIMER[2] = 0
        ENDIF

Besten Dank schon mal  :biggrins:
iRobot
  • gefällt mir    Danke
Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith

Ich leide nicht an Realitätsverlust... ich genieße ihn.

Heute um 19:13:37
Antwort #13

Werbung

Gast

28. Februar 2011, 14:57:25
Antwort #13
Offline

iRobot



Nein, Sinn würde es machen wenn der Mechanismus funktioniert und man sich über sowas keine Gedanken machen müsste  :mrgreen:
  • gefällt mir    Danke
Never argue with an idiot. He will lower you to his level and beat you with experience. - Bob Smith

Ich leide nicht an Realitätsverlust... ich genieße ihn.

28. Februar 2011, 20:39:33
Antwort #14
Offline

Twister


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
  • gefällt mir    Danke
Kleinere Wunder werden sofort erledigt... größere nach der Mittagspause...


Teile per facebook Teile per linkedin Teile per pinterest Teile per reddit Teile per twitter
 

über das Roboterforum

Nutzungsbedingungen Impressum Datenschutzerklärung

Sponsoren des Roboterforums

ROBTEC GmbH