Roboter mit TwinCat NC

matzew

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits,

ich bin neu im Forum und habe mich bereits durch einige Beiträge gelesen :) .

Da ich in Sachen SPS und TwinCat noch sehr unerfahren bin habe ich eine Frage an die Profis unter euch:
Ich arbeite an einem Roboterarm, der über Joystick ferngesteuert wird.

Als Steuerung dient eine Beckhoff SPS. Die Steuerung programmiere ich in TwinCatPLC.
Mit MC_MoveAbsolut fahren die Motoren aber nur die erste Position an.
Hier im Forum und in der infosys steht, dass ich die Fahrt unterbrechen muss durch eine Funktion gleicher Instanz mit den neuen Werten.

Meine Frage:
Wie kann ich dem Motor jeden Zyklus (1ms) einen neuen Soll-Wert geben?
Muss ich wirklich nach jedem Zyklus die aktuelle Instanz des MC_MoveAbsolut durch eine andere Instanz unterbrechen?
Macht man das wirklich so oder gibt es eine elegantere Lösung?


Viele Grüße
Matze
 
Meine Frage:
1) Wie kann ich dem Motor jeden Zyklus (1ms) einen neuen Soll-Wert geben?
2) Muss ich wirklich nach jedem Zyklus die aktuelle Instanz des MC_MoveAbsolut durch eine andere Instanz unterbrechen?
3) Macht man das wirklich so oder gibt es eine elegantere Lösung?

Hallo Matze,

ich kann mir nicht vorstellen, dass du jede ms deiner Achse neue Geschwindigkeiten und Positionen übertragen musst. Aber besser du schreibst erst mal, was genau umgesetzt werden soll.

Prinzipiell kann ich dir aber empfehlen, gleich die neuere „MC Library 2“ zu verwenden.
Die Funktion MC_Moveabsolute kann mit der steigenden Flanke an „Execute“ neu angestoßen werden, sofern der MC_BufferMode entsprechend eingestellt ist. *1

1) In „jedem Zyklus“ kannst du natürlich keine neue Flanke erzeugen, aber wenn es sein muss in jedem zweiten. Die Frage ist, wo kommt dein neuer Sollwert her?

2) Nein. Du hast pro Antrieb eine Instanz. In dieser Instanz kann jeweils immer nur eine Bewegungsfunktion (MC_Moveabsolute, MC_MoveRelative, MC_Jog,...) aktiv sein. Wenn es notwendig ist, kannst du aber während der Bewegung den Baustein nachtriggern. Zuerst wird dazu der „Execute“ weggenommen und die neuen Daten angelegt, im nächsten Zyklus muss der „Execute“ wieder gesetzt werden.

3) Das kommt darauf an, was du tatsächlich vor hast. Normale Pick-and-Place- Aufgaben kann man so einfach umsetzen.
Soll deine Applikation mit einer 3D-Delta Kinematik oder ähnlichem ausgestattet werden, ist es sehr ratsam, sich die fertige Kinematic Transformation anzusehen...

Gruß
Chräshe

*1
Um den BufferMode zu verwenden, ist immer ein zweiter Funktionsbaustein nötigt. Es ist nicht möglich, einen Move-Baustein mit neuen Parametern zu triggern, während er noch aktiv ist.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Chräshe,

danke für die schnelle Antwort.
Die mc2 Bibliothek hab ich bereits. Dadurch kam ich auf das MC_Absolut mit zwei Instanzen.

Zum Projekt:
Ich möchte meine Kinematik für einen mehrachsigen SCARA Roboter umsetzen.
Über ein Gamepad soll man den Endeffektor im Raum bewegen (x,y,z) und ausrichten.
Wenn der Benutzer den Joystick bedient berechne ich die Sollwerte neu.
Die Transformation zwischen Raumkoordinaten und Achskoordinaten steht bereits und liefert auch die Richtigen Werte.
Bringt mir die Kinematic Transformation etwas wenn ich die Transformationen schon habe?

Es scheitert bisher nur an der Motoransteuerung. Die Achsen fahren einmal in die erste Position, dann bewegen sie sich nicht mehr.
Ich kann statt einer gezielten Bewegung sicher auch eine Endlosbewegung machen. Aber bei einer Geschwindigkeitsänderung muss ich auch hier die Bewegung anhalten, die Richtung ändern oder eben die Geschwindigkeit verringern.

Wenn ich das mit dem Nachtriggern richtig verstanden habe heißt das:

Bei neuer Sollposition:
- Execute false
- neuen Wert
- Execute true

Beeinflusst es nicht die Bewegung wenn ich den Motorblock kurz deaktiviere?
Verzeiht mir mein Unwissen :D

Grüße
Matze


 
Hallo Matze,

Bringt mir die Kinematic Transformation etwas wenn ich die Transformationen schon habe?
Vermutlich nicht.

Es scheitert bisher nur an der Motoransteuerung.
Na ja, bei einem Roboter nicht ganz unwesentlich! :rolleyes:

Ich kann statt einer gezielten Bewegung sicher auch eine Endlosbewegung machen.
Ich kenne jetzt natürlich deinen Aufbau nicht. Im Prinzip muss in Abhängigkeit vom Ausschlag des Joystick, eine Drehzahl und Richtung ausgegeben werden.


Bei neuer Sollposition:
- Execute false
- neuen Wert
- Execute true
Genau, wobei du zwei Aktionen in einem Zyklus zusammen fassen kannst.

Beeinflusst es nicht die Bewegung wenn ich den Motorblock kurz deaktiviere?

Nicht den Baustein abschalten oder deaktivieren, sondern nur
Execute für eine Zyklus auf FALSE und im nächsten, mit neuen Daten am Baustein, wieder auf TRUE.


Sieh dir dazu das mit dem MC_BufferMode noch mal genauer an.

Gruß
Chräshe
 
Bei nem Roboter sind die Transformationen ja das Grundsätzliche. Man will sich als Anwender später programmiertechnisch im 3D-System bewegen, während die Achsen des Roboters sind völlig unterschiedliche bewegen, und dazu synchronisiert, so dass ein Punkt im Raum von allen Achsen (in ihrem eigenen Koordinatensystem) zur selben Zeit erreicht werden.
Das wird über simple MC_MoveAbsolute nur schwer zu realisieren sein, denke ich. Denn jeder Fahrauftrag wird von der NC separat gehandhabt. Für jede Achse wird ein separater Fahrauftrag ausgeführt, mit Beschleunigungsrampe, Konstantfahrt, und Verzögerungsrampe. Aber es wird bei den Einzelaufträgen nicht danach geschaut, wie weit die anderen Achsen schon sind, also bei Bedarf nicht gebremst oder beschleunigt.

Was du brauchst, ist eine kontinuierliche Sollwertübermittlung an die Antriebe. So etwas macht ja auch z. B. eine CNC-Steuerung. Die arbeitet auch nicht mit Fahrbefehlen, sondern man gibt das Ziel (im xD-Raum) und die resultierende BAHNgeschwindigkeit vor.

Was für Antriebe hast du denn zur Verfügung? Die Antriebe müssen die kontinuierliche (zyklische) Sollwertübertragung unterstützen.
Und für die Interpolation der Sollwerte gibt's mehrere Möglichkeiten: Vorgefertigte (Bei Beckhoff z.B. die "Kinematik Transformation" oder die CNC), oder du berechnest alles über die PLC und gibst die resultierenden Sollwerte einfach als zyklische Prozessdaten (nicht als Fahraufträge!) an die Antriebe. Dazu braucht man dann nicht mal die NC-Steuerung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Transformation hab ich in der PLC als function block. Bekomme für jede Position die im Raum die angefahren werden soll den benötigten Winkel und die Winkelgeschwindigkeit für alle Achsen.

Genau an eine kontinuierliche Sollwertübermittlung dachte ich.
Das ganze System war bisher als NC-Achsen eingerichtet, daher versuch ich es auch so umzusetzen.

Ich hab Schrittmotoren von Beckhoff zur Verfügung. Mit EtherCat Schrittmotorklemmen. Die Ist-Werte werden über Potentiometer ermittelt, da zwischen Motor und Achs-Welle jeweils ein Zahnriemen mit Untersetzung ist. Das alles ist ein Eigenbau für den ich die Kinematik entworfen habe.

Das bedeutet ich sollte lieber eine CNC-Konfiguration verwenden?
Ich leß mich mal in die infosys dazu ein.


Edit: Es ist eine PTP-Bewegung die ich ausführen möchte am Effektor


Grüße
 
Zuletzt bearbeitet:
Hallo Chräshe

Nein ich hab einen Scara, kein Portal. Es ist ähnlich wie das: http://gaullyblog.files.wordpress.com/2011/11/scara-arm.gif
Ich kenne das als "offene kinematische Kette".
Besteht aus 3 Hauptachsen im Arm und 2 Nebenachsen im Effektor. Insgesamt also 5 Achsen, bzw 5 Motoren.

Das ganze ist ein Teil einer Studienarbeit an der Uni, also ein Schulungmodell :)
Damit sammel ich erste praktische Erfahrung.
Per Joystick soll eine beliebige Position im Raum (x-y-z) mit dem Effektor angefahren werden.
Ein Joystickgesteuerter Scara. Daher dachte ich zuerst an eine simple p2p Bewegung.


Nächtliche Grüße
Matze
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm, die Aufgabe wird immer interessanter!

Wenn ich das richtig verstehe willst du mit dem Joystick den Arm in Echteit bewegen. Du gibst ja mit den Joystick eine Soll-Geschwindigkeit in X, Y und Z vor?
Jetzt könntest du die Achsen mit einer Soll-Geschwindigkeit versorgen, alternativ würde ich etwas mit dem MC_MovecontinuousAbsolut (Link: http://infosys.beckhoff.de/content/...cplclibmc_movecontinuousabsolute.htm?id=14273) bauen. Bei den früheren KL-Schrittmotorklemmen konnte man direkt eine Geschwindigkeit der Klemme mitteilen, so konnte man die NC auslassen. Ich würde jedoch aus Bequemlichkeit die NC-Steuerung nutzen. Die Überwacht Endlagen und Schleppfehler, rechnet alle Kinematik-Daten und die Parameter lassen sich einfach eisntellen....
 
exakt! Ich möchte den Arm in Echtzeit steuern.

@ Chräshe:
Durch das nachtriggern von MC_MoveAbsolut funktioniert es jetzt den Motoren ständig neue Werte zu liefern.
Das ist schon mal ein Fortschritt, danke :)
Es ist noch sehr ruckelig natürlich. Auch nimmt er neue Werte nur wenn ich den Joystick wieder loslasse.

pseudo-code:
If Joystick And PowerOn
Werte berechnen
variable = true​
else
variable = false​
end_if
...
MC_MoveAbsolut (Execute := variable,...)

Da ich die lineare Geschwindigkeit und Richtung im Raum per Joystick bekomme genügt es eigentlich die berechnete Winkelgeschwindigkeit und die Drehrichtung an die Motoren zu geben.
Die Richtung bekomme ich durch die Differenz von Soll- und Istposition. Die genaue SOllposition brauch ich also gar nicht... Vielleicht für andere Modi.
Ich teste es morgen mit MC_MoveVelo.
 
Die Methode Fahraufträge absetzen halte ich nicht für geeignet, da, wie bereits von mir oben erläutert, dann jede Achse für sich eigenständig einen Fahrauftrag abarbeitet, also ohne Koordination und Abstimmung mit den Fahraufträgen der anderen Achsen. Das führt dann zum einen zu "abgehackten" Bewegungen, und evtl. dazu, dass der Arm sich z. B. anstatt auf dem kürzesten Weg "auszufahren", erst der eine Teil nach rechts, dann der andere Teil nach links bewegt. Hier müsste eigentlich die Position des zweiten Arms in Abhängigkeit von der IST-Position des ersten Arms bewegen in jedem Zyklus berechnet werden (je nachdem, wie die Transformation aussehen soll).
Hier steht die notwendige Beschleunigung und Geschwindigkeit für die zweite Achse am Beginn des Fahrauftrags vielleicht noch gar nicht fest.

Mein Vorschlag:
Lass die NC beiseite und vergiss die Fahraufträge und versuch es über ein zyklisches Positionsinterface der Schrittmotorendstufe zu realisieren.
Was für eine Schrittmotorendstufe steht denn zur Verfügung? Bietet diese ein zyklisches Prozessdateninterface für Poistion? Also dass als Sollwerte zyklisch Positionen (Inkremente) vorgegeben werden, die die Endstufe dann stur umsetzt?
Dann wäre es doch einfach. Die Transformation in der SPS berechnet in jedem Zyklus die Positionen für deren Bezugssystem und die Achsen folgen dann einfach.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das klingt interessant. Würde ich gerne ausprobieren aber ob das damit möglich ist? hm ich bin grad total überfragt :/
In der Infosys hab ich auf die Schnelle nichts gefunden. Vielleicht steh ich grade auch auf dem Schlauch

das System besteht aus:

CX5020 SPS
EL7041 Schrittmotorklemme http://infosys.beckhoff.com/index.p.../1031/el70x1/html/bt_el70x1_title.htm&id=7940
und diversen Eingangs-Ausgangs- und Potenzialklemmen.

Wie kann ich denn ohne Fahraufträge direkt Signale aus der twincat plc an die Motoren senden?
 
Hallo Matze,

MC_Movevelocity ist für dein Vorhaben die besser Wahl. Um die Bewegung Ruckelfrei zu bekommen, kommst du vermutlich um den passenden MC_BufferMode und das nachtriggern nicht herum.
Was das nachtriggern angeht, muss ich mich noch korrigieren.
Bei der neuen Version „MC Library 2“ reicht es nicht, am Execute eine neue Flanke zu erzeugen:

Um den BufferMode zu verwenden, ist immer ein zweiter Funktionsbaustein nötigt. Es ist nicht möglich, einen Move-Baustein mit neuen Parametern zu triggern, während er noch aktiv ist.

Gruß
Chräshe
 
EL7041 Schrittmotorklemme http://infosys.beckhoff.com/index.p.../1031/el70x1/html/bt_el70x1_title.htm&id=7940
und diversen Eingangs-Ausgangs- und Potenzialklemmen.

Wie kann ich denn ohne Fahraufträge direkt Signale aus der twincat plc an die Motoren senden?
Mit der Betriebsart "Position Control": http://infosys.beckhoff.com/index.php?content=../content/1031/el70x1/html/bt_el7xxx_procdata.htm (unten)
Teste es mal. Stelle diese Betriebart ein, dann muss als Sollwert in Prozessabbild der Klemme so etwsa wie "Position" stehen (anstelle von "Velocity").

Nun verknüpfe die Prozessdaten mit der SPS anstatt mit der NC (nun musst du die Control-Bits allerdings selbst setzen, da die NC das jetzt nicht mehr für dich übernimmt). Wenn die Klemme "enable" ist, dann brauchst du eigentlich nur einen Wert in "Position" reinzuschreiben, und die Klemme sollte diese Anzahl Schritte ausführen.

Das ist die direkteste Möglichkeit zur Prozessdatenausgabe, allerdings muss man ggf. eine Sollwertrampe einstellen, sonst ist die Beschleunigung zu heftig und der Schrittmotor könnte abreißen. Bedenke, es gibt dann NC-seitig (da nicht vorhanden) keine Begrenzung von Beschleunigung oder Ruck. Der Motor verrsucht möglichst schnell die in den Prozessdaten eingetragene Anzahl Schritte auszuführen. Das musst du nun selbst machen, also Sollwertrampen etc.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Anleitung. Das werde ich mal als Alternative zum MC-block ausprobieren. Ich kann doch so auch die Geschwindigkeit vorgeben?
Im Dropdownmenu steht das ja.
Wie definiere ich die Begrenzungen und Rampen dann? in der PLC als Abfrage oder im SystemManager?

Die Sollwerte werden dann also jeden Zyklus aus der PLC gelesen?
 
Ich kann doch so auch die Geschwindigkeit vorgeben?
Im Dropdownmenu steht das ja.
Das geht auch mit Geschwindigkeitsinterface, ja.
Das macht die NC im Prinzip genauso. Die Berechnet das Verfahrprofil und gibt die entsprechenden Sollwerte (als Geschwindigkeit) aus.
Den Vorteil von Positionssollwerte sehe ich darin, dass du die Achse nicht "einfangen" (regeln) musst, also die Regelung der Geschwindigkeit muss die Schrittmotorendstufe übernehmen.
Wie definiere ich die Begrenzungen und Rampen dann? in der PLC als Abfrage oder im SystemManager?
Du musst ein "Profil" berechnen und als Sollwerte in Abhängigkeit von der Zeit vorgeben.
Die NC bietet auch die Externe Sollwertgenerierung: http://infosys.beckhoff.com/index.php?content=../content/1031/tcncptp/html/tcncptpextsetvalue.htm
Kannst du ja auch mal probieren.
Die Sollwerte werden dann also jeden Zyklus aus der PLC gelesen?
So in etwas, die Werte werden übergeben (kleine Feinheit) ;-)
 
Ich habe es jetzt erstmal mit MC_MoveVelo realisiert. Das funktioniert schon mal ganz gut.

Jetzt habe ich allerdings ein Fehler beim Antrieb.
ca. 10 Sekunden nach dem Start schaltet sich eine Achse ab. Immer die gleiche. Immer nach der gleichen Zeit. Auch wenn ich keine Fahrbefehle gebe.
In der PLC bekomme ich beim MC_Power den Fehler 19209: Antriebshardware nicht betriebsbereit.
Problem muss die Klemme sein, da ich zum Test Motoren und Klemmen getauscht habe.
Aber wie gesagt erst nach 10 Sekunden :confused: An was kann es liegen, dass sich die Achse nach einer gewissen Zeit deaktiviert?
Kann ich die Konfiguration der Klemme von einer anderen "kopieren" oder einfach zurück setzen?

Nach Suche im Infosys und Forum hab ich gelesen, das könnte an der Schleppabstandkorrektur liegen. Aber auch wenn ich die deaktiviere bekomme ich den Fehler.

Im System Manager erscheint auch kein Fehler. Bei der NC-Achse wird nur das Häkchen "Bereit" entfernt.
 
Hallo alle zusammen,

der Beitrag hier ist zwar schon lange her aber ich programmiere momentan auch Beckhoff motoren und würde 2 Motoren gleichzeitig anfahren mit einem Befehll, denn jeder einzelnen Motor kann ich schon allein anfahren.

könnte mir jemand dabei helfen bitte?
Welche Befehle ich dafür brauche?
Ich habe schon alles versucht, was ich konnte aber immer noch nichts passiert.

mfg

Vista
 
Zurück
Oben