Beiträge von chrisfriedo

    Also ILF nehme ich nur für das teachen.

    Heißt aber, ich habe "Teachpunkte" als ILF erstellt um es "Benutzerfreundlicher" zu machen.

    Die abgespeicherten Koordinaten übergebe ich dann an das Array.


    In Experten-Syntax rufe ich dann einzelne Werte des Arrays auf.


    -> heißt also ich deklariere das Array als FRAME um?


    Die anderen Möglichkeiten teste ich auch bei Gelegenheit mal, bzw. lese mich dazu ein um entscheiden zu können ob das passt.


    Vielen Dank euch schon mal!

    Finde zum Stichwort $CP_STATMON leider nichts in der Doku, kann ich irgendwo mehr darüber lesen um es besser zu verstehen?


    Was genau meinst du mit unerwünscht lange Bewegungen?

    In meinem Fall ist es so, dass der Robi sich womöglich komplett umorientieren möchte um zur Position zu kommen.... aber nicht sicher, hab ihn noch nich bis zum Zielpunkt fahren lassen - war mir dann doch zu heiß, keine Lust auf einen Crash :S

    Grüße, benötige mal wieder eure Hilfe, bitte.


    Einige an sich passende Beiträge habe ich schon gelesen, jedoch fehlt mir die entscheidende Meinung wie es in meinem Fall klappen kann.


    Zum Problem:

    Ich entnehme aus einem Tray 20 Bauteile mit definiertem X und Y Offset voneinander.

    Die Berechnungen funktioniert, bis auf eine Position, bei dieser muss der Greifer relativ nahe an den Robotersockel (wsl Singularitäts-Problem)

    Diese Position bereitet Probleme da mein Robi plötzlich IRGENDWO hinfährt.


    -> Dachte mir dann, das kann nicht sein -> Habe die besagte Position einmal separat geteacht um mir die E6Pos Werte anzusehen -> siehe da, der Turn müsste einen ganz anderen Wert haben.

    Als Folge habe ich die Berechnung angepasst und Turn auf den benötigen mit berechnet --> funktioniert, Robi fährt wie gewollt alle Positionen an.



    Zur Frage:

    Ich denke mir nun, sollte in Zukunft die erste Position umgeteacht werden und möglicherweise der Turn wieder anders ausfallen für die "knappe Position" - dann stimmt die Berechnung nicht mehr.

    Wie kann ich also sicher sein, dass die Berechnung IMMER stimmt und sich in Zukunft beim nach-teachen keine potentiellen "Crashs" ergeben?



    INFO :

    - Das Positions-Array ist als "DECL E6POS" Array deklariert (sollte es eher DECL FRAME sein um Status/Turn zu ignorieren?)

    - Die Vorposition wird als SPTP angefahren, die Greif-und Nachposition wird mit SLIN angefahren



    Bin gespannt auf die fachliche Meinung :)

    Grüßt euch,


    ich bin heute im Kopf irgendwie nicht so da und sehe den Wald vor lauter Bäumen nicht, deshalb - ich bitte um Nachsicht :) ^^


    Wie kürze ich den folgenden Code am besten ab?

    Code
    WHILE (edited[1]==FALSE) AND (edited[2]==FALSE) AND (edited[3]==FALSE) AND (edited[4]==FALSE) AND (edited[5]==FALSE) AND (edited[6]==FALSE) AND (edited[7]==FALSE) AND (edited[8]==FALSE) .....
    
    ;PROGRAMM-Syntax
    ;edited[aktBauteil]=TRUE
    
    ENDWHILE

    Ich habe ein Array mit Boolschen Werten angelegt welches sich auf ein Positions-Array bezieht und abgearbeitet Bauteile auf True setzt.

    Ich müsste die Syntax der While Funktion sogar noch bis "edited[20]" fortsetzen.


    Die Schleife soll nur solange durchlaufen bis alle Bauteile abgearbeitet sind.



    Jemand eine Idee?

    Vielen Dank!

    ^^ ..ein wirklich wieder sehr gelungener Erguss, ich hab' schon etliche Beiträge von dir verfolgt Programmiersklave und die haben alle immer unfassbar weitergeholfen, also vielen Dank dafür schon mal vorab!!


    Zurück zum Code, ich hab mir aus allen Inputs von euch etwas zusammengestückelt:


    Hier wird mir zuerst geprüft welches Teil unbearbeitet ist (Das Array dazu ist 1-dimensional in der dat.file hinterlegt "edited_QUADR[1] - [20]" und beim Start sind alle mit FALSE gesetzt.


    Ist die Nummer im Tray eines unbearbeiteten Bauteil "gefunden" dann wird diese Nr. auch aus dem Positions-Array übergeben und damit die Koordinate zugewiesen.
    Die spätere Berechnung möchte ich später über ein UP Teachprogrammm() erledigen.


    Nachdem die Positionen an XP11 übergeben sind setzte ich die Position im edited Array auf TRUE und gleichzeitig übergebe ich noch die aktuell entnommene Nr. im Tray an eine neue Variable "iAktVaristor_V1", so dass ich genau weiß welches Bauteil sich an welchem Sauger befindet (benötige ich später zum wieder einlegen in das Tray) ...kann sein dass es unnötig ist aber ich wollte damit auf Nummer sicher gehen.

    Dann Bewegungs-blabla


    Und dann die gleiche Vorgehensweise natürlich für den 2. Saugarm.
    Das war jetzt mal mein geistiger Erguss dazu, aber ist alles noch in der Entstehung, kann also sein dass ich den Code noch 10x abänder :D

    panic mode : Ah perfekt, hier ist die Berechnung für die Positionen gleich mit integriert.

    Aber für diesen Fall fällt noch die Überprüfung ob das Teil schon bearbeitet ist oder?

    Also so wie es Loelik schreibt:

    Code
    IF edited_QUADR[index] == FALSE THEN
        "BERECHNUNG...."
    ENDIF

    Oder verstehe ich den Code noch nicht zu 100%?

    Hallo liebe Community,


    ich habe folgende Aufgabe zu lösen:

    Mein Roboter KRC 4 R600 mit der KRC 5 micro Steuerung ist mit einem Vakuumgreifer bestückt.

    Es geht um das Handling zwei verschiedener Baugrößen (Quadrat-/ Block-Form) in ein Werkzeug.

    Nach dem bearbeiten durch das Werkzeug soll das Bauteil zurück auf seine ursprüngliche Tray-Position abgelegt werden.


    Der Greifer verfügt über 4 Sauggreifer, 2x Quadrat und 2x Block-Handling. (siehe Skizze)

    Es müssen pro Tray 20 Bauteile bearbeitet werden.



    Zu meiner Frage:

    Hier am besten erstmal der Code.


    Die Idee ist folgende:

    (Zeile 1) Zuerst wird geprüft an welchem der beiden Sauger kein Vakuum anliegt / somit auch kein Bauteil angesaugt ist.

    (Zeile 4-17....) Anschließend wird geprüft welche Bauteile im Tray noch unbearbeitet sind. Die Variable


    "edited_QUADR" setze ich nach dem es bearbeitet wurde auf TRUE und markiere somit dieses Bauteil im Tray als abgearbeitet.

    Die IF-Verschachtelung soll dem Roboter somit eine Position eines unbearbeiteten Bauteils übergeben.



    Die beiden Felder sind in der dat.file wie folgt hinterlegt:



    Die Funktion müsste gegeben sein, ich hab nur das Gefühl, dass man die IF-Verschachtelung auch deutlich einfacher gestalten kann.

    Habt ihr dafür Tipps/Tricks?



    Vielen Dank schon mal für die Hilfe,


    Grüße :)

    Karlo Danke, mir ging's ja aber um die Struktur im sps.sub und den Aufruf darin von cell.src :)

    Also meine cell.src sieht genauso aus.


    Programmiersklave das hilft mir sehr weiter.

    wollte im Prinzip nur eine Bestätigung ob der cell Aufruf einfach so im Loop stehen darf (eben weil ich es überall vor dem Loop gesehen hab).

    Deine Codes werde ich auch mal testen, insofern das erlaubt ist ^^


    Also mittlerweile hat die Kommunikation zwischen SPS und Robi auch gut funktioniert....jetzt stehen schon die nächsten Probleme an, wie richtiger Überschleif und Taktzeit Optimierung :S

    Danke allen schon mal wieder für die Hilfe - bin echt begeistert vom Forum!! <3

    Das ist klar wegen LOOP



    Jedoch noch die offene Frage ob, das hier alles so zulässig ist was ich hier betreibe?

    Also gemeint ist besagter Code:


    JoLa


    Ich habe während des Ablauf's mal den Not-Aus am KCP gedrückt, nach dem lösen vom Not-Aus hing das Programm in der Schleife des SPS.sub fest -> das KCP hat sich regelrecht überschlagen im Anzeige-Bildschirm 8|



    Mit dem einfügen von $PERI_RDY hat auch der Not-Aus funktioniert...


    Oder gibt's da eine elegantere Lösung? :)

    1. die Standardmäßige Syntax im Ordner "AUTOEXT INIT" habe ich gesehen aber der Aufruf hat nicht stattgefunden... deswegen das zusätzliche Einfügen, dann ging's


    1.1 ich dachte dass er dann erst durch die IF - Anweisung in Cell springt wenn eben die BA EXT ausgewählt ist



    2. den Gruppeneingang haben wir gewählt um von SPS - Seite aus den Override einstellen zu können - das funktioniert



    Aktuell sieht der Code so aus:

    Das Wait ist rausgelöscht (dachte schon dass das Probleme verursachen könnte.


    Nur mein CELL Aufruf steht eben in dem LOOP ... was ja laut Dokus nicht so sein soll?! ?(

    Hallo zusammen,


    habe schon etliche Beiträge zum Thema gelesen aber leider ohne wirklichen Erfolg/Bestätigung dass ich richtig liege.


    zum Problem:

    Die SPS soll über das sps.sub meine CELL aufrufen.

    Klar über sowas wie:

    Code
    IF ($MODE_OP==#EX) OR ($MODE_OP==#AUT) THEN       
    CWRITE($CMD,STAT,MODE,"RUN /R1/CELL()")
    ENDIF 


    Diese Änderung übertrage ich in der BA T1 und wechsle auf EXT.

    -> kein automatischer Programmaufruf von CELL.src


    Die Vermutung war dann, dass der "Vorlaufzeiger" in sps.sub schon darüber gesprungen ist, ehe ich in EXT wechsle


    Habe dann den Code geändert auf:


    Code
    WAIT FOR ($MODE_OP==#EX) OR ($MODE_OP==#AUT) 
    IF ($MODE_OP==#EX) OR ($MODE_OP==#AUT) THEN   
        CWRITE($CMD,STAT,MODE,"RUN /R1/CELL()")     
        $OV_PRO=giOverride  ;einstellbar durch SPS
    ENDIF

    Damit funktioniert der CELL.src - Aufruf wenn ich mit den Schalter auf EXT wechsel.




    Nun die eigentliche Frage:

    Ist das so OK oder hintere ich den Programmzeiger an irgendetwas?

    Also bekomme ich im späteren Ablauf damit Probleme?


    Was auch funktioniert hat:

    Wenn ich den ersten Quellcode in den LOOP der sps.sub packe funktioniert es auch.

    ...aber das wäre gegen alle bisher gelesenen Beiträge und gegen die Vorgehensweise der Doku von KUKA



    PS: Hoffe dass ich keinen neuen unnötigen Thread erstellt habe und alle Richtlinien des Forums genüge tue - ich bitte um Nachsicht :S

    Noch eine Zusatzfrage:


    Wie rufst du im UP HOLEN () dass UP ABLEGEN () auf?


    Nur interessehalber mal gefragt, habe mein Programm nun über die Hälfte gekürzt und würde es gerne mal ohne SPS in der Schleife ablaufen lassen für den TEST...tatsächlich bei Ebenentiefe 20 haut er mir den Fehler raus mit Verschachtelung

    Perfekt beschrieben!

    Tatsächlich mache ich das auch so und habe nur etwas zu sporadisch geschrieben..


    Ich habe zwar tatsächlich noch jeweils für die 3 Nester ein UP, die ich über HOLEN () Aufrufe - brauche ich wirklich nicht ist mir aufgefallen - vll ändere ich das noch..



    Zum Ablegen habe ich jedoch noch die Besonderheit, dass ich unterschiedlich in ein Tray ablegen muss.

    Heißt jede zweite Position wird das Bauteil um 180° verdreht eingelegt.


    Habe dann in ABLEGEN () noch zwei UP's die Ablage_gerade () und Ablage_ungerade benannt sind.

    Ungerade/gerade im Sinne der abgelegten Anzahl im Tray.

    Noch dazu ein Ablage_niO ()


    Aus jedem dieser Ablegen UP's springe ich wieder zurück zu HOLEN ().


    Habe den Ablauf auch schon getestet, die 20 Stück legt er ohne Störungen ein.

    Stellt sich mir nur grade die Frage ob dass dann auch für mehrere Trays nacheinander funktioniert...

    Also gibt es dann möglicherweise Probleme nach dem x-ten befüllten Tray?




    Vielen Dank jeden Falls schon mal für die Zeit und guten Tipps!!

    Hi, danke für den wertvollen Tipp für den Fall eines Nothalts bzw. Abbruch - werde ich mit beachten und umsetzen!


    Zur Programmstruktur, ich habe es wie folgt umgesetzt:


    Aufruf meines Job's "Transport ()" über die cell.src


    Im Modul Transport () habe ich alle UP's gepackt, jeweiligen Teil HOLEN ( ) springt er einfach in ABLAGE ( ) UP und darin warte ich dann auf Jobaufruf für einen erneuten Aufruf von HOLEN ().


    So mal ganz grob dazu.