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

ВСТУПЛЕНИЕ
Я переучиваю себя на 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

1

Решение

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

1

Другие решения

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

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

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

Что такое __stdcall?

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

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

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

С уважением
Kajal

1

По вопросам рекламы [email protected]