王小勇,薛峰
(1.上海辛格林纳新时达电机有限公司,上海 200072;2.扬州市经济和信息化委员会,江苏 扬州 225209)
桥式起重机作为一种物料搬运设备,对于企业生产活动中的重型物料搬运,和生产活动的有序进行具有重要意义。传统的桥式起重控制系统主要采用继电器接触器进行控制,采用交流绕线串电阻的方法进行启动和调速[1],这种控制系统存在可靠性差,操作复杂,故障率高的缺点,并且造成电能浪费。近年来,由于变频器在起重领域的广泛应用,改善了传统控制系统的一些缺点,大部分变频器必须配合PLC控制器使用,但PLC的IO刷新一般在整个程序的单次循环结束以后,可能会造成实时性偏弱并且可能由此造成潜在的逻辑风险;另外,PLC程序编制过程中对于时序逻辑的保证完全依赖于程序员个人的逻辑严谨程度,没有安全的机制保证。普通的单片机程序也存在类似的问题,由于大量地使用了散落在程序各个部分的相互关联的条件分支,系统反应部分的代码显得凌乱不堪,这些都使得程序对于保证严格的时序逻辑存在潜在的风险[2]。
桥式起重机桥架两端通过运行装置直接支撑在高架轨道上,通常用于生产车间内的物料搬运。桥式起重机的基本机构类别有以下两种:
(1)起升机构是实现重物上升或下降的机构,根据起吊重物吨位的不同分为主起升机构和副起升机构。
(2)运行机构是桥式起重机平行移动的机构,它分为大车走行机构和小车走行机构。
起升机构是位能性负载。其特点是:重物上升时,电动机克服各种阻力作功,属于阻力负载;重物下降时,重物本身的重力是下降的动力,电动机成为了能量的接受者,故属于动力负载。起重机的运行机构都是阻力负载[3]。
通过对各机构运行过程的分析可以抽象出一些共性逻辑即每一个独立机构都存在电机正反转、多段速切换、速度限位保护和极限限位保护等相似逻辑。对于应用变频调试的起重设备而言,控制的关键在于变频器起制动过程与机械制动器动作的配合,这个逻辑的合理与否直接关乎变频器运行寿命以及桥式起重机的安全性。起升机构运行开始前抱闸处于闭合状态,要起动运行就要开抱闸,如果开闸过早变频器未建立足够的转矩就会发生溜钩;反之如果开闸过晚则可能出现磨闸一方面影响制动器寿命和变频器逆变器寿命,另一方面容易引起变频器过流保护系统停止运行[4]。制动器是机械抱闸装置,该装置释放需要时间,在制动器释放过程中变频器不宜加速,否则也会出现磨闸,并且电机堵转时变频器输出频率偏高,造成释放瞬间电机速度过高引起振动。起升机构停止命令发出后,制动器要闭合,同样制动器闭合也需要时间,在此过程中变频器必须保持转矩,否则也会溜钩。
桥式起重机整体结构由中控室、主起升机构、副起升机构、大车行走机构和小车行走机构五大部分组成,由驾驶室人员在驾驶室内通过操作杆给出各机构运行的方向和段速,这些信号通过通信总线给到每一机构,而和每一机构相关的故障及报警等保护逻辑点就近接入该机构控制器,这样整个系统的走线可以最简,调试和检修更加方便。整机电气控制系统如图1所示。
图1 桥式起重机电气控制系统
由图1可看出每一机构的IO控制CPU要给出控制逻辑的运行结果需要从三个方面得到输入信息,即从主控室信号采集板处通过CAN通信取到运行方向标志和段速标志,从和本机构相关的保护和控制触点处得到限位、报警、故障以及抱闸信号,从变频器CPU通过串口通信取得变频器故障、允许给速度信号和张闭闸信号,综合以上信号由IO控制CPU计算相应的速度曲线,给到变频器连续的运行速度,同时给出相应控制输出。
高性能的桥式起重机各机构在启动和停止瞬间对于逻辑要求非常高,因为这对起重机运行安全性和寿命均有相当重要的意义,因此必须寻求一种机制以保证运行状态的安全和精确切换。美国Miro Samek博士提出的量子平台QP(Quantum Platform)是一种关于反应式的系统,这种系统类比了量子力学中的基本概念,建立了QF(Quantum Frame)框架以及状态、事件、信号以及状态间的跃迁条件等,这种系统使用事件驱动的方法达到与环境不断交互的目的,非常适合用于嵌入式软件领域[5],特别是应用于工业控制系统的程序设计。本文采用量子平台状态机机制建立桥式起重机控制系统程序框架,确保控制逻辑中各项任务的调度,从而满足桥式起重机对高安全性和高性能方面的要求。
量子平台由Miro Samek博士提出,借鉴了量子力学中量子在各种能量态之间跃迁的描述手段来描述嵌入式软件中的编程模型。量子平台本身实际上较为系统地提出了嵌入式系统中状态机的编程模型。量子框架QF提供了更快速、更安全和更可靠的开发并发任务的方法,基于QF的应用不需要直接操作临界区、信号量和其他类似的机制,在编程时不用担心竞争条件、死锁以及优先级反转等带来的风险,但是却可以获得多线程的所有好处。
状态机工程中必须包含状态机内核,这个内核可以以库的形式包含在工程中,由该内核完成状态的跃迁、信号的发送及调度机制。每个工程中可以包含若干个状态机,每个状态机中包含了若干个状态,这些状态可以存在层次包含,在每个状态机中任何时候都只有个状态是活动的,每个状态机都有个属于其自身的消息队列,这个消息队列由事件触发并由QF框架完成消息分发,并由该状态机中的唯一活动的状态进行响应。每个状态机在初始化的时候可以指定状态机的优先级,量子内核根据设定的优先级进行状态机响应函数的调度。在每状态机中均唯一维护了属于自身的结构体变量,由量子内核利用该结构体完成响应处理过程的参数传递。
本文中的量子平台状态机基于Miro Samek设计的量子框架,根据前面所作分析,桥式起重机每个机构的逻辑都可以抽象为应用逻辑和驱动逻辑,应用逻辑和驱动逻辑都对设备运行的稳定性、可靠性和安全性加以保证,据此可将其抽象为应用逻辑状态机AppCtrl和驱动逻辑状态机DrvCtrl,另外出于构建整个状态机系统间的事件驱动机制的考虑,可以再构建一个系统状态机SysCtrl,将这几个状态机的对应类均从qpc:Qactive类派生,由此可以在每个状态机中声明一个类对象并将其强制转化为QActive*类型,基本情况如下:
/*桥式起重机驱动逻辑状态机部分*/
static DrvCtrl l_drvctrl;
QActive*My_Drv=(QActive*)&l_drvctrl;
/*桥式起重机应用逻辑状态机部分*/
static AppCtrl l_appctrl;
QActive*My_App=(QActive*)&l_appctrl;
/*桥式起重机系统逻辑状态机部分*/
static SysCtrl l_sysctrl;//为状态机命名
QActive*My_Sys=(QActive*)&l_sysctrl;//为状态机引用
本项目利用可视化量子平台的建模工具QM(Quantum Platform Modeler),来建立工程,由此可以通过建立层次状态模型,轻易实现层次状态机,并可以自动生成代码框架。由QM建模工具生成的代码具有如下特点,首先为状态机中的每个状态生成一个函数,在这个函数中两个函数指针,一个是本状态类的指针,另一个是事件类指针,以驱动状态机中的Stop状态为例,生成的代码框架如下:
QState DrvCtrl_Stop(DrvCtrl*me,QEvent const*e){
switch(e->sig){
case Q_ENTRY_SIG:{ //进入事件
……
return Q_HANDLED();//返回0 }
case TIME10MS_SIG:{ //收到10ms定时器事件……
return Q_HANDLED();//返回0 }
case DRV_EVENT_SIG:{ //收到驱动事件,由PostDrvEvt函数触发
……
return Q_TRAN(&DrvCtrl_InvRun);//跳转到 RUN状态 }
break;
}
return Q_SUPER(&QHsm_top);//执行父状态相应事件处理代码,不发生状态跳转
}
每个状态机都各自维护自身定义的这个对象,并由QF将该指针对象和完成状态响应函数中的第一个指针形参结合完成地址传递,第二个事件指针的值也由QF框架完成传递。
信号的选择对于基于活动对象的系统非常关键,它影响事件和活动对象,因此必须声明一个枚举类型的信号结构体,将所有事件对应信号均封装在内,如定时器信号、按键信号、出错信号以及通信信号等。
为建立状态机机制,首先必须对QF框架以及状态机进行初始化,本文将其封装在BSP_init函数中,如下所示:
void BSP_init(void)
{ QF_psInit(subscrSto,Q_DIM(subscrSto));//初始化 QF框架的报文发布和订阅
QF_poolInit((EVENT*)regPoolSto,sizeof(regPoolSto),sizeof(regPoolSto[0]));//初始化消息池
QActive_ctor(&((SysCtrl*)My_Sys)- > super,(QStateHandler)&SysCtrl_initial);//初始化状态机
QTimeEvt_ctor(&((SysCtrl*)My_Sys)- >timeEvt__5,TIME5MS_SIG);//初始化5ms定时器
QActive_start((QActive*)My_Sys,1,SysCtrlQueueSto,Q_DIM(SysCtrlQueueSto),(void*)0,0,(QEvent*)0);//开启 My_Sys状态机(优先级别:1)
QActive_ctor(&((AppCtrl*)My_App)- >super,(QStateHandler)&AppCtrl_initial);//初始化状态机
QActive_start((QActive*)My_App,2,AppCtrlQueueSto,Q_DIM(AppCtrlQueueSto),(void*)0,0,(QEvent*)0);//开启 My_App状态机(优先级别:2)
QActive_ctor(&((DrvCtrl*)My_Drv)- > super,(QStateHandler)&DrvCtrl_initial);
QActive_start((QActive*)My_Drv,3,DrvCtrlQueueSto,Q_DIM(DrvCtrlQueueSto),(void*)0,0,(QEvent*)0);//开启 My_Drv状态机(优先级别:3)
……}
另外还必须为状态机系统提供时钟节拍,利用QF_run()函数启动状态机,将上面的BSP_init()和QF_run()均放在在主程序入口处首先调用,这样就建立了基本的状态机工作机制。同时为在状态机之间传递消息还封装了两个事件对象DrvEvt和ErrorEvt以及两个消息发送函数PostDrvEvt和PostErrorEvt,其中Post-DrvEvt在应用逻辑状态机中调用以向驱动逻辑状态机发送运行消息,PostErrorEvt则在驱动状态机中想应用逻辑状态机发消息,以此完成状态机间的信息交互。每个状态机都有且仅有其中的一个状态处于活动状态,由该活动状态处理相应的事件消息,而活动状态的父状态是一种隐含的活动状态。
本项目中为了数码管、按键、液晶面板的显示和参数切换、故障保存等还建立了其他的状态机,各状态机中的状态都接受不同的事件消息,这些都在状态机模型建立的时候充分考虑和设计,其中液晶面板的参数显示和设置采用链表的机制完成。
基于量子平台状态机的桥式起重机电气控制系统代码简洁、结构清晰,整个程序运行均基于事件驱动,符合设备运行的真实状态,通过将起重机起停瞬间的关键逻辑抽象成状态机中的独立状态并预先规划出状态之间跳转的路径和条件的方法确保了设备的安全性和可靠性。由于采用了QM的可视化建模和代码生成工具,整个控制系统的软件开发和调试时间大幅降低,目前该电控系统已得到成功应用,设备运行稳定、可靠,得到了客户的好评。
[1]王德伟.智能控制在桥式起重机上的研究及应用[D].武汉:武汉科技大学,2007.
[2]MIRO SAMEK PH D.嵌入式系统的微模块化程序设计——实用状态图C/C++实现[M].北京:北京航空航天大学出版社,2004.
[3]戴明宏.起重机变频调速控制系统的设计与研究[D].成都:西南交通大学,2004.
[4]夏翔.起重电控设计参考手册[M].北京:机械工业出版社,2012.
[5]冯源,夏立.基于量子平台的PMU软件及状态机描述[J].单片机与嵌入式系统应用,2007,7(6):8.