杨 鹏 卜乐平 王黎明
海军工程大学电气工程学院,湖北武汉 430033
随着全电力船舶的发展,船舶能量管理系统的应用逐渐成为未来发展的必然趋势。电力系统运行状态信息的获取是船舶能量管理系统的基础性问题,是制定能量调度方案的重要依据。船舶能量管理系统子站(以下简称“子站”)作为底层数据采集装置,是上述信息的主要来源,为主站提供通用数据帧(电力系统正常运行时的状态信息)和故障录波数据帧(故障信息),同时还作为主站的“执行者”根据主站发送的命令帧输出相应的数字量和模拟量控制信号。此外,子站还需根据主站发送的动态配置帧来对自身参数进行动态配置。主站根据子站上传的信息对当前电力系统运行状态进行监控,并对电力系统故障进行处理。
现有的船舶电力采集系统一般是采用上层以太网,下层CAN网的组网方式。但CAN网在远距离数据传输时速率受限[1-2],无法保证大容量数据帧传输的实时性。此外,传统的数据集中处理方式也带来了巨大的数据处理压力问题。
针对上述问题,本文提出了一种基于分布式网络结构的船舶电力系统运行状态获取方法,如图1所示。系统的上层主干网为环形工业以太网,下层为子站与供配电系统的各个局域网,上下层之间采用交换机相连接。系统中的各种信息以以太网的方式在上下层之间流通,同时电力系统状态信息将被保存到海量数据库中,以供系统分析使用。子站对电力系统的各种信息进行预处理,再根据需要采用不同的方式上传,从而减轻了主站的数据处理压力,提高了系统整体性能。
以太网是当前应用最普遍的局域网技术,具有通信速率高、信息量大、网络管理功能完善等显著优点[3],适用于船舶有限网络空间内的信息交互。以太网通信建立在TCP/IP协议的基础上,TCP/IP协议的传输层提供了两种服务:用户数据包协议(UDP)和传输控制协议(TCP)。其中UDP是面向无连接的协议,其不与对方建立通信连接,而是直接将数据包发送过去,因此,UDP协议通信的实时性高、费用低、效率高[4]。使用UDP协议可以保证通信的实时性并降低网络费用,但同时也降低了通信的可靠性。TCP为面向连接和高可靠性的协议。TCP协议通过三次握手在通信双方之间建立一个可靠的链接,并在通信过程中使用序号和确认机制,利用超时重传、拥塞控制与流控制等机制来确保所有发送的数据包都能到达目的地。因此TCP协议通信可靠性高,但TCP中用于保证可靠性传输的各种机制也降低了通信的实时性[5]。
针对船舶能量管理系统子站对数据帧实时性和可靠性的需求,大容量的通用数据帧可采用UDP协议传输以满足其对实时性的需求。故障录波数据帧作为分析电网故障的重要参考信息和动态配置帧、命令帧,一并采用TCP协议传输,以确保这些重要数据和命令能够准确送达主站。考虑到船舶空间资源的有限性,子站采用嵌入式实现。采用ARM处理器作为子站的主控制器。由于ARM处理器存在资源受限的问题,并考虑到系统多任务处理的需求,通过使用轻量级TCP/IP协议栈LwIP和高实时性的操作系统COS-II,可以有效减少存储空间的占用并提高代码的运行效率。LwIP实现的重点是在保持TCP/IP协议主要功能的基础上减少对ARM的占用,这使得LwIP很适合在低端嵌入式系统中使用[6]。
子站的通信接口硬件结构如图2所示。本系统采用Cortex-M3内核ARM处理器LM3S8962作为硬件平台,LM3S8962的以太网控制器由一个完全集成的媒体访问控制器 (MAC)和网络物理(PHY)接口器件组成。无需增加外部的MAC芯片或PHY芯片,这使得本系统的以太网接口硬件设计大大简化,只需添加简单的外围设备即可实现以太网通信功能。
通信软件总体设计采用客户端/服务器模式,通过该模式可以充分利用两端硬件环境的优势,将任务合理分配到客户端和服务器来实现,一方面能降低系统的通信开销,另一方面可减轻服务器运行数据负荷,而且该模式还使系统易于扩展[7-8],满足船舶能量管理系统大容量数据发送和接收的需求。服务器和客户端是一个相对的概念。在船舶能量管理系统中,子站在发送通用数据帧和故障录波数据帧时是作为客户端,而在接收配置帧和命令帧时是作为服务器。在μCOS-II平台下完成上述功能只需分别建立任务作为客户端和服务器完成相应的功能即可。
子站以太网通信接口整体设计结构如图3所示。在LM3S8962上移植μCOS-II实时操作系统,针对片内的以太网控制器编写驱动程序,并移植TCP/IP协议栈。完成μCOS-II和协议栈的移植后,由操作系统管理各任务,包括网络通信程序和其它应用程序。子站的通信软件设计主要包括协议栈的移植、驱动程序设计、数据帧结构的定义和嵌入式以太网通信程序设计。
协议栈的移植主要是操作系统模拟层的移植,包含以下两个方面:与CPU或编译器有关的文件移植和与底层操作系统相关的结构体和函数[9]。参照LwIP官方文档sys_arch.txt可知,LwIP在设计时为了简化协议栈移植,把所有与硬件、操作系统、编译器等有关的部分全部独立出来放在了/src/arch 目录下。因此,LwIP 在 uC/OS-Ⅱ下的移植主要是根据不同硬件平台修改这个目录下的相关文件。
4.1.1 与CPU或编译器有关的文件
在/src/arch/目录下的文件中有一些与 CPU或编译器相关的定义,如数据长度、字的高低位顺序等。这些与移植μCOS-II时的定义应一致。
4.1.2 与底层操作系统相关的结构体和函数
主要包括信号量及相关函数、消息队列及相关函数、超时处理函数以及创建新线程函数等。这些结构体和函数在文件 sys_arch.c和 sys_arch.h中实现。
1)线程间通信。LwIP需要使用信号量、消息队列进行线程间同步和通信等操作。在移植COSII时已经实现了相关的操作,故只需适当的封装和处理μCOS-II中的相关函数即可。
2)超时处理。LwIP中每一个有网络连接作用的线程都具有超时属性,即维护一个sys_timeouts链表。移植时需要编写sys_arch_timeouts(void)函数,该函数返回线程当前的sys_timeouts结构体指针。
3)创建线程。LwIP创建线程实际上就是利用μCOS-II的系统函数创建了一个任务,因此sys_thread_new函数实现比较简单。
LwIP的网络驱动有一定的模型,该模型位于目录 /src/neti/ethernetif.c 文件中,主要包括网卡初始化、数据包接收和数据包发送等函数。LM3S8962的以太网控制芯片完全集成在片内,因此编写网络驱动程序只需在此框架中完成与底层硬件相关的部分即可。
本系统的网络驱动程序流程如图4所示。首先由以太网初始化函数(InitNic)调用LwIP协议栈初始化函数(LwIPInit),同时建立接收线程并添加数据包接收函数(stellarisif_input),接收函数调用ethernet_input()函数来处理接收数据包。在LwIPInit中,调用网络接口初始化函数(stellarisif_init)来初始化与此网络接口对应的结构体,同时向LwIP注册发送函数(etharp_output)和链路层发送函数(low_level_output),并调用 low_level_init函数来完成以太网底层硬件驱动。
当网络接口接收到一个数据包时,通过接收中断向接收线程发送信号量,启动接收线程处理接收数据包,若为ARP数据包,则调用ARP接收函数处理;若为IP数据包,则更新ARP缓冲表,将数据传送到传输层,判断是TCP还是UDP方式,再由应用层对数据包进行处理。
若从网络接口发送一个数据包,便调用etharp_output函数从 ARP缓冲表中查找目标MAC地址,并添加以太网帧头部,调用链路层发送函数通过底层发送函数 (low_level_transmit)来完成实际的发送。若无法找到与IP匹配的MAC地址,则发送ARP请求数据包来获取MAC地址。
4.3.1 多任务模式下的通信程序设计
LwIP协议栈提供3种形式的API函数:BSD API、RAW API和 LwIP API[10]。BSD API要求在协议栈中将要发送的数据从应用程序拷贝到内部缓存,效率低且消耗资源多;RAW API要求应用程序驻留在TCP/IP进程中,这导致通信与应用程序不能同时进行,降低了通信性能;LwIP API将负责通信的部分驻留在TCP/IP进程中,负责大量运算的部分作为一个单独的进程,通过进程间通信机制实现应用进程与协议栈进程之间的通信[11]。由于子站既要对AD采集的大量数据进行处理,又要立即响应接收数据,故采用LwIP API作为应用程序接口,将应用程序分成了两部分,一部分处理通信,一部分处理数据。负责通信的部分被划分为3个任务,即一个TCP服务器任务,负责接收主站的控制指令;一个TCP客户端任务,负责故障录播帧的发送;一个UDP客户端任务,负责通用数据帧的传递。负责处理数据的部分被划分为两个任务,以分别对主站指令和AD采样数据进行处理。
4.3.2 子站通信程序工作流程
子站通信程序工作流程如图5所示。AD数据采集模块在定时器的控制下周期性地对被测电力设备的电压、电流值进行采样,然后通过邮箱将采样数据传递给数据处理模块1,通过对数据的解析,判断电力设备是否出现故障,如果出现故障,则立即启动故障录播模式,详细记录故障点的原始数据并打包成故障录播帧。由于这些数据是分析和解决故障的重要判据,必须保证准确无误地传递给主站,因此通过TCP方式传输。若是正常数据,便将数据封装成通用数据帧,通过UDP方式传递给主站。子站采用TCP方式接收来自主站的控制指令和动态配置帧。TCP一直监听设定的端口,有数据到来时对数据进行判断,如果数据有效,便通过邮箱发送给数据处理模块2,经解析后执行主站的指令。
为了验证本系统设计的可行性与正确性,首先在实验室环境下搭建简单的嵌入式以太网通信系统,用来测试在多任务模式下TCP和UDP通信信道的运行状况。将子站设置成回环通信调试模式,即回发接收到的主站命令,在调试助手中建立TCP客户端以向子站发送命令,可以看到,在接收窗口中可以看到同样的命令,这说明子站收到了命令,并将此命令回发给主站。同时,让子站通过TCP和UDP两种方式向主站发送模拟数据,在调试助手中分别建立TCP、UDP服务器以接收子站发送的数据。如图6所示,两种方式数据上传正常。
主站的监控软件由Qt编写,能以图形和文字两种方式实时显示电力系统被测节点的运行状态,单击开关按钮可以改变子站开关的状态,并将开关变化后的状态上传至主控界面,监控软件界面如图7所示。通过实验验证,在子站中采用TCP和UDP方式通信取得了预想的结果,点击界面上的不同菜单,可分别将各被测节点的电压、电流、功率和开关状态显示到界面上,并且可以查看各数据的历史曲线。
针对船舶能量管理系统中高实时性与低网络开销的大容量通用数据帧传输和高可靠性与完整性的故障录播帧、配置帧以及命令帧的传输,本文采用基于LwIP协议栈和μCOS-II实时操作系统相结合的嵌入式以太网通信接口设计方法,实现了分别用TCP和UDP对不同性质数据帧的传输,并可通过主站监控界面对子站进行远程监控。本系统采用模块化思想优化软件体系,利用多任务方式处理各个模块,增加了模块内部的内聚性,降低了模块之间的耦合性,提高了系统的灵活性。实验证明,设计方案满足船舶能量管理系统中对通信可靠性和实时性的需求,实现了电力系统状态信息获取与数据帧传输的网络化。
[1]赵浩,李声晋,芦刚.基于CAN总线和以太网的远程监控系统设计[J].测控技术,2006,25(10):53-56.
[2]甘永梅,李庆丰,刘晓娟,等.现场总线技术及其应用[M].北京:机械工业出版社,2005.
[3]ZOU J N,CHEN J,LIN R J.Implementation of access controller for Ethernet passive optical network [J].Journal of Shanghai University,2006,10(5):425-430.
[4]郑巨明,张和生,贾利民,等.基于 μC/OS-Ⅱ和 Lwip的嵌入式以太网接口设计 [J].计算机测量与控制,2009,17(11):2238-2242.
[5]SCAGLIA S.嵌入式Internet TCP/IP基础、 实行及应用[M].北京:北京航空航天大学出版社,2008.
[6]邱书波,陈伟.基于ARM的轻量级TCP/IP协议栈的研究及移植[J].计算机应用与软,2009,26(8):90-92.
[7]方涛.基于B/S与C/S混合模式下的电厂燃料管理系统的研究[D].保定:华北电力大学,2005.
[8]李先军,刘波,余丹,等.一种基于AJAX技术的B/S与C/S 混合构架模式[J].计算机应用,2009,29(4):1135-1138.
[9]孔栋,郑建宏.嵌入式TCPIP协议栈LWIP在ARM平台上的移植与应用[J].通信技术,2008.41(6):38-40.
[10]焦海波,刘健康.嵌入式系统网络设计[M].北京:北京航空航天大学出版社,2008.
[11]高强.嵌入式WEB发布平台在变电站自动化系统中的应用研究与实现[D].成都:西南交通大学,2006.