Fehler im Programm

  • [size=3]Hallo zusammen,[/size]


    [size=3]ich habe das problem das er nur immer die erste Kiste anfährt und nicht weiter Palettiert.[/size]
    [size=3]ich mochte gerne das er in X 4 Kisten stellt Y 2 Reihen und in Z 6 kisten hoch.[/size]
    [size=3]hier ist mein Programm und das was ich in der Config.dat geschrieben habe.
    [/size]



    [size=3]Bitte um schnelle Hilfe[/size]
    [size=3]Vielen Dank im Vorraus !!
    [/size]





    [size=3]Programm:
    [/size]

    [size=3]DEF Palletieren ( )[/size]
    [size=3]INI
    [/size]

    [size=3]PTP HOME Vel= 100 % DEFAULT[/size]



    [size=3]IF FIRST_RUN == TRUE THEN[/size]
    [size=3]BASE_DATA[1] = BASE_DATA[5][/size]
    [size=3]FIRST_RUN = FALSE[/size]
    [size=3]ENDIF[/size]


    [size=3];Position ueber der Palette[/size]
    [size=3]PTP Ueber_Palette CONT Vel=100 % PDAT1 Tool[2] Base[1][/size]


    [size=3];Position ueber Ablegeposition[/size]
    [size=3]LIN Ueber_Ablegen CONT Vel=1 m/s CPDAT Tool[2] Base[1][/size]


    [size=3];Position zum Ablegen[/size]
    [size=3]LIN Ablegen Vel=1 m/s CPDAT Tool[2] Base[1][/size]



    [size=3];Greifer oeffnen[/size]



    [size=3];Position ueber Ablegeposition[/size]
    [size=3]LIN Ueber_Ablegen CONT Vel=1 m/s CPDAT Tool[2] Base[1][/size]


    [size=3];Position ueber Palette[/size]
    [size=3]PTP Ueber_Palette CONT Vel=100 % PDAT1 Tool[2] Base[1][/size]



    [size=3];Zaehler fuer Teile aktuellisieren[/size]
    [size=3]Teile_in_X = Teile_in_X + 1[/size]
    [size=3]; Wenn max. Anzahl in der X-Reihe erreicht [/size]
    [size=3]IF Teile_in_X >= Max_Teile_in_X THEN[/size]
    [size=3]Teile_In_X = 0[/size]
    [size=3]BASE_DATA[1].X = BASE_DATA[5].X[/size]
    [size=3]Teile_In_Y = Teile_in_Y +1[/size]
    [size=3]IF Teile_In_Y >= Max_Teile_in_Y THEN[/size]
    [size=3] Teile_in_Y = 0[/size]
    [size=3] BASE_DATA[1].Y = BASE_DATA[5].Y[/size]
    [size=3]Teile_in_Z = Teile_in_Z + 1[/size]
    [size=3] IF Teile_in_Z == Max_Teile_in_Z THEN[/size]
    [size=3] Teile_in_Z = 0[/size]
    [size=3]BASE_DATA[1].Z = BASE_DATA[5].Z[/size]
    [size=3]ENDIF[/size]
    [size=3]ENDIF[/size]
    [size=3]ENDIF[/size]


    [size=3];Berechnung der Verschiebung für das naechste Teil[/size]
    [size=3]BASE_DATA[1].X = BASE_DATA[1].X + Teile_in_X+330 X_AbstandTeil[/size]
    [size=3]BASE_DATA[1].Y = BASE_DATA[1].Y + Teile_in_Y+490 Y_AbstandTeil[/size]
    [size=3]BASE_DATA[1].Z = BASE_DATA[1].Z + Teile_in_Z+180 Z_AbstandTeil[/size]


    [size=3]PTP HOME Vel= 100 % DEFAULT[/size]




    [size=3]END[/size]
    -------------------
    Config.dat



    [size=3];Palettieren[/size]


    [size=3]BOOL FIRST_RUN=FALSE[/size]
    [size=3]INT TEILE_IN_X=0[/size]
    [size=3]INT TEILE_IN_Y=0[/size]
    [size=3]INT TEILE_IN_Z=0[/size]
    [size=3]INT MAX_TEILE_IN_X=4[/size]
    [size=3]INT MAX_TEILE_IN_Y=2[/size]
    [size=3]INT MAX_TEILE_IN_Z=6[/size]

  • Schritt für Schritt zum Roboterprofi!
  • Auf die Schnelle:

    Code
    ;Berechnung der Verschiebung für das naechste Teil
    BASE_DATA[1].X = BASE_DATA[1].X + Teile_in_X*330 ;X_AbstandTeil
    BASE_DATA[1].Y = BASE_DATA[1].Y + Teile_in_Y*490 ;Y_AbstandTeil
    BASE_DATA[1].Z = BASE_DATA[1].Z + Teile_in_Z*180 ;Z_AbstandTeil


    Kann ja auch ein Abtippfehler sein. Daher immer den Originalcode hier reinschreiben oder noch besser als .src anhängen!
    Nix abschreiben, nix löschen, nix ändern.


    EDIT: Und keine Doppelpostings!!

  • Ich sehe keine Schleife um deine Fahrbewegungen. Wenn du die Funktion nur einmal aufrufst, fährt sie genau einmal die Position ab, rechnet dann wild herum und es geht wieder in Home. Rufst du die Funktion mehrfach auf? Die Variable FIRST_RUN ist nach meinem Verständnis lokal und immer FALSE.


    Gruß,
    M

  • Wie Hermann schon schrieb, aber auch das ist noch flasch, denn damit inkrementierst Du zusätzlich zum Faktor. Also entweder inkrementieren:
    BASE_DATA[1].X = BASE_DATA[1].X +330
    oder (besser) malnehmen, aber dann vom Ausgangsbase her:
    BASE_DATA[1].X = BASE_DATA[5].X + (Teile_in_X*330)
    (die Klammern dienen mehr der Visualisierung.)


    und am Anfang vor der Schleife das Initialisieren nicht vergessen:
    Teile_in_X = 0;
    ...
    Ausserdem gibt es noch eine böse Überraschung, wenn es denn mal laufen sollte: der Robbi wird wieder von vorne anfangen und den Kistenstapel zu Klump hauen, da keine Endbedingung festgelegt ist.
    Darüber hinaus sieht es nicht verkehrt aus. Ich würde mir in der configmon.ini die drei Zählvariablen in eine Variablenliste packen, damit Du sicher sein kannst, bei korrektem Zählerstand geteacht zu haben. Ist nämlich auch ein beliebter Fehler, denn man bei dieser Art der Programmierung machen kann.


    Grüße,
    Michael

  • Jetzt isses noch schlimmer.
    Du musst doch in der Berechnung mit X, Y und Z weiterwandern. Also brauchst Du das Start-Base (bei Dir 5). Und etwas, was du draufaddieren kannst. Zum Beispiel 2. Reihe entspricht Ausgangsbase PLUS EINMAL den Abstand. 3. Reihe entspricht Ausgangsbase PLUS ZWEI MAL den Abstand. Und so weiter. Guck noch mal in meinen ersten Beitrag. Genau das schreibst Du in eine Formel: neues Base.x= BASE_DATA[5].x PLUS (x MAL Abstand). Wobei man bei 0 anfängt zu zählen, dann passt es auch am ersten Platz mit ... PLUS (NULL MAL Abstand)
    Das gleiche für Spalten und Lagen natürlich, implizit.


    Und die Initialiserung natürlich VOR die Schleife (die bei Dir noch mit "loop" anfängt - dazu gleich mehr), und natürlich ALLE DREI Zähler und nicht nur X.


    Anstelle von loop ... endloop würde ich gleich was Vernünftiges nehmen, sonst hört dieses Programm NIE auf. Loop...Endloop ist tatsächlich nur für den Sonderfall gedacht, dass irgendwas nie aufhören soll. Ansonsten kannst Du das mit repeat .... until programmieren.


    Arbeitsraumüberwachung ist klar - dein Programm fährt aus dem Arbeitsbereich, den der Roboter maximal erreichen kann. Das kann jetzt daran liegen, dass die Palette zu weit weg oder zu nah dran ist (das wäre die ungefährliche Variante), liegt aber vermutlich eher daran, dass Dein Punkt über der Palette ein PTP in Base 1 ist. Daraufhin versucht der Robbi natürlich, auch diesen Punkt zu verschieben, aber da er vermutlich als POS oder E6POS gespeichert ist, wird er versuchen, mit der vorgebenen Konfiguration dahin zu fahren, die sich aber eigentlich je nach Position ändern müsste. (Gefährlich!)
    Also, am besten teacht Du die Punkte über der Palette in Base 5, dann bist Du auf der sicheren Seite, und legst nur die LIN-Punkte in das verschobene Base 1. Bei LIN ignoriert der Roboter die Konfiguration... müsstest Du wissen.


    Grüße,
    Michael

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