encoder Motor- Counter invertieren

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
Gelva
Beiträge: 2
Registriert: 17 Jun 2013, 16:02

encoder Motor- Counter invertieren

Beitrag von Gelva » 17 Jun 2013, 16:14

Hallo und guten Tag,
ich baue und programmiere mit dem Robo Tx-Controller ein automatisiertes Hochregallager im Rahmen mein Abschlussarbeit.
Nun habe ich ein Problem mit dem Counter des Encoder-Motors. Der Counter soll sich bei Drehrichtungswechsel des Motors invertieren, also zurückzählen. Der Befehl SetCntConfig(uint fthdl, int devId, int id, int mode); ist hierbei leider Wirkungslos.
Kann mir jemand weiterhelfen?

mfg Gelva

c#
dll: ftMscLib.dll
ROBO TX Controller Firmware 1.30

vleeuwen
Beiträge: 1567
Registriert: 31 Okt 2010, 22:23
Wohnort: Enschede (NL)
Kontaktdaten:

Re: encoder Motor- Counter invertieren

Beitrag von vleeuwen » 17 Jun 2013, 23:07

I hope that I understood your question well.

The counter on the "encoder motor" is from the type INCREMENTAL ENCODER.
An incremental encoder provides only a relative indication of movement and not position or direction of rotation.
This is also the weakness of this type of encoders.

For position indication there exist a ROTARY ENCODER.
This encoder can deal with change of direction of rotation and delivers two bit data.
see: http://en.wikipedia.org/wiki/Rotary_encoder
However and unluckily the TX-C fast counter is not able to deal with rotary encoder data.

It is possible to create with software a ROTARY ENCODER counter yourself with the I-nputs.
However the counter speed to the speed of the I-nputs (online mode: ideal situation 50 counts/sec, for a stable control system 30 count/sec).
The main problem will be the creation of the overlapping two bits waveforms.
http://upload.wikimedia.org/wikipedia/e ... am.svg.png

thkais
Beiträge: 381
Registriert: 31 Okt 2010, 21:45

Re: encoder Motor- Counter invertieren

Beitrag von thkais » 18 Jun 2013, 21:11

Moin allerseits,

um ein Hochregallager in fischertechnik zu bauen und zu programmieren sind keine Fremdkomponenten notwendig.
Dass es funktioniert, zeigt das Hochregallager aus dem "Automation Robots" Baukasten - mit RoboPro ist es natürlich etwas einfacher, aber in C gehts notfalls auch ;)
Der Ansatzpunkt ist falsch. Bei den Encoder - Motoren sollte man sich sowieso nicht ausschließlich auf die Daten der Transfer-Area verlassen (die wird "nur" alle 10ms aktualisiert, die Impulse des Encoder-Motors kommen schneller) sondern die eingebauten "Fahre Motor x Schritte" - Funktionen verwenden. Steuert man die Motoren "manuell" sind Positionierungsfehler vorprogrammiert, weil der "Motor Stop"-Befehl einfach zu spät kommt.

Für die aktuelle tatsächliche Position lässt man eine Variable als Zähler mitlaufen, dann muss man für die neue Position nur die Differenz berechnen, je nach Vorzeichen der Differenz links- oder rechtsrum fahren und fertig ist die Laube. Sehr aufschlussreich sind auch die zum Automation Robots gehörenden RoboPro Programme, da kann man sich einige interessante Kniffs abschauen.
Eine Positionierung läuft in etwa so:
- die aktuelle Position ist in einer Variablen gespeichert. Der Counter des Motors ist 0(!)
- Soll eine neue Position angefahren werden, wird die Differenz Soll - Ist gebildet
- je nach Vorzeichen wird die Drehrichtung festgelegt
- Der "Fahre Motor X Schritte" Befehl wird ausgeführt. --> StartMotorExCmd()
- Man liest den Counter aus (und damit die TATSÄCHLICH gefahrenen Schritte) --> GetInCounterValue()
- der Wert des Counters wird (je nach oben festgestellter Drehrichtung) von der aktuellen Position abgezogen oder addiert.
- Der Counter wird wieder auf 0 gesetzt, damit die nächste Position angefahren werden kann. --> StartCounterReset()

Durch die Korrektur der aktuelle Position mit dem tatsächlichen Zählerstand werden zuverlässig kumulative Positionierungsfehler ausgeschlossen, auch wenn der Motor mal einen Step zu früh oder zu spät stehengeblieben ist.

Der StartMotorExCmd() Befehl ist recht komplex, man kann damit sogar zwei Motoren synchronisieren. Wichtig ist auch, sich in das Thema Callback einzuarbeiten, z.B. für den Motor-Befehl benötigt man den Callback SetCBMotorExReached() um das Erreichen der Zielposition zu überwachen.
Gruß
Thomas

Gelva
Beiträge: 2
Registriert: 17 Jun 2013, 16:02

Re: encoder Motor- Counter invertieren

Beitrag von Gelva » 19 Jun 2013, 09:25

Guten Morgen und Danke für eure schnellen Antworten,
so wie Thomas es beschrieben hat, habe ich bereits die automatische bzw. teil automatische Ansteuerung des RBG programmiert und das klappt auch sehr gut.
Mein beschriebenes Problem bezieht sich nur auf die manuelle Steuerung durch das Gamepad. Dabei lässt sich die Methode mit der Differenz und dem Counterreset nur begrenzt anwenden, da bei schnellen Richtungsänderungen z.b.(schnell hoch-runter) ist die Zeit zum Zurücksetzen des Zählers zu kurz. Der Reset wird immer dann ausgeführt, wenn der Gamepadstick in "Null-Stellung" gerät. Diese "Nullstellung" wird aber öfter nicht erkannt wenn der Stick zu schnell bewegt wird...
Da es aber mit meiner gegebener Hardware nicht anders zu realisieren habe ich die Idee wieder verworfen, jetzt muss das RBG nach dem Betrieb mit dem Gamepad nur wieder neu ausgerichtet (durch zwei Taster auf x- und z-Achse) werden, bevor in den automatischen Modus gewechselt werden kann.
Durch das Mitzählen der Motoren hätte man nathlos zwischen den zwei Bedienmodi wechseln können, ohne das RBG neu auszurichten.

Gruß Gelva

Antworten