摘要:为降低开发难度、提高开发效率,提出把基于层次化状态图的建模技术和框架技术应用于plc时控制软件的开发。以电梯控制为例说明了把此技术应用于plc实时控制软件开发的过程。首先根据电梯控制要求和电梯算法建立了系统顶层状态图模型。然后分析了系统任务特性,根据任务特性提出了把控制任务分成局部顺序任务、全局实时任务和异步并发任务的系统分析方法,给出了任务间通信的方法。提出了用函数封装任务实现状态嵌套、用置位或复位函数的“使能输八端”进行任务调度的软件实现方法。最后给出了在西门子plc上实现的电梯控制的主要程序和解决定时器失效问题的方法。实现的软件具有较高的实时性,设计的plc程序可作为类似控制软件的框架。
关键词:实时控制;建模;框架;pic;电梯
1 引言
开发实时系统控制软件是一项困难的任务。文献[1]提到,实时系统设计的许多形式化方法只能解决“小玩具”问题,这种说法在今天看来仍然是基本正确的。很多文献中介绍了采用不同方法建立的电梯控制系统模型,如:改进的petfi net模型、改进的uml模型、面向对象的模型。建模的本意是简化系统,降低系统开发难度,而不少模型较复杂或脱离实际,对系统实现并无帮助。一些模型只是对系统的行为进行了直观的描述性建模,距离对系统的控制还有一段距离。文献[2]中提出了模型驱动的plc软件开发方法,但缺乏应用实例。
很少有文献提及框架技术在plc软件开发中的应用。软件框架是已经实现过和验证过的完善与详实的一类软件的模板,可在类似的软件开发中重用,从而提高开发效率。本文以电梯控制为研究对象,采用uml状态机图建立了控制软件模型,并且介绍了可以作为类似系统控制软件框架的一个实例一电梯控制系统的实现方法。
2 电梯控制需求描述与电梯算法
简化的电梯系统(忽略超重、报警、到达响铃、关门阻挡检测等信号,不考虑轿厢启停的速度控制,每层平层停车位置使用安装在每个楼层的行程开关检测)的输入信号包括:轿厢内目的楼层请求按钮、每层的上升招唤按钮、每层的下降招唤按钮、每层的楼层行程开关、开门按钮、关门按钮、开门限位开关、关门限位开关;输出包括:目的按钮指示灯、上行招唤按钮指示灯、下降招唤按钮指示灯、轿厢上升(曳引电机启动正转控制)、轿厢下降(曳引电机反转控制)、到达楼层显示灯、开门(门控电机正转)、关门(门控电机反转)、当前电梯状态显示灯(下行态、上行态或空闲态)。
电梯完成初始化后开始响应用户招唤按钮和目的按钮的输入,为用户提供运送服务。这时,用户和电梯的构成如下:
用户请求一电梯服务关系模式。一个轿厢对多个用户的服务是共享的。为了提高服务效率,需要按照一定的策略来调度轿厢的移动为多个用户服务。常用的调度算法是电梯调度算法,简称为“电梯算法”,它的描述如下:电梯在运行中服务于同方向上的请求,中途不改变其运动方向,除非它完成r所有同方向上的请求任务。
3电梯控制顶层建模
状态图较之经典状态机最主要的改进之处是组合状态(层次化可嵌套状态)的引入,它在fsm的模型中加入了对层次和并发的支持,消除了用fsm模型来描述一些复杂系统时所发生的状态和转换的爆炸的町能性。同时,组合状态是隐藏内部细节的上理想机制,把复杂性隐藏在组合状态的内部,就可以在高抽象层次上更加容易的理解和把握系统。电梯控制系统模型有多种,系统状态的划分也有多种。还算合理的一种把系统状态划分为:空闲态、上升态、下降态。3个状态问均有状态转换,还有状态自身的转换。该模型未考虑电梯调度算法。
考虑到电梯算法和简化状态图,改进后的电梯控制状态图模型,如图1所示。
该模型每个状态只有一个转换进入点和转换退出点,结构比较清晰。空闲态向上升态转换的条件是:有大于当前层的楼层l的上升招唤按钮、下降招唤按钮或轿厢内目的楼层请求按钮被按下。上升态向空闲态转换的条件为:完成所有上升任务一无大于当前层的上升招唤按钮、下降招唤按钮或轿厢内目的楼层请求按钮被按下。
空闲态和上升态控制任务的状态图模型,分别如图2,图3所示。
4电梯控制任务分析
由图l可见,模型到系统实现还有很大距离。在此类反应式实时多任务控制系统的开发中,控制任务的分析与设计对于系统实现至关重要?。本文把控制任务归纳分类成全局实时任务、局部顺序任务、异步并发任务和周期任务4种。本文系统无周期任务。下面根据任务的特性对其分类。
1)局部顺序任务图l中所示的5个状态对应于系统的5个任务。本文把这些任务定义为局部顺序任务。原因是,控制器只需要按照顺序执行其中的一个任务。
2)全局实时任务电梯需要对多个用户提供运送服务,用户通过各层或轿厢内的按钮输入服务请求,电梯控制根据电梯算法,顺序服务用户。尽管运送服务不是实时的,但要求对用户输入的确认响应是实时的。当用户按下按钮时,控制系统立即点亮与上行招唤、下行招唤、目的按钮对应的指示灯,实时响应确认用户请求,并注册这个请求。此后,控制系统按照用户请求移动轿厢,到达有请求的楼层时停止移动轿厢,自动开门,完成对用户的服务,并熄灭相应的指示灯,注销请求。这种呼叫显示及用户请求注册功能构成一个全局实时任务,在电梯正常工作状态中该任务都需要实时执行。
电梯轿厢在运动时需实时监测、显示当前到达楼层,判断是否有注册的请求,以便在有请求的楼层停止。到达楼层是通过安装在各层的行程开关检测的,为了显示楼层数码和判断是否到达目标楼层,当前楼层用数字量表示。程序中通过编程把行程开关输出了量变换成相应的楼层的数字并显示。这个功能构成“当前层更新”全局实时任务。
3)异步并发任务电梯在上升态、下降态、空闲态控制任务的执行中均允许有门的操作,门的操作也可与呼叫显示及用户请求注册任务同时发生。可以把门的操作分析出来在门控制中实现。门控制任务的状态图,如图4所示。
门控制任务执行时间可能跨跃2个局部顺序任务。如:用户在电梯处于空闲态时按下开门按钮,又按下一个轿厢内目的楼层请求按钮使电梯进入上升态,而门的操作任务还没有完成。由以上2点,把任务执行可能与多个任务重叠和并发操作的“门控制”任务定义为异步并发任务。
4)任务的实时性在电梯进入正常工作状态后,全局实时任务一直被执行,保证了系统对用户请求响应的实时性。其他类型的任务也有实时性要求。如:轿厢停靠在一层,此时三层的下降招唤按钮被压下,导致电梯进入上升态,轿厢在上升运动途中位于一层与二层中间时又有人按下了二层的上行招唤按钮,电梯应该在上升到二层时停止并开门。上升态任务中实时性的关键是轿厢运动过程中停止的判断和停止动作的执行。图3中上升中状态的任务就是判断是否需要停止,一旦满足条件就执行停止操作。轿厢停止并开门有3种情况。第一种情况是,将在大于当前层,并且上升招唤按钮被按下的楼层停止并开门;第2种是,将在大于当前层并且轿厢内目的楼层请求按钮,被按下的层停止并开门;第3种是,将在大于当前层,并且下降招唤按钮被按下并且“下降招唤按钮”被按下的楼层是所有召唤中最高的楼层停止并开门。在基于plc的控制器实现中,一般来说最大延迟时间为plc程序循环扫描时间的2倍。这与plc的速度和程序的规模有关,同时如果合理调度任务,可以减少程序扫描时间。
5控制任务间的通信与任务调度
任务:呼叫显示及用户请求注册完成请求的响应和请求信息的注册,对用户的服务在任务上升态、下降态中完成。任务:呼叫显示及用户请求注册模块与上升态下降态模块构成请求信息的生产者一消费者模式。任务之间的通信可使用共享内存的方法实现。呼叫显示及用户请求注册任务置位相应变量,上升态、下降态查询相应变量,完成服务后复位变量。
由于已经根据其特性对任务进行了分类,任务的调度就比较简单了。本文采用plc最自然的顺序调度的任务调度策略。局部顺序控制任务相互没有重叠,同时只有一个在运行。全局实时任务一直运行。上升态、下降态、空闲态任务中通过置位:
门控制使能变量来启动门控制任务。门控制完成后复位门控制使能变量,以便于需要任务同步的任务得到门当前的状态。要注意的是异步并发任务:门控制的使能(置位控制变量,使得该任务被执行)控制可能导致任务重入(任务执行完成前有被从头重复执行)问题,在本系统中不允许该任务重入,所以在任务使能前要满足的条件是该任务没有被使能,参见图2。
6控制系统的实现
1)状态嵌套的实现图1只是一个顶层的状态图模型,在原点复归、上升态、下降态、空闲态中又包含了各自的底层的转态一转换逻辑。也就是说,它们嵌套了子状态。很多plc厂家提供了顺序功能图(sfc)语言编程环境,利用顺序功能图语言可以实现平面的状态图模型。但sfc语言编程不能直接实现状态嵌套.使用起来不方便。但sfc与状态图基本思想是一致的,就是“把大的任务分成小的(阶段)步一即状态,每个阶段(步)的程序只考虑处理与该步有关的输入,通过控制小的(阶段)步程序的执行顺序,实现状态转换,与当前小的(阶段)步无关的程序和输入被忽略”。该方法的关键是,忽略了无关的输入和程序,把大的控制任务简化成很多小的控制任务一状态。受此启发,可以把小的控制任务即状态封装在子程序(或函数)中,通过控制子程序“使能输入端”(参见图5中的语句)控制子程序是否被执行,就可以方便的实现任务的调度,控制调度的顺序也就实现了任务的切换即状态的转换。同时子程序是可以嵌套的,状态嵌套问题随之解决。
2)控制软件框架用西门子s7—300plc的编程环境step 7实现的主程序(obl),如图5所示。图1中的初始化在plc初始化程序块obl00中实现。在原点复归任务程序的最后的语句中,通过复位原点复归使能、置位呼叫显示使能(见图5)语句,使呼叫显示及层更新子程序一直实时运行,同时还置位了空闲使能,使系统状态转换到空闲态。在空闲态中再控制系统向上升态或下降态转换。门控制是一个相对独立的任务,在空闲态、上升态、下降态中,通过置位门控使能,启动门控制,参见图2和图3。
本文的电梯控制软件中,状态嵌套只有2层。在子程序中采用置位或复位相应的状态位变量来控制其内部的状态转换。为了启动子程序内部的状态转移,需要在子程序外部置位子程序中的第一个状态的控制位变量。
7子程序中定时器问题的解决
在用“子程序封装任务”实现状态嵌套的实现中发现,子程序中的定期器在plc第一次启动运行时可以正常工作,在此后,定时器不能正常启动,以致程序在定时器处卡壳。siemens step7帮助中s—odt的使用说明中要求:
启动定时器需要在其输入端(s)加一个正向边沿,并且信号的变化是必须的。造成子程序中定时器不能启动的原因是子程序不是连续扫描的,而是根据状态转换的需要调度执行的。
这样,定时器的输入端(s)在使能(置1)前可能无法得到复位(置0)信号,满足不了“边沿触发”的条件。因此,可把子程序中定时器的语句放到子程序中所有语句的最前面,这样在子程序进入时。先扫描定时器语句,定时器的输入端(s)可得到复位信号,此后的扫描中定时器的输入端再使能启动,就满足了定时器“边沿触发”的启动条件。
8结语
本系统设计在一个8层曳引型模型电梯上实现并验证,软件运行稳定可靠。设计中使用控制子程序“使能位”实现了系统任务调度,plc在扫描程序时只需扫描执行部分子程序,正常工作时plc程序扫描条数为整个程序的63%,系统效率较不使用任务调度的设计有较大提高。另外,本文介绍的系统开发方法具有模型和实现对应关系直接明了、实现的系统结构化程度高的优点,提出的任务分类方法对实时系统软件设计具有普遍的指导意义。给出的软件(图5)还可以作为类似控制系统软件的模板。这两点的应用町以提高开发效率。
参考文献(references):
[i]桂先洲,戴金海.任务图模,i!!中实时任务设计[j].软件学报.2002,13(6):1103.1lio.(gui xianzhou.dai jinhai.real—timetasks tte^ign in task graph model[j].journal of software,2002,13(6):1103—1110,)
[2]miehael f z.ciritlens p.medel.driven development of plc soft—ware for machine tools[j:.production engineering,2008,2(1):3946.
[3] mim s.嵌入式系统的微模块化程序设计-实用状态图c/c++实现[m].敬万钧.陈丽蓉.译.北京:北京航空航天大学出版社,2004.(miro s.practical statef‘harts in c/c++qutmtum programmingfar embedded,,ystems【m].jing wangjun.chen limng.translated.bering:buaa press,2004.)
[4]daniel d(;,frank v.$anjiv n.et a/.specification and design 0fembedded svstemi m1 usa:prentice hall ptr.1994.
[5]lin ch,wang q g.lee t h.global stability of limit。ycles for ack of mimo relay feedback systems[j].contwl engineering ofchina.2007,14(i):66-69.