Как я могу прочитать статус скорости моего двигателя maxon?

Я пишу программу на 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

Что такое motorobj? Есть ли у него какие-то функции к читать от мотора? Прошу прощения за грубость, но, может быть, вам стоит реализовать такую ​​функцию?

Some programmer dude 07.09.2018 13:53

@Someprogrammerdude Я добавил код :)

tinkerbell 07.09.2018 13:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
208
0

Другие вопросы по теме

Python 'ser.write' постоянно останавливает программу в Windows, возможные ошибки?
Приложение C# Mono в Linux / Raspbian не может читать из последовательного порта во время обслуживания сокета (может писать /, но буфер последовательного ввода сообщает 0 байтов)
Поток данных и обещания Node.js с последовательным портом
Форма для выполнения команды последовательного порта и выхода через 5 секунд
Передача данных через последовательный порт между Python и приложением C (работает в Microblaze)
Пакетный файл для отправки данных на com-порт
Проблема с передачей постоянно читаемых данных последовательного буфера другому классу
Очистка первой части строки последовательного чтения
Подключите эмулируемый последовательный порт к программному обеспечению и получите результаты
Невозможно прочитать из последовательного порта, если не открывать его один раз с помощью minicom