伴随着嵌入式系统及以太网技术的不断发展,使各种电子产品和终端设备具备网络接入的需求及可行性,并逐渐成为数据传输的主要手段,同时网络的接入使得远程监测成为可能。泵舱作为船舶动力保障系统的重要组成部分,其性能的好坏直接关系着船舶能否安全可靠的运行,因此对其进行有效的监测就显得十分必要。泵舱的一个重要监测指标即是泵舱管道进口和出口的压力信号。国外在监测方面起步早、技术成熟,能提供对整船的“全景图”式的监测,可满足对船舶自动化监测的方方面面[1]。而我国船电技术水平相对落后,核心装备及大部分电子监测设备依赖于外国进口,“只造船体,进口设备”成为我国船舶业的发展模式[2]。为扭转这种不利局势,针对传统监测手段需要人工不定时查看数据、工作量大,易产生偏差、不能实时反映泵舱管道压力信号的变化,以及因管道压力超限而引起泵舱管道破裂造成漏油等危险事故的发生等情况,为了对泵舱压力信号提供准确、实时的监测,同时考虑到系统的硬件制造成本,设计了基于Linux操作系统的船用设备泵舱压力信号自动远程监测系统。
1 硬件电路总体设计硬件电路总体设计分为2大部分:电源板及核心板。电源板组成包括主电源电路、压力信号采集及处理电路、工作状态及预警指示电路;核心版包括以S3C2440A为主控芯片的最小控制系统、以模数转换电路组成的压力信号处理电路、千兆以太网电路。图 1为系统硬件总体设计。
1.1 压力信号采集处理电路由于在实际应用中可能面临不同输出范围的泵舱管道压力传感器,为适应这种需求,设计中分别设置了0~10 mA和4~20 mA的2种压力信号接收电路,并可以通过对控制电路的适应性跳转灵活选择其中一路作为接收电路,传感器压力信号首先经过I/V变换将电流信号变换为电压信号,然后经过增益为1的电压隔离器ISO124,为确保信号之间不会产生相互干扰,同时保护内部和外部设备的安全,将得到的压力电压信号经过增益为1的电压隔离器ISO124,滤除干扰的同时提高了共模抑制比[3]。基于设计本身的转换精度需求模数转换器件选用AD公司的AD7888,它是一款8通道单端输入、12位ADC,具有高速、低功耗、灵活多变的电源管理模式及易于操作等优点,同时为获取更为精确的输出,选用了REF5050由外部提供AD7888一个5 V的基准电源。模数转换器件AD7888与主控制器S3C2440A是通过SPI总线连接的,连接框图如图 2所示。
1.2 最小系统本设计选择三星公司的S3C2440A作为主控芯片,它是16/32位ARM920T的精简指令集处理器,实现了内存管理单元(MMU)[4],提供了一套完整的通用系统外设,如本设计所需的UART、SPI、USB等外设,降低了系统设计成本,同时支持Linux等多种嵌入式操作系统,方便任务管理和网络协议实现。SDRAM选用2片K4S561632,每片容量为4 M×16 bit×4Banks,2片构成32位64 MB容量,接在BANK6上;Flash存储器包含Nand Flash和Nor Flash,Nand Flash选用2 GB容量的K9F2G08,用于存储内核镜像和文件系统,Nor Flash选用EN29LV160AB,容量为2 MB,用于开发初期在Nor Flash启动模式下烧录u-boot到Nor Flash中,然后在u-boot下通过命令行启动DNW将u-boot、内核镜像及文件系统下载到Nand Flash中,之后便可在Nand Flash模式下启动系统。这样做的好处是缩短了开发的周期同时节约了成本。除此之外,最小系统还包括复位电路、晶振电路和电源电路。组成框图如图 3所示。
1.3 千兆以太网接口电路ARM9系列芯片S3C2440A外设包含2个USB主机端口,其中一个端口是USB主机与USB设备复用端口,前期开发中将其接为USB设备,用于DNW烧录内核及文件系统时使用。设计中由于需要2路自适应双冗余以太网(共用一个IP地址),所以将另一路USB主机接口引入到由AT43301与SP2525-2组成的USB扩展电路,其中芯片SP2525-2为低电平有效的USB电源控制开关,用于指示过流限制、热关断或欠压锁定的状态,其热关断功能会切断开关避免过流对器件造成损害。网络芯片选用亚信公司的AX88179,它是一款单芯片USB3.0转10/100/1 000 M以太网控制器,USB接口符合USB3.0、2.0及1.1规范[5],集成以太网MAC和PHY兼容于IEEE802.3、IEEE802.3u、IEEE802.3ab协议,具有USB HOST接口的微处理器连接AX88179即可实现双绞线千兆以太网功能,内置上电复位电路及用于处理协议及控制功能的Pipelined RISC,而且AX88179还支持包括TCP大包传送承载及符合IEEE802.3az超节能以太网标准、双绞线交叉自适应、IPv4/IPv6封包校验和承载引擎、支持网络远程唤醒等许多高级特性。EEPROM选用串行AT93C66A用于存储USB描述符及Note-ID等信息。网络接口RJ45选用LA1S109-43LF,它内部集成了千兆网络变压器,无需外部另外连接,图 4为千兆网电路组成框图。
2 驱动程序设计本设计选用的嵌入式操作系统为Linux,它具有源码开放、多用户、多任务、良好的用户界面设计、安全可靠、良好的移植性以及其可精简的内核、对系统的内存空间占用少等优点使得其在嵌入式应用中倍受青睐。最主要的是Linux网络功能强,支持所有常用的网络通信协议。移植Linux内核主要负责系统任务的管理及集成TCP/IP协议,方便实现网络功能控制。
Linux下的驱动加载分为静态编译和动态加载,静态编译即为将驱动加载到内核里,好处是启动内核的同时硬件的驱动被安装,无需另外的操作。而动态加载需要将驱动程序编译为一个.ko的模块文件,好处是不需要将硬件驱动加载到内核里所以内核较为精简,但是启动内核后需要使用insmod命令加载驱动模块。
2.1 AD7888在Linux下的驱动设计模数转换芯片AD7888与S3C2440A通过SPI总线连接,AD7888的读写形式是以字节出现的,所以在Linux内核下应归为字符设备。字符设备驱动程序的重要结构为file_operations,它规定了驱动程序向应用程序提供的操作接口,是整个字符驱动的核心,所包含的内容如表 1所示。
命令 | 系统调用 |
open | 当应用程序打开设备时对设备进行初始化 |
release | 关闭设备时处理关闭操作 |
read | 从硬件读取数据并交给应用程序 |
write | 从应用程序接收数据送到硬件 |
ioctl | 为应用程序提供对硬件行为的控制 |
file_operations结构的每一个成员的名字都对应着一个系统调用[6]。用户进程利用系统调用对设备文件进行打开、关闭、读、写等操作。系统调用通过设备文件的主设备号找到对应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给对应的函数。设计中打开函数AD_open( )用来打开AD78888设备;释放函数AD_reslease( )用于释放驱动程序加载时分配的资源;读函数AD_read( )用于将AD7888中转换的数据从内核空间读入到用户空间;写函数AD_write( )用于向AD7888发送指令,将从用户空间的数据传到内核空间用于控制模数转换通道的选择。根据AD7888在SPI接口下的操作方式,编写其在Linux下的驱动程序,程序执行流程如图 5所示。
模块入口函数为:module_init(spi_ad7888_init ),向内核声明驱动模块的初始化函数为spi_ad7888_init ( ),它完成的主要工作包括:GPIO引脚定义为SPI总线模式;配置SPI的控制寄存器、波特率分频寄存器为合适的值;向内核注册驱动程序并创建设备节点;打开SPI的时钟,这点容易被忽略,但至关重要,因为在操作系统下任务管理为节省功耗,会把没有用到的时钟关闭,所以在使用时需要将其打开,打开函数为
struct clk *clk = clk_get(NULL,"spi");
clk_enable(clk);
配置AD7888的控制寄存器值实际包含对AD7888工作模式的选择以及通道的选择,这里需注意此时写入的通道值为下次转换的通道。
2.2 AX88179网络设备驱动Linux系统下的网络设备驱动可分为4层,层次结构由下到上分别为:网络设备与媒介层、设备驱动功能层、网络设备接口层、网络协议接口层[7]。本设计中USB转以太网芯片AX88179的网络驱动程序主要是在设备驱动功能层中完成,数据发送操作是通过hard_start_xmit()函数实现,而数据的接收是通过网络设备上的中断触发来完成。除发送接收数据操作外,网络驱动程序还包含注册、初始化、设备的打开关闭以及对net_device数据结构体的填充。
图 6为AX88179网络驱动模块流程图,为了使内核尽量精简同时避免重新编译内核,本设计将网卡驱动编译为一个驱动模块进行动态加载。由于AX88179为USB转以太网控制器,作为USB设备在初始化函数中需要注册struct usb_driver数据结构,其中包含设备初始化函数指针Probe、驱动程序支持的设备列表id_table,对与USB设备来说一般以Vendor ID和Product ID标识,AX88179的VID值为0x0B95,PID值为0x1795。当USB网络设备插入系统,内核便会根据其设备标识唯一的指定相对应的驱动程序所注册的Probe函数来完成此设备的初始化[8]、注册网络接口以及对结构体net_device的填充等操作。当此函数成功返回时,就说明USB网卡检测及设备注册已经完成。网卡数据结构的初始化则是在设备接口打开时,就调用open函数完成的,之后便可根据相应的发送和接收数据规则进行数据包的发送和接收操作。
3 应用程序设计加载完Linux系统下的AD7888和AX88179的驱动程序模块后,即可编写应用程序实现AD转换后数据的网络通信,从而实时的监测数据的变化,得到泵舱的管道压力变化信息,并在压力超标的情况下给出及时的预警信息,防止危险事故的发生,提供一个安全可靠的泵舱环境。本文的应用程序是基于Socket编程实现的。
Socket套接字是一组接口,结构上处于传输层和应用层之间,它是TCP/IP协议族与应用层通信的中间软件抽象层[9],用户只需利用这组接口通过Socket组织数据来符合指定的通信协议[10]。正是由于它把复杂的TCP/IP协议族隐藏在Socket接口后面使得用户在实现网络通信更为简化。本文以Socket套接字实现TCP通信为例,ARM核心版用来作为Socket服务器端,PC机作为客户端,通过两端互相接收/发送请求、建立连接和传输数据。TCP协议设计了严格的3次建立连接握手过程、4次关闭连接握手过程。通信流程如图 7所示。
通信时服务器端程序先被执行,依次初始化Socket、端口绑定(bind)、监听端口(listen)、调用accept阻塞,然后等待客户端的连接。客户端在执行程序连接服务器端时需要首先输入服务器端的IP地址,初始化客户端Socket,此时服务器端已准备就绪并发出同意连接信号,连接服务器。成功连接后服务器端通过Write()函数将AD转换后的数据传输给客户端Socket,客户端通过Read()函数读取服务器发送的数据,即可完成数据通信。
4 验证测试本系统在进行TCP通信服务时,服务器端为ARM开发板,IP地址设为192.168.1 .105 ,客户端为Vmware Linux虚拟机平台,内核版本为Linux2.4,IP地址设为192.168.1.110,与服务器端处于同一网段。以电流信号发生器模拟压力传感器所产生的0~10mA电流信号,为方便对转换精度的计算,在测试时选定电流信号产生固定值5.000 mA,经转化电路(I/V)转换为电压信号在进入模数转换器前的测定值为2.492 V。PC机使用Wireshark实时捕抓服务器端与客户端之间的TCP数据。之所以选择Wireshark是由于它是一款效率高且免费的网络抓包分析工具,可以捕获并描述网线当中的数据,并且能直观地显示出来,可分析每个封包并能实时查看网络的各个状态等有点。图 8为Wireshark捕获的实时TCP状态信息报文。
从图 8以太网报头中目的MAC地址为00-0c-29-c4-4d-80,源MAC地址为00-0e-c6-c1-eb-11,其后的0x0800表示上层使用的协议为IP协议,IPv4;0x06表示上层传输层协议为TCP协议,有效数据在右侧直观地显示出值为2 032,即在该报文中对本系统有用的信息单元内容为32 30 33 32 0a。2 032为电流信号经I/V转化、模数转换得出的数字值,因为AD7888为12位的模数转换器,基准电压为5 V,所以经计算它所对应的电压值为2.480 V,设计中I/V转换电路使用精度为千分之一阻值为500 Ω的电阻,所以推算出2 032所对应的电流值为4.961 mA。0~10 mA对应0~1.6 MPa的压力信号,所以5 mA对应0.8 MPa,4.961 mA对应0.793 8 MPa,两者误差为0.006 2,满足设计性能指标误差值不超过0.01的要求。经验证,该网络可以完成网络通信并保证将泵舱管道的压力信息完好的传输给上位机,且转换精度满足系统设计需求0.01 MPa。
5 结论针对船舶安全性问题逐渐得到广泛关注的情况下,提出了一种基于Linux的泵舱压力信号自动监测系统的设计。
1) 硬件系统以S3C2440为核心控制器,添加压力信号采集、转换电路及以AX88179为主要芯片的千兆以太网接口电路构成。
2) 叙述了模数转换芯片AD7888和以太网控制芯片AX88179的驱动程序实现过程。
3) 通过Socket编程可实现将泵舱压力信号由以太网传输到上位机,从而实时监测压力信号的变化,实验数据表明压力转换精度满足系统设计需求,验证了该系统的可靠性和实用性。
[1] | 张寅昊. 船舶监控报警系统的设计与实现[D]. 南京: 东南大学, 2012. |
[2] | 杨培举. 中国造船驶向世界之巅——《船舶工业中长期发展规划》解读[J]. 中国船检 , 2006 (10) : 16-21 |
[3] | 张忠民, 孙铭君. 基于LPC2294的泵舱信号转换电路设计[J]. 电子科技 , 2014, 27 (8) : 61-66 |
[4] | 韦东山. 嵌入式Linux应用开发完全手册[M]. 北京: 人民邮电出版社, 2008 : 431 -492. |
[5] | 孙建民. USB 3.0/千兆以太网转换器的设计[J]. 物联网技术 , 2012 (8) : 57-58-62 |
[6] | 刘建国, 张付祥, 付宜利, 等. AD7888与S3C24140的SPI接口及Linux下嵌入式驱动的实现[J]. 工业仪表与自动化装置 , 2006 (5) : 47-49 |
[7] | 李全. 基于Linux的USB网络设备的驱动程序的研究[D]. 武汉: 华中科技大学, 2010: 23-48. |
[8] | 吴强, 周淑华, 马正新. 基于USB设备的Linux网络驱动程序开发[J]. 微计算机信息 , 2007, 23 (1/2) : 6-8 |
[9] | 高翊宇, 马林华, 南秦博. 基于Linux操作系统下的TCP/IP网络通信研究与应用[J]. 现代电子技术 , 2006, 29 (18) : 74-76 |
[10] | 欧军, 吴清秀, 斐云, 等. 基于socket的网络通信技术研究[J]. 网络安全技术与应用 , 2011 (7) : 19-21 |