Einfach ein wzdelete für jede weltzone am Anfang einfügen. Ist komisch, ist aber so.
Beiträge von Hermann
-
-
Ja.
Achtung das ist jetzt die exakte Antwort auf die gestellte Frage.
Ich möchte nicht mehr in die Frage hineininterpretieren, da ich an anderer Stelle dafür gerügt wurde eben dieses getan zu haben. Austausch PN IO-Devices an C1604
Wobei die Antwort nicht mal bedeutet, dass ich die Antwort weiss.
-
Habe schon von Fällen gehört, in denen das nachlizenziert werden musste. Sonst riskiert man halt eine Anzeige.
Ansonsten dürfte das eher ein Fall für einen Rechtsanwalt sein, wer hier was darf oder auch nicht.
-
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.
-
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.
-
Bei Robotern mit "safe operation" gibt es die Datei gar nicht iirc.
-
.. 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.
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:
Dat-Datei des Hauptprogramms TESTPROG.DAT:
CodeDEFDAT 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:
Code
Alles anzeigenDEF testprog( ) INI ; Hier jetzt mal abgekürzt !! MODE = #SYNC ptp xhome CWRITE($CMD, Stat, Mode, "STOP 3") WAIT FOR ($PROG_INFO[3].P_STATE == #P_STOP) OR ($PROG_INFO[3].P_STATE == #P_FREE) CWRITE($CMD, Stat, Mode, "CANCEL 3") WAIT FOR ($PROG_INFO[3].P_STATE == #P_FREE) CWRITE($CMD, Stat,Mode, "RUN /R1/Test1() >3") ; EDIT: WAIT FOR ($PROG_INFO[3].P_STATE == #P_ACTIVE) for schleife=1 to 10 startsim=true wait sec 10 startsim=false wait sec 2 endfor CWRITE($CMD, Stat, Mode, "STOP 3") WAIT FOR ($PROG_INFO[3].P_STATE == #P_STOP) OR ($PROG_INFO[3].P_STATE == #P_FREE) CWRITE($CMD, Stat, Mode, "CANCEL 3") WAIT FOR ($PROG_INFO[3].P_STATE == #P_FREE) END
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:
Dat-Datei des Hauptprogramms TESTPROG.DAT:
CodeDEFDAT testprog public decl int schleife=1 ; diese Var. ist Modulglobal GLOBAL BOOL startsim=false ; diese ist Systemglobal ENDDAT
Testprogramm TESTPROG.SRC
Code
Alles anzeigenDEF testprog( ) DECL STATE_T STAT ; diese Variable ist Lokal also DECL MODUS_T MODE ; nur in diesem Unterprogramm gueltig ;FOLD INI;%{PE} ;FOLD BASISTECH INI GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( ) INTERRUPT ON 3 BAS (#INITMOV,0 ) ;ENDFOLD (BASISTECH INI) ;FOLD USER INI ;Make your modifications here ;ENDFOLD (USER INI) ;ENDFOLD (INI) MODE = #SYNC ptp xhome for schleife=1 to 10 CWRITE($CMD, Stat, Mode, "STOP 3") WAIT FOR ($PROG_INFO[3].P_STATE == #P_STOP) OR ($PROG_INFO[3].P_STATE == #P_FREE) CWRITE($CMD, Stat, Mode, "CANCEL 3") WAIT FOR ($PROG_INFO[3].P_STATE == #P_FREE) CWRITE($CMD, Stat,Mode, "RUN /R1/Test1() >3") ; EDIT: WAIT FOR ($PROG_INFO[3].P_STATE == #P_ACTIVE) startsim=true wait sec 10 startsim=false wait sec 2 endfor END
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.
-
Weiss nicht, ob ich das richtig verstehe denn ich konnte diesen Auszug finden:
Die Bewegungsanweisungen für Zusatzachsen in diesem Beispiel können ineinem SBB-Programm verwendet werden, sofern dieses dem System-Submit
zugeordnet wird und nicht einem Extended Submit.
Die Zusatzachsen E2 und E3 werden in Abhängigkeit von bestimmten Eingängen.
gen verfahren.
WAIT-Anweisungen oder Warteschleifen wurden hier nicht verwendet, da sie
den Zyklus aufhalten.
Andere Programme sind ja dann den externen Interpretern zugeordnet und die haben ajs die EX1, EX2, EX3.... und dann ist 1 Roboterinterpreter, 2 Systemsub-Interpreter und 3 Ext1 , 4 EXT2Und die werden auch laut Programmierhandbuch mit CWRITE gestartet.
Also müsstest du im Programm des SYS Registers circa Folgendes machen.
Sys.sub
InitAblauf
If globale_Variable==True THEN
SUB_Rutine()
ENDIF
Ablauf
End
Verstehe ich das so richtig?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:
CodeDEF 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.
-
Nunja, das C_DIS macht bei so einer PingPong Bewegung nicht unbedingt Sinn, da wird ja schon vor dem Zielpunkt wieder umgekehrt, im Umkehrpunkt herrscht auch immer Geschwindigkeit = 0, da kann man machen was man will.
-
Wird immer wieder gefragt.
An Stelle der geschweiften Klammer eine variable vom Typ frame nehmen. Dieser den y-Wert zuweisen.
Yoffs=$nullframe
Yoffs.y=100
In der Schleife dann sinngemäss immer
Yoffs.y=yoffs.y+10
-
Einfach nochmal über den Button in der Anzeige starten, hat iirc immer funktioniert.
Aber einen Hacken bekommst trotzdem nicht, höchstens einen Haken
-
Leider gibt es auch Roboter, auf denen nur von Kuka signierte Programme startbar sind. Nur mal der Vollständigkeit halber erwähnt Falls da mal jemand drüberstolpert.
-
Gratuliere, Eine Idee: Base in die LS legen (das sollte auch beim Scara schräg definierbar sein), dann kann man den Versatz 1:1 übernehmen, vorausgesetzt das Tool ist in einer der Tool Hauptachsenrichtungen montiert und nicht auch da noch verdreht.