目前,地震预报的信息来源主要依靠遍布在各处的地震观测台站所监测到的地震数据。随着地震观测台网规模日益扩大,实时性和数据量的要求也在不断提高。除了固定的地方地震观测台站以外,还有大量野外流动地震观测站。流动观测站主要对一定时间和地区内的数据进行强化观测,用以提高监测能力和异常跟踪能力,并可以针对多种物理量进行采集,将数据反馈到台网中心[1]。因此,一个流动站常常会布置数量众多而又分散的采集点,而如何将这些分散的采集点的数据传输到地震台网,是野外流动观测技术的关键之一。
在野外复杂环境中,通常将采集节点数据汇总至流动站,再由流动站统一接入互联网。局部数据的传输方式可有多种选择,需要综合考虑距离、便捷性、可靠性及成本等多种因素。本文中设计了一种采用控制器局域网(CAN)进行地震数据传输的方式,以满足分散的采集点能在相对较广范围内进行组网通信的要求。
1 系统框架
本文以激光多普勒地震仪项目为背景进行系统构建,主要解决将分散的采集点进行集中管理的问题。由于野外采集点数量众多,且安装位置较分散,若都与流动站之间直接组建局部网络连接,则无论采用何种组网方式,都必将加重人力、物力的投入,同时也会加重流动站的管理负担。因此,本文采用中继站的思想,将一定区域内的采集点利用总线方式汇总到主控机上,再由主控机统一将数据传输到流动站,系统结构如图1所示。采用这种分布式结构,一方面可以降低采集点组建网络的成本,另一方面主控机可以取代部分流动站的功能,对本局域网内的采集点进行管理和监控,便于组成规模更大的野外流动站。
系统采用的控制器局域网(CAN)是一种ISO国际标准化的串行通信协议,能有效支持具有很高安全等级的分布实时控制。相对于其他总线,CAN总线具有传输距离远、速度较快、抗干扰能力强、介质简单、可靠性高等优势[2-3],适合野外无人值守的环境。
2 采集节点的CAN通信实现
项目中采集点的主控芯片采用TI公司C54系列DSP,因芯片不带CAN控制端口,所以要在DSP平台上实现CAN通信节点的设计。
2.1 基于DSP的传输节点设计
项目选取SPI接口的独立控制器MCP2515作为总线控制端,收发器采用带有隔离的总线收发器ADM3054,该芯片直接将隔离器和收发器集成到一起,省去了控制器与收发器之间的光耦隔离,同时也可解决控制器与收发器之间的电平匹配问题,简化外围电路设计。
将DSP的多通道缓冲串行口(McBSP)配置成SPI兼容模式,这种模式下每一帧的长度是固定的。但MCP2515的SPI控制指令长度并不统一,因此,采取折中方案以最长的指令位数来配置串行口。
使用SPI模式通信时,关键的问题是时序的匹配,因为DSP的工作时钟频率远高于SPI传输时钟频率,所以需要在读操作时加入足够长的延时。图2中的(a)、(b)可反映这一情况,采用控制器的环回模式进行测试,DataSend数组中存放的是发送的8 B数据,RecvBuff数组中存放的则是通过SPI读取接收数据寄存器得到的值。图2(a)是没有加入足够延时的读操作,从虚线框标出的数据看出,读操作在时间上发生了错位,当前的读操作实际读到的是上一个指令传送回来的数据,而图2(b)在加入了足够长的延时之后,能在时间上对应,读到正确的数值。
2.2 节点的通信策略
CAN协议所采用的对报文进行地址编码的方式便于在总线上增删节点。在本项目中,由于各个节点都只与主控机进行通信,所以,充分利用CAN报文帧ID识别码的特性,将发送帧的识别码、本节点的编码以及本节点接收滤波器的识别码相统一。而主控机的节点则可以读取所有总线上的报文,所采用的通信策略如图3所示,这样的设计实际上就将原先总线式的拓扑结构转换成了类似星形拓扑的结构,便于主机管理所有节点。
3 主控制点的设计
相对于采集节点单一的采集处理任务而言,主控机需要实现更多的功能,单任务的MCU则无法满足要求。因此,本文选用嵌入式微处理器ARM11作为主控机的硬件平台,ARM处理器具有丰富的外设接口和良好的实时控制性能,无论从寻址空间还是处理性能上,都要优于一般的单片机,适合充当小型控制中心。
3.1 Linux下CAN网络设备驱动的实现
项目中移植了Linux 3.0.1版本内核作为软件运行的系统平台,内核会为驱动提供统一的接口。在较新版本的内核中,CAN设备已经不再简单定义成字符设备,而是定义成网络设备,这更接近于CAN是一种局域网的本质,从而可以使用Socket套接字操作CAN设备,并使用内核提供的高级功能。
对内核已提供的MCP2515的驱动文件进行修改以符合硬件平台的实现。通过定义mcp251x_priv结构体来管理设备所有的信息,如下所示:
struct mcp251x_priv {
struct can_priv can;
struct net_device *net;
struct spi_device *spi;
……
};
以上3个结构体变量分别存放了设备需要使用的协议层、网络层和硬件层的相关信息。通常,网络设备驱动模块主要包括网络协议接口层、网络设备接口层、设备驱动功能层和网络设备与媒介层4层[4],各部分模块在内核中的结构关系如图4所示。设备通过SPI子系统来实现硬件层操作,网络设备与SPI设备之间的连接桥梁是驱动功能层struct net_device_ops,通过它向上层提供网络设备的底层硬件操作接口函数:
struct net_device_ops mcp251x_netdev_ops = {
.ndo_open = mcp251x_open,
.ndo_stop = mcp251x_stop,
.ndo_start_xmit = mcp251x_hard_start_xmit,
};
采用“顶半部”和“底半部”的机制来处理中断,可以解决在中断中读写SPI耗时的问题,这种机制将耗时过长的中断程序放到更安全的时段中运行,以使系统能及时响应其他的中断请求[5]。因此,仅仅在中断函数中唤醒一个处理函数的工作队列:schedule_work(&priv->irq_
work),而将真正的处理程序放到这个工作队列中运行,以保证系统实时响应的性能。
运行驱动还需要向内核注册必要的硬件信息,如晶振频率(.oscillator_frequency)、SPI总线号(.bus_num)、硬件中断号(.irq)等硬件信息。其中设备名(.modalias)必须要和驱动中定义的设备名相同,否则内核无法把这些信息传递到驱动中。
struct mcp251x_platform_data mcp251x_info = {
.oscillator_frequency = 8000000,
.board_specific_setup = mcp251x_ioSetup,
……
};
struct spi_board_info spi_mcp251x_info[] = {
{ .modalias = "mcp2515",
.platform_data = &mcp251x_info,
.irq = IRQ_EINT(16),
.bus_num = 1,
……
},
};
3.2 基于Qt的控制应用程序开发
上层应用程序是实现主控制点所有功能的入口,也是人机交互的平台。项目采用跨平台的C++应用程序开发框架Qt来实现图形化用户界面程序的开发,其具有良好的适应性和可移植性[6]。
本系统中移植了4.8.0版本的Qt库,如图5所示。项目应用程序的主要框架通过窗体部件类QWidget来构建。为了使界面更直观,加入了对标签窗体类QTabWidget的支持。同时,主控机的Socket CAN通信功能由多线程来实现,多线程机制可以使Qt程序在同时运行多个阻塞式任务时,不会影响用户界面的响应。
子线程类RecvThrd主要实现对CAN口的监听任务,并通过信号-槽机制将数据传给主线程,重写虚成员函数void RecvThrd :: run( )加载新的线程任务。Socket CAN的使用类似于其他网络协议操作,主要包括建立套接字、绑定端口和监听等,不同的是CAN通信不需要与对方建立连接,主要实现方式如下:
void RecvThrd :: run( )
{
rv_sk=socket(PF_CAN,SOCK_RAW,CAN_RAW);
recv_addr.can_family = AF_CAN;
recv_addr.can_ifindex = 0;
bind(rv_sk, (struct sockaddr *)&recv_addr, len);
recvfrom(rv_sk,(void*)&recv_frame,sizeof(struct can_frame),0,(struct sockaddr *)&recv_addr, &len);
……
}
如图6所示,使用绘图类QPainter在子窗口Graph中实时显示动态数据曲线和坐标。绘制坐标曲线时首先要使用QPainter的视窗转换函数将Qt中默认的绘图坐标原点从屏幕的左上角移到左下角。动态曲线采用折线方式绘制,当曲线超过一定宽度后,会实时向左平移。由于在Qt中使用专门定义的数据类型,所以C中的通用数据类型都需经过特定转换后才能供Qt使用和显示。管理数据和文件时使用流操作可有效减少系统调用次数,提高运行速度[7]。
4 测试与总结
将Qt应用程序交叉编译后,下载到ARM平台上运行,产生图6中的标签式窗口界面。在构造主窗体时传入Qt :: FramelessWindowHint参数,可以让界面不产生标题栏,使窗口界面能准确并完整地显示在液晶屏上。
当主线程检测到新的地震采集节点号时,会弹出消息框通知用户处理,新节点会被加入每个子窗口的设备列表中,或被丢弃。引入Qt的互斥锁QMutex机制,可以有效避免因命令没有得到及时处理而导致重复添加相同ID号的情况。在另外两个子窗口中可以浏览接收的数据以及管理对应节点。
测试表明,基于ARM平台的主控机可以满足数据收发、实时显示、节点监控以及异常记录等多任务要求,在不影响与地震采集节点间通信的前提下,实现良好的人机交互和实时控制性能,在整个网络系统中起中继站的作用,方便了流动站对分散的地震采集节点的控制和管理。
本文设计了一种采用CAN总线通信技术在地震数据采集点与流动站之间进行数据传输的方式,利用CAN总线通信传输距离长、抗干扰能力强、易于施工布线的特点,以及微处理器ARM优越的实时控制能力和良好的通信能力,在地震采集节点与流动站之间构建中间控制点,以星形拓扑的方式将一定范围内分散的采集点集中控制。同时,通过在ARM硬件平台上构建Linux多任务系统平台,采用Qt嵌入式应用程序框架搭建人机交互界面,实现了良好的实时控制和管理功能。这种基于CAN总线和嵌入式技术的地震数据传输方式,既便于野外环境中网络的组建和拓展,也有利于减轻流动站的管理任务。