曹剑馨
(陕西国际商贸学院 信息工程学院,陕西 咸阳 712046)
近年来,工业控制网络随着微电子技术、计算机技术以及通信技术的快速发展也不断向前发展,从计算机集成控制系统CCS发展到基于模拟信号传输的集散控制系统(DCS),再到数字化、智能化、全分散的现场总线控制系统FCS,最后到工业以太网等等。工业控制网络[1]作为一种特定应用的网络,相比较商业信息网络,具有其自身的要求和特点,其中非常重要的一点就是实时性要求高,不仅要求传输速度快,还要求响应快。
在CAN总线[2-3]通信系统中,其固有的仲裁机制会导致优先级低的帧自动退出发送,只能等待总线再次空闲的时候,再去竞争总线。对于优先级低的报文,只有在负载率较小时,才能竞争到总线访问权,从而获得被发送的机会;但是在负载率较大的情况下,就会出现总线只发送高优先级信息,而低优先级信息得不到发送,被长时间延时甚至造成信息丢失的现象,因此影响到整个网络的实时性能[4-7]。
针对这一问题,提出了一种基于EDF动态优先级调度算法的实现方法,以改善CAN总线系统信息调度的灵活性。
CAN总线的媒体访问方式为载波监听多路访问/冲突检测机制CSMA/CD[8-9],CSMA/CD是Carrier Sense Multiple Access/Collision Detect的缩写。
这种控制方式不会对任何工作站预约发送时间,而是采用争用技术,即工作站的发送是随机的,必须在网络上争用传输介质。当同一时刻有多个工作站向传输线路发送数据时,为避免这些信息在传输线上相互混淆从而遭破坏的情况出现,每个工作站在发送信息之前,必须要监听传输线上是否有信息在发送,以达到尽量避免由于这种竞争而引起的冲突。
一个工作站在发送数据前,需要先进行总线的监听,以判断总线上是否有其他工作站正在发送数据。如果判定总线此时是空闲状态,则可以进行数据的发送。反之,等待一定时间间隔后重试。
当存在多个节点同时访问总线需要发送数据时,对于这种冲突的处理,CAN总线采用非破坏性逐位仲裁技术[10-12],会停止低优先级数据帧的发送,而确保高优先级的数据帧可以继续发送。
最早截止期优先调度算法EDF[13-15]是Earliest Deadline First的缩写,属于动态优先级调度算法中很重要的一种调度理论。
任务的优先级依据任务距离截止期限动态进行分配。任务的截止期限越早,优先级越高;反之,优先级越低。
任务优先级分配计算式定义为di(t)-t。其中,di(t)代表t时刻的任务截止期,由此式决定下一时刻应该调度哪个任务。
在EDF调度算法中,消息的优先级不再是静态固定的,而是在每个时刻,都要计算下个时刻系统中任务的相对截止期来进行优先级的分配,并且系统下一时刻的调度任务具有不确定性,与系统中其他任务有关联,这就使得系统具有较好的适应性。
在MATLAB/Simulink软件的Stateflow仿真环境中搭建10节点的CAN总线通信系统仿真平台。母版模型中包含2个部分,分别为节点模型块与总线模型块。节点模型块个数为10个,总线模型块个数为1个,且所有模块为并行关系。
引入EDF动态优先级调度算法的仿真模型较没有引入之前的模型最大的变化在于节点模型块中的“send”模块,对其分别增加了“pri”状态与“resent”状态以及一些状态迁移线。改进后的节点模型块如图1所示。
图1 改进后的节点模块
此节点模型块包括“send”“buffer”“period_data_put”3部分。其中,“period_data_put”用于对simulink输入的数据进行采集,总线系统负载率的大小就是通过改变此处的数据采集周期来调整的;在“datain”中,采集的数据被组装数据帧,这里组装为CAN标准短帧的形式;“buffer”代表节点的缓冲器,数据帧的组装完成后,开始由“null”转换到“nonull”,当数据发送完成后,再返回“null”状态,等待下一次触发。“send”代表节点发送部分,当总线上有数据等待传输时,触发由“sleep”到“wait”的转换,“pri”负责完成系统中报文优先级的分配,当本节点通过总线仲裁获得发送权限时,状态由“pri”转换到“transmission”,实现数据的发送;如果判定某报文的截止期小于0,则触发由“pri”到“resent”的转换,重新发送数据;当数据帧传送完毕后,由“transmission”转换到“sleep”,等待下次数据发送。
改进后的总线模块如图2所示。
图2 改进后的总线模块
此总线模块中也包括3个状态:“idel”“busy”“space”。总线最初处于“idel”状态,代表没有数据发送的空闲状态,当有信息需要发送时,开始对待发节点的优先级进行仲裁,仲裁结果做为由“idel”转换到“busy”的触发条件;“busy”代表数据处于发送状态,当数据发送完毕后,通过“return”事件触发由“busy”到“space”的转换;经过一个“space(帧间隔)”后,回到“idel”状态,代表总线空闲状态,等待下一次传输。
本文的仿真中进行了以下设定:传输速率为200 Kbit/s,总运行时间为0.25 s,每帧报文的数据长度为100 bit;同时,在没有引入EDF算法对总线系统进行改进前,假设了各节点的优先级为:节点1信息优先级>节点2信息优先级> …>节点10信息优先级。
选择10个节点中数据更具代表性的4个节点(节点1、节点7、节点9、节点10)进行研究,分别对4个节点在不同负载率下的数据发送成功率进行分析,引入EDF算法前的仿真结果如图3所示。引入EDF算法后的仿真结果如图4所示。
图3 改进前的总线模型仿真结果
图4 改进后的总线模型仿真结果
由图3可以看出,随着负载率的逐渐增大,节点1的信息几乎都能得到发送,甚至在负载率为110%时,也能达到接近于100%的发送成功率。但是,其他节点由于优先级较低,会随着负载率的增长(尤其负载率达到70%以上时)会出现数据发送成功率急速下降的现象,节点9、节点10表现的尤为明显,这就会导致大量数据不能及时得到发送甚至数据丢失,总线系统的通信实时性能受到严重影响。
由图4可以看出,随着负载率的增加,各节点的数据发送成功率依然总体呈现下降趋势,但是这种趋势较之前明显更加平缓。与图3中的数据相比较,每个节点在不同负载率下的数据发送成功率基本都有提高,尤其从节点10来看,在负载率为110%时,其数据发送成功率为49%,与图3中的35%相比较,有显著提高,证明总线系统的通信实时性能得到改善。
本文针对基于静态优先级调度算法的CAN总线系统存在的缺陷,提出了基于EDF动态优先级调度算法的CAN总线通信系统改进方法,并使用MATLAB的Stateflow工具箱搭建仿真平台,仿真结果证实使用动态优先级调度算法EDF对CAN总线通信系统进行改进,有效提高了总线上数据发送的成功率,尤其是高负载下各节点数据发送的成功率,改善了多报文传输时的实时性问题。