Frame im Unterprogramm als Basis nutzen

  • Hallo zusammen,

    Ich brauche nochmal eure Hilfe.
    ich möchte einen berechneten Frame als Basis verwenden. Aktuell ist es so, dass ich die Basis die ich berechnen möchte, immer wieder überschreibe.


    BASE_DATA[Base_Nr] = CALCBASE(Ursprung, PunktX, PunktY)
    BAS(#Base,Base_Nr)


    Schöner wäre es aber, wenn ich einen FRAME berechne:


    DECL FRAME Basis_Neu
    Basis_Neu = CALCBASE(Ursprung, PunktX, PunktY)


    Und diesen dann verwende:
    BAS(#Base,Basis_Neu)


    Kann ich einen Frame Zeitweise als Basis verwenden? Und wie gebe ich das dann an?

  • Schritt für Schritt zum Roboterprofi!
  • Basis_Neu = CALCBASE(Ursprung, PunktX, PunktY)

    BASE_DATA[2] = BASE_NEU


    BAS(#Base,2)


    Hoffe verstehe dein Problem richtig, aber so sollte es gehen


    Kannst die Bases/Frames immer zuweisen, wie du es brauchst.

    zB.
    IF XXX THEN

    BASE_DATA[2] = BASE_DATA[BaseNr]

    ELSE

    Basis_Neu = CALCBASE(Ursprung, PunktX, PunktY)

    BASE_DATA[2] = BASE_NEU

    ENDIF

  • Sorry, meine Erklärung war nicht Ideal.

    Naja, ich möchte ja den Frame als Base verwenden. Also die BASE_DATA[] gar nicht überschreiben. (Zumindest nicht in dem Programm)


    Bisher ist es also so gemacht worden:

    DECL FRAME Basis_Neu

    Basis_Neu = CALCBASE(Ursprung, PunktX, PunktY)


    BASE_DATA[1] = Basis_Neu

    BAS(#Base,1)


    Jetzt steht in 1 meine neue Basis drin, mit der ich nun verfahren kann. Läuft bei CALCBASE aber etwas falsch, dann stehen die falschen Daten auch drin.

    Daher möchte ich direkt im FRAME verfahren, ohne die BASE_DATA[] zu beschreiben.


    DECL FRAME Basis_Neu

    Basis_Neu = CALCBASE(Ursprung, PunktX, PunktY)


    BAS(#Base,Basis_Neu)

  • Ein Roboter brauch eine Base, auch wenns ein Nullframe ist.


    Dann musst du prüfen, ob deine Baseberechnung plausibel ist, bevor du diese zuweist.


    zB durch Eingrenzungen:


    IF Base_Neu.x > 5000 ... THEN

    Fehler

    WAIT FOR FALSE

    ENDIF



    Was hast du denn generell vor?


    Reicht dir eine Base Schiebung? Durch einen Doppelpunktoperator?

  • Mithilfe eines Programms möchte ich mir eine neue Basis einmessen.


    BASE_DATA[BaseNumber] = TEACHBASE(BaseNumber, ToolNumber,....)


    In dem Programm soll der Roboter jedoch Verfahren werden. Um es mir etwas leichter zu machen, berechne ich zunächst eine grobe Basis und schiebe mir die dann zurecht, bis sie exakt wird.


    Eigentlich möchte ich mir aber die BASE_DATA eben erst überschreiben, wenn das Programm durch ist. Um den Roboter zu Verfahren möchte ich aber auf die groben Basen zugreifen. Bricht das Programm aber zwischendurch ab, so ist eine der groben Basen hinterlegt.


    Klar brauche ich immer eine Basis, diese ist jedoch im Aufbau auch nur ein Frame. Dementsprechend könnte es ja sein, das ich statt einer Basis eben direkt einen Frame nutzen kann.

  • Code
    $BASE = "Was für ein Frame auch immer du verwenden willst". 


    Also z.B.


    Code
    $BASE = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0} 


    setzt das Base auf die Welt (oder $NULLFRAME wenn du so willst). Schau dir einfach mal den Code im bas.src an. Da steht genau drin was bei dem Aufruf BAS(whatever) passiert.


    Funktioniert solange es sich um ein statisches Base handelt, dass also fest im Raum stehen bleibt.


    Sobald du auf einem bewegten Base unterwegs bist (z.B. auf einem Base, dass sich mit einem Dreh-Kipptisch mitbewegen soll) musst du EK(...) verwenden. Bei Roboteam wäre es LK(...) und bei Conveyor EB(...).



    Fubini

  • Bitte beachten: wenn Du $BASE direkt überschreibst (was problemlos funktioniert) geht bei den jüngeren Systemen (weiss nicht ab welcher Version) das Teachen in diesem Base nicht mehr. Es wird dann nicht in dem gleichen Frame geteacht, wie der, in dem gefahren wird, was unter ExpertTech u. U. gefährlich wird.


    Je nachdem, was Du vorhast, ist es daher die bessere Idee, BASE_DATA[16] oder so als temporäres Berechnungsergebnis zu überschreiben und das dann zu verwenden, auch wenn es ein Schritt mehr ist.

  • Vielen Dank fubini,


    Das hatte ich gesucht.

    Eigentlich logisch mit $BASE zu arbeiten, bin noch nicht so lange als Kuka Programmierer unterwegs.

    Danke auch für die Infos zu den bewegten Basen.

  • Bitte beachten: wenn Du $BASE direkt überschreibst (was problemlos funktioniert) geht bei den jüngeren Systemen (weiss nicht ab welcher Version) das Teachen in diesem Base nicht mehr. Es wird dann nicht in dem gleichen Frame geteacht, wie der, in dem gefahren wird, was unter ExpertTech u. U. gefährlich wird.


    Je nachdem, was Du vorhast, ist es daher die bessere Idee, BASE_DATA[16] oder so als temporäres Berechnungsergebnis zu überschreiben und das dann zu verwenden, auch wenn es ein Schritt mehr ist.

    Ok, danke.

    Ja so etwas hatte ich befürchtet.

    Klar könnte ich einfach irgendeine BASE_DATA nehmen, falls die aber doch mal wer benutzt, wird diese von meinem Programm überschrieben. Das gefällt mir nicht.


    Was ist wenn ich nach der vollständigen Berechnung wieder $BASE = BASE_DATA[BaseNumber] schreibe?

    Bzw mit BAS(#BASE,BaseNumber) wieder den aktuellen Datensatz übertrage?


    Dann müsste ich nur noch eine Lösung für den Fehlerfall finden.


    In meinem Programm selbst benötige ich keine Teachpunkte. Nach der Ausführung meines Programms soll aber die BASE_DATA aktualisiert sein und von anderen Programmen genutzt werden können. Diese haben ja aber sowieso immer BAS(#BASE,...) am Anfang stehen.

  • Wenn Du da nichts teacht kannst Du mit $BASE machen was Du willst. Und hinterher auch wieder in eine der vorbestimmten Datenschachteln schreiben.


    Hat man ja gelegentlich, dass man komplizierte Messungen machen muss und dann irgendwelche Verschiebungen und Verdrehungen bekommt, die man als Zwischenergebnis benutzt, um auf diesem Base dann wieder weitere Verschiebungen und Verdrehungen zu messen.


    Ich hatte mir nur zwischendurch angewöhnt, bei komplizierterem Kram BAS(#BASE,...) gar nicht mehr zu benutzen und nur noch direkt zu berechnen und zuzuweisen, gerne auch mit der Doppelpunkt-Frame-Verknüpfung. Das ging dann vor ein paar Jahren plötzlich in die Hose...

    falls die aber doch mal wer benutzt, wird diese von meinem Programm überschrieben. Das gefällt mir nicht.

    Das ist aber ein grundsätzliches Problem. Man kann dem Base ja einen aussagekräftigen Namen geben. Wer es dann trotzdem benutzt, braucht sich nicht wundern.

  • Wen man $base direkt zuweist, dann sollte man keine 'normalen' (sollen heißen die Standard folds) Bewegingsbefehle mehr benutzen, da wird sonst die base wieder überschrieben. Sollte klar sein, will nur nochmal drauf hinweisen. ;)

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