在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之后,LOADLIBRARY就不能再工作了,即使我已经使用了62位版本的'visa32.dll‘和'visa.h’。有两个问题:
(1)首先,Matlab抱怨没有安装正确的编译器,甚至无法运行LOADLIBRAY。按照他们的在线指示安装MinGW-w64编译器的附件。这个问题似乎已经解决了。
(2) LOADLIBRAY似乎能够运行,但是它有以下错误:
未能解析类型'( fastcall )、viOpenDefaultRM ( ViPSession vi‘原始输入'( fastcall ) viOpenDefaultRM ( ViPSession vi’)在输入的第217行从文件C:\Program (x86)\IVI Foundation\VISA\WinNT\Include\visa.h错误解析参数中找到的函数属性函数可能无效。..。
我想知道是否有人能帮上忙。事先非常感谢!
发布于 2018-07-30 09:59:56
在MATLAB中使用VISA库进行仪器控制的优点是:直接(即更快)访问端口,能够更好地使用GTL (到本地)和处理通信错误等。
loadlibrary('visa32.dll','visa.h','alias','visa32');
[err, defaultRm] = calllib('visa32', 'viOpenDefaultRM', defaultRm);然而,LOADLIBRARY的局限性给我们带来了很多麻烦,对于不同的Windows体系结构,LOADLIBRARY的工作原理也不尽相同。下面是在32位和64位Windows上测试过的解决方案:
1. MATLAB中的C++编译器:
a.这只影响64位MATLAB;
必须安装一个称为“MinGW-W64编译器”的MATLAB外接程序:
这对于R2017b来说比较容易,只需使用 的Add管理器;
ii.对于R2017b之前的MATLAB版本,很难:
下载并安装“MinGW-W64”:
tdm-gcc.tdragon.net/下载
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-already-have-mingw-on-my-computer-how-do-i-configure-it-to-work-with-matlab
2.签证库文件:
a.不同结构的动态链接库文件;
b.该库文件可在安装NI-488.2驱动程序后使用(最新版本是'NI4882_1760f0.exe';
c.用于32位Windows和32位MATLAB:
i.库文件:‘visa32.dll’
ii.位置:‘C:\Windows\System32 32\’
d.用于64位Windows和64位MATLAB:
i.库文件:‘visa64.dll’
ii.位置:‘C:\Windows\System32 32\’
Ⅲ.备注:
1.根据NI的网站,64位Visa32.dll位于C:\Windows\SysWOW64 64中,这是不对的;
或者,一个64位版本的‘visa32.dll’,比NI-488.2驱动程序安装的‘visa64.dll’还小,可以从:https://www.azdll.net/files/visa32-dll.html下载。
3.头文件:
a.加载签证库需要两个头文件:‘visa.h’和‘visatype.h’;
b.安装NI-488.2驱动程序后,两者都可用;
对于32位 ,这两个文件都在‘c:\Program\\VISA\bit 64\include’中。
对于64位Windows,这两个文件都位于:‘C:\程序文件(X86)\\ \WinNT\ ’
e.‘visatype.h’可以按原样使用;
‘visa.h’必须修改为MATLAB的LOADLIBRARY。对“Visa.h”所作的改动如下:
i.在头文件的开头添加以下内容:
#ifdef _WIN64
#define __fastcall
#endifii.屏蔽'viInstallHandler‘和'viUninstallHandler',因为它们不是常用的;
Ⅲ.删除“,.”由于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
将“viVxiServantResponse”函数替换为:
#ifndef _WIN64
ViStatus _VI_FUNC viVxiServantResponse(ViSession vi, ViInt16 mode, ViUInt32 resp);
#endif修改后的‘visa.h’,改名为‘visa_Matlab.h’,可以从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');https://stackoverflow.com/questions/51376698
复制相似问题