加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在LabVIEW上构造复杂多任务应用程序

(2008-02-27 16:00:32)
标签:

it

分类: LabVEW
 

在LabVIEW上构造复杂多任务应用程序

曾令理从网上转载


关键词:LabVIEW,数控机床,多任务并行

Key wordsLabVIEW,CNC machinemultitasking

 

  近年来,美国NI(National Instruments)公司的产品LabVIEW,日渐受到国内有关人士的重视,但其应用大都还局限于测控领域,用于开发一些较为简单的应用程序。作为一种图形化的快速编程语言(G Language),其多方面的优点还远未开发出来。因此,本文就LabVIEW平台上开发较为复杂的实时多任务系统,结合自己所做的工作,谈一些体会。

1 LabVIEW简介
  LabVIEW是NI公司开发的、主要面向计算机测控领域的虚拟仪器软件开发平台,而实际上是一种图形化的快速编程语言。它的编程风格有别于传统的编程语言,降低了对编程者编程经验和熟练程度的要求,易于学习和使用,大大提高了编程效率,被誉为工程师和科学家的语言。另外,作为一种编程语言,和一些通用语言相比,它还有其他一些独到之处,尤其是其多任务的并行机制。对LabVIEW的多任务机制重点介绍如下:
  LabVIEW的运行机制是一种带有图形控制流结构的数据流模式,程序框架从宏观上讲是一种多任务并行的运行机制,而不是如C等传统计算机语言的顺序执行结构。平台的执行系统(execution system)可以完成一般操作系统完成的任务调度工作。
  LabVIEW中保留有一个就绪任务(active tasks)队列,平台的执行系统周期扫描该任务队列,根据任务的优先级(priority)和先后顺序,决定在下一个时间片内哪个任务将获得CPU的使用权。因此,LabVIEW的多任务运行机制是考虑任务的优先级和先后顺序的CPU分时占用过程。并行任务优先级的设置有两种方式:一种是通过VI设置(VI setup)对话框中的优先级设置(priority setting),但此种方法易引起程序运行混乱,编程者不易控制;另一种更常用的方法是设置Wait函数。在LabVIEW中,一个正在执行的并行任务被终止运行有以下几种情况:一是执行代码检测到其执行时间到(一个完整的时间片);另一种情况就是程序在运行过程中碰到Wait函数(包括时间或事件等待等),程序会自动终止运行,放弃CPU,以等待下一次运行。据此,可以充分利用Wait函数,以实现对多任务的控制。
  在多任务系统中,与任务控制有关的操作,如任务的建立、撤消、挂起、激活等,在一般操作系统中都是以系统调用的方式给出,而在LabVIEW中,则要简单、灵活得多。
  构建一个多任务系统,还要解决好任务间的同步和互斥,以及任务间的通信——系统公共数据区等问题。现以笔者在LabVIEW平台上开发的一套数控机床仿真培训系统为例加以说明。

2 数控机床实时多任务系统的实现
2.1 问题的提出
  基于LabVIEW的如上一些优点,以及其独特的多任务并行机制,我们考虑在该平台上开发一套数控机床仿真培训系统。
  数控机床中的CNC单元是一个实时多任务操作系统,它包括管理和控制两大任务。系统的管理包括:通信、显示、诊断、参数设置以及零件程序的输入与编辑,这类程序实时性要求不高;系统的控制包括:译码、刀具补偿、速度处理、插补、位置控制、开关量控制等,这类程序完成实时性很强的控制任务,在实际系统中,往往通过中断来实现。
  以某型数控系统为例,按实时性的要求,其CNC的任务分为定时任务和随机任务。按优先级从高到低排列为(括号内有数字的为定时任务,该数字即为定时时间):
  (1) 位置控制(4 ms);
  (2) 插补计算(包括高级PLC任务,8 ms);
  (3) 低级PLC任务(定时时间常数由用户自定);
  (4) 译码解释(条件任务,有空的缓冲区时被激活);
  (5) 刀具补偿(条件任务,有空的缓冲区时被激活);
  (6) 动态显示(96 ms);
  (7) 人机界面(菜单管理,一次性启动死循环任务,相当于主程序,只要CPU空闲就循环执行此任务)。
2.2 系统实现
2.2.1 多任务系统的建立
  针对本仿真培训系统,在一般数控系统多任务的基础上,增加了几个子任务,系统多任务框架如图1所示。

http://www.wanfangdata.com.cn/qikan/periodical.Articles/ckjs/ckjs2000/0001/image1/t43-1.gif
图1 系统多任务框架

  图中的各任务都是LabVIEW执行系统下并行的子任务,在流程图中被分别置于各自独立的循环结构(while loop)中,如图2所示(人机界面主VI的流程图)。结构图中的箭头线表示任务间的控制关系,详见后述。

http://www.wanfangdata.com.cn/qikan/periodical.Articles/ckjs/ckjs2000/0001/image1/t43-2.gif
图2 人机界面主VI的流程图

2.2.2 几个关键问题
  (1) 定时任务的处理
  LabVIEW的多任务运行机制是协作式的(cooperative),而非抢占式(preemptive),系统不支持中断,因此,无法严格控制某个任务在一指定时刻执行,而不能满足数控系统实时性的要求。但是,实时性只是一个相对的概念,对于本仿真培训系统,有别于工业用的数控系统,并不需对硬件进行控制,尤其是实时性要求极高的轴的位置控制。因此,系统实时性要求并不太高。在LabVIEW平台上,通过对各任务的合理调度,较好地满足了培训对系统实时性的要求。
  在系统的任务调度中,并没有严格地控制各定时任务执行的周期,而是保证了各任务间执行的相对次数,这也是数控系统对各任务的要求。对于定时任务,要保证位控、插补、低级PLC和动态显示各任务的运行次数之比为1∶2∶6∶24。
  (2) 两级任务队列
  在任务调度中,专门构造了一个任务调度核心,该调度核心作为并行的子任务之一,进行周期查询,每执行一次,就对其所控制的任务状态作一次判断和设定。在对各任务状态传递中,采用了LabVIEW函数库中的事件(occurrence)函数,利用事件等待(wait on occurence),来控制任务的激活和挂起(参见主VI的流程图)。调度核心每次循环的运行过程如图3所示。

http://www.wanfangdata.com.cn/qikan/periodical.Articles/ckjs/ckjs2000/0001/image1/t44-1.gif
图3 调度核心循环运行过程

  图3中,事件1为位控子任务所等待的事件;事件2为插补所等待;事件3为低级PLC所等待……。而事件n则为条件任务,如译码或刀补所等待的事件。在每次循环结束时,要设置一个时间Wait函数,这样可以保证调度核心每循环一次,被它激活的子任务也可以运行一次,否则,调度核心可能在一个时间片内无效地连续运行多次,造成资源浪费,更严重的是大大降低了其他子任务的运行频率。通过改变对时间Wait函数中时间参数的设置,可以方便地控制子任务的实际运行频率。
  值得指出的是,时间Wait函数中的时间参数,在一定的范围内,其具体值的多少,并不影响各任务的实际执行频率,因为此时时间参数的值小于该任务CPU时间片的轮流间隔,它仅能使该任务放弃一次CPU的占有机会,要想改变任务的执行频率,必须设置足够大的参数值。
  两级任务队列包括平台级的就绪任务队列和应用系统级的任务调度队列,平台的执行系统根据就绪任务队列决定哪个任务获得CPU而被执行,而任务调度队列则由编程者控制决定哪些任务被激活进入就绪队列。平台的执行系统无法控制,但通过应用系统的任务调度模块(本系统包括任务调度核心和人机界面等起任务控制作用的模块),来控制平台的就绪任务队列,从而最终控制多任务的运行。有了该任务调度队列,就使得系统成为一个开放式体系,可根据需要灵活添加、删除任务,以及对任务的执行频率进行控制。
  通过对系统的调试,可以控制各定时任务以如下的平均周期运行:位控,10 ms;插补,20 ms;低级PLC,60 ms;动态显示,240 ms。这已完全能够满足仿真培训对系统实时性的要求。
  由系统的结构图还可看出,仿真面板和轨迹显示子任务是由人机界面来控制的,其具体实现与任务调度核心的控制类似(相当于调度核心控制的条件任务)。操作者在人机界面上选择相应的控制,就可激活仿真面板或轨迹显示子任务。
  (3) 系统共用数据区
  公共数据区对于多任务间通信至关重要。在LabVIEW中,全局变量(globals)、数据文件(datafile)等都可被用作公共数据。可根据数据的不同格式,选用合理的数据结构。但是,LabVIEW毕竟是一平台级软件,虽然它直接支持的数据结构也很丰富,包括数组(array)、字符串(string)、记录(cluster)等,以及由它们构成的更复杂的数据结构,但其图形化的编程风格,在一定程度上限制了构造高效率的算法。
  例如:在本系统中,需要建立4个完全相同的C刀补缓存块,每块包括若干个数字量(numeric)和逻辑量(boolean),从算法的角度考虑,可以选用Array of four clusters of two arrays的结构,但考虑到不使流程图过于复杂以及流程图的可视性,最终选择了最简单的control和变量一一对应的结构,它虽然编程和查询效率低,但流程图的可视性最好。
  (4) 任务间的同步
  在多任务的调度过程中,任务间的同步是一个经常碰到的问题,若处理不好,轻则达不到编程者的意图,严重的还可能造成死锁,使编程者无法控制。例如:在本系统中,有一些公共数据,由多个任务共享,如人机界面中编辑显示区的内容,它可由多个子任务生成,再送到人机界面上显示,也可由操作者在界面上编辑,再送到其他任务作相应处理。因此,这里存在一个数据的双向传送问题,其数据流向如图4所示。

http://www.wanfangdata.com.cn/qikan/periodical.Articles/ckjs/ckjs2000/0001/image1/t44-2.gif
图4 数据流向示意图

  在此数据的传送过程中,就人机界面而言,何时是对全局变量的读操作,何时为写操作,需要严格的同步。在系统的实现中,设置了另一个全局变量作为一个信号灯,而将数据的读操作和写操作置于一个条件结构(case structure)中,由上述信号灯作为条件参数进行控制,相关的子任务可以通过设置信号灯的状态以获得不同的操作。
  系统中其他相关问题,都可用类似方法解决。

3 结束语
  LabVIEW多任务并行的运行机制,是一般传统语言所不具备的。可以通过合理构造两级任务队列,充分利用Wait函数,方便、灵活地实现多任务调度,快速、高效地构造较为复杂的多任务并行程序。但是,LabVIEW在多任务体系中,无法实现严格的任务定时,因此它所构造的多任务系统在实时性上有所局限,这是使用者所必须注意的。■

作者简介:杨红,男,1971年生,讲师。华中理工大学硕士研究生,主要研究方向:计算机测控
     技术,数控技术。
作者单位:杨 红(武汉 华中理工大学机械学院 430073)
     李 斌(武汉 华中理工大学机械学院 430073)
     赵英俊(武汉 华中理工大学机械学院 430073)

参考文献:

[1]LabVIEW Tutorial for Windows.National Instruments Corp.,1994
[2]LabVIEW User Manual for Windows.National Instruments Corp.,1994
[3]胡英勃,李行善.LabVIEW 在并行程序设计中的应用.测控技术,1997,(5)
[4]毕承恩.现代数控技术.北京:机械工业出版社,1991.12

收稿日期:1999-07-00

请看PDF全文

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有