胡广浩,张昊楠,阮福明
(中海油田服务股份有限公司 物探事业部,天津 300450)
中国海油开展自主海上地震勘探装备研发[1- 2],实现海洋地震拖缆采集装备产业化应用并跻身国际先进行列。拖缆综合导航系统是物探船的“大脑”,负责指挥和控制地震勘探作业过程。“海途”拖缆综合导航系统由综合导航系统软件和导航数据采集平台组成,导航数据采集平台为船载各系统提供时间服务、采集外部设备数据并进行时间戳标定、根据导航算法计算的响炮时间实时同步触发外部设备等,可见具备内部时钟并给数据时间戳标定(数据授时)是拖缆综合导航系统工作的前提,而时间同步(时间授时)又是船载外部系统能与拖缆综合导航系统协同工作的前提。
实现时间同步通常采用授时系统(时间服务器)的方式,目前市场上常见授时系统分为两种,一种为通用设备,常用于Internet上提供用户计算机时间的同步,受Internet网络环境影响,同步实时性、精度通常不高;另一种是专用设备,通常作为专业组件内置于专业设备之中,不能被其他系统所利用。针对物探船相对封闭的的局域网环境,本文基于VxWorks和现场可编程阵列(FPGA,field-programmable gate array)设计并实现了一套授时系统,该系统既能作为时钟基准用于内部数据授时,又能作为时间服务器用于同步局域网系统时间。在本授时系统之上扩展的导航数据采集平台,是“海途”拖缆综合导航系统[3]的核心单元。
本系统采用欧式通用计算机总线(VME,versamodule eurocard)工控机箱作为授时系统各模块搭载箱体,前插版和后插板基于VME背板总线互通互连,如图1所示。其中,前插版为系统主控板,采用GE公司VG5单板计算机和VxWorks实时操作系统;后插板为时钟守护板,主要包括FPGA模块、授时模块及外部天线插座和网络插座等。前插板和后插板采用通用型输入输出(GPIO,general purpose IO)组件接口进行通讯,物理上采用P2接插件连接。
图1 授时系统结构框图
全球定位系统(GPS,global positioning system)提供了全球、全天候、实时的精密导航和定位能力,同时提供了协调世界时(UTC,coordinate universal time)作为时间系统,它是目前应用最为广泛的主动式卫星授时手段[4- 8]。
本文选用i-Lotus公司的M12M Timing GPS为授时模块,为本授时系统提供时间参考基准。物探船的速度一般不超过8 m/s, M12M Timing GPS基于GPS卫星C/A Code工作,最大能捕获12颗GPS卫星,动态速度达到515 m/s,秒脉冲(1 PPS,one pulse per second)定时精度达到12 ns@6-sigma,通讯协议支持NMEA 0183 v3.0,能极大地满足海洋地震勘探的时间精度需要。M12M Timing GPS授时模块以标准的晶体管-晶体管逻辑集成电路(TTL,transistor-transistor logic)电平形式每秒产生1 PPS信号的同时,会以RS232串口形式同步输出一个与1 PPS相对应的整数秒UTC时间信息,串口UTC时间信息与TTL电平信号延迟在50 ms之内,时序如图2所示。
图2 输出信号时序图
通过主控板捕获授时模块输出的UTC时间信息,将解析后的年月日时间信息交由系统主控板实时时钟(RTC,real-time clock)维护,时分秒信息通过GPIO组件接口交由FPGA模块维护,如图3所示。
图3 时间下行流程图
在以太网局域网环境中,网络时间协议(NTP,network time protocal)[9]是当前最常用的计算机系统时间同步协议。NTP时间同步协议基于复杂的最优主时钟选择算法实现,带来的结果是时间同步收敛较慢,同时在同步过程中占用较多的系统资源[10-12],不能很好应对地震勘探中的实时性要求。简单网络时间协议(SNTP,simple network time protocal)在NTP基础上做了优化和改进,简化了复杂的时间同步计算过程,轻量级设计使得其在保证同步精度的前提下,更加适合于局域网内需要时间同步的计算机系统数量不是很多、单个时钟源情形,SNTP在局域网范围内时间同步精度可以达到0.1 ms的精度[13-14],能满足地震勘探做时间同步的精度需求。地震勘探中各系统处于相对封闭的局域网环境中,各系统构成相对比较固定,采用SNTP协议能简化协议实现的复杂度,降低资源占用率和提升运行效率,可为其他应用最大留出系统资源。本系统(运行于系统主控板的应用软件)为SNTP的服务端,其他系统为客户端,如图4所示。
图4 时间上行流程图
GPIO为作为通用输入输出接口,计算机通过对它的控制实现与外部设备通讯的目的,使用时可以直接根据外部设备的数据传输需要,通过对其进行软件编程达到传输数据的目的[15]。本文GPIO组件的设计采用自定义的通信协议,读数据、写数据、地址等总线宽度均是8位,读控制、写控制等总线宽度均是1位,引脚定义如表1所示。在本系统中系统主控板为主设备,时钟守护板上的FPGA模块为从设备。
表1 GPIO物理引脚定义
1)GPIO读数据时序:系统主控板通过GPIO从FPGA模块获取时间,通过25 引脚作为控制线,拉低电平的同时送出地址,延迟1 μs,延迟期间FPGA根据地址将相应的数据送到数据总线GPIO[16∶9],系统主控板读取GPIO获取数据,最后将电平拉高,完成读数据过程,时序如图5所示。
图5 GPIO读数据时序
2)GPIO写数据时序:系统主控板通过GPIO发送GPS时间(时分秒)数据给FPGA模块,通过26 引脚作为控制线,拉低电平的同时送出地址和数据,延迟1 μs,延迟期间时钟守护板完成数据接收和处理,最后将电平拉高,完成写数据过程,时序如图6所示。
图6 GPIO写数据时序
随着可编程技术的不断发展和进步,FPGA被广泛应用于各类电子设计领域。作为授时系统的核心,时钟守护板FPGA模块选用ALTERA公司的EP3C25F256芯片,它内置50 MHz的晶振。作为时钟守护板的核心部件,FPGA模块采用模块化设计思路[16],划分为GPIO接口模块、命令处理模块、1 PPS监测模块和时钟守护模块,其功能如图7所示。
图7 FPGA功能框图
1 PPS监测用于对连续相邻的1 PPS信号之间的时间间隔进行监测,当连续一段时间内相邻1 PPS信号时间间隔都稳定在正常阈值范围内,则认为1 PPS为稳定的有效信号,输出给时钟守护模块,否则不输出。1 PPS模块通过边沿检测模块、间隔计时器模块、稳定监测模块、开窗计时器模块等组合设计,为时钟守护模块提供稳定的1 PPS信号输入。
1)边沿检测模块:该模块工作状态分为检测状态和空闲状态。令输入信号为IPL,其延迟一个时钟周期信号为DPL。系统开启或复位后,进入检测状态,若“IPL == 1 且DPL == 0”表示检测到脉冲上升沿,输出一个1 PPS信号给间隔计时器模块和开窗计时器模块,并跳转到空闲状态。在空闲状态下,若“IPL == 0 且DPL == 1”表示检测到脉冲下降沿,跳转到检测状态。若检测“IPL == DPL”超出500 ms,强制跳转到检测状态,以应对异常情况。
2)间隔计时器模块:跟踪连续1 PPS信号并计算相邻两个的时间间隔,输出给稳定监测模块,同时清空计时器开始下一轮间隔统计。
3)稳定监测模块:连续跟踪60 s时间内相邻1 PPS的间隔计时值都稳定在正常阈值范围内,认为1 PPS为稳定的有效信号,输出间隔计时的间隔平均值AVG和一个使能信号给开窗计时模块。
4)开窗计时器模块:检测到使能信号有效时开始计时,当边沿检测模块的1 PPS信号到来时,清空计时值。计时值为间隔平均值加1时,强制计时值减掉间隔平均值,同时继续计时。当计时时间处于[AVG-5 μs∶AVG+5 μs]时,同时在此时间段内由边沿检测模块输入的1 PPS信号有效时,则输出1 PPS信号给时钟守护模块。
时钟守护模块是FPGA模块的工作核心,包括GPS计时器、秒计时器、25 μs计时器、系统时钟计时器。时钟守护模块以授时模块为时钟源,通过25 μs计时器、秒计时器、GPS计时器三级时间步进与外部授时模块的时钟对齐,设计如图8所示。
图8 时钟守护模块结构图
1)25 μs计时器:每20 ns(50 MHz晶振)增加1计数,每1 250计数清零并且秒计时器增加1计数,当1 PPS信号到来时强制清零。
2)秒计时器:每25 μs计数周期增加1计数,当1 PPS信号到来时清零。当1 PPS到来时候,理论计数应该为40 000,考虑到1 PPS信号丢失和本地系统时钟偏差,设计上每到达40 002计数强制清零并且GPS计时器增加1,这样把最大时间偏差控制在50 μs。
3)GPS计时器:当1 PPS信号到来增加1计数,当1 PPS失效时,给出计数增加信号。当收到系统主控板发过来的GPS时间信息后,将此计数器值更新。
4)系统时钟计时器:通过25 μs计时器、秒计时器、GPS计时器的组合,采用系统时钟计时器维护当前系统时间。系统时钟计时器= GPS计时器×40 000+秒计时器(单位25 μs)。
本系统作为物探船的唯一时间服务源,必须实时响应各客户端的时间请求并具备能长时间稳定的提供时间服务能力。VxWorks嵌入式实时操作系统[17]具有中断延迟短、任务切换快、优先级抢占等优点,以其良好的可靠性和卓越的实时性被广泛地应用在通信、航空航天、地球物理勘探[18]等高精尖技术及实时性要求极高的领域中,满足物探船对时间服务实时性和可靠性的要求。
NTP和SNTP 协议支持主从、广播模式。主从模式下,用户向服务器提出服务请求根据所交换的信息计算两地时间偏差和网络延迟从中选择认为最准确的时间偏差并调整本地的时钟。广播模式适用于高速的局域网中局域网中一个或多个服务器以固定的时间周期向某个多播地址广播自己的时标客户端,不计算时间偏差和网络延迟直接用接收到的时标修正自己的时钟忽略各种误差[9,13]。考虑到物探船局域网环境中各个系统相对稳定,本文采用主从模式,简化服务端软件设计,提高时间服务效率。
基于软件工程模块化设计思想,主控板软件由GPIO协议驱动、授时卡控制任务、SNTP服务任务及时间服务钩子(函数)等组成,如图9所示。GPIO协议驱动进行GPIO总线协议的实现,提供上层应用与FPGA模块通讯应用程序编程接口(API,application programming interface),授时卡控制任务对授时卡工作参数配置、工作状态监控、数据解析和时间分发等;SNTP服务任务及时间服务钩子为外部系统提供时间服务。授时卡控制任务和SNTP服务任务需要访问GPIO共享资源,设计互斥型信号量进行保护。
图9 软件模块划分图
VxWorks通过板级支持包(BSP,board support package)[19-21]提供了底层GPIO的驱动,本系统通过实现自定义软总线协议,为授时卡控制任务和SNTP服务任务提供操作FPGA模块的API。
1)初始化过程GPIO_Init()关键代码如下:
/* 创建VxWorks互斥型信号量,实现GPS时间分派任务和时间服务任务的对GPIO操作的互斥 */
semMID =
semMCreate(SEM_Q_PRIORITY|SEM_INVERSION_SAFE|SEM_DELETE_SAFE);
/* 设置GPIO工作方向,[9∶16]-in,other-out */
sysGpioDirSet(0x0000FF00);
2)读GPIO过程关键代码如下:
GPIO_Read(UINT8 addr, UINT8 *pData):
/* 加锁 */
semTake(semMID,WAIT_FOREVER);
/* 配置地址 */
GPIOValue = (GPIOValue & 0xFF00FFFF) | ((addr<<16)&0x00FF0000);
/* 拉低GPIO 25 引脚 */
GPIOValue = GPIOValue & 0xEFFFFFFF;
sysGpioWrite(GPIOValue);
/* 延迟1us,在此期间FPGA模块完成数据准备 */
sysUsDelay(1);
/* 获取1Byte数据 */
*pData = (sysGpioRead()>>8) & 0xFF;
/* 拉高GPIO 25 引脚(复位)*/
GPIOValue = GPIOValue | 0x10000000;
sysGpioWrite(GPIOValue);
/* 释放锁 */
semGive(semMID);
3)写GPIO过程同读GPIO过程类似,不再详述。
VxWorks的网络组件提供了基础SNTP服务的框架支持,本文无需关注协议本身的具体实现过程,只需实现框架开放的用户接口实现。首先通过配置VxWorks的操作系统映像,使SNTP服务以系统任务的形式运行[19-20]。VxWorks提供的SNTP服务是以钩子(回调)函数的形式支持用户自定义的时间服务实现,钩子函数设置入口为sntpsClockSet(),钩子函数需具备sntpsClockHook(int request, void *pBuffer)接口方式,其中参数request为请求的代码,SNTP协议规定需要实现SNTPS_ID、SNTPS_RESOLUTION、SNPTS_REALTIME等3项,实现流程如图10所示。
图10 时间服务流程图
实现SNTP服务端核心代码如下:
/* 参考标识符 */
if(SNTPS_ID == request){
strcpy(pBuffer, "pps");
}
/* 时间精度 */
else if(SNTPS_RESOLUTION == request){
/* 由FPGA模块维护的时钟精度50000(ns) */
*((ULONG *)buffer) = (ULONG)50000;
}
/* 时间戳 */
else if(SNPTS_REALTIME == request){
/* 复位RTC的时分秒 */
rtcSetTime(0,0,0);
/* 通过RTC提供的API实现由RTC时间设置计算机系统时钟 */
rtc_SetSysTimeFromRTC();
/* 获取计算机系统时间,从1970年1月1日0时0分0秒至今经历时间 */
/* 其中,timeval为struct timespec类型 */
clock_gettime(CLOCK_REALTIME, &timeval));
/* 获取FPGA时间(时分秒) */
/* FPGAClockTimeGet封装了对GPIO_Read的调用 */
FPGAClockTimeGet(&clockTime);
/* FPGA秒部分 */
clockTimeSec = clockTime/40000;
/* FPGA纳秒部分(FPGA计时单位25us,乘以40000为1秒) */
clockTimeNano = (clockTime -
clockTimeSec*40000)*25000;
/* SNTP服务器发送的时间需转化为格林尼治标准时间 */
/* 即1970年1月1日0时0分0秒以来所经过的时间,所以加上 */
/* 时间偏移常量SNTP_UNIX_OFFSET */
time = timeval.tv_sec +
SNTP_UNIX_OFFSET + clockTimeSec;
pTime = (ULONG *)buffer;
/* 封装SNTP时间帧秒部分 */
*pTime++ = time;
/* 封装SNTP时间帧纳秒部分 */
*pTime =
sntpsNsecToFraction(clockTimeNano);
} else {...}
FPGA模块以授时模块为时钟源,通过25 μs计时器、秒计时器、GPS计时器三级时间步进进行时钟守护,软件模块实现SNTP服务端协议,根据SNTP协议特点,局域网内系统同步的精度跟系统处理延迟无关,仅跟局域网环境有关。因此,本系统对授时系统的验证只需要测试授时系统的时间守护精度,因此本系统的授时精度完全取决于FPGA模块时钟守护精度,跟软件SNTP协议模块无关。
授时模块输出的秒脉冲TTL电平直接传递给FPGA模块,标记时间为TOD,输出的串口UTC时间信息SOD经由软件模块传递给FPGA模块,FPGA模块计算两个信号时间差Delta,Delta的计时刻度为1 μs。 FPGA模块在收到UTC时间信息后,将依据TOD和时间差Delta维护内部时钟。 从三层授时模型看,影响授时精度的是秒计时器精度,因此测量秒计时器精度即可得到授时精度。
M12M Timing GPS授时模块以TTL电平形式每秒产生1 PPS信号的同时,会以RS232串口形式同步输出一个与1 PPS相对应的整数秒UTC时间信息,串口UTC时间信息与TTL电平信号延迟在50 ms之内,时序如图2所示。
将授时模块以TTL电平形式每秒产生1 PPS信号、与1 PPS相对应的整数秒UTC时间信息接入到FPGA模块,每来一个1 PPS则秒计时器清零,并上传当前1 PPS到达时间,发送给软件模块进行记录,最后分析1 PPS达到时间的数据,连续运行4个小时左右。按照1 PPS达到时间帧的格式,提取微秒数据,将微秒数据做直方图统计,如图11所示。
图11 统计图
根据直方图统计的数据,计算出微秒数据的标准差,标准差在概率统计中,反映组内个体间的离散程度,计算所得平均值为999 999.005 5,计算所得标准差为0.074 116,数据离散程度低,靠近中心平均值,所以认为对于时间精度的截取,可以达到百纳秒级,满足自主海上地震勘探装备授时精度不低于50 μs的精度要求。
在本授时系统之上扩展的导航数据采集平台,是“海途”拖缆综合导航系统[3]的核心单元,顺利完成海上三维地震采集作业,它的成功应用表明,该授时系统从时间授时精度、稳定性上都能满足海上地震勘探生产作业要求。
本文开发了基于VxWorks实时操作系统和FPGA的授时系统,授时精度优于50 μs,成功应用到海上拖缆地震勘探生产作业中,满足物探船上对时间同步的精度要求和实时性要求。在不失实时性和精度的前提下,该系统采用了模块块化设计,良好的扩展能力,使之易于扩展出具有时间标定或时间服务的应用系统。