使用32位Windows 7上的Matlab R2015b,LOADLIBRARY可以正常工作:
library = 'C:\Windows\System32\visa32.dll';
headerFile = 'C:\Program Files\IVI Foundation\VISA\WinNT\include\visa_Matlab.h';
loadlibrary(library, headerFile, 'alias','visa32');
并且我可以使用'visa32.dll'中的函数,例如
defaultRm = 0;
[err, defaultRm] = calllib('visa32', 'viOpenDefaultRM', defaultRm);
vi = 0;
InstrAddr = 'GPIB0::29::INSTR';
pInstrAddr = libpointer('int8Ptr', [int8( InstrAddr ) 0] );
[err, tempVar, vi] = calllib('visa32', 'viOpen', defaultRm, pInstrAddr, 0, 0, vi);
打开仪器的通讯端口...
但是,当我升级到64位Windows 7和Matlab R2017b之后,即使使用了62位版本的“ visa32.dll”和“ visa.h”,LOADLIBRARY也将不再起作用。有两个问题:
(1)首先,Matlab抱怨没有安装正确的编译器,甚至无法运行LOADLIBRAY。按照他们的在线说明安装MinGW-w64编译器插件。这个问题似乎已经解决了。
(2)LOADLIBRAY似乎能够运行,但是它具有以下错误:
无法解析类型'( fastcall ))viOpenDefaultRM(ViPSession vi'原始输入'( fastcall ))viOpenDefaultRM(ViPSession vi' 在文件C:\ Program Files(x86)\ IVI Foundation \ VISA \ WinNT \ Include \ visa.h的第93行的输入的第217行上找到 函数属性的参数解析错误可能无效。 ...
我想知道是否有人可以帮忙。提前非常感谢!
答案 0 :(得分:0)
在MATLAB中使用VISA库进行仪器控制的优点是:直接(即,更快)访问端口,能够使用GTL(转到本地)并更好地处理通信错误等。使用LOADLIBRARY加载VISA库和CALLLIB可以访问已加载库中的功能,例如
loadlibrary('visa32.dll','visa.h','alias','visa32');
[err, defaultRm] = calllib('visa32', 'viOpenDefaultRM', defaultRm);
但是,LOADLIBRARY中的限制造成了很多麻烦,并且对于不同的Windows体系结构,其工作方式也有所不同。这是已经在32位和64位Windows上测试过的解决方案:
1. MATLAB中的C ++编译器:
a。这只会影响64位MATLAB;
b。必须安装名为“ MinGW-w64编译器”的MATLAB附加组件:
我。对于R2017b,这相对容易,只需使用MATLAB的插件管理器即可;
ii。对于R2017b之前的MATLAB版本,这非常困难:
从以下位置下载并安装“ MinGW-w64”:
tdm-gcc.tdragon.net/download
sourceforge.net/projects/tdm-gcc/postdownload?source=dlp
sourceforge.net/projects/mingw/files /
然后按照以下说明配置MATLAB:
de.mathworks.com/help/matlab/matlab_external/compiling-c-mex-files-with-mingw.html
de.mathworks.com/help/matlab/matlab_external/install-mingw-support-package.html
de.mathworks.com/matlabcentral/answers/313298-i-已经在我的计算机上安装了Mingw,如何配置与Matlab一起工作
2. VISA库文件:
a。用于不同Windows体系结构的不同DLL文件;
b。安装NI-488.2驱动程序后,该库文件可用(最新版本为“ NI4882_1760f0.exe”;
c。对于32位Windows和32位MATLAB:
我。库文件:“ visa32.dll”
ii。位置:“ C:\ Windows \ System32 \”
d。对于64位Windows和64位MATLAB:
我。库文件:“ visa64.dll”
ii。位置:“ C:\ Windows \ System32 \”
iii。注意:
1.根据NI网站,64位VISA DLL是“ visa32.dll”,位于“ C:\ Windows \ SysWOW64”中。这不对;
2.另外,可以从https://www.azdll.net/files/visa32-dll.html下载64位版本的“ visa32.dll”,该版本比NI-488.2驱动程序安装的“ visa64.dll”要小。
3.头文件:
a。加载VISA库需要两个头文件:“ visa.h”和“ visatype.h”;
b。安装NI-488.2驱动程序后,两者均可用;
c。对于32位Windows,两个文件都位于: ‘C:\ Program Files \ IVI Foundation \ VISA \ Win64 \ include'
d。对于64位Windows,两个文件都位于: ‘C:\ Program Files(x86)\ IVI Foundation \ VISA \ WinNT \ include'
e。可以直接使用“ visatype.h”;
f。必须为MATLAB的LOADLIBRARY修改 “ visa.h” 。在“ visa.h”上所做的更改是:
我。在头文件的开头添加以下内容:
#ifdef _WIN64
#define __fastcall
#endif
ii。屏蔽掉“ viInstallHandler”和“ viUninstallHandler”,因为它们并不常用;
iii。从LOADLIBRARY(https://de.mathworks.com/matlabcentral/answers/103180-why-do-i-get-warnings-when-loading-a-dll-with-loadlibrary-in-matlab-7-13-r2011b)不支持的以下功能中删除“,...”:
viPrintf,viSPrintf,viScanf,viSScanf,viQueryf
iv。在以下功能中,将“ ViVAList”替换为“ ViConstBuf”:
viVPrintf,viVSPrintf,viVScanf,viVSScanf,viVQueryf
v。用以下内容替换“ viVxiServantResponse”功能:
#ifndef _WIN64
ViStatus _VI_FUNC viVxiServantResponse(ViSession vi, ViInt16 mode, ViUInt32 resp);
#endif
g。可以从visa_Matlab.h下载修改后的“ visa.h”,重命名为“ visa_Matlab.h”。
示例:
% ‘visa32.dl’ or ‘visa64.dll’, ‘visa_Matlab.h’ and ‘visatype.h’ must be
% available in the local directory
archstr = computer('arch');
if ~isempty(strfind(archstr, 'PCWIN64')) || ~isempty(strfind(archstr, 'win64'))
dllName = 'visa64';
else
dllName = 'visa32';
end
headerFileName = 'visa_Matlab.h';
loadlibrary ([dllName '.dll'], 'visa_Matlab.h','alias',dllName);
visaFunctions = libfunctions(dllName,'-full');