Использование DLL производителя для управления шаговым контроллером через USB с использованием C++

ВВЕДЕНИЕ Я переучиваю себя на C++ после прохождения курса обучения в колледже. Недавно я приобрел контроллер шагового двигателя Arcus Performax PMX-4EX-SA-TB9 с USB-соединением, которое планирую использовать. Компания предоставляет программное обеспечение для управления степпером вручную, используя свой собственный код, а также предоставляет терминал в своем программном обеспечении, где вы можете отправлять отдельные строки кода в контроллер для управления степпером. Вы можете контролировать ускорение и максимальную скорость и все виды вещей. С этим было весело играть, но теперь я хочу пойти дальше. В онлайн-руководстве рассказывается об использовании C++ для написания собственных программ для степпера, и я скачал файлы, которые, по моему мнению, мне нужны. У меня есть файл DLL, файл lib и файл заголовка. Таким образом, я узнал, что файл DLL представляет собой динамическую библиотеку ссылок, которая используется во время выполнения исполняемого файла. Я прочитал файл lib и файл заголовка и обнаружил, что я думаю, что некоторые объявления функций в файле заголовка похожи на некоторые команды двигателя. Я вставлю файл заголовка ниже.

МОЙ ВОПРОС

Могу ли я использовать файл DLL вместе с lib и заголовком для управления этим устройством, используя то, что я вижу в функциях в заголовочном файле? Как мне все это загрузить? Желает ли кто-нибудь написать небольшой небольшой пример, используя функцию fnPerformaxComDoMove, приведенную ниже? Так что я могу пойти оттуда? Я использую Visual Studio C++ 2013, и я сделал онлайн-уроки по созданию и использованию DLL, которую я сделал сам, но все они кажутся такими простыми по сравнению с этой.

МОЙ МЕГЕР ПОНИМАНИЕ

Я считаю, что, поскольку мне предоставляют DLL, заголовок и файл lib, я буду использовать определение _declspec (dllexport), а не версию для импорта. Все объявления функций начинаются как "BOOL", затем "PERFORMAXCOM_API", затем "_stdcall", и я привык видеть только тип, затем имя функции, а затем аргументы в скобках. Что означают "PERFORMAX_API" и "_stdcall" перед всеми различными функциями? Я понимаю, что DWORD является двойным словом и представляет собой 32-битное целое число, но некоторые аргументы запрашивают ось, например, x,y и z... зачем им хотеть число, когда они могли просто запросить символ? Большое спасибо всем, кто может помочь мне с любой информацией. Я так сильно хочу научиться этому пользоваться.

HEADER

    #ifdef PERFORMAXCOM_EXPORTS
    #define PERFORMAXCOM_API __declspec(dllexport)
    #else
    #define PERFORMAXCOM_API __declspec(dllimport)
    #endif

    extern PERFORMAXCOM_API int nPerformaxCom;

    #ifdef __cplusplus
    extern "C" {
    #endif

    PERFORMAXCOM_API int fnPerformaxCom(void);

    //USB reset

    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComUSBReset(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComFlush(IN HANDLE pHandle);

    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetNumDevices(OUT LPDWORD         lpNumDevices);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetProductString(IN DWORD dwNumDevices, OUT LPVOID lpDeviceString, IN DWORD dwOptions);    
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComOpen(IN DWORD dwDeviceNum, OUT HANDLE* pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComClose(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetTimeouts(IN DWORD dwReadTimeout, DWORD dwWriteTimeout);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSendRecv(IN HANDLE pHandle, IN LPVOID wBuffer, IN DWORD dwNumBytesToWrite,IN DWORD dwNumBytesToRead,OUT LPVOID rBuffer);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxMove(IN HANDLE pHandle, 
                                                        IN int commandCode, 
                                                        IN int axes,
                                                IN int moveDir,
                                                IN long *value,
                                                IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxCommandReply(IN HANDLE pHandle, 
                                                         IN char *command, 
                                                         IN char *reply);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxIO(IN HANDLE pHandle, 
                                                IN int commandCode, 
                                                IN int bitNumber,
                                                IN long *value,
                                                IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxMotorStat(IN HANDLE pHandle, 
                                                IN int commandCode, 
                                                IN int axes,
                                                IN long *value,
                                                IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxSpeedAccel(IN HANDLE pHandle, 
                                                       IN int commandCode, 
                                                       IN int axes,
                                                       IN long *value,
                                                       IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxGeneral(IN HANDLE pHandle, 
                                                    IN int commandCode, 
                                                    IN int axes,
                                                    IN long *value,  
                                                    IN int modelCode);


    long PERFORMAXCOM_API _stdcall fnPerformaxComGetAxisStatus(IN HANDLE pHandle,DWORD dwAxisNumber);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetPulseSpeed(IN HANDLE pHandle,DWORD dwAxisNumber);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetPulsePos(IN HANDLE pHandle,DWORD dwAxisNumber);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetPulsePos(IN HANDLE pHandle,DWORD dwAxisNumber, DWORD pos);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetEncoderPos(IN HANDLE pHandle,DWORD dwAxisNumber);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetEncoderPos(IN HANDLE pHandle,DWORD dwAxisNumber, DWORD pos);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetPolarity(IN HANDLE pHandle,DWORD dwAxisNumber,DWORD dwPolarity);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetPolarity(IN HANDLE pHandle,DWORD dwAxisNumber);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetDIOSetup(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIOSetup(IN HANDLE pHandle, DWORD dio_setup);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetDIO(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetDIOBit(IN HANDLE pHandle,DWORD bitn);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIO(IN HANDLE pHandle,DWORD dio_value );
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIOBit(IN HANDLE pHandle,DWORD bitn,DWORD bitv );
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComDoHome(IN HANDLE pHandle,
                                                               DWORD axis,
                                                               DWORD dir,
                                                       DWORD low_speed,
                                                       DWORD high_speed,
                                                       DWORD accel_time,
                                                       DWORD decel_time,
                                                       DWORD search_mode,
                                                       DWORD ramp_mode);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComDoMove(IN HANDLE pHandle,
                                                       DWORD axisn,
                                                       DWORD target,
                                                       DWORD low_speed,
                                                       DWORD high_speed,
                                                       DWORD accel_time,
                                                       DWORD decel_time);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComStop(IN HANDLE pHandle,
                                                       DWORD axisn,
                                                       DWORD ramp_stop);






    #ifdef __cplusplus
    }
    #endif

2 ответа

Когда вы используете файл заголовка в проекте, PERFORMAXCOM_API становится __declspec(dllimport), поэтому каждая функция объявляется как импорт DLL. _stdcall - соглашение о вызовах для каждой из функций. По сути, вы можете просто игнорировать эти детали и написать код для вызова функций.

Префиксы метода __declspec(dllimport) и __declspec(dllexport) являются расширениями языка от Microsoft, которые указывают компилятору, какие символы импортируются или экспортируются.

_Stdcall является соглашением о вызовах компилятора MSVC.

Stackru уже получил лучшие ответы, вот ссылки, которые могут помочь вам получить очень четкие ответы на ваши вопросы. Это займет несколько минут, чтобы пройти.

Что такое __stdcall?

что на самом деле означает __declspec(dllimport)?

Что касается ваших вопросов по оси, символ также имеет тип номера (такой же, как целое число), которые принимают меньшие значения (байтовый syze). Но микропроцессор в таком оборудовании, которое вы используете, будет работать намного быстрее, если размер типа данных будет таким же, как у микропроцессорной архитектуры. если Arcus Performax PMX-4EX-SA-TB9 представляет собой 32-разрядное аппаратное обеспечение (в отличие от большинства современного оборудования, DWORD будет работать намного быстрее, чем char).

Надеюсь это поможет.

С уважением Каджал

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