基于Netty的风电叶片监测系统设计与实现
2018-01-23郭峰麻强
郭峰++麻强
摘 要:风力发电机叶片监测系统能够及时了解叶片的运行状态,该系统的研发具有重要的现实意义。本文给出了系统的拓扑结构图,设计了软件体系结构,并针对叶片状态数据传输的特点,基于Netty框架设计了系统数据传输协议,有效解决了高频数据接收和处理的问题。
关键词:风电叶片监测系统;软件体系结构;Netty
中图分类号:TN915 文献标识码:A
0.引言
风力发电是具有大规模开发前景的清洁新能源之一,在当今社会有着重要的社会效益和经济效益。然而大部分优质风资源都在人烟稀少、环境恶劣、气候复杂的地区,风力发电场也大都坐落在这些地方,因而风力发电机运行状态的监测和维护便成了风电行业的重要课题。叶片作为风电机组关键零部件之一,其状态的好坏直接影响着风电机组的发电效率。叶片工作在高空、全天候条件下,经常受到空气介质、大气射线、沙尘、雷电、 暴雨、冰雪的侵袭,容易造成叶片损伤。传统的依靠人工巡检的方式发现叶片问题,不仅费时费力,而且效率低下,往往不能及时发现叶片潜在的问题和缺陷异常,这将对风电机组运行维护工作产生巨大影响,甚至导致安全事故。因此对叶片运行状态进行实时监测是非常有必须要的,对于提高机组利用率,减少维护成本具有重要的意义。
1.系统拓扑结构
风电叶片状态的实时监测系统包括监测仪,传输网络和服务端,服务端软件部署在风力发电厂的中心服务器上,传输网络基于因特网构建,监测仪通过GPRS或Wifi接入因特网,监测数据通过TCP/IP传输到中心服务器。工作人员可以在监测中心或者通过移动设备实时查看并及时获知风力发电机叶片的运行状态。监测中心的监测管理软件能够实现数据的远程采集和远程监测,监测的所有数据进入数据库,并能生成各种报表和表格。
本系统拓扑结构如图1所示,主要由中心服务器、通信网络、现场监测设备、监控设备4部分组成,通信网络以Internet为基础构建, 现场监测设备采集的数据通过Internet传输到中心服务器, 监控设备包括PC、笔记本电脑、智能手机等。
2.软件体系结构设计
分层是最重要最常见的软件体系结构风格之一,根据服务端软件的功能要求,本系统采用分层B/S结构,分为表示层,业务层,数据层。系统软件体系结构如图2所示。
表示层有两种形式,通过浏览器访问的Web应用形式,和运行在android平台下的移动APP形式。为实现界面和业务逻辑的分离,表示层采用JSP开发,并通过Spring MVC框架进行访问控制。
为保证软件低耦合,高内聚特性以提高软件的质量,业务层采用Spring框架进行封装,并以tomcat作为web容器.
数据访问层包括数据库访问和网络通信两个部分。数据库访问模块基于Mybatis框架开发,为数据库中的每个表设计一个Java类,类的属性与表的字段对应,对数据库的操作通过Mybatis进行,而程序代码中不出现SQL语句。 Java提供的NIO功能使用复杂,本系统基于Netty开发网络通信模块,Netty封装了socket通信功能,方便建立中心服务器与检测仪的数据连接。
4.基于Netty的数据处理机制
当前系统中每台风机有3个叶片,每个叶片上安装6个传感器,其中4个传感器监测应变,另外两个传感监测温度,应变和温度以波长的形式发送到数据库,波长用浮点数表示。每台风机用一个调制解调仪以50Hz的频率通过4G模块向服务器发送数据,每个调制解调仪有4个通道,分别连接每个叶片上的传感器。目前4个通道有一个是空置的,未来通道数量有可能扩充到8个,每通道也可能会配置更多的传感器。
本系统中传感器数量不多,但是由于传输频率较高,对接收服务具有一定的压力,传统的基于Socket的网络数据传输实现方式是同步阻塞的,当客户端并行连接过多或者频繁传输数据时,消耗大量的服务器资源,造成服务器性能下降,不能及时处理客户端的请求。针对此类应用场景,研究人员提出多种改进方案,Netty是具有代表性的高效率的异步非阻塞式网络通信框架,在电子商务、游戏、大数据等领域获得了大量的应用,如淘宝、hadoop的底层通信机制都是基于Netty实现的。
在本系统中,每帧数据大小是不同的,由于传感器配置数量未来可能发生变化,或者在运行过程中,某些传感器可能发生故障无法发送数据,因此,在传输过程中,每帧数据量是不同的,需要根据每个通道上的传感器数量计算帧的大小。
基于上述因素,通信协议数据区格式见表1。
服务器读取数据分为两个阶段:(1)读取固定字节的帧头数据,判断传感器数据的长度;(2)根据计算结果,读取传感器数据。
基于Netty设计实现的自定义解码器关键代码如下:
public class CustomDecoder extends ByteToMessageDecoder {
//固定长度的帧头数据是14个字节
private static int HEADER_SIZE = 14;
private static int dstStartPos = 3;
private static int dstStopPos = 11;
private static int count=0;
private static ByteBuf buf = Unpooled.buffer(1024);
private Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
//標记读指针位置,以便可以回滚指针endprint
in.markReaderIndex();
// 如发现剩余字节不够14字节,回滚指针,等待下次解码
if (in.readableBytes() < HEADER_SIZE) {
buf.clear();
in.resetReaderIndex();
return null;
}
//读取包头信息
in.readBytes(buf, HEADER_SIZE);
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
// 每通道最多6个传感器,1个字节保存通道的传感器器数量,共8个字节
byte b1,b2,b3,b4,b5,b6,b7,b8;
b1=req[2]; b2=req[3]; b3=req[4]; b4=req[5];
b5=req[6]; b6=req[7]; b7=req[8]; b8=req[9];
//计算出不确定长度的包体数据
int msgLen = (b1+b2+b3+b4+b5+b6+b7+b8)*2;
// 如发现剩余字节不够包体长度,回滚指针,等待下次解码
if (in.readableBytes() < msgLen) {
System.out.println("包体长度小,回滚”);
buf.clear();
in.resetReaderIndex();
return null;
}
//读取包体信息
in.readBytes(buf, msgLen);
ByteBuf frame = ctx.alloc().buffer(HEADER_SIZE + msgLen);
frame.writeBytes(buf, 0, HEADER_SIZE + msgLen);
buf.clear();
return frame;
}
}
结语
系统采用多层B/S软件架构,结合高效、安全、主流的java开发框架——SSM(Spring MVC+Spring+Mybatis), 和异步非阻塞式的网络通信框架Netty,系统具有方便快捷的操作界面、靈活安全的权限管理、提供PC端和移动端实时和历史数据的丰富报表,满足了用户随时了解叶片状态的需求。
目前,该系统已经通过验收测试,用户反应运行情况良好,尤其是数据传输方面,服务器能够有效接收和处理高频的传感器数据。
参考文献
[1]普雷斯曼,郑人杰,等,译.软件工程,实践者的研究方法[M].北京:机械工业出版社,2011.
[2]Spring+MyBatis企业应用实战 疯狂软件[M].北京:电子工业出版社,2017.
[3]李林锋.Netty权威指南[M].北京:电子工业出版社,2014.
[4]温昱.软件架构设计[M].北京:电子工业出版社,2007.endprint