ВСТУПЛЕНИЕ
Я переучиваю себя на 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
Когда вы используете файл заголовка в проекте, PERFORMAXCOM_API становится __declspec (dllimport), поэтому каждая функция объявляется как импорт DLL. _stdcall является соглашением о вызовах для каждой из функций. По сути, вы можете просто игнорировать эти детали и написать код для вызова функций.
Префиксы метода __declspec (dllimport) и __declspec (dllexport) являются расширениями языка от Microsoft, которые инструктируют компилятор, какие символы импортируются или экспортируются.
_Stdcall является соглашением о вызовах компилятора MSVC.
Stackoverflow уже получил лучшие ответы, вот ссылки, которые могут помочь вам получить очень четкие ответы на ваши вопросы. Это займет несколько минут, чтобы пройти.
что на самом деле означает __declspec (dllimport)?
Что касается ваших вопросов по оси, символ также имеет номер типа (такой же, как целое число), которые принимают меньшие значения (байтовый syze). Но микропроцессор в таком оборудовании, которое вы используете, будет работать намного быстрее, если размер данных будет таким же, как у микропроцессорной архитектуры. если Arcus Performax PMX-4EX-SA-TB9 представляет собой 32-разрядное оборудование (а это большинство оборудования в современном мире, DWORD будет работать намного быстрее, чем char).
Надеюсь это поможет.
С уважением
Kajal