工业以太网确定性调度的设计与实现
工业控制网络对网络的实时性要求很高,不仅要求传输速度快,数据传输还要具有确定性。以太网的通信存在不确定性,不能满足实时性要求,成为以太网应用于工业控制领域的主要障碍。本设计实现的实时以太网[2]就是网络中每个节点的通信被严格地限定在规定时间内,确保在同一网段内同时只有一台在发送数据。 1. 前言 工业控制网络是一种特定应用的网络,和商业信息网络相比,它具有自身的要求和特点,其中非常重要的一点就是实时性要求高,不仅要求传输速度快,还要求响应快,并且数据传输要具有确定性。以太网的通信调度方式——带有冲突检测的载波侦听多路访问机制(CSMA/CD),是一种非确定性的通信调度方式。网络每个节点要通过竞争来取得信息的发送权:节点监听信道,只有发现信道空闲时才能发送信息。信息开始发送后,还需要检查是否发生碰撞,如发生碰撞,则需等待,等待的时间取决于“二进制指数退避算法”得出的随机延迟[1][4],这种随机延迟为工业通信的数据传输增加了难以避免的不确定性。 2. 系统模型 本设计通过在以太网MAC层之上增加确定性调度层,上层采用了EPA[3](Ethernet of Plant Automation)协议的数据封装格式,因此使数据包的类型判断和调度发送时间的获取成为可能。EPA 是一种基于工业以太网的现场总线标准,是在控制系统与现场测量、控制装置之间,以及现场测量、执行机构之间进行通信的分布式数字控制系统。这样对所有的上层数据包在整个实时网段范围内进行数据包统一调度发送,从而避免碰撞现象的发生并确保数据传输的确定性要求。通信模型如图 1所示: 图1 实时以太网通信模型 3. 系统设计 本设计是在嵌入式平台下实现的,利用ARM7处理器和Cs8900网络接口芯片搭建的硬件平台进行开发,在同一网段中,每一个运行的设备等同于一个网络节点。 上层采用EPA协议封装,分实时数据和非实时数据进行发送和接收。实时数据到达后,通过实时通信服务接口向下递交,对数据进行缓存处理,等待调度发送。下一个发送周期到来后,将用新的实时数据更新相应缓冲区;非实时通信服务通过OS中提供的BSD接口来提供,但是为了实现确定性的调度,非实时数据包穿越TCP/IP协议栈到达数据链路层时,不允许直接调用硬件驱动接口进行数据包收发操作,而是通过一个虚拟的驱动接口将数据包放入相应的发送和接收队列。修改原E-NIC的驱动接口,使其成为虚拟驱动接口,无法直接将数据递交给硬件驱动,而是入非周期队列。对硬件网卡的收发操作在硬件驱动接口中实现。设计图如图2: 确定性调度层负责何时调用硬件驱动接口收发数据帧。当确定性调度层收到数据帧时,根据以太网帧首部的type字段来区分实时数据帧和非实时数据帧。若是实时数据帧,将用收到的实时数据更新相应缓冲区;若是非实时数据,则将其放入相应的接收队列并通过任务通信机制通知上层协议栈数据帧到达事件。确定性调度层的调度表由调度算法生成。 4. 主要模块描述 实时通信服务接口、虚拟驱动接口、时钟同步服务和实时调度算法为本设计的四个主要模块。 4.1 实时通信服务接口 实时通信服务接口负责为上层应用(协议)提供周期性实时消息的实时通信服务。 周期性实时消息的发送和接收采用缓冲机制,即为本节点在运行过程中要发送的每个周期性实时消息在内存中定义相应的缓冲区,每当上层应用通过实时通信服务接口发送新的消息时,即用该新消息值更新其对应缓冲区中的旧消息值;为本节点在运行过程中要接收的每个周期性实时消息在内存中定义相应的缓冲,每当上层应用通过实时通信服务接口接收新的消息时,则将对应缓冲区中的消息值返回。节点在运行过程中将要发送的每个周期性实时消息必须要有与其对应的已知的目标地址(包括目标MAC地址-用于识别节点,端口号-用于识别实时消息所对应的缓冲区元素)。 实时通信服务接口要提供以下接口函数: (1)RtAppInterface() 创建实时接口函数,用于实时周期性消息的发送和接收。 (2)RtMapping() 将由RtAppInterface()函数创建的接口进程映射到特定的地址(MAC,端口号(即缓冲元素的索引))。 (3)RtSend() 使用已创建和映射完毕的实时接口进程进行实时消息的发送。 (4)RtRecv() 使用已创建和绑定完毕的实时接口进程进行实时消息的接收。 4.2 虚拟驱动接口 虚拟驱动接口负责为上层TCP/UDP/IP协议栈提供一套虚拟的驱动程序接口,该接口必须与上层协议栈所使用的原硬件驱动接口一致,但需改变该接口中的具体函数实现,使得虚拟驱动接口所对应的具体函数无法直接实现对硬件的控制(如打开,关闭设备,收发数据包等)。必须确保用虚拟驱动接口替换原硬件驱动接口后,从TCP/IP协议栈使用驱动接口的角度来看,和使用原硬件接口一样,即用虚拟驱动接口替换原硬件驱动接口的改动对于上层协议栈的使用而言必须是透明的。对上层协议栈发下来的数据包以FIFO的顺序缓存到消息队列,何时调用硬件驱动接口发送这些数据包由确定性调度层决定。 虚拟驱动接口提供的主要函数: (1)RtVirtualIn( ) 接收IP层的发送数据包,根据数据包类型确定转存入队列还是向下递交。 (2)RtVirtualOut( ) 调用驱动层的发送函数发送数据,接收发送返回信息。 (3)RtVirtualPacketType() 取对应字段,判断到来包类型(EPA类型字段 以太网类型字段)。 4.3 时钟同步 在实时网段内,时钟同步是非常关键的,因为实时网段内各节点上的任务运行和消息发送都是基于时间基准的,特别是总线上的消息调度,为了避免碰撞,消息间必须留出足够的间隙来容纳节点间的同步误差。为了提高时钟同步精度,应把时钟同步功能放在协议栈中尽可能靠近硬件的位置。本系统中时钟同步功能由确定性调度层来提供。时钟同步协议采用IEEE 1588协议[6]。 在实时网段内选定一节点作为主时钟,主时钟定期发布时钟同步消息,时钟同步消息作为主时钟节点上的周期性消息。由于时钟同步消息在调度好的同步窗口中发送,可以保证时钟消息的发送独立于当前网络负载而无碰撞的发送,因而时钟消息从发布节点到各个接收节点的延迟对各个接收节点而言为一常量。 4.4实时调度算法 本设计采用的算法根据RM和EDF算法改进而成的[7],每个基本周期开始时动态生成此基本调度单位(ESU)的调度时间表。整个链路时间由连续等长的基本调度单位(ESU)组成,通常ESU为实时网段内所有周期性实时消息的周期的最大公约数HCF。每个ESU被分成周期性实时消息窗口(PW)和非周期性消息窗口(AW),如图3所示。PW中的调度根据事先由周期性实时消息调度算法生成的调度表来进行,调度表的长度为所有周期性实时消息的周期的最小公倍数LCM,调度表中与各个节点相关的部分被存放在各个节点中,各节点根据调度表中规定的时刻,以宏周期为循环单位周而复始的执行周期性实时消息的发送动作。在AW中,数据采用优先级队列节点轮询的方式发送。按照非周期数据实时要求将非周期数据划分为i个优先级,每个优先级在节点中维护一个非周期优先级队列,因此每个节点中的非实时优先级队列为i个。发送时采用节点轮询的方式按优先级从高到低的顺序进行发送,每次被轮询节点将指定优先级队列中的数据全部发送。 图3 基本周期内数据发送窗口 5.结论 本系统所实现的实时以太网可以完成网段内数据的调度发送,基于本设计的实时以太网完全可以应用于一般的过程控制工业领域。通过改进原型系统的时钟同步机制等来可以进一步提高系统的实时性以及时钟精度,基于本设计的实时以太网改进的目标是把时钟精度提高到微秒级,进而应用于时间精度要求较高的工业领域,如运动控制等。 |