PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe: C++ Programmierung für Faulhaber Motion Controller



wlan
10.08.2005, 12:36
Hallo liebe Leute!

ich habe einen Roboter konstruiert. Dafür habe ich 3 Motoren (MCBL 3603 Brushless DC-Sercomotor) von der FirmaFaulhaber und 3 entsprechende Motion-Controller-Karten gekauft.

Ich habe nun die Frage: wie kann man die Ansteuerung der Motoren in C++ programmieren? Ich nehme RS232 als Schnittstellen. Für die Schnittstellen-Kommunikation benutze ich PComm Library von MOXA, was einwandfrei fonktioniert.

Ich würde die Befehle (z.B. Geschwindigkeit, Drehrichtung, Stop-Befehl, Beschleunigung usw.) alle 10 oder 20ms an die Hardware schicken. Es sieht jetzt so aus, dass der Motor (oder die Controller-Karte) nicht so schnell reagieren kann.

Hat vielleicht jemand schon ähnliche Karte benutzt? Ich würde mich sehr freuen wenn jemand mir helfen könnte!

Vielen Dank!

WLAN

Lars.
10.08.2005, 12:39
Sag mal, kannst du dich nicht für ein Unterforum entscheiden oder warum postest du diesen Beitrag 3 mal?

wlan
10.08.2005, 12:42
sorry, ich konnte mich wirklich nicht für ein unterforum entscheiden.
lege mein post bitte in ein unterforum und ich werde da weiter schreiben.
danke!

Lars.
10.08.2005, 12:48
Ich weiss nicht genau wer, aber irgendjemand kann Beiträge verschieben

Frank kann es bestimmt

Frank
10.08.2005, 13:17
Es scheint wohl am besten ins PC-Forum zu passen, da es wohl um eine PC-Karte geht. Es ist zu empfehlen solche Karten immer in 2 bis 3 Zeilen zu beschreiben, denn oft sind diese PC-Karten weniger bekannt.

wlan
10.08.2005, 13:37
vielen Dank!

Diese Karte heisst: Motion Controller für bürstenlose DC Servomotoren (für den Motor MCBL 3603)

Die genaue Beschreibung seht ihr in folgender Datei:
http://www.faulhaber.de/zip_pdf/anleitung/2000/IM_e_MCDC_MCBL_3603.pdf

mehr zur Programmierung:
************************************************** ********
One of the most important objectives in the development of these units was to keep its operation as simple as possible. This has been attained with the use of just a few, highly efficient functions. Manual balancing or potentiometers are no longer required. Menu-guided program and
parameter-editing functions are already integrated for operation with an ASCII terminal. In place of internal menu management, the clearly structured command set can be simply integrated into a customer-specific interface, e.g. with Visual Basic, Lab View, Pascal, C++, etc. Any PC with Windows operating system can be used as an input terminal. Program updates are made directly via the serial interface without changing the hardware. Communication is made via the serial port RS232 or RS485.
************************************************** ********

Die Befehle für den Motor wurden eigentlich schon in der Software der Karte integriert. Z.B. mit dem Befehl "jn" kann man den Motor in negative Richtung bewegen. Mit "sp 10000" kann man eine Geschwindigkeit von 10000 einstellen.

Die Motoren hab ich im Roboter eingebaut. Sie sind mit den Karten (1 zu 1) verbunden. Die Karten wurden mit den RS232-Schnittstellen (über eine MOXA-PCI-Multiport-Karte)verbunden.

Mein Problem ist: ich habe die Grundbefehle (jn, jp, sp, ac usw.) als Funktionen in VC++ geschrieben. (Wie gesagt, PComm Library habe ich für die Schnittstellen-Kommunikation benutzt.) Sie scheinen auch funktionieren. Aber die Karte braucht sehr lang (über 50ms) um die Befehle auszuführen.

Ich weiss nicht ob es am C++-Programm oder an der event. falschen Benutzung der Karten liegt.

NumberFive
10.08.2005, 22:16
das chr(13) schickst du mit ?

die brücken sind drin oder die Hardware fluss controlle abgeschaltet ?

Hast du mal eine PC oder so an die Serial gehängt dauert es dann genauso lange ?

9 byte zum übertragen = 72 bits + 9 mal start + 9 mal stop
90 bits sollte eigendlich in 5 ms erledigt sein bei 19200 baud.

NumberFive
11.08.2005, 07:58
Hat mich die ganze nacht beschäftigt. deshalb frage ich jetzt das Teil ist sich nicht ganz billig gewesen wie kommt man an so ein sponsor ?

wlan
11.08.2005, 10:40
Hat mich die ganze nacht beschäftigt. deshalb frage ich jetzt das Teil ist sich nicht ganz billig gewesen wie kommt man an so ein sponsor ?

Hallo, das ist ein Forschungsprojekt. Ich bin total Newbie in diesem Bereich. Mein Vorgänger hat den Roboter konstruiert, und ich bin jetzt für die Steuerung zuständig.

Ich bin eigentlich Nachrichtentechniker, habe wenig Ahnung von der Steuerung und hardwarenaher Programmierung. Deswegen bitte ich hier um eure Hilfe! :-)

wlan
11.08.2005, 10:54
hier ist der Code zur Initialisierung der Schnittstellen und der Motoren,
könntet ihr ein paar Verbesserungstipps geben?



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> //for isdigit()
#include <math.h> //for sin(), cos()
#include <process.h> //for multithread
#include <windows.h> //for PCOMM.h and multimedia timer
#include "../Moxa/PComm.h" //Serial Communication Libarary
#include "../Moxa/MoxaFunction.h"
#include "GlobalFunction.h"

void init (int port)
{
/* Port Control, enable the port */
if (sio_open(port) == SIO_OK)
{
sio_ioctl(port, B38400, P_NONE | BIT_8 | STOP_1 );
// Port Control, set baud, parity...
sio_flowctrl ( port, 0xc ); //0XC: software flow control: XON/XOFF
sio_DTR (port, 0 ); //turn DTR off
sio_RTS (port, 0 ); //turn RTS off
sio_flush (port, 2);
/*
0 : flush input buffer
1 : flush output buffer
2 : flush input & output buffer
*/
sio_SetReadTimeouts(port, 0, 0);
// Set sio_read into block mode, which is used in readposition()
sio_SetWriteTimeouts(port,0);
//Set sio_write into block mode
}
else
{
printf("Cannot Open Port%d !!!\n", port);
system("pause");
exit(-1);
}

// tp: tell position -> definierte Funktion
if (tp(port) != 0)
{
pq(port);// pq: Power Quit
}

if (port == MotorOne)
{
printf("Motor One Status:\t");
}

if (port == MotorTwo)
{
printf("Motor Two Status:\t");
}

if (port == MotorThree)
{
printf("Motor Three Status:\t");
}

pw(port);
printf("Power ON\t\t\n\n");
//printf("%9d\n\n",tp(port));
}

wlan
11.08.2005, 10:56
das chr(13) schickst du mit ?

die brücken sind drin oder die Hardware fluss controlle abgeschaltet ?

Hast du mal eine PC oder so an die Serial gehängt dauert es dann genauso lange ?

9 byte zum übertragen = 72 bits + 9 mal start + 9 mal stop
90 bits sollte eigendlich in 5 ms erledigt sein bei 19200 baud.

das chr(13) habe ich eigentlich mitgeschickt. Beispiel: den Befehl "jp" (jogging positive) schicke ich (als Funktion) wie folgt:

// Line-Break als Carrige-Return!
#define K_CR 0x0d

void jp (int port)
{
char temp[5]="\0";
sprintf(temp,"%s%c\0","jp", K_CR);
sio_write(port, temp, strlen(temp));
}

gibt es Fehler oder kann man effizienter machen?

NumberFive
11.08.2005, 13:00
Ich möchte gerne wissen wie man an so jobs kommt.
als ich ausblidung gemacht habe (Komunikationselektroniker).

Durfen wie so gut wie nix machen und schon garnicht so interresante sachen.
wir haben kabel gezogen.

Sorry wenn das aggresiv klingt hast du das ding gelesen ?

38400 kann das teil garnicht. und die Fluss controlle habe ich auch nicht gefunden. Betreibs du das Teil Per RS232 oder per RS485 hast du gesehen das beide Schnittstellen auf dem Selben port sind.

Wie sieht dein kabel aus ?

wlan
11.08.2005, 13:40
Ich habe RS232 benutzt, und zwar über eine MOXA-PCI-Multiport-Karte (mit 4 RS232-Schnittstellen).

Folgende Schritte habe ich gemacht:
Connect the motor phases to MOTOR
Connect the encoder and the motor Hall sensor leads to ENCODER HALL
Connect the RS232 (or RS485) to the computer port COM
Connect the power supply to PWR
Power the motion controller

Die COM-Optionen sind:
Boud-Rate: 38400
Data Bits: 8
Parity: None
Stop Bits: 1
Flow Control: XON/XOFF
Output State: DTR:OFF; RTS:OFF

Mit anderen Konfigurationen kann er nicht arbeiten.
Flusscontrolle wird so definiert:
sio_flowctrl ( portNr, 0xc ); //0xc: Bit 2 und Bit 3 für software flow control: XON/XOFF


Sorry, dass ich keine gute Vorbereitungsarbeit gemacht habe. Ich bin Berufsanfänger, habe mich nur sehr viel mit der Bildverarbeitung beschäftigt. Könntest du mir vielleicht weiter helfen?

NumberFive
11.08.2005, 13:45
Laut deinem PDF stimmt das aber nicht deine Aussage

<Zitat>
29. PIN configuration
PIN configuration
Serial interface RS 232 or RS 485, 9 POLE D-SUB
RS232 set up
Set the baud rate RS232 via 6-bit CONFIG switch S1 (6 bit SMD multiswitch)
data 8bit
stop bit 1
parity no

Speed:

bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 Function
x x x OFF OFF x RS232 9 600 baud (default)
x x x OFF ON x RS232 2 400 baud
x x x ON OFF x RS232 4 800 baud
x x x ON ON x RS232 19 200 baud
</Zitat>

Was stimmt nun ?

Also nicht 38400 Baud

Hast ein zweiten pc ? Hängt den doch mal anstant dem Controller dran.

Gruß

wlan
11.08.2005, 14:51
Es tut mir wirklich sehr Leid. Die Schnittstelle war RS485, nicht RS232. Die PIN-Konfiguration war Bit5 auf ON und Bit4 auf OFF, also 38400 baud.

Andere Kabelverbindungen habe ich auch geprüft. Jetzt stimmt alles. Nur das Ausführen der Befehle immer noch zu langsamm ist.

NumberFive
11.08.2005, 18:51
http://www.google.de/url?sa=t&ct=res&cd=1&url=http%3A//www.elektronik-projekt.de/include.php%3Fpath%3Dcontent/content.php%26contentid%3D16%26catid%3D7%26themeid %3D3&ei=WHb7QqbPCrqYYKSIkZcN

also bei rs485 fehlt mir die erfahrung was heist lange dauert bis das programm von dem aufruf zu rückkommt oder was meinst du ?

die adresse 0 ist nicht vergeben ?

wir müssen senden 9 bit adresse dann die länge 9 bit dann die daten
bei CI1<cr> macht das 4*9. 14 milisec für die Reine übertragung.

Wie lange ist es den wirklich ? ist es abhängig von der Befehls länge ?

Gruß
du spricht den controller zu erst an befor du die daten schickst ?
CI?<cr>

Volly42
04.09.2005, 21:51
Ich kann mir nicht vorstellen, daß Du die Befehlssequenzen schneller über die serielle Schnittstelle bekommst. Der erste Flaschenhals wird Windows sein. Hast Du mal mit Portmon die Kommunikation angeschaut? Ich glaube dort sieht man auch Zeiten.

Andere Frage: Wieso mußt Du denn immer alle Werte schicken, einmal Geschwindigkeit einmal Beschleunigung, einmal Drehrichtung müßte doch reichen, dann sollte sich das Teil doch erst mal bewegen. Alle 10ms die Beschleunigung zu ändern, macht keine Mechanik mit.