Posts by Hermann

    Na, da hab ich einfach zu viel in die Frage reininterpretiert, und den subtilen Hinweis, auf was auch immer, falsch verstanden. Wollte halt nur einen Hinweis geben, falls die Vermutung von Fanuc nicht stimmt, wie man sich da helfen kann. Hast wahrscheinlich eh schon gewusst. Werde in Zukunft die Fragen genauer lesen, und wenn überhaupt nur noch exakt auf die Frage antworten.

    Bitte um Entschuldigung falls ich irgendwas falsches gesagt habe. 8)

    Weitere Info, Greifer ist aktuell auf dem Transport und nicht verfügbar. Nur für die schlauen Hinweise. ;)

    Dann erübrigt sich doch die Frage. Kannst eh nichts mehr machen. ;)

    Hab da keine Erfahrung, aber im schlimmsten Fall musst da halt die Module taufen. Also solltest einen Laptop mit entsprechendem Tool dabeihaben und die pn-namen und IP Adressen wissen. Dann bist für alle Fälle gewappnet.

    .. Hierzu frage ich die aktuelle Roboterposition ab und rechne diese mittels : - Operator in das benötigte Basis- / Tool-Koordinatensystem...

    Wenn du die Koordinatensysteme schon kennst, kannst die auch vor dem Einlesen der Position schon setzen, dann sparst die Umrechnung per Doppelpunktoperator. Sieht halt nicht so wissenschaftlich aus ;).

    Das eigentliche Problem wird das vermutlich aber trotzdem nicht komplett lösen. Eine Möglichkeit wäre eventuell Umrechnung in Achswinkel per Inverse() und dann das vergleichen. Da kann man dann aber keine vernünftigen Bereiche definieren. Wäre also nur eine Ergänzung zum x/y/Z Vergleich.

    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.

    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.

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

    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.

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

    Mir ist wirlich nicht klar, was du denn jetzt wirklich machen möchtest, und was du schon probiert hast.

    Im ersten Beitrag sieht es aus, als ob du im normalen Vordergrundprogramm einen Submit starten möchtest. Auch da ist schon mal ein ganz einfacher Fehler drin:

    CWRITE($CMD,STAT,MODE,"STOP/R1/TP/..../TEST() > 3")

    Was machen da die vielen Punkte? "/.../", die gehören da nicht hin. Siehe Beispiel von Woodys, aber selbst da vermute ich, dass das "/TP" zu viel ist. Der Run Befehl im CWrite braucht IIRC nicht den ganzen Pfad, sondern nur das "/R1/".

    DEF TEST1( )

    DECL STATE_T STAT ; Wie im Beispiel

    DECL ....

    Im CWrite steht "TEST()", das Programm heisst "TEST1()".

    Das kann nicht funktionieren, egal was da sonst noch drumrumsteht. :(

    Und ich habe jetzt alle varianten ausprobiert aber der SYS.Sub ...

    Was meinst mit SYS.Sub?

    Statt nur einzelne extrem kurze Fragemente des Codes hier reinzuschreiben wäre es sinniger, mal das ganze Paket an Programmen, notfalls gekürzt um unwichtige Dinge wie Bewegungen u.Ä. darzustellen.

    Kann sein ich verstehe einfach nicht wirklich um was es hier geht, und bin dann raus. Und wie schon mal gesagt: würde einen dauernd laufenden SUBMIT Prozess hernehmen und den Aufruf der Funktion über eine Variable steuern. Keine Ahnung warum man sich das Programmiererleben schwerer machen muss als es eh schon ist. 8)

    Keine Ahnung, was du mit diesem 'Auszug' sagen willst, aber im Prinzip ist der Ansatz am Ende korrekt.

    Das kann im Standard Submit SPS.SUB oder in einem der anderen parallelen Submits so programmiert werden. Aber es laufen immer alle benötigten Submits.

    Um den Anfangspost zu verwenden:

    Code
    DEF TEST1( )
    
    While TRUE ; Gewollte endlosschleife bis Abwahl des Programms
     if globale_variable then
      TESTLOOP()
     endif
    ENDWHILE
    
    END

    Zwecks des häufigen Hinweises auf das Handbuch:

    Bin mir sicher, dass im Handbuch die verschiedenen Gültigkeitsbereiche deklarierter Variablen beschrieben wird.

    Es gibt Variable:

    - die im ganzen System bekannt sind, am einfachsten schreibt man die in die $config.dat, es gibt aber auch noch mindestens eine andere Möglichkeit.

    - die innerhalb einer Quelldatei bekannt sind, also allen Prozeduren und Funktionen innerhalb einer Quelldatei, diese stehen in der zugehörigen .DAT Datei.

    - die nur innerhalb einer Prozedur / Funktion bekannt sind, die stehen direkt nach der DEF - Zeile im Quellcode.

    Edit: wo man was deklariert ist hochgradig davon abhängig was man damit erreichen will. Diese Variablen STAT und MODE zum Beispiel:

    Es gibt diese ganz verwegenen Programmierer, die innerhalb des Hauptprogramms und innerhalb eines Submits diverse Submits stoppen und starten.

    Ganz abgesehen davon dass ich das für kompletten Quatsch halte, den wohl kaum irgend jemand jemals noch überblickt, wäre da die Verwendung dieser Variablen als globale Variable absolut falsch, da sie dann zugleich in verschiedenen Prozessen verwendet werden, das führt früher oder später zu Problemen. Da ist es absolut zwingend entweder verschiedene globale Variable, oder besser lokale Variable zu verwenden.

    Das sind die die absoluten Basics der Programmierung, egal welche Programmiersprache, ob Roboter, PC oder sonstwas. ;)

    Weiss gar nicht warum sich so viele Leute immer mit dem cwrite rumärgern um irgendwelche Submitprogramme zu starten und beenden. Ich steuere das normalerweise mit einer globalen Variablen. Im Submit wird diese Variable verwendet um einen bestimmten Teil durchzuführen oder eben auch nicht, im Hauptprogramm gesetzt/zurückgesetzt. Da kann man dann auch Trigger verwenden. Ganz einfach, übersichtlich und zeitoptimal, bin skeptisch was die Laufzeit dieses cwrite Befehls angeht.