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

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

最近要用到一款设备, 通信接口是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 @心好累想退休 :

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

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
Htmlayout皮肤Htmlayout皮肤引擎介绍
黑猫Aar教程网:简码编程
C大Aardio论坛:Aar爱好者论坛
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...