石新梅,曹 建+,赵 亮,李宗灿,黄 兵
(1.中南大学 物理与电子学院,湖南 长沙410083;2.中国科学院 上海微系统与信息技术研究所 汽车电子工程中心,上海200050)
设备实时性不强一直是阻碍软PLC 在工业控制领域推广应用的关键问题[1]。工业上提高系统实时性的关键在于提高操作系统的实时性,如开发实施内核[2]或者对现有系统进行实时性扩展[3],但此类方法大都成本高,且实现复杂。
前人对PLC的研究采用的都是基于共享内存的循环扫描工作模式[4-6],而此工作模式最重要的缺陷就是响应时间可预测性不高。由循环扫描所引起的响应时间滞后可达两个扫描周期以上[7],具体与编程方法等有关。目前循环扫描工作模式常用的改进方法包括:根据任务对实时性要求的不同而采用不同的扫描周期[8,9]、运用不同的实时调度算法[10]、分时处理[11]、分区I/O 服务等等。但这些方法往往周期设置受限,或者程序设计相对复杂且可移植性不高,有的甚至以损失部分任务的响应时间为代价。
响应速度虽说是衡量一个实时系统的重要标准之一,但实时系统最重要的特征是执行时间的可预测性[12]。因此,为了改善传统PLC的实时性问题,本文提出了收发信号工作模式。采用该模式的软PLC 系统实现简单,能够实时通信且具有很高的执行时间可预测性,同时还可以减少由于循环带来的CPU 资源消耗。
Qt使用了一种元对象系统机制对C++进行了扩展。头文件中包含Q_OBJECT 宏声明的QObject子类,在编译过程中,都会由元对象工具生成另一个相应的标准C++源文件。该文件中有QObject子类的 “元信息”,包括一个含有对象的类名,以及它所支持的信号和槽的列表等。当事件或者状态发生改变的时候,信号就会被触发[13]。其中槽函数可以跟普通成员函数一样被正常调用,其唯一的特殊性是可以与信号相关联。
程序中通过调用connect方法建立信号和槽的连接,即将信号类和信号索引、槽类和槽索引记录到全局的connectlist中。这样在程序运行时,当一个信号被发出,通过查找connectlist就能调用与其相关联的槽函数,从而就能实现类间通信。信号和槽的关系可以是一对一或者一对多,同时信号之间也可以相关联。若一个信号与多个槽或信号相关联,则当这个信号发出,它们会相继被调用。
由于元对象工具在编译过程中已将信号-槽的列表,以及connectlist等创建完成,实际工作中槽的调用时间,即系统响应时间,就完全取决于运行状态下读取connectlist以及相应调度的速度。
图1 (a)是循环扫描模式框架结构。各模块都有自己的内存副本以保存自身数据,模块内部可以随机更改内存副本。共享资源区存储了所有模块内存副本的映射。I/O口可以随机读取共享资源中的数据。所谓循环扫描,指的是每次循环开始,都首先将所有模块的内存副本映射到共享资源,然后根据共享资源区数据执行用户程序,执行完毕后再重新将数据写到I/O 或各内存副本中。由此可见,扫描周期必须小于模块最小更新时间,以防止数据丢失。
图1 (b)是收发信号模式的框架结构。开始工作后,模块内数据的更新将触发信号,从而使共享资源区数据更新。这个更新又将触发新的信号,从而实现其它模块的更新。
由以上分析可知,若要实现两模块之间的通信,在循环扫描模式下,假设模块1在前一次循环将新数据映射到共享资源,则模块2将在后一次循环读取该新数据,从而实现更新。响应时间跟周期有关;在收发信号模式下,模块N 可以直接更改共享资源数据,进而触发信号,其它模块随即响应,响应时间仅跟数据调度相关。
由以上分析可见,收发信号工作模式实现简单,响应时间可预测性高。另外,此模式可以避免类似循环扫描模式中的空循环,同时不必对未改变的变量进行读取和判断,因此可以在一定程度上节约CPU 资源。
图1 循环扫描模式和收发信号模式的框架
本文的设计运用Qt的信号-槽技术,在共享资源思想的基础上,通过以下步骤实现PLC 系统中各模块间以收发信号模式通信:
(1)设计一个变量类VariableItem,作为共享资源中的数据保存类型。此变量既能存储数据值,又能在值改变时发射信号。每个变量必须有一个唯一属性,以便于识别。PLC 控制系统中所有须用到的数据都对应一个Variable-Item 对象,并根据唯一属性来区分。
(2)设计一个容器类Variable作为共享资源空间。容器类统一管理a中的VariableItem 对象,可以对变量对象执行的操作有:统计、注册、注销等。本文中变量名为变量唯一性特征。所谓完成一个变量的注册,就是在Variable容器里添加一个新名字的VariableItem 对象,并保存在QMap中。
(3)将模块用类封装,并设计信号接收端口,即槽函数。模块有变量名属性,表示其所要关联的变量。根据是否对变量具有写权限,模块被分成两类,其中具有写权限的模块有一个指向其关联变量的指针,以更新变量值。
(4)通过connect的方法,将已注册变量对象与相应模块关联,同时进行有效性检查 (例如:判断变量是否注册,变量数据类型是否一致等)。
实际工作过程:系统首先自动将所有用户设定的变量注册,并将每个变量都与相应模块关联。随后,任意变量值的改变将触发信号,进而触发相应模块的槽函数。这种更新也可产生新信号,触发新的模块更新。控制过程具体流程如图2所示。
图2 控制流程
本文分别在Windows7 (简称Win7)和Linux2.6.32操作系统下进行了测试和对比。所用Win7操作系统的硬件平台 为:处 理 器Inter (R)Core (TM)i5-2400 CPU @3.01GHz,内存4G,硬盘300G。Linux 系统的硬件平台为:处理器Cortex A8,600MHz,RAM DDR2 SDRAM 128MByte,Flash 128MB nand flash。
本文模拟了软PLC的循环扫描工作模式,以及收发信号工作模式。考虑到实际应用中的复杂性,本文进行了多种测试对比。所有测试都采用gettimeofday函数记录时间点,并都获取了两万组测试结果。
如图3 (a)部分是模拟循环扫描i个变量变化的测试框图。图3中次线程i代表第i个任务模块,每个线程拥有自己的变量m_num。次线程i不断产生一到三倍扫描周期之间的随机时间,并按照随机时间休息,休息完就刷新成员m_num 的值,并记录时间点;主线程中的数组thread-Num [N]是各次线程m _num 的映射表。主线程在扫描周期开始时刻遍历所有次线程的m_num。若某m_num 改变,则刷新映射表数组,并记录时间点。将检测到m_num值变化的主次线程时间点相减,再加上扫描周期,即得到一组循环扫描响应时间。
图3 (b)部分是模拟i个变量改变的收发信号模式测试框图。M _flag 是线程和QWidget对象的唯一标识。主线程中将线程i的信号与QWidget对象i的槽连接。线程i在1s至5s之间随机发信号,模拟数据更新,并记录时间点和M _flag。QWidget对象在槽中同样记录时间点和M _flag。将具有相同M _flag 的收发信号时间点相减,即得到一组收发信号的响应时间。
图3 测试流程
表1、表2中的测试种类分别代表两种平台下单个信号槽的连接测试、单个信号与100个槽的连接测试、200个信号与200个槽分别连接测试 (信号都在1~5s内随机发出)、循环扫描1 个对象的随机更新测试、以及循环扫描200个对象的随机更新测试。软件PLC 对于不同的PLC 程序扫描周期一般在10-100ms之间。因此在模拟循环扫描工作模式时,分别选择了10ms和100ms两个比较有代表性的扫描周期。收发信号模式中的200个信号,即对应循环扫描工作模式中的200个扫描对象。选择200个信号槽是基于实验平台处理速度的考虑,以保证测试过程中扫描周期大于检测更新时间。
图4、图5是有代表性的响应时间测试结果。纵坐标为该响应时间占总测试结果的百分比,横坐标从左到右依次为单个信号与100个槽连接的响应时间、200个信号槽分别连接的响应时间、200 个对象以100ms 为扫描周期的响应时间。
表1 Linux响应时间测试结果
表2 Win7响应时间测试结果
对于周期性的任务,最能反应系统实时性的是响应时间方差。如图4、图5所示,收发信号模式的响应时间集中分布在0~2ms左右,而循环扫描模式的响应时间则在一到两倍扫描周期内接近平均分布。从表1、表2中可以看出,在信号槽一一对应的情况下,收发信号模式的响应时间方差比循环扫描工作模式的方差小了3到4个数量级。因此,不论从响应时间快慢,还是从响应时间可预测性来看,收发信号模式相对于循环扫描模式都有一定的优势。
但值得注意的是,如果与同一个信号关联的槽过多,则会影响降低系统的实时性,如图4、图5 最左边的两曲线。因此在设计过程中应当尽量避免信号槽一对多的情况。
在获得响应时间的同时测得两种平台下CPU 占用率。在Win7 平台下通过任务管理器查看CPU 占用率,在Linux下通过top命令查看CPU 占用率。数据稳定后的观察结果如表1、2 最后一行所示。可见相对于循环扫描模式,收发信号模式能在监控200个对象随机变化时明显减少CPU 占用率。
进一步增强系统实时性是软PLC 系统重要的发展方向。本文在共享资源的基础上,运用了收发信号模式代替传统循环扫描模式实现实时数据交互。测试结果表明,相对于传统的循环扫描模式,该模式实现简单、响应时间短、可预测性高、CPU 占用率低,是一种性能良好的实时交互模式,能满足大多数实际场合的需求。但因Qt实现原理限制,使用该模式需要注意避免信号槽的一对多使用。另外该模式在实际使用过程中可能存在信号-槽形成死循环等状况,有待进一步改进。
[1]ZHANG Lei.The study and realization on running system of soft-PLC based on PC [D].Taiyuan:Taiyuan University of Technology,2008 (in Chinese).[张磊.基于PC的软PLC运行系统研究与实现 [D].太原:太原理工大学,2008.]
[2]ZHANG Lei.The study on RTX-based full software numerical control system[D].Qinghuangdao:Yanshan University,2006(in Chinese).[张蕾.基于RTX 的全软件数控系统的研究[D].秦皇岛:燕山大学,2006.]
[3]YU Saihua.Research and development of the soft-PLC system based on Windows[D].Nanjing:Nanjing University of Aeronautics and Astronautics,2012 (in Chinese). [喻赛花.基于Windows的软PLC 系统开发 [D].南京:南京航空航天大学,2012.]
[4]WU Yuxiang,GUO Jianxung,ZHOU Jianxiang.Design of embedded soft-PLC programming system[J].Control Engineering of China,2010,17 (3):363-367 (in Chinese). [吴玉香,郭建勋,周建香.嵌入式软PLC编程系统的设计 [J].控制工程,2010,17 (3):363-367.]
[5]MA Yuanjia,QIN Fujun.Research of running system of soft-PLC based on the real time database[J].Microcomputer Information,2010,4 (1):55-56 (in Chinese).[马远佳,秦付军.基于实时数据库的软PLC 运行系统研究 [J].控制系统,2010,4 (1):55-56.]
[6]CHEN Xue,LIU Yinzhong,XU Ensong.Design and implementation of soft-PLC ladder diagram editing software based on Qt[J].Computer Systems & Applications,2011,20 (12):64-69 (in Chinese).[陈雪,刘荫忠,徐恩松.基于Qt的PLC梯形图编辑软件的设计与实现 [J].计算机系统应用,2011,20 (12):64-69.]
[7]LAN Chengzhang,FAN Limin.Brief analysis on the lag phenomenon of PLC input/output response[J].Value Engineering,2010 (3):41-41 (in Chinese).[兰成章,范丽敏.PLC中输出滞后输入的浅析 [J].价值工程,2010 (3):41-41.]
[8]ZHANG Zhilong.A kind of high-performance computer programmable logic controller(PCC)[J].Programmable Controller &Factory Automation,2011 (7):7-13 (in Chinese).[张志龙.一种高性能计算机可编程控制器 [J].可编程控制器与工厂自动化,2011 (7):7-13.]
[9]MA Xiongbo,HAN Zhenyu,WANG Yongzhang,et al.Research of a RTX-based soft-PLC multi-task system [J].Modular Machine Tool &Automatic Manufacturing Technique,2010(1):35-41 (in Chinese).[马雄波,韩振宇,王永章,等.基于RTX 的软PLC多任务系统研究 [J].组合机床与自动化加工技术,2010 (1):35-41.]
[10]BA Wei.Research on the dynamic-priority scheduling algorithms of tasks in real-time systems[D].Dalian:Dalian University of Technology,2010 (in Chinese).[巴巍.实时系统动态优先级任务调度算法的研究[D].大连:大连理工大学,2010.]
[11]SHEN Huiyang.The communication methods between PLC and inverter in same link and different protocols[J].Manufacturing Automation,2012,34 (1):10-13 (in Chinese).[申辉阳.PLC和变频器同链路不同协议同时通信方法 [J].制造业自动化,2012,34 (1):10-13.]
[12]Khalib Z I A,Ahmad B R,Ong O B L.High performance nonpreemptive dynamic scheduling algorithm for soft real time system[C]//Computer Applications and Industrial Electronics,2012:54-59.
[13]Blanchette J,Summerfield M.C++GUI QT4programming[M].2nd ed.Upper Saddle River:Prentice Hall,2008.