基于LabVIEW的舵机自动加载测试系统软件设计
公司的LabView2013图形化编程语言(Graphics Language,G语言)进行设备软件开发。本文在介绍测试系统硬件的基础上,给出了软件的框架设计,重点阐述了软件开发过程中遇到的典型问题:生产者一消费者设计模式处理数据采集、利用通知器控件实现循环通信、利用LabVIEW特有的字符串转换控件解决数据类型转换等,并给出了解决问题方法,以期对其它基于LabVIEW的软件开发提供借鉴。
1 硬软件结构设计
1.1 硬件结构设计
测试对象直升机并联舵机主要由电机、减速器、蜗杆机构、电磁离合器、微动行程开关等组成,输出轴为慢速的旋转运动。
舵机自动加载测试系统的硬件结构如图l所示。选用阿尔泰公司PXI机箱、PXI控制器和两块多功能数据采集卡作为控制和测量平台,选用三相交流伺服电机、伺服驱动器、扭矩传感器、编码器构成加载系统,组成完整的舵机自动加载测试系统。PXI控制器通过连接数据采集卡控制舵机转动、控制伺服电机扭矩输出和位移输出等,同时它还采集各种设备反馈的信号,包括舵机电机及舵机离合器的电流和电压信号、扭矩传感器信号、编码器脉冲信号等。
1.2 软件设计
LabVIEW是NI公司最核心的软件产品,是工业控制、测试软件开发的专业平台,它具有界面简洁友好,能较好地模拟测控仪器及环境等特点。它采用了工程人员熟悉的术语、图形等图形化符号来代替常规基于文字的语言程序。它将功能强大的C语言与测控技术有机结合,具有灵活的交互式编程方法和丰富的库函数,为开发人员建立检测系统、自动测试环境、数据采集系统、过程监控系统等提供了理想的软件开发环境。LabVIEW实时编译特性,让编程和调试效率得到很大的提升。根据软件开发规律,从功能设计,结构设计和通信设计依次说明。
1.2.1 软件功能设计
测试系统软件所提供的功能包括:
1)图形用户(GUI)界面的人机对话接口和界面友好,包括可显示设定指令的曲线和回采信号的实时曲线及数字实时刷新显示监测信号等;
2)有典型试验入口;
3)试验进程的监测及报警;
4)控制参数的设置;
5)系统输出输入通道的自检;
6)试验数据的保存、处理、曲线回放、报表打印等。
1.2.2 软件结构设计
将测试测量程序划分3个层次,即主VI、功能层和最底层的驱动层。LabVIEW已经提供了常用的底层驱动功能,如数据采集设备的驱动、文件读写驱动、VISA驱动等,因此,舵机自动加载测试系统程序设计主要在主vI和功能层。
主VI是最高一层,它主要通过界面为程序提供必要的信息,并且接收需要的信息以及调用下层VI。依据LabVIEW开发程序的流程即提出需求、设计、编码、测试、发布和维护,结合舵机自动加载测试系统的特点,采用从用户界面设计着手开发。为保证舵机自动加载测试系统良好的人机交互,主界面将采集区域与控制区域分类排布,并且卡片式管理各个实时显示项,统一使用LabVIEW银色系列控件,从而让试验监视方便,测试过程操作简单。将测试主界面划分为舵机控制、加载电机控制、试验控制、试验监控和试验记录5个区域,每个区域下又有若干测试子项。图2所示为舵机自动加载测试系统的交互界面设计简图。
依据主VI设计功能层,功能层采用自顶向下的设计方式,逐步实现使用子Ⅵ去实现各个功能模块,软件结构图如图3所示,软件程序流程图见图4。
1.2.3 软件通信环境
1)使用标准PXI仪器总线通信协议,支持32或64位数据传输,最高数据传输速率可达132Mb/或528Mb/s;
2)RS232串口通信协议。
2 数据采集模块设计
2.1 数据采集的实现
LabVIEW可以很方便无缝地利用NI公司的数据采集卡实现数据的采集,NI提供了上百种采集卡的驱动程序供用户使用。然而由于NI采集卡是高端产品,价格昂贵,不适用于一般的企业和科研单位,应用并不是很广泛。在满足舵机测试各项要求的情况下,通过动态链接库(.d11)调用非NI板卡——阿尔泰的PX19606多功能采集卡来实现数据的采集,LabVIEW程序见图5。
在LabVIEW程序窗口选择基本函数Call Library Function Node.vi,并且在其右键的菜单里选择configure对其属性,例如DLL文件的路径、被调用的函数名、参数的类型及返回类型进行配置后,即可在LabVIEW中连接阿尔泰提供数据采集卡进行模拟量数据采集。
CreateDevice为设备创建了句柄,供其它函数调用识别设备,InitDeviceProAD初始化硬件通道和采样频率等,StartDeviceProAD启动设备,ReadDeviceProAD Half读取指定长度数组数据进入物理缓冲区,从缓冲区不同层次的数组取出一个元素,经过一系列转换即可得到各个传感器采集的电压值。最后ReleaseDeviceProAD和ReleaseDevice释放设备,完成一次数据采集。将这些动态链接库函数加入到循环结构中,即可实现连续数据采集。
2.2 数据采集中的生产者一消费者设计模式
数据采集程序在运行时仍然希望系统能够处理其它事件,这是在传统的状态机或者事件结构中无法实现的。因为无论是状态机结构还是事件结构,都是由一个循环组成的,不同的状态是无法同时被响应和处理的。解决这个问题的方法也比较简单,LabVIEW本身就是一种多线程的程序设计语言,可以再加一个循环或者另外开一个程序独立运行。舵机自动化测试过程中,既需要对数据实时采集,又必须通过对采集的数据根据舵机测试项的具体需求进行处理得到计算值,然后与标称值比对,从而得出最后结果,因此多线程是必须的。然而,在舵机自动加载测试系统中,采集数据速度很快,而分析处理数据速度相对较慢,如果分析处理过于复杂可能会导致处理时间过长,将会影响到采集数据的速度。为了解决此问题,采用生产者-消费者数据采集模块程序模式来设计采集循环。
如图6所示,生产者循环不断的产生数据送入缓存器,而消费者循环则从缓存器中不断的读出数据。在由于每个循环只做自己的事情,所以相互之间并不会发生影响。生产者循环不产生数据,消费者循环则不运行。队列起到了重要的作用。这里采用全局变量进行数据传递,它与生产者一消费者设计模式下的队列相连。这虽然破坏了数据流,但是让编程模块化程度更好,有利于提高多人开发其它模块的效率。
3 循环间通信设计
因为舵机自动加载测试系统并没有多个数据流同时对一个变量进行读写,不会因为竞态条件发生读写冲突,所以在并行采集循环中,可以使用全局变量进行数据传递。然而,LabVIEW以数据流机制控制VI执行,数据流机制的主要特点是数据从属,即仅当一个节点接收到所有必需的输入数据时,节点才可以执行,当节点执行完毕,数据流出节点。循环没有执行结束,数据流无法流出循环,并行循环间无法进行通信。
LabVIEW的通知器控件是用来在程序框图中的两个独立部分之间或者在运行于同一台机器的两个Ⅵ之间通信的工具,它类似于数据邮箱,程序框图的一段代码发送数据给邮箱,另外一段代码从邮箱中接收数据。等待通知器控件的程序框图则完全停止执行,只有当新数据可用时才重新启动。这使计算机减少浪费在无止境的轮询中的时间。通知器经常用在循环控制的信息传递,例如两个循环同时启动,同时终止的控制等。通知器这一特性,可以为并行循环通信提供一种通信的方法。在循环外层再嵌套上通知结构,即使循环未结束,也能将数据送出循环。
在LabVIEW程序面板,单击编程一同步一通知器操作一获取通知其引用,即可新建一个通知器。如图7所示的事件循环结构中,获取通知器通过句柄的方式与发送通知控件相连接,等待通知控件错误输出连线与循环相连。当“开启检测”事件发生时,等待通知控件收到发送通知控件的布尔指令,即可开始执行循环结构。即使等待循环从未结束,也可将数据实时写入全局变量,供其它Ⅵ读取,程序如图8所示。
4 串口通信中的数值转换
虚拟仪器软件体系结构(VISA)是一种包括GPIB、串口、以太网、USB的编程和故障诊断仪器系统的标准配置。为了在LabVIEW中编写的VISA接口程序,需另外安装NI-VISA驱动程序。LabVIEW提供NI-VISAInteractiveControl对VISA进行配置和调试。在后面板利用VISA节点进行串行通信编程,利用ⅥSAConfigure Serial Port节点设定串口的设备句柄、波特率、停止位、校验位、数据位,读写串口,利用VISARead节点和VISA Write节点对串口进行读写,关闭串口,停止所有读写操作等。
在舵机测试设备调试过程中,发现静态应变片扭矩传感器出现电压偏置,推测原因是由于自动测试加载系统电路密集程度高,各个子电路接地不同,以及电路间可能的电磁干扰。为了彻底解决这个问题,将扭矩传感器输出方式由电压输出改为频率输出,这很好地抑制了干扰。接收频率信号的扭矩表提供模拟量接口和VISA接口与PXI控制器相连。如果再用电压模拟量传递扭矩信号,必然增加一次转换过程,可能导致采集精度的下降,所以采用VISA接口来链接扭矩表和PXI控制器。
通过向扭矩表发送接收命令码,扭矩表向PXI系统传送一组数据类型为BCD码的当前测量值。测量数据由特定字节数组成。数据的数符、数码、阶符和阶码都包含在特定的字节中。这就会面临一个问题,数据是BCD码,不能直接参与后续运算,因此需要将字节数里的信息提取出来。在文本语言编程中,通常是将BCD码转换成二进制然后按位取出0或1进行加权幂运算,再减去进制不同的差值,最后换算成十进制数值。然而这样不仅代码冗长,可读性不好,并且影响执行效率,降低采集速度。
VISA接口采集到的BCD码32H转化为十进制数值32,在文本编程语言中:
需先将32H换算成二进制码,即00110010B;
最后得到数值5-18=32。
如果在LabVIEW中采用与文本语言相同转换思路编程,必然造成代码堆积凌乱。为了解决这个问题,在LabVIEW中巧妙使用字符串,能非常轻松完成数值的转换。如图9所示,BCD码32H连接数值至十六进制字符串转换控件,得到十六进制数组成的字符串,再将该十六进制字符串当成十进制字符串,直接连接十进制字符串至数值的转换控件,即可非常方便得到数值32,代码简洁明了。
5 结束语
(1)利用LabWindows/CVI开发功能相同的舵机自动加载测试系统占用50MB磁盘空间,而利用封装性更好的LabVIEW2013搭建的相同的系统,大小占用只有不到4MB,LabVIEW有效地降低代码体积;
(2)图形化编程语言带来了不同视角的编程方式。在舵机自动加载测试系统开发过程中,充分利用LabVIEW的编程特性可取得意想不到的效果;
(3)在测试系统各项功能开发实现过程中,LabVIEW呈现出更加简洁的编程方式,给后续拓展和维护带来一定的便利性。