23. Juli 2019, 09:42:59
Roboterforum.de - Die Industrieroboter- Anwender und Experten Community

[gelöst] Roboterinterpreter


hot_post_locked Autor Thema: [gelöst] Roboterinterpreter  (Gelesen 2829 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

21. Februar 2019, 18:26:33
Gelesen 2829 mal
Offline

woodys


Servus mal wieder....
Ich hab ein Problem mit dem robotetinterpreter....

Ich möchte eine Variable setzen wenn das Programm abgewählt wird...
Das mach ich in der SPS.SUB mit

Pro_state1 ==#P_Free.....

Das funktioniert auch! Aber
Wenn ich im angewählten Programm zurück setze habe ich den selben Wert warum?

Es scheint so das Pro_state1 ==#P_reset
Die gleiche Funktion hat... Das funktioniert dort auch....

Weshalb ist das so?

Grüße
« Letzte Änderung: 28. Februar 2019, 18:53:12 von Roland Keller »
  • gefällt mir    Danke

Heute um 09:42:59
Antwort #1

Werbung

Gast

21. Februar 2019, 21:33:25
Antwort #1
Offline

SJX

Global Moderator
Hallo woodys,

Überprüfst Du den Status von $PRO_STATE1 über die Variablenkorrektur oder wie kommst Du darauf?
Da auf "Aktualisieren" gestellt?
Wenn Du dann startest, stoppst, etc, nimmt er da mindestens die entsprechenden Statis an?

Laut Dokubeschrieb sollte dies definitiv nicht so sein.

Oder verstehe ich Dein Problem nicht, hast es nicht eindeutig geschrieben...…
Code würde vieles klären...


Gruss SJX
« Letzte Änderung: 21. Februar 2019, 21:38:50 von SJX »
  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

21. Februar 2019, 22:19:16
Antwort #2
Offline

woodys


Hi ja du hast es schon richtig verstanden....

Ich setze irgendwo im Programm eine Variable z. B. Einrichten = True

I'm SPS.SUB steht dann...

If Pro_state1 ==#P_Free then
Einrichten = false
Endif

Wenn ich das Programm abwähle dann ist einrichten =false!

Sieht man unter anzeige... Variablen....

Wenn ich das Programm wieder anwähle und frage die Variable ab dann ist sie auch False!
Soweit so gut....

Mein Problem ist aber wie oben beschrieben wenn ich einrichten auf true setze... Uns ich setze das Programm zurück ohne Abwahl dann ist die Variable auf false! Was nicht sein kann...

In der SPS.SUB steht unter
If Pro_state1 ==#P_reset then
Steht was anderes drin...
Endif
  • gefällt mir    Danke

21. Februar 2019, 23:05:30
Antwort #3
Offline

SJX

Global Moderator

100% Sicher, dass es nur von dieser IF.... Abfrage kommen kann?
Keine Interrupts oder so, die dies auch auslösen könnten? (Prog von Dir geschrieben?)
Sonst würde ich ne Dummyvariable kreieren und diese auch in die IF Anweisung schreiben und verfolgen, ob das gleiche verhalten erkennbar ist.

Ab V8.3 muss es noch $PROG_INFO[] geben. Kamm mit Multisubmit.
Solltest das gleiche erreichen können mit:

IF $PROG_INFO[1].P_STATE == #P_FREE THEN

Gruss SJX

  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

22. Februar 2019, 19:03:34
Antwort #4
Offline

woodys


Hi ja zu 100 % das Programm habe ich geschrieben.... War heute bei einem anderen robby dran... Da ist das selbe!

Mit pro__info bin ich irgendwie auch nicht weitergekommen.. War etwas genervt heute  :kopfkratz:

Geh morgen noch mal ran...

Die Logik dahinter ist wenn man ein Programm anwählt ist der einrichter gezwungen das Programm abzufahren. Die Variable wird am Ende des Programms gesetzt.

Am Anfang des Programms muss der einrichter ein Dialog beantworten, ob er das Programm abgefahren hat.
Wenn er es nicht getan hat gibt es keine Freigabe das Programm automatisch zu starten.

Es kommt halt immer vor das falsche Programme angewählt werden die zum Produkt nicht passen und craschs passieren!

Wenn ich es morgen nicht vergesse kann ich mal ein Code schicken....
  • gefällt mir    Danke

Heute um 09:42:59
Antwort #5

Werbung

Gast

26. Februar 2019, 15:55:53
Antwort #5
Offline

woodys


anbei das programm
und die sps.sub


&ACCESS RVO
&REL 39
&COMMENT PLC on control
DEF  SPS ( )
  ;FOLD DECLARATIONS
  ;FOLD BASISTECH DECL
  ;Automatik extern
  DECL STATE_T STAT
  DECL MODUS_T MODE
  ;ENDFOLD (BASISTECH DECL)
  ;FOLD USER DECL
  ; Please insert user defined declarations

  ;ENDFOLD (USER DECL)
  ;ENDFOLD (DECLARATIONS)
  ;FOLD INI
  ;FOLD AUTOEXT INIT
  INTERRUPT DECL 91 WHEN $PRO_STATE1==#P_FREE DO RESET_OUT ()
  INTERRUPT ON 91
  $LOOP_MSG[]="                                                            "
  MODE=#SYNC
  $H_POS=$H_POS
  ;Automatik extern
  IF $MODE_OP==#EX THEN
    CWRITE($CMD,STAT,MODE,"RUN /R1/CELL()")
  ENDIF
  ;ENDFOLD (AUTOEXT INIT)
  ;FOLD BACKUPMANAGER PLC INIT
  BM_ENABLED = FALSE
  BM_OUTPUTVALUE = 0
  ;ENDFOLD (BACKUPMANAGER PLC INIT)
  ;FOLD TQM_INIT
    TorqueDefinitions()
  ;ENDFOLD (TQM_INIT)
  ;FOLD USER INIT
  ; Please insert user defined initialization commands

  ;ENDFOLD (USER INIT)
  ;ENDFOLD (INI)

  LOOP
    WAIT FOR NOT($POWER_FAIL)
    TORQUE_MONITORING()
    ;FOLD BACKUPMANAGER PLC
    IF BM_ENABLED THEN
      BM_OUTPUTSIGNAL = BM_OUTPUTVALUE
    ENDIF
    ;ENDFOLD (BACKUPMANAGER PLC)
    ;FOLD USER PLC
    ;Make your modifications here
IF $Pro_State1 == #P_Free THEN
b_Einrichten_Fertig=False
$OUT[40] = False
endif
IF $Pro_State1 == #P_Stop THEN
$OUT[40]=False
endif
IF $Flag[1] THEN
b_Einrichten_Fertig=TRUE
endif
IF ($Pro_State1 == #P_Stop) AND ($MODE_OP==#AUT)  THEN
$DRIVES_ENABLE=TRUE
endif
IF $Pro_State1 == #P_Reset THEN
b_Reset=TRUE
;FOLD OUT 11 'a_Werkzeugbereich_frei' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:11, 3:a_Werkzeugbereich_frei, 5:TRUE, 6:
$OUT[11]=TRUE
;ENDFOLD
;FOLD OUT 12 'a_Werkzeugbereich_frei' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:12, 3:a_Werkzeugbereich_frei, 5:TRUE, 6:
$OUT[12]=TRUE
;ENDFOLD
;FOLD OUT 13 'a_Werkzeug_schließen' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:13, 3:a_Werkzeug_schließen, 5:TRUE, 6:
$OUT[13]=TRUE
;ENDFOLD
;FOLD OUT 14 'a_Werkzeug_öffnen' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:14, 3:a_Werkzeug_öffnen, 5:TRUE, 6:
$OUT[14]=TRUE
;ENDFOLD
;FOLD OUT 15 'a_SGM_ohne_Handling' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:15, 3:a_SGM_ohne_Handling, 5:TRUE, 6:
$OUT[15]=TRUE
;ENDFOLD
;FOLD OUT 16 'a_Auswerfer_zurück' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:16, 3:a_Auswerfer_zurück, 5:TRUE, 6:
$OUT[16]=TRUE
;ENDFOLD
;FOLD OUT 17 'a_Auswerfer_vor' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:17, 3:a_Auswerfer_vor, 5:TRUE, 6:
$OUT[17]=TRUE
;ENDFOLD
;FOLD OUT 18 'a_Kernzug_1_einfahren' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:18, 3:a_Kernzug_1_einfahren, 5:TRUE, 6:
$OUT[18]=TRUE
;ENDFOLD
;FOLD OUT 19 'a_Kernzug_1_ausfahren' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:19, 3:a_Kernzug_1_ausfahren, 5:TRUE, 6:
$OUT[19]=TRUE
;ENDFOLD
;FOLD OUT 20 'a_Kernzug_2_einfahren' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:20, 3:a_Kernzug_2_einfahren, 5:TRUE, 6:
$OUT[20]=TRUE
;ENDFOLD
;FOLD OUT 21 'a_Kernzug_2_ausfahren' State=TRUE;%{PE}%R 8.3.40,%MKUKATPBASIS,%COUT,%VOUTX,%P 2:21, 3:a_Kernzug_2_ausfahren, 5:TRUE, 6:
$OUT[21]=TRUE
;ENDFOLD
endif
IF $IN[12] == True THEN
b_Werkzeug_geschlossen = True
ENDIF
IF $IN[34] == False THEN
b_Stoerung_Absaugung = True
endif


    ;ENDFOLD (USER PLC)
  ENDLOOP
  ;FOLD ;%{H}
  ;FOLD
END
  ;ENDFOLD


DEF  RESET_OUT ( )
  INT N
  MsgLoop(" ")
  IF REFLECT_PROG_NR == 1 THEN
    FOR N = 0 TO PGNO_LENGTH - 1
      $OUT[PGNO_FBIT_REFL + N] = FALSE
    ENDFOR
  ENDIF
  IF (PGNO_REQ>0) THEN
    $OUT[PGNO_REQ]=FALSE
  ELSE
    IF (PGNO_REQ<0) THEN
      $OUT[-PGNO_REQ]=TRUE
    ENDIF
  ENDIF
END

;FOLD USER SUBROUTINE
; Integrate your user defined subroutines

;ENDFOLD (USER SUBROUTINE)
;ENDFOLD
« Letzte Änderung: 26. Februar 2019, 20:21:59 von Roland Keller »
  • gefällt mir    Danke

26. Februar 2019, 16:57:54
Antwort #6
Offline

Programmiersklave


Schreib einfach mal temporär in die RESET_OUT(), dass er dir irgendwas pulsen soll, was Du mitkriegst. Die Routine wird ja von Interrupt 91 aufgerufen, und der reagiert auch auf (Pro_State1 WIRD #P_FREE).
Wenn bei jedem Rücksetzen also der Puls kommt, dann weißt Du, dass es am System liegt und der Dir das Rücksetzen kurzzeitig als "Abgewählt" interpretiert. In dem Fall kannste auf die Art nix machen. Dann kannste nur gucken, wie lange abgewählt ansteht, und erst dann reagieren, wenn es drei Zyklen (oder so) der Fall war.
Ich vermute fast, dass er im nächsten Takt wieder auf P_RESET steht.

Grüße,
Michael
  • gefällt mir    Danke

26. Februar 2019, 17:22:41
Antwort #7
Offline

woodys


Bin jetzt zuhause...kann es gerade nicht testen...
Seit Tagen zerbrech ich mir den Kopf das irgendwie lösen zu können....

Es muss doch irgendwie möglich sein...
  • gefällt mir    Danke

26. Februar 2019, 19:41:46
Antwort #8
Offline

SJX

Global Moderator
Hallo woodys,

Du hast noch ein weiteres Problem.

Wenn das $FLAG[1]=True gesetzt wird im Prog Förderband()  (Fall 1x durch.....),
wird Dir ab dann der sps.sub  b_Einrichten_Fertig=TRUE pollen.

Wenn Du dann noch Prog abwählst, wird innerhalb 8 Submitzeilen geswitcht FALSE / TRUE.
Wenn Du dann ein anderes Programm anwählst, wird $FLAG[1] immer noch TRUE sein und er pollt b_Einrichten_Fertig=TRUE. Also nichts mit Deinem Part mit Abfrage.

Wie viele Leute haben schon an diesem Prog / Robi gearbeitet?
Struktur und Übersicht würde mir komplett fehlen.  :denk: :denk: :denk:

Gruss SJX


  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

Heute um 09:42:59
Antwort #9

Werbung

Gast

26. Februar 2019, 20:14:17
Antwort #9
Offline

woodys


Das mit der Variable einrichten... Kam von mir!

Ich habe das nur mal so stehen lassen weil ich nicht mehr weiter weiß.... Wenn ich in der nächsten Zeit nicht mehr weiter komme dann entferne ich das wieder.. Ganz klar...

Hast du einen anderen Vorschlag?

Meinst du die Struktur in der SPS.SUB?

Die src Datei war komplett von mir..
« Letzte Änderung: 26. Februar 2019, 20:17:03 von woodys »
  • gefällt mir    Danke

27. Februar 2019, 18:24:50
Antwort #10
Offline

SJX

Global Moderator

Der Vorschlag von Programmiersklave betreffend "kurzzeitig als abgewählt interpretiert" sollte vermutlich die Lösung bringen.
Kriegst Du den Code dazu hin in der sps.sub?

Gruss SJX
  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

27. Februar 2019, 19:13:43
Antwort #11
Offline

woodys


Hi sorry... Konnte heute leider nicht ran... Aber morgen wieder!

Theoretisch kann ich doch einfach mal irgend einen $out
  • pulsen oder? Spielt das eine Rolle wo ich diesen Ausgang pulsen soll? Zwischen dem IF Block?


Also in sub schreibe ich...

IF $Pro_State1 == #P_Free THEN
b_Einrichten_Fertig=False
$OUT[40] = False
endif

IF Pro_state1 ==#P_reset THEN
b_Einrichten_Fertig=True
Endif

Das flag lass ich dann weg.....


DEF  RESET_OUT ( )
  INT N
  MsgLoop(" ")
  IF REFLECT_PROG_NR == 1 THEN
    FOR N = 0 TO PGNO_LENGTH - 1
      $OUT[PGNO_FBIT_REFL + N] = FALSE
    ENDFOR
  ENDIF
  IF (PGNO_REQ>0) THEN
    $OUT[PGNO_REQ]=FALSE
  ELSE
    IF (PGNO_REQ<0) THEN
      $OUT[-PGNO_REQ]=TRUE
    ENDIF
  ENDIF
END
Pulse $out
  • ; Ausgang pulsen.....


Das heißt jetzt wenn die SPS.SUB den Ausgang pulsen muss dass dann noch Zeit bleibt die variable auf true zu schalten? Ich hoffe ich habe das verstanden

Grüße
  • gefällt mir    Danke

27. Februar 2019, 20:35:45
Antwort #12
Offline

SJX

Global Moderator

Hallo Woodys,
studier mal attached.
so auf die art muss #p_free eine gewisse zeit anstehen, dass deine Variable false gesetzt wird.
Timernummer kannste selber wählen, zeit anpassbar
natürlich ungetestet.

Gruess SJX
  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

Heute um 09:42:59
Antwort #13

Werbung

Gast

27. Februar 2019, 21:05:03
Antwort #13
Offline

woodys


 :supi:
Danke für die Info ich kann es soweit nachverfolgen... Aber eins ist mir noch aufgefallen... Wann starte ich den Timer? Der wird bis jetzt nur gestoppt...

Ich werde es einfach mal probieren morgen...
« Letzte Änderung: 27. Februar 2019, 21:11:20 von woodys »
  • gefällt mir    Danke

27. Februar 2019, 22:22:36
Antwort #14
Offline

SJX

Global Moderator
Sorry, hast recht.

ist Zeile nach:
$TIMER[1] = 0
$TIMER_STOP[1]= FALSE

Gruess SJX
  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.


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