无法在MATLAB中加载C库

时间:2015-07-20 17:58:35

标签: matlab mex loadlibrary

我正在尝试使用MATLAB来控制使用Phidg​​et 1063_1控制器的步进电机。 Phidg​​ets为他们的设备提供库和示例程序,我正在尝试运行他们的示例步进电机程序。该程序加载一个C库(我在MATLAB中没有经验)。这是我正在尝试运行的程序:

function stepper

loadphidget21;

stepperHandle = libpointer('int32Ptr');
calllib('phidget21', 'CPhidgetStepper_create', stepperHandle);
calllib('phidget21', 'CPhidget_open', stepperHandle, -1);

valPtr = libpointer('int64Ptr', 0);

if calllib('phidget21', 'CPhidget_waitForAttachment', stepperHandle, 2500) == 0
    disp('Opened Stepper');

    t = timer('TimerFcn','disp(''waiting...'')', 'StartDelay', 1.0);

    %set parameters for stepper motor in index 0 (velocity, acceleration, current)
    %these values were set basd on some testing based on a 1063 and a stepper motor I had here to test with
    %might need to modify these values for your particular case
    calllib('phidget21', 'CPhidgetStepper_setVelocityLimit', stepperHandle, 0, 6200);
    calllib('phidget21', 'CPhidgetStepper_setAcceleration', stepperHandle, 0, 87543);
    calllib('phidget21', 'CPhidgetStepper_setCurrentLimit', stepperHandle, 0, 0.26);

    %IMPORTANT: If you are using a 1062, delete this line.  This command is only for the 1063 Bipolar stepper controller
    calllib('phidget21', 'CPhidgetStepper_setCurrentPosition', stepperHandle, 0, 0);

    start(t);
    wait(t);

    disp('Engage Motor 0');

    %engage the stepper motor in index 0
    calllib('phidget21', 'CPhidgetStepper_setEngaged', stepperHandle, 0, 1);
    start(t);
    wait(t);

    currPosition=0;
    calllib('phidget21', 'CPhidgetStepper_getCurrentPosition', stepperHandle, 0, valPtr);
    currPosition = get(valPtr, 'Value');

    disp('Move to 20000');

    %set motor to position 1 (20000)
    calllib('phidget21', 'CPhidgetStepper_setTargetPosition', stepperHandle, 0, 20000);

    %wait for motor to arrive
    while currPosition < 20000
        calllib('phidget21', 'CPhidgetStepper_getCurrentPosition', stepperHandle, 0, valPtr);
        currPosition = get(valPtr, 'Value');
    end
    disp('Motor reached target');

    start(t);
    wait(t);

    disp('Move to 0');

    %set motor to position 2 (0)
    calllib('phidget21', 'CPhidgetStepper_setTargetPosition', stepperHandle, 0, 0);

    %wait for motor to arrive
    while currPosition > 0
        calllib('phidget21', 'CPhidgetStepper_getCurrentPosition', stepperHandle, 0, valPtr);
        currPosition = get(valPtr, 'Value');
    end
    disp('Motor reached target');

    disp('Disengage Motor 0');

    %disengage the stepper motor in index 0
    calllib('phidget21', 'CPhidgetStepper_setEngaged', stepperHandle, 0, 0);
    start(t);
    wait(t);
else
    disp('Could Not Open Stepper');
end

disp('Closing Stepper');
% clean up
calllib('phidget21', 'CPhidget_close', stepperHandle);
calllib('phidget21', 'CPhidget_delete', stepperHandle);

disp('Closed Stepper');

当我运行它时,我收到以下错误:

>> stepper
Index exceeds matrix dimensions.

Error in loadlibrary>getLoadlibraryCompilerConfiguration (line 527)



Error in loadlibrary (line 263)



Error in loadphidget21 (line 12)
            [notfound,warnings]=loadlibrary('phidget21', 'phidget21Matlab_Windows_x64.h');

Error in stepper (line 3)
loadphidget21;

在其他一些主题中,有人说当没有为MATLAB配置C编译器并且为mex配置编译器时应该解决这个问题。我也遇到了这个问题:

>> mex -setup
Error using mex
No supported compiler or SDK was found. For options, visit  http://www.mathworks.com/support/compilers/R2015a/win64.html.

1 个答案:

答案 0 :(得分:3)

阅读错误消息的最后一行:

  

未找到支持的编译器或SDK。有关选项,请访问http://www.mathworks.com/support/compilers/R2015a/win64.html

您目前没有与系统上安装的R2015兼容的编译器。访问该链接以获取选项。您需要获得兼容的编译器才能使代码正常工作。

此外,当您访问MathWorks页面时,会显示适用于您平台的免责声明:

  

对于64位Windows平台,MATLAB不提供C编译器。免费下载适用于大多数用户:

     

http://www.microsoft.com/en-us/download/details.aspx?id=8279

您正在尝试编译C代码,并且MATLAB不附带C编译器。使用.NET Framework 4下载Microsoft SDK V7.1是获取代码进行编译的最简单的解决方案。因此,请从Microsoft的上述链接下载SDK,重新设置mex并再次尝试使用您的代码。