调用GPIB-32.dll实现GPIB设备通信功能

By admin at 2019-07-18 • 1人收藏 • 3056人看过

最近要用到一款设备, 通信接口是gpib,下载了NI公司的Vb示例, 里面用的就是这个dll

这个dll里面包含了几十个函数, 还有个什么全局定义的线程变量函数....? , 嗯, 从vb示例里看这个使用方式还是蛮复杂的,

于是,我在这里就偷了个懒, 利用aar的便捷性暴力处理函数返回值, 嗯... 效果还是不错的

这样本来要把vb示例里的代码全部翻译为aar就免去了, 

下面就利用了三个函数基本实现了需要的功能了.

缺陷还是i有的: 没有封装err错误解析, 但是,我这里不需要知道这些错误信息, 所以,如果你需要用gpib的完整的功能, 那么还是自己看看gpib文档,慢慢写了.

特定库函数如下: 给需要gpib功能的人参考

//PEM340的GPIB库
namespace PEM340GpiB{
	
	GpiBdll = ..raw.loadDll($"\res\gpib-32.dll","GPIBshare");
	//这里只定义下读取函数, 因为里面的buff需要预定义地址
	ibrd = GpiBdll.api("ibrd","int(int ud,string& strr,int cnt)" );
	
	初始化 = function( a=0,b=1,c=0,d=11,e=1,f=0 ){
		var dev = GpiBdll.ibdev( a,b,c,d,e,f );
		GpiBdll.ibclr(dev);
		return dev;
	}
	
	读取值 = function(device,command){
		var ret = GpiBdll.ibwrt(device,command,#command);
		//定义一个字节数组, 用文本结束符来填充
		var buff= ..raw.buffer(1024,'\0');
		//读取内容
		var ret,buf1 = owner.ibrd(device,buff,1024);
		//下面合成为字符串
		var str;
		for(i=1;1024;1){
		        //如果字节为结束符,那么说明有效数据结束
			if(buf1[i]!='\0'){
				str = ..string.concat(str,..string.pack(buf1[i]));
			}else {
				break;
			}
		}
		return str;
	}
	
	检查设备在线状态 = function(device){
		var ret = owner.读取值(device,"*IDN?");
		if(ret){ return true}else{ return false};
	}
	
	读取消光比 = function(device){
		return owner.读取值(device,"PE");
	}
	
	读取功率值DBm = function(device){
		return owner.读取值(device,"DP");
	}
	
	读取功率值mW = function(device){
		return owner.读取值(device,"WP");
	}
	
	读取角度百分比 = function(device){
		return owner.读取值(device,"AG");
	}
	
	读取当前测量波长 = function(device){
		return owner.读取值(device,"WA");
	}
	
	设置当前测量波长 = function(device,Plength="1310"){
		if(Plength == "1310"){
			GpiBdll.ibwrt(device,"WA1",3);	
		}
		if(Plength == "1550"){
			GpiBdll.ibwrt(device,"WA0",3);	
		}
	}
	
	设置面板显示单位 = function( device,item="mw" ){
		var str = ..string.lower(item);
		if(str == "mw"){
			GpiBdll.ibwrt(device,"PW",2);	
		}
		if(str == "dbm"){
			GpiBdll.ibwrt(device,"PD",2);	
		}
	}
	
	读取当前测量速度 = function(device){
		var Rf = (tonumber(owner.读取值(device,"RF"))); 
		var ret;
		select(Rf) {
			case 2 {
				ret = "10HZ";
			}
			case 1 {
				ret = "5HZ";
			}
			case 0 {
				ret = "2.5HZ";
			}
		}
		return ret;
	}
	
	设置当前测量速度 = function( device,item=10 ){
		if(item == 10){
			GpiBdll.ibwrt(device,"RF2",3);	
		}
		if(item == 5){
			GpiBdll.ibwrt(device,"RF1",3);	
		}
		if(item == 2.5){
			GpiBdll.ibwrt(device,"RF0",3);	
		}
	}
	
}


/**intellisense()
PEM340GpiB = PEM340消光比GPIB接口用户库
PEM340GpiB.初始化(.(板卡序号,设备主地址,设备从地址,超时时长,传输结束模式,字符串结束模式) = 初始化消光比,\n参数示例: \n板卡序号: 默认0\n设备主地址: 即设备上设置的主地址,默认1\n设备从地址:没有则为0\n超时时长:0=取消超时,1=10微秒,2=30微秒,3=100微秒,4=300微秒\n5=1毫秒,6=3毫秒,7=10毫秒,8=30毫秒,9=100毫秒,10=300毫秒\n11=1秒,12=3秒,13=10秒,14=30秒,15=100秒,16=300秒\n传输结束模式:1=传输结束发送EOI消息 0=不发送,默认为1\n字符串结束模式,默认为0\n返回值: 设备操作号
PEM340GpiB.检查设备在线状态(.(设备号) = 检查设备是否连接正常,\n返回值:true / false
PEM340GpiB.读取消光比(.(设备号) = 读取消光比
PEM340GpiB.读取功率值mW(.(设备号) = 以mW格式读取功率值
PEM340GpiB.读取角度百分比(.(设备号) = 读取角度百分比
PEM340GpiB.读取功率值DBm(.(设备号) = 以dBm格式读取功率值
PEM340GpiB.读取当前测量波长(.(设备号) = 返回值:"1310" / "1550"
PEM340GpiB.设置当前测量波长(.(设备号,波长) = 参数:"1310" / "1550"
PEM340GpiB.设置面板显示单位(.(设备号,单位) = 参数:"dBm" / "mW"
PEM340GpiB.读取当前测量速度(.(设备号) = 返回值:"10HZ" / "5HZ" / "2.5HZ"
PEM340GpiB.设置当前测量速度(.(设备号,速度) = 参数为:10 / 5 / 2.5
end intellisense**/

上面主要就是那个读取函数了, 里面用\0来取巧, 就不用知道读出的数据长度了, 哈

感觉比调用dll里的线程函数方便了不止一点点.

2 个回复 | 最后更新于 2019-09-16
2019-09-09   #1

博主在做自动化设备相关吗?工业镜头、PCB相关有没有涉及?加个Q交流一下啊:2078709132

2019-09-16   #2

回复#1 @心好累想退休 :

用的到,搞过,以后多交流

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...