无法在 MATLAB 中加载 C 库
Trouble loading C library in MATLAB
我正在尝试使用 MATLAB 通过 Phidget 1063_1 控制器来控制步进电机。 Phidgets 为其设备提供库和示例程序,我正在尝试 运行 他们的示例步进电机程序。该程序加载了一个 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;
在其他一些帖子中,有人说当 C 编译器没有为 MATLAB 配置时会发生这种情况,为 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.
阅读错误消息的最后一行:
No supported compiler or SDK was found. For options, visit http://www.mathworks.com/support/compilers/R2015a/win64.html.
您目前没有在您的系统上安装与 R2015 兼容的编译器。访问 link 以了解您的选择。您需要获得兼容的编译器才能使您的代码正常工作。
此外,当您访问该 MathWorks 页面时,会显示针对您的平台的免责声明:
For the 64-bit Windows platform, a C compiler is not supplied with MATLAB. A free download is available that is suitable for most users:
http://www.microsoft.com/en-us/download/details.aspx?id=8279
您正在尝试编译 C 代码,而 MATLAB 并未附带 C 编译器。下载带有 NET Framework 4 的 Microsoft SDK 7.1 版是编译代码的最简单解决方案。因此,从 Microsoft 下载上述 link 的 SDK,重新设置 mex
并再次尝试您的代码。
我正在尝试使用 MATLAB 通过 Phidget 1063_1 控制器来控制步进电机。 Phidgets 为其设备提供库和示例程序,我正在尝试 运行 他们的示例步进电机程序。该程序加载了一个 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;
在其他一些帖子中,有人说当 C 编译器没有为 MATLAB 配置时会发生这种情况,为 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.
阅读错误消息的最后一行:
No supported compiler or SDK was found. For options, visit http://www.mathworks.com/support/compilers/R2015a/win64.html.
您目前没有在您的系统上安装与 R2015 兼容的编译器。访问 link 以了解您的选择。您需要获得兼容的编译器才能使您的代码正常工作。
此外,当您访问该 MathWorks 页面时,会显示针对您的平台的免责声明:
For the 64-bit Windows platform, a C compiler is not supplied with MATLAB. A free download is available that is suitable for most users:
http://www.microsoft.com/en-us/download/details.aspx?id=8279
您正在尝试编译 C 代码,而 MATLAB 并未附带 C 编译器。下载带有 NET Framework 4 的 Microsoft SDK 7.1 版是编译代码的最简单解决方案。因此,从 Microsoft 下载上述 link 的 SDK,重新设置 mex
并再次尝试您的代码。