1

私はプログラミングの専門家ではないので、愚かな質問をしてしまったことをお詫びします。

この方法で、コントロール ボード (pc-control.co.uk の motorhawk) の dll をロードしようとしています。

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

次に、ライブラリがロードされているかどうかを確認します

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

なにか提案を?

ご協力いただきありがとうございます

ダビデ

4

1 に答える 1

0

まず、ロード呼び出しをに変更することをお勧めします

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

変数notfoundは、ヘッダーファイルに記載されているが、dllにはない関数を一覧表示します。 warnings同様にいくつかの洞察を提供するかもしれません。

考えられる問題の1つは、hawk.dllがc ++ライブラリである場合、matlabはcスタイルのリンケージのみをサポートすることです。この場合でも、C ++でdllを記述できますが、extern "C"各関数定義とプロトタイプに追加して、dllを再コンパイルする必要があります。ソースコードにアクセスできない場合はextern "C"、c++関数を呼び出す関数を使用してラッパーDLLを作成する必要があります。

Dependency Walkerなどのツールを使用して、hawk.dllがエクスポートする関数と、それらがcまたはc++スタイルのリンケージであるかどうかを判別できます。

于 2012-09-21T19:05:00.947 に答える