KRL Servoventilprogrammierung

  • Hallo alle zusammen!


    folgendes steht mir befor, ich soll ein krl-programm schreiben für ein Bandvorschub-Endeffektor, im dem zwei Pneumatikmotoren mit Servoventilen angesteuert werden, dabei wird ein Motor quasi als Master, der zweiter als Slave fungieren. Beide Motoren haben je ein Ikrementalgeber. Die Drehzahl/Geschwindigkeit für den ersten Motor gebe ich vor, das wird auch die Geschwindigkeit des Roboters(am Endeffektor) sein. Der zweiter Motor soll sich dem ersten Motor anpassen, dabei muss beachtet werden das beim abrollen des Material, immer weniger Material auf der rolle bleibt und der 2.Motor immer schneller drehen soll um Vorschub an Material nicht zu hindern. Das kann mann entweder über Triangulationsensor(der vorhanden ist und ein Wert von 0-10V (50mm-350mm)/linear Liefert oder einfach über Zeit/Strecke! (muss ich noch rausfinden was besser ist)
    Die Servoventile werden im Bereich von 0-10V Betrieben, d.h. 5V-Mittelstellung(STOPP) 0-5V=Linkslauf, 5-10V=Rechtslauf, eigentlich werden die nur in eine Richtung laufen, deswegen irrelevant(nur zu Info)
    Inkrementalgeber liefert ein 2Byte-Wert.


    =============================
    IOSYS.INI
    Die Analoge-Ausgänge sind wie folgt belegt:


    ANOUT1=4,0,16,3,CAL32767
    ANOUT2=4,2,16,3,CAL32767
    ANOUT3=4,4,16,3,CAL32767
    ANOUT4=4,6,16,3,CAL32767


    Die Analoge-Eingänge:


    ANIN1=4,2,16,1 Inkrementallgeber 1
    ANIN2=4,4,16,1 Inkrementallgeber 1
    ;ANIN3=4,6,16,1 für Triangulationssensor(wird benötigt, aber noch nicht jetzt, kann aber gleich berücksichtigt ;werden)


    dazu kommen ein paar Digi-Ein/Ausgänge.
    ===============================
    Programm.SRC


    $ANOUT[1]=0.5 ; Grundstellung
    ....u.s.w.


    KUKA-Roboter=Master, WAGO-Modul=Slave mit der Adresse[4]


    Meine Frage an Euch, wie kann ich am bessten diese Regelung in KRL programmieren?
    für alle Vorschläge währe ich sehr Dankbar!

  • Schritt für Schritt zum Roboterprofi!
  • anscheinend kennen sich nicht viele damit aus, schade!
    ...habe aber ein paar andere Fragen, das mit dem InkrGeber auf $ANIN[] habe ich verworfen, habe jetzt die Ausgänge auf $IN[] gelegt:


    SIGNAL INK_GEB_VORSCH $IN[425] TO $IN[440]


    aber beim 2.Inkrementalgeber für Antrieb habe ich ein Problem, und zwar liegen diese 2Byte nich nacheinander so wie oben, sondern $IN[489] - $IN[496] (Unterer Byte) und $IN[473] - $IN[480](Oberer Byte)


    Wie kann ich diese 2 einzelne Bytes zu einem 2-Byte-Signal verbinden?


    so gehts nicht :(
    SIGNAL INK_GEB_ANTR ($IN[489] TO $IN[496] AND $IN[473] TO $IN[480])
    muss ich wahrscheinlich zerlegen


    und dann wenn ich beide rausbekommen habe, wie kann ich die Werte von INK_GEBER am besten vergleichen?


    über String?!
    StrComp (INK_GEB_ANTR[], INK_GEB_VORSCH[], #NOT_CASE_SENS) ?????


    hoffe jemand kann mir helfen!.

  • Hallo,


    der Variablen-Name INK_GEBER in der letzten Frage verwirrt mich, ich gehe jetzt aber mal davon aus, dass einer der beiden Inkrementalgeber gemeint ist.


    Sind die beiden Inkrementalgeber vom gleichen Typ (weil die Art der Byte-Übergabe unterschiedlich ist)? Da der 2. Inkrementalgeber eine 1 Byte große Lücke hat (in IOSYS.ini nicht versehentlich falsch parametriert?) und außerdem beim 2. Geber Highbyte vor Lowbyte kommt, würde ich die Eingänge wie folgt erfassen:


    SIGNAL INK_GEB_VORSCH $IN[425] TO $IN[440]; 1. Inkrementalgeber (1. byte ist Lowbyte, 2. Byte ist Highbyte)
    SIGNAL INK_GEB_ANTR_HIGH $IN[473] TO $IN[480]; Highbyte 2. Inkrementalgeber
    SIGNAL INK_GEB_ANTR_LOW $IN[489] TO $IN[496]; Lowbyte 2. Inkrementalgeber


    int geberwert1=0; Var., in die der Wert vom 1. Geber direkt reingeschrieben werden kann
    int geberwert2=0; den Wert füllen mit Rechnung unten


    Zum Vergleich beider Geberwerte:
    geberwert1=INK_GEB_VORSCH
    geberwert2 = 256* INK_GEB_ANTR_HIGH+ INK_GEB_ANTR_LOW


    Jetzt kann man geberwert1 und geberwert2 beliebig verwursten.


    Generell kann man mit SIGNAL ... nur direkt aufeinanderfolgende Eingänge, also ohne Lücke zusammenfassen, max. 16 Eingänge zusammenfassen ist möglich.


    Gruß


    PA

  • Hi,
    wenn ich mich noch recht erinnere kann man bis zu 32 Bit zusammenfassen, dann wird sogar das
    höchste Bit als Vorzeichenbit ausgewertet.


    Die Lage der Bytes können doch in der IOSYS.INI so verschoben werden, dass sie nacheinander
    auf den Eingängen ankommen.
    Sowas wie:


    INB59=4,2,X1
    ; normalerweise INB60=4,3,X1
    INB60=4,4,X1


    Bezweifle aber, dass die Bytes tatsächlich nicht direkt nacheinander erscheinen, tippe da eher auf
    einen Fehler in der IOSYS.INI, oder bei der Interpretation der Eingangswerte.


    Vergleich geht einfach mit:

    Code
    if INK_GEB_VORSCH <> INK_GEB_ANTR then
     ; tue dies, lass jenes, oder andersrum
    endif


    Hermann

  • PA, Hermann, ihr hattet Recht!
    habe schon vorher in einem anderen Zusammenhang gesehen, diesmal aber übesehen!


    In IOSYS.INI, INB60 übersprungen, genau deswegen!


    ....
    INB59=4,8,x1
    INB61=4,9,x1
    .....


    kann mir jemand von euch helfen beim vergleichen von Geschwindigkeiten/Drehzahlen?
    Die beide Inkrementalgeber sind von gleicher Bauart/Modell(Hengstler RI 38), wie ich schon oben beschrieben habe. Ich möchte die Umdrehungszahl/Sek (oder Min.) von Motoren auslesen können und anpassen....nur wie das genau geschehen soll habe ich noch keine Ahnung. Von beiden Ink_Geber bekomme ich durch diese je 2Byte-Signal ca. 65xxx Inkremente/Umdrehung....

  • Versteh ich das richtig, Du willst eine Geschwindigkeitsregelung über die KRL machen?
    Also wohl über Submit?
    Hmm, ob das schnell genug ist für ne saubere Regelung...? :denk:

    Gruss<br /><br />Dodo

  • Im LOOP des submit interpreters kannst du schön eine regelung für deine applikation (regelung) programmieren.


    Ich hab so etwas ähnliches schon mal programmiert.
    schau dir die sps.sub mal genauer an!!


    da gibts einen loop und der laäuft ständig...


    kleiner tipp wait befehle vermeiden sonnst gibts troubles..

  • Hallo,


    Hermann.


    Da für eine Geschwindigkeitsabfrage /-anpassung, oder was auch immer, der Absolutwert von den Inkrementalgebern interessant ist, muss man schon die Mühsal der Rechnung auf sich nehmen, die ich für den 2. Inkrementalgeber angegeben habe.



    ___xyz___


    Aufgrund der direkten 2Byte-Zusammenfassung für Inkrementalgeber 1 und fehlendem Hinweis der Pos. für Low- u. Highbyte habe ich nicht vorausgesetzt, dass beide Inkrementalgeber vom gleichen Typ sind. Da das jetzt geklärt ist: Die Wert-Berechnung, die für Geber 2 beschrieben wurde, gilt dann natürlich auch für Geber 1.


    Unter der Annahme, dass die Beschreibung, mit der dieses Thema eröffnet wurde, nehme ich mal an, dass die Geschwindigkeit beider Motoren gleich ist, wenn das Material, dessen Dicke mit dem Triangulationssensor gemessen wird. neu eingelegt wird. Diese Startgeschwindigkeit in eine Konstante oder Variable legen.
    Die Anfangsdicke legt man sich in eine Konstante (Durchmesser, z. B. START_DURCHMESSER, weil einfach zu messen). In eine weitere Konstante (z.B. ABSTANDSRADIUS) kommt der Wert des Abstands zwischen Sensor und Drehmittelpunkt der Materialrolle (der Sensor misst die Rollendicke letzlich als Radius). Die tatsächliche Rollendicke (Durchmesser, z.B. durchmesser_aktuell) erhält man mit:
    durchmesser_aktuell=2*(ABSTANDSRADIUS-sensormesswert).


    Die Abroll-Länge ist Durchmesser * PI (PI muss für den KUKA als Konstante mit Wert 3,1415 angegeben werden) und so könnte man die neue Geschwindigkeit angeben mit:
    neue_geschwindigkeit=startgeschwindigkeit*START_DURCHMESSER/durchmesser_aktuell


    Der Vorschlag basiert auf der Beschreibung zu Beginn des Themas (immer gleich viel Material spenden, auch wenn Rolle dünner wird).


    In der sps.sub kann man diese Berechnungen in einer Schleife kontinuierlich wiederholen und auch das Auslesen der Inkrementalgeber machen. Je nachdem, wie flott der Roboter sich bewegt, muss sich in der Abrollmechnik für das Material noch eine gefederte Zwischenrolle als Materialspeicher befinden.


    Gruß


    PA

  • Hallo XYZ und auch ein Hallo an die anderen,
    hast du schon was programmieren können?
    hier noch eine Lösung wie man das Ganze machen kann.
    Irgendwo mußt du das Programm für deine beide Motoren aufrufen. Wie schon geschrieben kannst du das im SUBMIT Interpreter machen oder du programmierst einen Interrupt der über einen Timer ausgelöst wird.
    Beispiel:
    Im Programmkopf in deinem Hauptrogramm mußt du den Interrupt deklarieren.


    ;TAKTGENERATOR FÜR REGELUNG
    INT Takt=-150


    GLOBAL INTERRUPT DECL 1 WHEN $TIMER_FLAG[1]==TRUE DO PD_Regelung()
    INTERRUPT OFF 1
    $TIMER[1]=Takt


    Beim Start ist Timer_flag[1] false: weil negativer wert (takt=-150)


    so jetzt kommt ein wenig programmcode
    ..
    ..
    irgendwann wenn gewünscht (roboter ist bereit für seine arbeit) kannst du den Timer starten und den Interrupt aktivieren.


    INTERRUPT ON 1
    $TIMER_STOP[1]=FALSE


    ab diesem Zeitpunkt wird das Programm (PD_Regelung()) alle 150 ms aufgerufen. Den Taktgeber kann man natürlich anpassen.


    wenn die Arbeit erledigt ist kannst du den Interrupt wieder deaktivieren.
    INTERRUPT OFF 1
    $TIMER_STOP[1]=TRUE
    ;Taktgeber wider mit Startwert initialisieren
    $TIMER[1]=Takt



    Das Programm PD_Regelung kannst du in einer eingenen Datei schreiben.
    Programmkopf und Programmende sollte so aussehen.
    ;===============================================
    ;PD_REGLER
    ;===============================================
    GLOBAL DEF PD_Regelung()
    ;interrupt regelung unterbrechen
    INTERRUPT OFF 1
    ;taktgeber init
    $TIMER_STOP[1]=TRUE
    $TIMER[1]=Takt


    ;==============
    ;hier kommt dein code für die regelung rein
    ;==============


    ;interrupt regelung aktivieren
    INTERRUPT ON 1
    $TIMER_STOP[1]=FALSE
    END



    So und jetzt mußt du (nur :uglyhammer_2: ) noch die Regelung schreiben. Leider habe ich in KRL noch keine Regelung programmiert. Aber ich füge mal ein PD-Regler in C ein. Das ganze sollte dann in KRL umgesetzt werden. Ich hoffe das es ein wenig hilft :denk:


    Also die Regelung ist für eine kleine Roboterplattform mit zwei Motoren links/rechts. Mit dieser Regelung kann das Teil vor/zurück und Kurven fahren. m pro sekunde und radiaten pro sekunden.
    Das Programm mußt du für deinen Bedarf kürzen. Schau dir Speedsystem() an.

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu

  • Hallo PA, Paulaner und alle andere!
    vielen Dank für die viele Hilfe!


    @Paulaner, leider konnte ich noch nichts programmieren, aber die Idee mit den Interrupts und Timer habe ich schon im Kopf gehabt! nur leider habe ich bis jetzt keine Interrupts programmiert und deswegen war dein Post sehr hilfsreich!....nur programmieren könnte ich bis jetzt noch gar nichts! :wallbash: :wallbash: :wallbash: :wallbash:
    Die Sache ist unsere Roboter laufen in Kooperation(2 Stück) und an einem von den beiden muss ich das programmieren! nach dem ich in IOSYS.INI, IB60 eingefügt habe, habe ich die Roboter neugestartet...na ja, und seit dem läufts nichts!....KUKA kann da auch nicht weiter helfen(nach Aussage von Kollegen) und ich weiß nicht was da nicht funktioniert....irgendwie erinert mich an Würfel werfen.....so wie ich das mitgekriegt habe, muss mann zuerst RT2(Slave) starten und dann 3-5sek später RT1(Master), damit die konfiguriert sind, sonst läufts gar nichts!....und diese Startprozedur funktioniert aber nicht immer, bei den letzten über 20 Starts hats nicht geklappt!...die Sache ist aber, wenn es läuft, dann läuft es stabil!...........und wie gesagt, KUKA kann das auch nicht lösen..........und da die Roboter hardwaremäßig zusammen verschaltet sind, die Roboter wieder einzeln laufen lassen wird noch mehr arbeit mit sich bringen(sollen aber auch nicht einzeln laufen!)....

    Aber an meiner Regelung bin ich immer noch dran!...Die C-Datei gucke ich mir an!...hoffe kann das auf KRL ustellen....


    erstmal mein Dank an alle!

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