Я пишу программу на C++ для управления двигателем Epos maxon с помощью связи rs232. Я уже разобрался, как отправлять сообщения для установки скорости или других настроек. Теперь мне нужно заставить его вращаться в течение определенного периода времени (например, 10 секунд) после того, как он достиг своей целевой скорости. очевидно, можно прочитать состояние двигателя и увидеть, достигнута ли целевая скорость. в примечании к приложению говорится, что если установлен бит 10 объекта 0x6041, целевая скорость достигается, но я не знаю, как прочитать этот бит. Кто-нибудь знает, что мне делать? Вот код того, как я устанавливаю скорость с определенным ускорением:
void DataField::doVelocity(int i) {
float colTime = fromString<int>(Action[i][1]); //Haltezeit in sekunde
float frequency = fromString<int>(Action[i][2]); //Drehfrequenz in Hz
float acceleration = fromString<int>(Action[i][3]); //Beschleunigung in Hz/s
cout << "Parameter:\t" << colTime << "\t" << frequency << "\t" << acceleration << endl;
short mode2[8] = { 0x1103,0x6060,0x0100,0x0003,0x0000,0x0000 }; //velocity mode einstellen
motorobj.communication(mode2);
short accel[8] = { 0x1103, 0x6083, 0x0100, acceleration , 0x000, 0x000 }; //Acceleration einstellen NOCH NICHT GETESTET
motorobj.communication(accel);
target[1] = { 0x60ff }; //target velocity index
target[3] = frequency;
motorobj.communication(switchon);
motorobj.communication(target);
motorobj.communication(control);
//controlbit abfragen, ob target velocity erreicht ist, wenn ja: velocity Haltezeit lang halten
Sleep(colTime * 1000);
}
Это класс, в котором я реализую все функции, которые мне нужны для двигателя:
class motor {
private:
RS232 *rs232p;
uint8_t written;
char *buffer;
public:
motor(char*buffer, RS232 *rs232);
~motor();
void schreiben(short *Befehl);
short CalcFieldCRC(short* pDataArray, int numberOfWords);
void communication(short*Befehl);
void eingaben(int mode, short*Befehl1, short *Befehl2);
};
motor::motor(char *buffer, RS232 *rs232) : rs232p(rs232), buffer(buffer) //da rs232 hier als zeiger übergeben wird, kann es allen anderen funktionen ohne "&" übergeben werden
{
written = 0;
}
motor::~motor()
{
}
void motor::eingaben(int mode, short*position, short *start)
{
short a, b;
if (mode == 1)
{
cout << "gewuenschte Position eingeben" << endl;
cin >> a;
position[3] = a;
cout << "fuer start rel. position 127 eingeben, fuer absolut position 63" << endl;
cin >> b;
start[3] = b;
}
else if (mode == 2)
{
cout << "gewuenschte Geschwindigkeit eingeben" << endl;
cin >> a;
position[3] = a;
cout << "fuer start 15 eingeben" << endl;
cin >> b;
start[3] = b;
}
}
void motor::schreiben(short *Befehl) {
Befehl[5] = CalcFieldCRC(&Befehl[0], 6);
short a2, b1, b2, c1, c2, d1, d2, e1, e2, f1, f2;
a2 = Befehl[0]; //0pCode weglassen
b1 = Befehl[1];
b2 = Befehl[1] >> 8;
c1 = Befehl[2];
c2 = Befehl[2] >> 8;
d1 = Befehl[3];
d2 = Befehl[3] >> 8;
e1 = Befehl[4];
e2 = Befehl[4] >> 8;
f1 = Befehl[5];
f2 = Befehl[5] >> 8;
char buffer2[60] = { a2, b1, b2, c1, c2, d1, d2, e1, e2, f1, f2 };//LSB zuerst übergeben
//char buffer[60] = { a2,b2,b1,c2,c1,d2,d1,e2,e1,f2,f1 };
rs232_write(rs232p, buffer2, 11, &written);
};
void motor::communication(short* Befehl)
{
char opCode[1] = { 0x11 }; //OpCode für schreiben
char OK[1] = { 0x4f };
rs232_write(rs232p, opCode, 1, &written);
Sleep(100);
if (buffer[0] == 'O' || buffer[0] == 0x4f)
schreiben(Befehl);
else
cout << "Fehler! Falsche Antowrt" << endl;
Sleep(100);
if (buffer[0] == 'O' || buffer[0] == 0x4f)
rs232_write(rs232p, OK, 1, &written);
else
cout << "Fehler! Falsche Antowrt" << endl;
Sleep(100);
if (buffer != 0)
rs232_write(rs232p, OK, 1, &written);
else
cout << "Fehler! Falsche Antowrt" << endl;
}
short motor::CalcFieldCRC(short* pDataArray, int numberOfWords)
{
unsigned short shifter, c;
bool carry = false;
short CRC = 0;
//Calculate pDataArray Word by Word
while (numberOfWords--) //solange noch datenwörter vorhanden sind
{
shifter = 0x8000; //=0b1000 0000 0000 0000
c = *pDataArray++; //Datenwort i in c kopieren
do
{
carry = CRC & 0x8000; //carry =1 wenn hoechstes bit von crc gesetzt ist
CRC <<= 1; //CRC=CRC*2
if (c & shifter) CRC++; //wenn betrachtetes bit des Datenwortes gesetzt ist, crc+1
if (carry) CRC ^= 0x1021; //wenn carry=1, crc XOR polynom
shifter >>= 1; //betrachtetes bit nach rechts shiften
} while (shifter);
}
return CRC;
}
#endif
//globale variablen die in allen Funktionen gebraucht werden
uint8_t written;
RS232 rs232;
char buffer[61]; // +1 for the NUL-terminator
motor motorobj(buffer, &rs232); //motor objekt estellen
@Someprogrammerdude Я добавил код :)
Что такое
motorobj
? Есть ли у него какие-то функции к читать от мотора? Прошу прощения за грубость, но, может быть, вам стоит реализовать такую функцию?