谭立志,李二喜,张利民,吴桂清
(1.株洲职业技术学院,湖南 株洲 412001;2.湖南大学 电气与信息工程学院,湖南 长沙 410082)
高速铁路客运专线工程的大规模建设推动着我国国民经济高速发展,专线的建设工程规模大、技术标准高,要保证全线运行的安全可靠,路基的高质量建设是其重要保障,路基沉降值的大小对于高速列车的安全运行、线路养护维修工作量及车辆轨道结构设施的使用寿命等有着重要影响[1]。因此,在高速铁路整个施工建设和运行周期中必须加强对全线路基、桥梁、隧道实施全面的、连续的、可靠的、准确的、长期的沉降位移监测。
随着Internet技术的逐渐普及,它对当今社会的作用和影响也越来越大,从某种意义上来讲,它提升了世界的可接入性。但是在工业控制领域,还有许多传统的串口仪器被广泛使用,这些仪器都面临着数据集中、接入、控制和二次开发的新课题。仪器网络化是解决此问题的唯一途径,可这需要非常大的软硬件投资,甚至会超过原设备的开发投资,代价实在太高。
本文中,将以高速铁路路基沉降远程监测为例,提供了一种基于AT91SAM9261的数据集中器设计方案,较好地解决了上文提出的问题,具有很好的推广价值。
高速铁路路基沉降远程监测系统由各类现场仪器、数字模块、数据采集器以及监控主机等组成。系统采用分布式组网方式,现场仪器负责采集能够体现路基沉降变化水平的电流、电压信号,系统通过处理后将之转化为可以识别和计算的数字量。数据采集器支持与现场仪器的多种连接方式:可以通过电缆与仪器直接相连;也可以先连接数字模块,数字模块再以总线的形式连接多台仪器。二者之间采用带有屏蔽层的RS-485同轴电缆进行连接,考虑现场仪器的野外露天运行条件,系统提供了太阳能供电装置确保现场仪器在极端环境下的正常工作。在系统的最上层,监控主机与数据集中器共同接入Internet,用户可以通过远程访问的形式对数据集中器进行动态在线监测。系统的拓扑结构如图1所示。
图1 系统拓扑结构Fig.1 System topology
数据集中器在整个高速铁路路基监测远程监测系统中起着承上启下的作用,能够自动化采集分布在铁路沿线的各类监测仪器数据,并为监控主机提供统一的数据接口。因此,数据集中器是整个监测系统的自动监测、数据存储及传输中心。
系统的硬件设计框图如图2所示。
图2 硬件设计框图Fig.2 Hardware design diagram
本系统芯片采用的是以ARM926EJ-S为核心的嵌入式微处理器AT91SAM9261,它是目前应用最广的工业级32位高性能嵌入式RISC处理器,它具有独立的16K指令和16K数据cache、全功能的MMU虚拟内存管理单元、DSP扩展功能的指令集以及丰富的外部接口[2],另外,该芯片功耗非常低,温度适应范围广,而且具有良好的抗电磁干扰能力,因此非常适用于环境恶劣多变的露天监测环境。
考虑到数据集中器的数据量较大,系统自带的NAND Flash容量有限,因而专门设计了SD卡模块,用于满足系统长时间、大容量的存储需求;另外,系统还设计了简单的按键模块以及液晶显示模块,用于现场布置和调试仪器参数使用。
ARM芯片AT91S AM9261本身自带的以太网接口仅包括数据链路层及以上部分,没有物理层。我们选用DM9000AEP芯片作为系统的以太网物理层接口。该芯片功能完整、成本低廉。支持外部处理器以字节、字、双字等方式读写其内部的EEPROM,可以自适应10/100M以太网,支持全双工模式下的流量控制,完全符合IEEE 802.3x标准。另外,该芯片还提供了4K双字节的SRAM,可以很好地满足本系统的需要。
文献[3]针对数据采集仪上的多串口全双工通信模块的设计与实现进行了论述,本文在此基础上实现了对数据集中器串口模块的扩展。其中,多串口模块采用硬件描述语言VHDL进行FPGA设计[4],使用Atmega128L微处理器对FPGA进行配置,并通过FPGA和MCU方便地实现多串口的扩展。
在数据集中器中,由于其串口数量较多(每台数据集中器携带32个串口),如果使用专门的串口扩展芯片,不仅价格昂贵,还会导致电路板体积变大,功耗升高,不能适应恶劣多变的露天监测环境。因此,在本系统中,我们将若干接口电路的功能集成到了一片PLD或FPGA芯片,该方法具有集成度高、体积小、功耗低和速度快等优点,而且还具有用户可编程能力,可以很方便地实现整个系统的功能重构。
由于文章篇幅限制,其实现思路及程序代码便不再赘述,具体可以参考文献[3]。
从软件角度来看,嵌入式Linux系统从上到下可以分为以下四个层次,即启动与引导程序Bootloader、Linux内核kernel、根文件系统root filesystem以及用户应用程序[5]。
嵌入式软件开发中所采用的编译为交叉编译,所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。搭建交叉编译环境是嵌入式开发的第一步,也是必备的一步,选择合适的交叉编译器对于嵌入式开发是非常重要的[6]。在本系统中,主要涉及gcc、glibc、binutils等软件的安装,其中,binutils用于生成包括as、ld、objdump等在内的一些辅助工具,以方便嵌入式Linux系统的构建。
U-boot(universal boot loader)是遵循GPL条款的开放源码项目,U-boot在AT91SAM9261上的移植可以分为源代码编译,目标板烧写以及启动配置3个步骤。U-boot源代码可以从开源网站www.sourceforge.net方便获取,本系统中使用的U-boot版本为1.3.4,将其进行交叉编译后,即可获得对应的二进制可执行文件。通过AT91系列处理器专门的烧写工具sam-ba可以实现对Boot Loader的烧写。最后,我们还需针对相应的硬件系统,设置U-boot中的环境变量,从而实现其对Linux的引导和启动,这些环境变量主要包括ethaddr、ipaddr、serverip、stdin、stdout、stderr,等等。
Linux采用的单内核体系统结构,主要负责整个操作系统的进程调度、内存管理、文件管理以及设备驱动,Linux内核由多个在功能上不同的模块组成,各个模块负责不同的事务处理且相互关联,这一特性也方便了用户对于内核的裁剪,提高了其灵活性。在本系统中,可以直接使用Atmel公司提供的针对AT91SAM9261的Linux源代码,并进行相关的内核裁剪和配置,然后使用make命令完成对Linux内核的编译。最后,还需要通过U-boot的mkimage命令,在原映像文件头部添加64字节的结构体用于记录启动参数信息,即可实现U-boot对Linux内核的加载。
在嵌入式系统中,Yaffs是针对NAND Flash而特别设计的文件系统。它去掉了一些多余功能,所以执行速度更快、内存占用更少,同时具有对NAND Flash的保护机制,可以延长其使用寿命。我们可以直接通过“git clone git://www.aleph1.co.uk/yaffs2”下载Yaffs源码并进行相关编译。另外,考虑到Linux本身并没有提供对Yaffs的支持,因此还需额外将Yaffs源码复制到Linux源码中,并对其进行重新编译。为了构造完整的嵌入式Linux系统,除Linux内核外,还需引入对Busybox的支持,它是一个集成了一百多个最常用linux命令和工具的软件工具包。为简单起见,我们采取了Busybox的默认配置,在编译完成后,将之安装在系统的/usr/local/busybox目录下。最后,我们通过Yaffs2制作工具将该目录制作成Yaffs2格式的文件系统,至此,则整个Linux根文件系统制作完毕。
根据设计要求,数据集中器的软件模块框图如图3所示。其功能主要可以分为以下几个部分:
1)数据采集:通过调用仪器信息库中的仪器数据,结合不同厂家的通信协议,以串口通信的方式实现对高速铁路沿线各类现场仪器的实时数据采集;
2)数据存储:对采集上来的电压、电流信号,进行A/D转换,将之转化为可以识别和计算的数字量,并进行存储;
3)业务调度:对数据集中器的各项业务进行调度处理,包括人机交互以及处理来自监控主机的查询、设置设备参数、用户管理以及数据提取等指令;
4)网络通信:负责与监控主机之间的通信,监控主机可以据此对数据集中器的设备参数以及用户管理等进行相关设置与查询。
系统需要不同种类仪器的协同工作,由于各生产厂家的通信协议差异较大,必须要求软件能够兼容所有协议且具有良好的拓展性。因此,将图3中的通信协议Protocol类设为抽象类,为外部调用提供统一接口,而具体的协议实现则交由各继承类来完成。利用工厂方法模式(Factory Method),定义一个用于创建协议对象的通用接口,从而将协议对象的实例化延迟到子类阶段,方便以后对协议种类的扩展。
图3 系统软件框图Fig.3 System software diagram
如图4,Protocol类为工厂方法模式创建协议对象的接口,Protocol_Digital、Protocol_CCD、Protocol_Module等由Protocol类派生,表示不同种类仪器的具体协议。
图4 工厂方法模式Fig.4 Factory method
在程序设计中,根据依赖倒转原则,我们把工厂方法类Protocol_Creator抽象成一个接口,该接口中包含方法CreateProtocol,用于创建抽象类Protocol的对象;然后在所有具体的协议类中都添加对该接口的实现。
此时,如果要为数据集中器添加新的仪器协议,就不再需要修改顶层的Protocol_Creator类,而只需添加对应的协议Protocol_XXX以及相应的工厂接口XXX_Creator即可。
在本系统中采用SQLite数据库用于数据存储,它支持丰富的SQL语句,是遵守ACID事务的关联式数据库管理系统,具有可移植性好、代码体积小、易于使用、高效可靠、零配置管理等特点[7]。特别值得一提的是,SQLite还支持触发器以及事务处理。
当数据采集模块接收到数据后,我们首先将数据存储到内存中,直至数据接收完毕,系统会对数据包的完整性进行检查,随后进行事务提交,即一次性地将全部接收到的数据存储到数据库中,从而提高了数据库的读写速度。当测量现场由于监控需求变更或仪器故障损坏,而导致仪器信息发生变动时,现场工作人员可以配合按键操作,自动调用SQLite触发器,实现数据库中相关表的级联更改,提高工作效率。另外,对于其他一般性事务,可以通过sqlite3_exec函数执行指定的SQL语句,该函数可以设置回调函数,方便用户当执行查询等操作时对查询结果进行进一步处理。
系统业务调度相当于数据集中器的粘合剂,它不仅要负责处理用户的按键输入以及液晶显示,还要处理来自监控主机的各类指令,并将处理结果和监测数据以数据包的形式返回给监控主机,从而实现高速铁路路基沉降的远程在线监测。
其流程图如图5所示,在系统初始化过程中,业务调度模块优于其他模块进行执行,随后以非阻塞的方式顺序循环检测按键事件以及网络数据包,当发现有业务到达时,即跳转到业务处理流程,待执行完毕后系统返回主线程继续操作。从图中可以看出,按键事件的业务优先级高于网络数据包,这样可以保证工程人员在现场配置数据集中器参数时,能够避免网络数据包的干扰,得到快速及时的响应。
图5 业务调度流程Fig.5 Business scheduling process
数据集中器包括四个物理按键,在按键事件处理过程中,通过调用read函数,读取按键所对应的设备文件/dev/event0,并加以判断。我们在程序中规定,按键时间小于150 ms系统不予响应,按键时间介于150 ms和600 ms之间触发“短按”事件,按键时间大于600 ms触发“长按”事件。
考虑到数据集中器与监控主机之间开发平台的差异,系统的网络通信模块采用基于传输控制协议TCP的Socket通信来实现。
4.4.1 选择高效的网络I/O方法
传统的处理网络I/O的技术分为多进程、多线程同步阻塞I/O以及SELECT、POLL的单线程事件驱动I/O等方式[8]。其中多线程、多进程同步阻塞网络I/O技术因为存在Forking以及切换上下文时的巨大开销,并不太适合处理高并发的网络连接;而SELECT、POLL的单线程事件驱动I/O技术由于要持续不断地写入Socket或者POLL FD结构,会导致不断地拷贝用户空间和内核空间,当网络负载不断加大时,系统性能就会急剧恶化。
考虑到数据集中器的实际工作环境,我们采用EPOLL单线程事件驱动I/O技术,它已集成在Linux 2.6及以上版本的内核中,该技术具有套接字遍历时间短、内存读写次数少等优点。其使用要点可简单归纳如下:
1)定义结构体epoll_event,声明变量epoll_event ev和指针*pev,其中ev用于登记EPOLL事件,以便处理监控主机的Socket连接,pev用于指向当前活跃的ev;
2)调用epoll_create函数,创建用于EPOLL事件的文件描述符,并调用epoll_ctl函数注册ev事件;
3)调用epoll_wait等待EPOLL事件发生,在用户进行I/O操作时,EPOLL作为一种异步事件通知机制,会首先查询I/O的可读写状态,并通过epoll_wait进行通知,再由用户决定是否读写。
4.4.2 请求使用机制
由于数据集中器是暴露在公共网络中的,因此其安全问题就显得尤为重要,本系统通过请求使用操作来解决上述问题,如图6所示,只有请求使用成功的监控主机才可以向数据集中器进一步进行远程访问;监控主机在完成远程访问后要及时退出使用,以便其他监控主机来获得使用权。为了防止某监控主机在进入可操作状态后上位机软件的非正常中断,我们规定,在某连接可操作后,如果连续2分钟内没有任何操作则退回到待批准状态。
图6 请求使用机制Fig.6 Request-use mechanism
我们在高速铁路某路段沿线布置了10台数据集中器,并在距离监控现场200Km外的监控主机上安装了配套的上位机监测软件,经过测试,在挂接35台数字模块和400余只仪器的情况下,系统依然能够稳定工作。
在设计中,我们有针对性地使用Atmega128L微处理器对FPGA进行配置,并通过FPGA和MCU方便地实现多串口的扩展;根据实际监测需求合理处理仪器通信协议,运用工厂方法模式(Factory Method),方便以后对协议种类的扩展;充分运用SQLite数据库的update触发器以及事务处理能力,提升系统的数据库性能,采用EPOLL单线程事件驱动I/O技术,提升了数据集中器的网络并发通信处理能力;采取请求使用机制,增强了数据集中器的网络安全性。
系统充分结合实际监控环境的特点,结构轻巧,层次清晰,有效地实现了所需功能。做到了转换协议正确,数据传输完整,满足高速铁路路基沉降的监控要求,具有节约投资,可移植性强等优点,可广泛应用于交通、电力、矿山、水利等工业控制领域。
[1]危凤海.高速铁路路基沉降的几种原因及其监测方法[J].筑路机械与施工机械化.2010,27(10):24-27.WEI Hai-feng.Several reasons for subgrade settlement of high-speed railway and monitoring methods[J].Road Machinery&Construction Mechanixation,2010,27(10):24-27.
[2]袁溪.基于AT91SAM9261的嵌入式数据采集系统设计与实现[J].计算机测量与控制,2009,17(9):1854-1856.YUAN Xi.Design of embedded data acquisition system based on AT91SAM9261[J].Computer Measurement&Control,2009,17(9):1854-1856.
[3]张羽,胡玉贵,殷奎喜,等.基于FPGA的多串口扩展实现[J].电子器件,2009,32(1):233-236.ZHANG Yu,HU Yu-gui,YIN Kui-xi,et al.Realization of multi-serials extension based on FPGA[J].Chinese Journal of Electron Devices,2009,32(1):233-236.
[4]潘松.VHDL实用教程[M].成都:电子科技大学出版社,2003.
[5]刘磊,张凤荔,秦志光.基于U-boot构建嵌入式Linux的Bootloader[J].计算机应用研究,2007,24(12):238-240.LIU Lei,ZHANG Feng-li,QIN Zhi-guang.Embedded Linux’s bootloader based on U-boot[J].Application Research of Computers,2007,24(12):238-240.
[6]冷玉林,钟将.基于ARM的嵌入式Linux系统构建[J].计算机系统应用,2010,19(11):23-31.LENG Yu-lin,ZHONG Jiang.Building embedded linux system based on ARM[J].Computer Systems&Application,2010,19(11):23-31.
[7]蒋晓宇,贺永胜,王金明.基于SQLite3的用电信息采集终端数据平台设计及研究[J].电测与仪表.2010,47(536A):103-107.JIANG Xiao-yu,HE Yong-sheng,WANG Jin-ming.Acquisition terminal's information platform design based on SQlite3[J].Electrical Measurement & Instrumentation, 2010,47(536A):103-107.
[8]ROSSI F.An event mechanism for Linux[J].Linux Journal,2003(11).