使用制造商的 DLL 通过 USB 控制步进控制器,使用C++

Use of a manufacturer's DLL to control a stepper controller via USB using C++

本文关键字:步进控制 步进 控制器 C++ 使用 控制 USB 制造商 DLL 通过      更新时间:2023-10-16

简介上完大学课程后,我正在复述自己的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"answers"_stdcall"是什么意思?我知道DWORD是双字,是一个32位整数,但有些参数要求一个轴,比如x、y和z……当他们本可以只要求一个字符时,为什么他们想要一个数字?非常感谢任何能为我提供任何信息的人。我非常想学习如何使用这个。

标头

    #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(和__declsspec(dllexport(是Microsoft的语言扩展,用于指示编译器导入或导出哪些符号。

_stdcall是MSVC编译器的一个调用约定。

Stackoverflow已经得到了更好的回复,这里有一些链接可以帮助你获得非常清晰的问题答案。这需要几分钟的时间。

什么是__stdcall?

__declspec(dllimport(到底是什么意思?

关于Axes上的问题,char也是数字类型(与integer相同(,它接受较小的值(byte-syze(。但是,如果数据类型的大小与微处理器架构相同,那么您使用的硬件中的微处理器将执行得更快。如果Arcus Performax PMX-4EX-SA-TB9是32位硬件(当今世界上大多数硬件都是这样(,DWORD的执行速度将比char.快得多

希望这能有所帮助。

问候Kajal