Roboterinterpreter

  • 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

  • Schritt für Schritt zum Roboterprofi!
  • 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

  • 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


  • If Pro_state1 ==#P_Free then
    Einrichten = false
    Endif


    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...


    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

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • 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....

  • anbei das programm
    und die sps.sub

  • 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

  • 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

  • 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..

    Einmal editiert, zuletzt von woodys ()


  • Hast du einen anderen Vorschlag?


    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

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

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


    Theoretisch kann ich doch einfach mal irgend einen $out[x] 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[x] ; 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

  • 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

  • Sorry, hast recht.


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


    Gruess SJX

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • :ylsuper:
    Hey....
    Also hab das ganze getestet....
    Musste noch am ersten IF Block den Timer starten... Zeit anpassen... Das wars.
    Das Ding läuft wie Butter genau so wie ich das brauche :biggrins:


    Danke nochmals... Das war sehr wichtig das es funktioniert


    Grüße

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