2012-06-21 49 views
1

我真的不是编程方面的专家,所以我已经为我的愚蠢问题道歉了。在MATLAB中加载motorhawk DLL

我想用这种方式来装载控制板(从pc-control.co.uk motorhawk)的dll

loadlibrary('hawk.dll', 'hawkdll.h', 'alias', 'hawk') 

如果当时我检查wheter库已经满载

libisloaded('hawk') 

我收到了积极的回应。但是,如果我要求的功能我刚才装

libfunctions('hawk') 

我没有得到任何功能,与一个错误说lib.hawk方法没有找到。

我想问题可能是在标题写入

/////////////////////////////////////////////// 
//   hawkdll.h 
//  revision 1.3 
// 
// All copyright PC Control Ltd. 2010 
//  
/////////////////////////////////////////////// 
// DLL Function type definitions 

// system defs 
typedef int (*Type_Sys_Initialise)();    // find all devices connected and open USB paths to them 
typedef int (*Type_Sys_GetMotorHawkCount)();  // find number of motor hawks connected 
typedef int (*Type_Sys_GetSwitchingHawkCount)(); // find number of switching hawks connected 
typedef int (*Type_Sys_GetServoHawkCount)();  // find number of servo hawks connected 
typedef int (*Type_Sys_CloseAllDevices)();   // close all open paths to USB devices 

// motor hawk defs 
typedef int (*Type_Motor_SetType)(int devnum, int type);    // choose motor type (stepper or DC Motors) 
typedef int (*Type_Motor_RunSteps)(int devnum, int steps);    // set the number of steps to execute 
typedef int (*Type_Motor_SetDCMotors)(int devnum, int M1Speed, int M1Dir, int M2Speed, int M2Dir);  // set the speed and direction of both DC motors 
typedef int (*Type_Motor_GetDCMotors)(int devnum, int *M1Speed, int *M1Dir, int *M2Speed, int *M2Dir); // get the speed and direction of both DC motors from the specified board 
typedef int (*Type_Motor_GetType)(int devnum, int *motor_type);           // get the type of motor currently configured for from the specified board 
typedef int (*Type_Motor_GetStepper)(int devnum, int *direction, int *interval, int *step_mode, int *power, int *steps, int *run_mode, int *paused);   // get the current stepper motor settings from the specified board 
typedef int (*Type_Motor_GetStepsRemaining)(int devnum, int *steps_remaining);   // get the current steps remaining from the specified board 
typedef int (*Type_Motor_SetDigitalOutputs)(int devnum, int outputs);     // set the digital outputs 
typedef int (*Type_Motor_GetDigitalOutputs)(int devnum, int *outputs);     // get the current settings of the digital outputs 
typedef int (*Type_Motor_GetDigitalInputs)(int devnum, int *inputs);     // get the current digital inputs 
typedef int (*Type_Motor_SetLimitEnables)(int devnum, int m1_forward, int m1_reverse, int m2_forward, int m2_reverse);   // set the limit switch enables 
typedef int (*Type_Motor_GetLimitEnables)(int devnum, int *m1_forward, int *m1_reverse, int *m2_forward, int *m2_reverse);  // get the current limit switch enable settings 
typedef int (*Type_Motor_SetStepper)(int devnum, int direction, int interval, int step_mode, int power);     // configure the stepper motor 
typedef int (*Type_Motor_PauseStepper)(int devnum);          // temporarily pause the stepper motor 
typedef int (*Type_Motor_ResumeStepper)(int devnum);         // resume running of the stepper motor 
typedef int (*Type_Motor_StopStepper)(int devnum);          // stop the stepper motor and clear any remaining steps 
typedef int (*Type_Motor_SetRunMode)(int devnum, int run_mode);       // set the stepper running mode (once or continuous) 
typedef int (*Type_Motor_ResetBoard)(int devnum);          // reset board 

// switching hawk defs 
typedef int (*Type_Switching_SetOutputs)(int devnum, int outputs);  // set the outputs 
typedef int (*Type_Switching_GetOutputs)(int devnum, int *outputs);  // get the current outputs 

// servo hawk defs 
typedef int (*Type_Servo_SetServos)(int devnum, int Servo1, int Servo2, int Servo3, int Servo4, int Servo5, int Servo6, int Servo7, int Servo8);   // set the servos 
typedef int (*Type_Servo_GetServos)(int devnum, int *Servo1, int *Servo2, int *Servo3, int *Servo4, int *Servo5, int *Servo6, int *Servo7, int *Servo8); // get the current servo positions 
typedef int (*Type_Servo_SetOutputs)(int devnum, int outputs);  // set the outputs 
typedef int (*Type_Servo_GetOutputs)(int devnum, int *outputs);  // get the current outputs 

/////////////////////////////////////////////// 
// other defs 
#define STEP_MODE_FULL 1 
#define STEP_MODE_HALF 2 

#define POWER_ZERO   1 
#define POWER_FRACTIONAL 2 
#define POWER_MAX   3 

#define MHK_STOPPED   0 
#define MHK_FORWARD   1  // direction of DC motors 
#define MHK_REVERSE   2 

#define TYPE_STEPPER 0   // motor hawk is driving a stepper motor 
#define TYPE_DCMOTORS 1   // motor hawk is driving two DC motors 

#define STEPPER_RUN_ONCE  0 // run the specified steps once 
#define STEPPER_RUN_CONTINUOUS 1 // run stepper continuously 

任何建议的方式吗?

感谢您的帮助

达维德

+0

什么是错误,你在尝试什么? –

回答

0

首先,我建议你改变你的负载调用

[notfound, warnings] = loadlibrary('hawk.dll', 'hawkdll.h', 'alias', 'hawk') 

变量notfound将列出在头文件中所提及的任何功能但在dll中找不到。 warnings也可能提供一些见解。

一个可能的问题是,如果hawk.dll是一个C++库,matlab只支持c风格的链接。如果是这样的话,你仍然可以用C++编写dll,但是你必须为每个函数定义和原型添加extern "C",然后重新编译dll。如果您无法访问源代码,则需要使用extern "C"函数创建一个包装程序DLL,然后调用C++函数。

您可以使用诸如Dependency Walker之类的工具来确定hawk.dll输出的功能,以及它们是c还是C++样式的链接。