使用LOADLIBRARY在64位Matlab R2017b中加载'visa32.dll'和'visa.h'

时间:2018-07-17 08:33:44

标签: matlab loadlibrary visa

使用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行上找到 函数属性的参数解析错误可能无效。 ...

我想知道是否有人可以帮忙。提前非常感谢!

1 个答案:

答案 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');