调用GPIB-32.dll实现GPIB设备通信功能
By
admin
at 2019-07-18 • 1人收藏 • 3127人看过
最近要用到一款设备, 通信接口是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
登录后方可回帖
博主在做自动化设备相关吗?工业镜头、PCB相关有没有涉及?加个Q交流一下啊:2078709132