C#实现仪器的自动化控制
1.概述
生产测试当中,测试仪器不可或缺,如果是小规模生产,手动测试可以对付;但是要想到达大批量生产的目的,为了简化测试,节约时间,就需要进行自动化测试。出于这样的需求,对仪器的自动化程控就有了需求。
下图是一个相对普遍的测试框架
整个控制过程中最为关键的部分就是上位机同测试仪器之间的通信,首先测试环境搭建完毕之后,能通信是关键的第一步,第二步就是用“仪器的语言”告诉仪器我们需要它们做什么。简而言之,就是这俩步。
下面先介绍几个相关的知识点。
2.常见的控制接口
常见的控制接口主要有:GPIB、串口(RS-232)、USB、LAN或以太网。
串行接口通信速度较慢,现代测试系统已经很少使用。
虽然现代仪表控制接口丰富, 但是,对于仪表生产厂商和用户而言,使用最为广泛 的是GPIB接口。
常用的USB接口版本为USB 2.0,其支持三种传输速率:低速1.5Mbps , 全速12Mbps 和 高速480Mbps , 传输速度根据外接设备自动调整,无需设置。直连最大的电缆长度5M, 最多连接设备127台。
以太网是当今现有LAN采用的最通用的通信协议标准 , 可在互联设备间实现 10Mbps-10Gbps 数据通信。
本人在实际中用到的主要是LAN和USB方式,所以提及较多的主要是这俩种。
关于控制接口更加详细的介绍,请到相关网站进行查阅。
3.SCPI(可编程仪器标准语言)
SCPI (Standard Command for Programmable Instrumentation)程控仪器标准命令是1990由九家仪器公司联合推出,其建立在IEEE488.2的基础,面向测试功能或测试信号,倡导仪器控制的一致性。
主要特点为:
- 程控命令面向测试流程,而不是描述仪器操作;兼容的编程环境使用同样的命令和参数来控制具有相同功能的仪器。
 - 在与通信物理连接层硬件无关的高层次上定义程控消息。
SCPI基于IEEE488.2形成,但并不局限于GPIB接口,它也可用于RS232C,LAN,USB总线。 - 与编程手段和程序语言无关,SCPI用户测试程序模块易于移植。
 
SCPI有公共的命令,即对所有的仪器都是可行的;也有特定的命令,即不同的仪器命令不同。但所有的命令都符合SCPI标准。
对于SCPI的更详细的介绍,请查阅相关资料,这里不再赘述。
4.VISA(虚拟仪器软件架构)
VISA是一个驱动程序软件架构,开发这一架构的目的在于统一与GPIB、串口、以太网/LAN、IEEE 1394和USB仪器的通信,并简化仪器的控制应用。通过VISA API,开发人员可以使用GPIB、串口、以太网/LAN、IEEE 1394和USB仪器。
VISA具备如下优势:
- 接口独立性--VISA提供了一个单一的API以相同的方法与仪器进行通信,而不考虑其接口类型。例如,VISA命令,发送一个ASCII字符串到一个基于消息的仪器,对于GPIB、串口、以太网/LAN、IEEE 1394和USB接口是完全相同的。
 - 一种面向对象的架构,可以方便地适应未来开发的仪器接口。
 - 功能全面的仪器编程特性,通过一个非常紧凑的命令集实现。
 
对于VISA更详细的介绍,请查阅相关资料。
5.仪器控制过程
- 连接仪器:通过常用的控制接口将上位机和待控仪器连接。
 - 确定仪器资源的名称:也称之为仪器描述符,描述了VISA资源的准确名称与位置。确认仪器的资源名称,可以到NI相关网站下载NI硬件驱动,打开NI-VISA软件后可以识别出来。
在设备和接口选项下面就可以找到仪器的资源名称,如果找不到(大多数情况是使用LAN接口的情况),可以手动添加,将仪器的IP地址(有可能需要端口号)输入,软件就可以识别仪器。
更详细的介绍请查阅NI相关网站或者其他资料。 - 编写控制程序:
这里需要说明两点,不同的仪器使用方法并不相同。编写仪器控制程序有几种方式。
1.使用仪器驱动。有的仪器厂商可能会自己基于VISA或者SCPI开发仪器的驱动,也就是往高层做了进一步封装,同时也是是对VISA和SCPI做了进一步封装,这样就进一步简化了开发流程。我们可以根据驱动说明或者仪器的编程说明使用仪器驱动软件架构。需要实现什么功能,调用相应的驱动API即可。还可以参考提供的样例。
2.使用VISA。使用VISA同仪器获得通信的桥梁,然后将“仪器语言”通过VISA接口通知给仪器,仪器就会按我们的逻辑进行相关的操作。这里的仪器语言需要参考仪器对应的编程说明(可以到仪器相应的官网下载),主要是指SCPI通信指令集。下文会稍作详细的介绍该方法。
3.实现自己的通信。这一点主要是针对LAN口通信的方式来说的,因为我目前只碰到过这一种情况。有的仪器并没有那么先进,去支持VXI-11协议,虽然也是TCPIP类的资源名称,但是这种情况下需要我们自己去实现TCP通信过程。并不难,我们只要实现一个TCP的客户端就可以。通过仪器提供的IP地址和PORT端口号,我们的客户端同仪器进行TCP连接,连接完成后给仪器发送“仪器语言”,同时也会接受到仪器的响应。 
下面,详细说一下如何使用VISA同仪器进行通信。
方法一
平台:vs2013。
建立好工程后,现引入两个.NET的托管DLL,将NationalInstruments.Common与NationalInstruments.VisaNS引用添加到项目。这两个dll文件在C:\Program Files (x86)\National Instruments\MeasurementStudioVS20XX\DotNET\Assemblies\目录下面可以找到。
打开一个VISA会话。
private MessageBasedSession mbSession;
try{
    mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().
    Open(resourceString.Text);//资源文件名
}
catch(InvalidCastException){
    MessageBox.Show("Resource selected must be a message-based session");
}
catch(Exception exp){
    MessageBox.Show(exp.Message);
}
查询数据,在创建了一个与我们的仪器通信的会话之后,我们可以开始发送数据至该仪器,并读回其响应。try{
    string responseString = mbSession.Query(stringToWrite.Text);
}
catch(Exception exp){
    MessageBox.Show(exp.Message);
}
我们也可用Write函数只发送不读取数据。
最后将会话关闭
mbSession.Dispose();
需要说明一点,在用串口和USB口控制时,我用这种方法失败了,所以用了第二种方法。现在我还没试验过是否该方法对所有的串口和U口都不能用,如果你测试过了,可以相互交流一下。同样,这种方式不适用于使用Socket的仪器。
方法二
第二种方法使用visa接口。
控制流程同第一种方法差不多。首先,将Visa32.dll文件放在工程的debug目录下面,如果不这么做,程序会先搜索debug目录,然后搜索system32目录,寻找Visa32.dll文件。这里,不像上面一样,将dll文件引入项目,是因为该dll文件是.NET非托管的程序集,需要显式引入,负责引入的类文件参考Visa32.cs。(注:通过dumpbin
 -depents ***.exe或dll可以查看该文件是否属于托管,如果有mscoree.dll就是托管的,否则非托管)
在项目中建立Visa32.dll后就可以引用里面的函数。具体的使用方法请参考:NI-Visa help。
下面是部分代码
public bool Init(){
            if (m_connect){
                return m_connect;
            }
            viError = Visa32.viOpenDefaultRM(out m_viDefaultRM);
            if (viError != Visa32.VI_SUCCESS){
                return false;
            }
            viError = Visa32.viOpen(m_viDefaultRM, resourceName, Visa32.VI_NO_LOCK, Visa32.VI_TMO_IMMEDIATE, out m_session);
            if (viError == Visa32.VI_SUCCESS){
                m_connect = true;
                //clears spectrum清除寄存器
                Visa32.viClear(m_session);
                viError = Visa32.viPrintf(m_session, "*CLS\n");
                if (viError != Visa32.VI_SUCCESS){
                    m_connect = false;
                }
                System.Threading.Thread.Sleep(10);
            }else{
                m_connect = false;
            }
            return m_connect;
        }
这种方法对于不支持VXI-11协议的仪器也不适用,需要自己实现TCP通信。
对于仪器控制很多地方我还有弄清楚,暂时先把这段时间的收获记录一下,如果对这方面也有想法的话,可以随时交流。
C#实现仪器的自动化控制的更多相关文章
- 利用BeEF REST API自动化控制僵尸主机
		
本文首发Freebuf,属于原创奖励计划,未经许可禁止转载. http://www.freebuf.com/articles/network/137662.html 一. 前言 关于BeEF,不再多介 ...
 - 使用Appium-Desktop捕获APP元素控件实现自动化控制
		
使用Appium捕获APP的元素控件 实现自动化控制 我是用的是华为P20手机进行测试,为了映射出它的adb端口,需再去官网下载安装一个华为手机助手,然后将手机调成开发者模式,连接时选择传输文件模式. ...
 - Python_Selenium之浏览器封装_去掉浏览器受到自动化控制横条显示及去掉是否记住密码弹窗
		
封装如下: from selenium import webdriverfrom common.config_utils import configfrom selenium.webdriver.ch ...
 - 安利下PyAUtoGUI这个库,可自动化控制鼠标键盘
		
PyAutoGUI 不知道你有没有用过,它是一款用Python自动化控制键盘.鼠标的库.但凡是你不想手动重复操作的工作都可以用这个库来解决. 比如,我想半夜时候定时给发个微信,或者每天自动刷页面等操作 ...
 - expect 自动化控制命令
		
expect 的核心是 spawn expect send set spawn 调用要执行的命令expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:send 发送需要交互的值,替代了用户手 ...
 - COM 自动化控制Excel应用程序
		
class Program { static void Main(string[] args) { var dt = new System.Data.DataTable(); dt.Columns.A ...
 - 小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置
		
建议大家按我发帖子的顺序来看,方便大家理解.请不要跳跃式的阅读.很多人现在看书,都跳跃式的看,选择性的看,导致有些细节的部分没有掌握到,然后又因为某个细节耽误很多时间.以上只是个人建议,高手可以略过本 ...
 - 爬虫实战:爬虫之 web 自动化终极杀手 ( 上)
		
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:陈象 导语: 最近写了好几个简单的爬虫,踩了好几个深坑,在这里总结一下,给大家在编写爬虫时候能给点思路.本次爬虫内容有:静态页面的爬 ...
 - Linux自动化命令工具expect
		
expect是Unix系统中用来进行自动化控制和测试的软件工具,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等. 用法 Linux中我们经常写脚本处 ...
 
随机推荐
- Spyder中figure显示设置
			
Spyder是Python的一个IDE.和其他的Python的IDE相比,它最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值. 如果不是进行大规模的工程开发,重点专注 ...
 - No.3 - CSS transition 和 CSS transform 配合制作动画
			
课程概述 作业提交截止时间:09-01 任务目的 深度理解掌握 transition-timing-function 以及它的意义 学会配合使用 CSS transform 和CSS transiti ...
 - Struts2框架学习笔记--strtus2初识
			
struts2概述: 1.struts2框架应用于javaEE三层结构中的Web层框架 2.struts2框架是在struts1和webwork基础之上发展的全新框架(脱胎换骨 ,用法完全不一样)ps ...
 - angular路由传参和获取路由参数的方法
			
1.首先是需要导入的模块 import { Router } from "@angular/router";//路由传参用到 import{ActivatedRoute,Param ...
 - Vue 源码分析—— 目录结构
			
一,Vue.js 的源码都是在src 目录下,其目录结构如下. 1.compiler 目录包含Vue.js 所有编译相关的代码.它包括把所有模板解析成ast 语法树, ast 语法树优化等功能. 2. ...
 - centos7 安装mysql5.7以及一些细节问题
			
突然发现我的新服务器上没有mysql,所以想安装一个,上次在我的window电脑上安装MySQL8.0我真的要气死了,和5.7修改密码的方式不一样,弄了很久,所以我决定还是不用安装8.0了,5.7就可 ...
 - WebGl  利用drawArrays、drawElements画三角形
			
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
 - jquery选择器基础
			
简单选择器 类 id 元素/标签 * 复合(sel1,sel2)逗号隔开 层次选择器 s1 s2:后代选择器,空格隔开 p>c:子代选择器:不包括孙代及以下 p+next :相邻选择器 p~su ...
 - echarts 地图 免费离线js,json包分享
			
最近,项目中需要用到地图,由于项目的特殊性,只能使用内网获取数据. 然而,echarts官网上的离线地图包(http://echarts.baidu.com/download-map.html)早在一 ...
 - Redis 之武林大会 - 哨兵(Sentinel)
			
前言 Redis在出从复制的模式下,一旦主节点由于故障不能提供服务,需要人工降从节点晋升为主节点,同时还要通知应用方更新主节点的地址,在很多应用场景下,这样的故障处理方式是无法被接受的.不过幸运的是R ...