Sub Interpreter MODE STAT problem

  • Also auch wenn es heißt, Roboterbahnen können nur vom Roboterkontrolleur interpretiert werden.

    Wollte ich mangels §DIGIN-Befehle einen eine Anpassung der Bahn in bestimmte Achsen machen, mittels Oszillator, ist halt ohne RSI die Standardlösung. Während der Bahnplanung.

    Digout auf ANIN zu mappen, hat so auch nicht gepasst.

    Der Oszillator bietet aber noch eine Datalink-Methode an mit SEN_PREA und SEN_PINT,

    dazu habe ich dann ein Beispiel in der OCCUBOT VI R 1.0 Doku gefunden.


    Der Sensor wird gedruckt, der Roboter passt die Bahn an, aber halt nur dann, wenn ich gerade den Oszillator im TECH.MODE auf Cycle habe.


    Also wollte ich die Routine halt ständig durchlaufen haben, im Hintergrund, während eine Testbahn läuft, abgearbeitet wird.


    Wenn ich dann den Sensor aktiviere, soll der Roboter zu dem Zeitpunkt die Anpassung machen.


    Du siehst also einmal die Bahnabfolge.

    Sobald die Bahn abgearbeitet ist, und die Anpassung nicht mehr erfolgen muss, soll das Hintergrundprogramm halt abgewählt werden, um Störungen zu vermeiden.


    Daher beim ersten Schleifendurchlauf der CWRITE-Start und dann am Ende wieder das Stoppen mit CWRITE

    Einmal editiert, zuletzt von SuS ()

  • Schritt für Schritt zum Roboterprofi!
  • FOR SChleife Anfang to Ende

    Kann schon mal nicht sein, da gibt es sicher einen Syntax Fehler.

    Diese "/../../": weg damit! Das geht auf gar keinen Fall.

    Das 'endfor' kann ich nirgends finden.

    'End' fehlt.

    Soll der Prozess Test1() für alle Schleifendurchgänge laufen oder nur den ersten?

    Die Deklaration von STAT und MODE im Hauptprogramm fehlt, wie auch die anderen Variablen.

    Multisubmit sollte vorhanden sein, sonst macht das '>3' keinen Sinn.


    Und dann fehlt für diesen Stand eine exakte Fehler-/Verhaltensbeschreibung, "geht nicht" reicht leider nicht, die ganzen Glaskugeln sind irgendwie verschollen. ;)

  • /.../.../ waren lediglich als Platzhalte, um hier den genauen Pfad nicht zu zeigen, normal ist der korrekte vollständige Pfad drin. Habs aber schon auf dein Anraten angepasst.


    Das Endfor ist auch im Programm drin, ich habe das hier lediglich von Hand ergänzt, damit klar wird, dass es eine Schleife ist

    Test1() ist ja das Sub-Programm, das soll ja mit CWRITE aufgerufen werden bis zur Abwahl, also dem Ende der Schleifen im Hintergrund, daher muss ich es ja nicht in jeder Schleife neu aufrufen.


    Das Prg der Tesbahn beginnt mit:



    DEF TESTOSCIL3( )

    DECL STATE_T PILLE1; STAT

    DECL MODUS_T PALLE1; MODE

    PALLE1=#SYNC

    MODE1=#SYNC

    ;FOLD INI;{PE}

    ;FOLD BASISTECH IN


    .... ander Dinge ...

    Bahnverlauf


    ....

    END


    Ich hatte wie gesagt STAT_T und Mode_T auch schon in der config deklariert,


    dann schonmal in der SUB

    DEF TEST1( )

    DECL STATE_T STAT1 (hier)

    DECL MODUS_T MODE1

    MODE1=#SYNC

    While SchleifeSubLoop<>1

    TESTLOOP()

    ENDWHILE

    ;FOLD ;%{H};

    END

    ;ENDFOLD


    Und ich hatte es schonmal mit einer Funktion versucht


    DEF Aufruf()

    DECL STATE_T PILLE1; STAT

    DECL MODUS_T PALLE1; MODE


    PALLE1=#SYNC

    CWRITE($CMD,PILLE1,PALLE1,"RUN/R1/TEST1()")

    WAIT FOR $PROG_INFO[3].P_STATE=#P_ACTIVE

    END


    DEF Abwahl()

    DECL STATE_T PILLE1; STAT

    DECL MODUS_T PALLE1; MODE

    PALLE1=#Sync

    CWRITE($CMD,PILLE1,PALLE1,"STOP/R1/TEST1()")

    WAIT FOR $PROG_INFO[3].P_STATE=#P_FREE


    ENDIF

    END


    Keins davon hat richtig funktioniert auch nicht bei


    DEF TEST1( )

    DECL STATE_T Pille (hier)

    DECL MODUS_T Palle

    Palle=#SYNC

    While SchleifeSubLoop<>1

    TESTLOOP()

    ENDWHILE

    ;FOLD ;%{H};

    END

    ;ENDFOLD


    daher verstehe ich es nicht und laut anleitung steht da eigentlich


    Sub()

    DECL STAT_T Stat

    DECL Modus_T Mode

    Mode=#SYNC


    der code




    und Im Hauptprg


    Cwrite($CMD, State, Mode, "Run/Pafd/Filename()"))

    Wait funktion


    und dann solls laufen...





    Ich mein Ich habe drei Möglichkeiten dieses MODE und State zu deklarieren ggf. noch in der Dat

    das ist in der Config, im Hauptprogramm und in der Sub,

    dann muss ich Mode ja noch sagen, dass es Synchron sein soll mit #SYNC


    Wie siehts denn richtig aus? Eigentlich habe ich ja alle Möglichkeiten wegen Pille-Palle durch


    Es kann auch ein anderes Beispil sein, aber die Struktur ist ja immer die gleiche eigentlich, daher versteh ich nicht warums nicht laufet

  • Submitmodul TEST1.SUB , das gestartet werden soll:

    Code
    DEF test1( )
    
    while true
     if startsim then
      i[1]=i[1]+1
     endif
    endwhile
    
    
    END

    Dat-Datei des Hauptprogramms TESTPROG.DAT:

    Code
    DEFDAT testprog public
     decl int schleife=1         ; diese Var. ist Modulglobal
     GLOBAL BOOL startsim=false  ; diese ist Systemglobal
    ENDDAT

    Testprogramm TESTPROG.SRC

    Den ganzen Brimborium mit CWRITE kann man sich auch sparen, wenn man das TEST1() ein Mal als parallele Task EX1 zuweist und startet.


    Im TESTPROG.DAT sieht man auch die zweite Möglichkeit Variable systemglobal zu deklarieren (wenn man es nicht im $config.dat deklarieren möchte).


    Wenn man sich dann i[1] in der Variablenansicht ansieht, dann kann man schön sehen wie das inkrementiert wird, solange die Variable startsim auf true sitzt.


    Edit: noch ein WAIT FOR ($PROG_INFO[3].P_STATE == #P_ACTIVE) eingefuegt.

  • /.../.../ waren lediglich als Platzhalte, um hier den genauen Pfad nicht zu zeigen, normal ist der korrekte vollständige Pfad drin. Habs aber schon auf dein Anraten angepasst.

    Ganz schlecht, es muss immer der exakte Code angegeben werden. Es kommt immer auf jedes einzelne Zeichen an!

    In diesem Fall schreibt man es ganz genau so, wie in meinem Beispiel oben, und zwar vollkommen egal in welchem Pfad das Programm liegt (es muss halt unterhalb vom /R1/ liegen.


    Das Endfor ist auch im Programm drin, ich habe das hier lediglich von Hand ergänzt, damit klar wird, dass es eine Schleife ist

    Siehe meinen Satz oben.


    Test1() ist ja das Sub-Programm, das soll ja mit CWRITE aufgerufen werden bis zur Abwahl, also dem Ende der Schleifen im Hintergrund, daher muss ich es ja nicht in jeder Schleife neu aufrufen.

    Siehe auch meinen Satz oben, und ich verstehe es immer noch nicht. Soll das jetzt erst nach dem Schleifenende angehalten werden, oder nach dem ersten Durchlauf?

    Wenn es erst nach allen Schleifendurchläufen angehalten werden soll, dann darf es nicht am Anfang jedes Durchlaufs gestoppt werden, aber nur beim ersten auch gestartet. Dann läuft es nämlich nur beim ersten Durchlauf. Da sind wir wieder beim fehlenden endfor, und der absolut exakten Codeangabe und der exakten Fehlerbeschreibung, die wieder fehlt.

    Keins davon hat richtig funktioniert auch nicht bei

    'Funktioniert auch nicht' IST KEINE FEHLERBESCHREIBUNG.

  • Es geht auch:

    Submitmodul TEST1.SUB , das gestartet werden soll:

    Code
    DEF test1( )
     while true
      if startsim then
       i[1]=i[1]+1
      endif
     endwhile
    END

    Dat-Datei des Hauptprogramms TESTPROG.DAT:

    Code
    DEFDAT testprog public
     decl int schleife=1         ; diese Var. ist Modulglobal
     GLOBAL BOOL startsim=false  ; diese ist Systemglobal
     DECL STATE_T STAT           ; diese Variable ist Modulglobal
     DECL MODUS_T MODE           ; Modulglobal
    ENDDAT

    Testprogramm TESTPROG.SRC:


    Variablen müssen selbstredend dort bekannt sein, wo sie benutzt werden.

    Es nutzt also nichts, wenn man die Variable 'STAT' im Submit-Modul deklariert, aber im Hauptprogramm benutzen will, das geht nicht.

  • Ganz schlecht, es muss immer der exakte Code angegeben werden. Es kommt immer auf jedes einzelne Zeichen an!

    Ist verständlich, ich darf aber nicht überall alles reinposten, ich wollte aber jetzt einfach wissen wie es funktioniert


    Danke für die Code-Abschnitte, das hat jetzt auf jedenfalls geklappt und hätte mir vorher richtig gewusst ein Haufen Zeit gespart, ich wär am liebsten gegangen, weil man sieht ja es war nicht "so viel notwendig".


    Um die Frage zu beantworten, es soll innerhalb des Arbeitsweges des Roboters laufen und danach nicht mehr.

    Da Du es ja über simstart löst könnte ich hier auch einfach die simstart loop nutzen und da den Aufruf machen und die Variabel halt am Ende des Weges kopieren als False und dann das Programm erneut abwählen.


    Es hat mir auf jeden Fall schonmal ziemlich weitergeholfen.


    Mit der Deklaration als parallelen Task hatte ich hier allerdings auch noch keine Doku gefunden, schaue ich ein anderes Mal nach.


    Vielen Dank

  • Ist verständlich, ich darf aber nicht überall alles reinposten

    Dann sollte man von Anfang darauf hinweisen, dass da etwas nicht dem exakten Code entspricht, ansonsten darf man sich nicht wundern, wenn man keine wirklich passenden Antworten bekommt. Spätestens nachdem ich darauf hingewiesen habe dass das da nicht hingehört, und nicht erst nach der x-ten Nachfrage. Es ist nun mal jede Kleinigkeit entscheidend. Das verwirrt enorm und führt über kurz oder lang zur Ignoranz diverser Posts/Postersteller meinerseits. :jawohl:

    Mit der Deklaration als parallelen Task hatte ich hier allerdings auch noch keine Doku gefunden, schaue ich ein anderes Mal nach.

    Das passiert doch schon mit diesem CWRITE Befehl. Man kann es halt auch manuell über das grüne 'S' oben erledigen. Dann läuft der Prozess solange man ihn abwählt, entweder manuell oder mit einem CWRITE Befehl.

    Um die Frage zu beantworten, es soll innerhalb des Arbeitsweges des Roboters laufen und danach nicht mehr.

    Das ist wieder keine Antwort auf meine Frage.

    Ich habe gefragt:

    Soll das jetzt erst nach dem Schleifenende angehalten werden, oder nach dem ersten Durchlauf?

    Was ist denn jetzt schon wieder der Arbeitsweg? Aber egal, das Problem scheint ja gelöst.

  • Sorry ja bis die Schleife zu Ende ist.

    Aber das passt, ich habe jetzt noch was anderes,der Oszillator hat eine TECH[1].Mode und der wäre jetzt halt schreibgeschützt.... kann natürlich am Interpreter liegen, dann ist es halt so

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