夏玉龙 ,赵怀林 ,和 阳
(1.上海应用技术学院 电气与电子工程学院,上海 201418;2.清华大学 计算机科学与技术系,北京 100084)
虚拟仪器就是一种基于计算机的自动化测试仪器系统,通过软件将计算机硬件资源与仪器硬件资源有机地融合为一体。与传统仪器相比,虚拟仪器更加突出软件的核心地位,具有开放性、灵活、价格低廉、技术更新周期短、用户可以定义仪器功能等特点[1]。
本系统需要完成数据采集、传输、存储以及其他功能。软件设计是整个测试系统最重要和复杂的部分,同时也是整个测试系统的核心。因此,选择恰当的软件开发工具可以起到事半功倍的功效。在当今的软件开发语言中,C、VC++、C#、Java、LabVIEW等都可以完成本系统所要求的功能。
LabVIEW(laboratory virtual instrument engineering workbench)是美国国家仪器公司NI(National Instruments)的创新软件产品。LabVIEW是一种图形化编程语言,被称作 “G”语言。G指的是Graphical Programming Language。与传统的软件开发语言相比,LabVIEW的图形化编程方式能够节省85%以上的程序开发时间,其运行速度却不受影响,体现出了极高的效率,同时也可以享受LabVIEW控件带来的极大的便捷性,再加上LabVIEW在数据采集、分析、图表显示等方面的卓越表现成为了本系统开发工具的首选。
LabVIEW程序是由VI组成的,VI包括前面板和程序框图。一般常规语言创建的程序,由一个图形界面窗口(一般称为GUI)和文本编辑窗口组成。LabVIEW中的VI,前面板相当于GUI,程序框图相当于文本编辑器。显然,前面板是人机交互的接口,而程序框图是用来编写代码的。LabVIEW最大的特点就是它的代码以图形化的方式出现。
前面板中放置的是输入/输出控件,程序框图中放置的则是与控件对应的函数以及代表 “数据流”的连线。LabVIEW程序的核心是数据流,也就是说,只有数据流流经某节点时,该节点才会执行。数据按照代表“数据流”的连线从一个函数(或变量)流向另一个函数(或变量)来完成各种各样的功能。
如图1所示,整个测试系统由装有基于Lab-VIEW开发的测试系统软件的计算机、DSP、传感器组成。依据内部通讯协议,上位机通过RS422总线与DSP进行串口通讯[2]。上位机通过如图2所示的人机交互界面将来自于测试人员的指令封装成8字节的具有帧头、指令数据、校验和的数据帧。DSP在接收到来自上位机的数据帧后,先通过计算校验和来验证帧数据的准确性,确认帧无误后,将帧数据进行解封装,得到指令数据,而后将指令数据发送给驱动器。驱动器得到来自DSP的指令后,驱动待测电机,使之按测试人员的意图进行运行。待测电机运行时的电压、电流、转速等参数由传感器进行捕获,并形成模拟信号,传送给A/D转换器。A/D转换器将传感器传来的模拟信号转换成数字信号,而后发送给DSP,DSP依据内部通讯协议,将数据封装成16字节的数据帧,通过RS422总线,由串口设备发送给上位机。上位机接收到数据帧后,同样先验证校验和,确保帧数据无误后,对帧进行解析从而得到待测电机的电压、电流、转速等信息,并在界面上显示出来[3]。
图1 电机测试系统结构示意图Fig.1 Diagram of motor test system structure
图2 人机交互界面Fig.2 Graphic user interface
串口设置模块提供设置端口号、波特率等串口属性的接口。在实时转速控制模块中,单次控制,可通过修改界面控件值、键盘↑↓光标键来控制转速;程序控制,通过时序指令配置模块配置程控指令,而后进行测试时,以2 ms的时间间隔发送这些预先配置好的程控指令。最后,在结束单次控制或程序控制之后,该系统都会以2 ms的时间间隔发送最近一次控制指令,以达到对电机持续稳定的控制。电机测试系统各个模块如图3所示。实时数据显示和保存,以各种控件为载体,数据以文本、仪表、曲线多种形式呈现;保存的数据可以在测试之后做进一步的分析。
图3 电机测试系统各个模块Fig.3 Each module of motor test system
在这个模块中,显然,单次控制具有偶然性,并且系统对单次控制的响应要具有很好的实时性。在前面板的鼠标点击、修改数值控件或按下键盘上下光标键的情况下,该系统会执行生成并发送单次控制指令的程序。轮询方式和事件结构均可以完成此目的。轮询方式具有结构清晰、程序流程明确、响应及时的特点,但是在单次控制任务不发生的情况下,轮询方式依然会不断地查询标志变量。这会造成极大的CPU资源浪费。相反,事件结构的优点则是减少CPU,同时还具有响应及时的特点。更重要的是事件结构采用队列方式来存储触发时间,这样就避免了漏掉事件的可能[4-6]。
与单次控制不同,一旦程序控制开始,便要以2 ms的时间间隔不停发送控制指令。有2种方案可以采用,第一种是生成一条指令就立即发送,这样做的好处是,占用的内存空间少,但要求CPU必须在2 ms的时间内完成多次读写内存操作,这对于CPU来说负荷过大,而且在CPU繁忙时,2 ms的定时精度也不一定能达到。另一种则是在发送之前生成所有指令数据存入硬盘文件并一次性读入内存,然后再逐一发送,这样做的好处是,在发送期间CPU的负担大大减轻,只需在连续的内存空间完成读操作,从而2 ms的定时精度有了极大的保证,同时,由于数据存于硬盘文件中,又可以达到同样程序控制的多次复用,交换这些好处的成本仅仅是复出一些内存空间和磁盘空间。比较之下,显然第二种方案更佳。
以2 ms时间间隔不间断发送最近一条指令和上述2种串口发送任务都需要发送串口数据而且情况均不一样,因此需要调用3次串口发送函数来完成。显然,可将3次函数调用分别放在3个线程,通过设置检测一些标志变量实现任务间的切换。但是由于LabVIEW对线程的控制不足以达到这一要求,会造成单次发送任务和循环发送最近一条指令的任务相互干扰的现象。
正常情况下,图4中应该显示实时发送的转速,执行完单次发送任务之后,上位机会继续发送最近一条指令。而这里,执行完单次发送任务之后,上位机没有继续发送最近一条指令,而是继续发送最近一条指令的上一条指令。这样就造成了图中显示的“干扰”现象。
图4 串口发送任务之间的相互干扰Fig.4 Interference between the sending tasks
针对这种情况,可以利用LabVIEW的生产者-消费者设计模式来完成。生产者-消费者设计模式是多线程编程中最基本的设计模式,是while循环和队列消息处理器相结合而构成的复合设计模式。
如图5最左侧分支所示,生产者循环可以响应鼠标单击、键盘按下等诸多事件直至程序结束。单次控制事件和程序控制事件发生以后,系统都会将指令放入队列,然后消费者循环从队列中取出指令并将其发送,同时在各自的事件分支中还应该设置一些标志变量(如“程序控制”和“单次控制”变量),使消费者循环不会相互影响。
如图5最右侧分支所示,循环发送最近一条指令会跟单次控制的发送任务放在一个条件结构的不同分支中,同时,这个条件结构包含在一个更外层的循环中。这样,在同一循环中,同时只能执行一个分支下的代码,因此就不会出现互相“干扰”的现象了。
如图5中间分支所示,程序控制的串口发送任务则放在另一个消费者循环当中,只要保证程序控制进行的过程中,单次发送的消费者循环不会执行任务代码即可。
图5 程序流程图Fig.5 Flow chart of the program
如图5所示的3个分支,大部分时间可以独立地并行执行,只在等待各自队列数据的进队和出队时,3个分支之间才会有执行的先后顺序。这样做的好处是可以充分利用现在计算机处理器的并行处理能力,提高了计算机程序的执行效率。
对程序运行时间的精确控制是编程者绞尽脑汁所追求的目标,但令人遗憾的是,在没有硬件定时器的情况下,Windows操作系统能够达到的最高精度是1 ms,而且这里所说的1 ms指的是由电池保持的计算机系统时间。LabVIEW在7.x版本后,出现了一种新的定时结构—定时循环,它是可以用于Windows操作系统中提高程序对时间控制精度的有效手段。但是,定时循环也会占用比较多的系统资源[6]。
此测试系统中,出于安全考虑,在非程序控制情况下,测试系统软件会每隔2 ms发送一次最近一条指令给DSP控制器来保证电机不会失控。在程序控制的情况下,测试系统软件也会每隔2 ms发送一条指令给DSP控制器来保证电机可以按照预先设计的方案运行。要完成此目的,使用定时循环再合适不过了,只需将定时周期设置为2 ms即可。值得注意的是,如果定时循环内完成任务实际所需时间高于2 ms,则定时循环会按部就班地执行循环内的任务,并不会通过某种手段加速任务执行以保证任务在2 ms内完成。因此,在设计定时循环所要完成的任务时,要充分精简任务以达到可以在一个周期内完成。
为了验证本系统的实际性能,将本测试系统长时间应用于实际的电机测试当中,并针对测试中遇到的问题进行改善,然后再进行测试。在单次控制过程中,电机能及时响应,同时测试软件也能及时动态显示电机的相关状态。在程序控制过程中,不仅能保证电机和测试软件及时响应,还能依据测试人员要求使转速指令呈现正弦和折线等波形。如图6所示,在定时任务中,通过示波器测定串口发送数据之间的时间间隔是2 ms,与预期相同,并且没有丢帧。这说明定时循环的定时精度还是十分精确和可靠的。测试完成后,系统能对测试数据执行高效率的保存工作。除此之外,系统可以流畅正常运行在Windows XP、Win7和Win8等常用操作系统平台上,这说明系统具有良好的移植性。
图6 示波器测定的发送间隔Fig.6 Sending interval measured by oscilloscope
本测试系统采用LabVIEW作为开发平台,将软件工程思想应用到测试系统开发过程,使得代码稳定,可靠且执行效率很高。本系统主要实现了串口通信、电机控制、数据显示与保存。不仅实现了与被测电机的实时通信与控制,而且本系统的电机控制模块通过巧妙设计,使其在操作系统之上有了比较精确的时间控制。测试人员不仅可以享受操作系统的便捷性,而且可以使用该系统完成定时精度要求较高的测试任务。系统可以正常运行在常见Windows操作系统上。因此,本文在基于虚拟仪器开发测试系统方面和操作系统之上提高测试系统实时性方面具有良好的参考意义。
[1]杨忠仁,饶程,邹建,等.基于LabVIEW数据采集系统[J].重庆大学学报:自然科学版,2004,27(2):32-35.
[2]卢天海,王见.基于LabVIEW的电机功耗实时监测系统设计[J].计算机测量与控制,2012,20(3):580-582,609.
[3]吕向锋,高洪林,马亮,等.基于LabVIEW串口通信的研究[J].国外测量电子技术,2009,28(12):27-30,42.
[4]雷振山.LabVIEW 7 Express使用技术教程[M].北京:中国铁道出版社,2004.
[5]National Instrument Corporation.LabVIEW User Manual[Z].April,2007
[6]陈树学,刘萱.LabVIEW宝典[M].北京:电子工业出版社,2011.