调用GPIB-32.dll实现GPIB设备通信功能
By
admin
at 2019-07-18 • 1人收藏 • 3379人看过
最近要用到一款设备, 通信接口是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