2. 中国北京 100036 中国地震局地震预测研究所
2. Institute of Earthquake Forecasting, China Earthquake Administration, Beijing 100036, China
在固定地震台站的观测系统中,常常将宽频带或甚宽频带地震计与24位地震数据采集器组合起来作为主要的地震观测仪器。宽频带、甚宽频带地震计是关键的地震监测设备, 其稳定性与可靠性是决定地震观测数据质量的主要因素。一般地,宽频带、甚宽频带地震计都是在机械结构的基础上通过电子反馈方式来达到低频观测频带(60 s或120 s)的,因此2种地震计均存在零漂的可能性。
宽频带、甚宽频带地震计产生零漂主要有2方面原因:一是自身因素,主要是因为簧片的老化时间不够长;二是环境因素,其中,环境温度变化是影响宽频带、甚宽频带地震计正常工作的最主要环境因素,其主要表现为对地震计零位的影响,测震台站的实际运维数据也佐证了这种影响(王晓蕾,2012;赵龙梅等,2017;王晓蕾等,2018)。地震计零位的变化,将对地震仪系统的量程产生一定程度的影响:当零位变化过大时,有可能导致靠摆,即摆锤被卡住,无法运动。因此,在实际工作中,运维人员在日常,特别是季节交替时应尽可能多关注地震计的零位变化情况。
一般地,运维人员采用人工方式对地震计的零位进行检查,即定期通过客户端软件连接数据采集器,通过菜单指令查询地震计零位。但是,这种完全依赖人工检查的方式存在一些不足,一是占用人工;二是检查工作缺少较好的周期性;三是不能在零位超范围后第一时间通知运维人员。因此,为了保证地震计零位在正常范围内,降低超范围零漂对宽带地震计的影响,提高地震台站观测数据的质量,有必要采用自动检测的方式对地震计的零位进行周期性检查,并将检查结果及时通知运维人员。
北京市测震台站使用的专业设备为北京港震仪器设备有限公司生产的地震计和数据采集器,本文将以港震公司的地震仪系统(EDAS-24GN数据采集器,BBVS-60、BBVS-120、BBVS-60DBH、GL-S120、FSS-3DBH等型号地震计)为例,介绍地震计零位实时监控与发布软件。该软件采用Python开发,使用了包括socket通信、多线程、定时任务以及微信等多个模块,可以快速实现周期性的地震计零位查询及发布功能。
信息的传递方式多种多样,电话、短信、邮件、QQ、微信等各具特点,传播效率和覆盖范围互有差别。腾讯公司2018年第3季度财报指出,微信及WeChat的合并月活跃账户数达10.82亿(网易科技,2018),即全球大约每8个人中就有1个人在使用微信。因此,将微信作为信息发布的工具是较合适的选择(叶佳宁等,2014;徐丹等,2016;魏艳旭等,2016;贾宁等,2016)。
1 工作流程为了获取地震计的零位信息,根据港震公司提供的地震数据采集器通信协议,本文工作的总体流程示意见图 1。首先,登录数据采集器的命令端口,从命令端口的返回信息中获取本次连接可以使用的数据端口;其次,向该数据端口发送零位查询帧,数据采集器将零位查询结果以响应帧的形式返回数据端口;再次,对响应帧进行解析,即可获得零位查询结果,如果零位电压超过了规定范围,可以通过启动调零设置帧要求数据采集器对地震计进行调零操作。最后,将零位查询结果及调零操作情况通过微信发送给有关人员。
为了实现地震计零位查询,需要用到Python的多个模块。各模块协同工作,以完成预期目标。以下对本软件中用到的各个模块进行介绍。
2.1 socket模块socket模块可以用来分别构建服务端或客户端的socket应用程序(Hetland,2010),本文仅使用了客户端的相关方法。通过该模块,可以构建与服务端的socket连接,并通过模块内置的方法实现与服务端的交互,如发送数据、接收数据等。
2.2 threading模块考虑到获取地震计零位流程的特点,本文使用多线程解决同时访问数据采集器命令端口、数据端口的问题。多线程类似于同时执行多个程序,Python提供了threading模块可实现该功能。使用该模块,可以在主程序中创建新的线程,从而完成并发任务,新的线程由主程序对其进行控制(Peterson,2015)。
2.3 itchat模块itchat是一个开源的微信个人号接口,该接口使得利用Python调用微信变得非常简单。在使用手机微信扫码登录后,利用itchat内置方法即可实现用户搜索,文字、图片、视频等信息的发送、接收,甚至可以使微信成为一个控制器(LittleCoder,2018)。
2.4 APScheduler模块APScheduler模块实现了类似操作系统定时任务的功能(Melentev,2018)。为了实现微信定时发布,如果采用操作系统的内置定时任务,则要求程序在每次启动时都要手工扫码登录微信;若采用APScheduler模块,则可以在程序初次启动时手工扫码登录微信,程序的其他部分则在APScheduler模块的管理下持续运行,无须再次扫码登录。该模块可以轻松实现对任务的多种调度方式,如cron风格、一次性调度等。
3 功能实现为了实现零位数据的查询、接收、解析与发布,本文主要通过多个函数实现上述目标,各函数功能及函数间数据流见图 2。下面以港震公司生产的EDAS-24GN数据采集器和地震计为例,对地震计零位实时监控与发布软件进行解释说明。
为了实现与数据采集器的交互,需要分别与其命令端口、数据端口建立连接。其中,与命令端口的连接是为了实现用户登录、获取本次连接的数据端口以及结束连接等;与数据端口的连接是为了实现查询指令的发送与数据的接收等。
3.1.1 与命令端口的连接为了建立与数据采集器命令端口的连接,可以使用socket模块。具体实现思路是:在导入socket模块后,新建socket对象,将数据采集器的IP地址及命令端口提供给该对象的connect()方法,从而建立这个连接;然后,通过该对象的send()、recv()方法实现与数据采集器的交互,进而获得本次连接的数据端口。以下为此部分主要代码。
import socket
s = socket.socket() #新建socket对象
s.connect((‘数采IP地址’,命令端口)) #建立连接,命令端口为5000
s.send(‘用户名’) #发送用户名给数据采集器
s.send(‘口令’) #发送口令给数据采集器
returnMsg = s.recv(1024) #接收数据采集器返回数据
从returnMsg中找到标识为“108 [数据端口] is data port.”的行,从而获得数据端口号,一般为8001至8003。
3.1.2 与数据端口的连接获得数据采集器返回信息中的数据端口后,为了在同一个程序中建立与数据采集器数据端口的连接,可以采用多线程的方法。具体实现思路是:导入多线程模块后,建立线程对象,赋予该对象要执行的函数名及其他参数,并启动该线程。在线程的函数中,实现对数据采集器数据端口的连接和参数帧的发送、接收功能;然后,在主程序中向命令端口发送请求实时数据的指令,实时数据和响应帧即可通过数据端口返回;最后,结束与数据采集器命令端口的连接。以下为此部分的主要代码。
import threading
def getData(‘数采IP地址’,数据端口):
returnData =‘’ #用于存储返回数据帧
dataSK = socket.socket() #新建socket对象
dataSK.connect((‘数采IP地址’,数据端口))#建立连接
sendresult = dataSK.send(查询帧) #向数据端口发送查询帧
#接收数据采集器返回的参数帧,一般地,响应帧会在发出查询帧后
#返回的10个数据帧内
for i in range(10):
returnData = returnData + dataSK.recv(1024)
#新建线程对象
t = threading.Thread(target=getData,args=(‘数采IP地址’,数据端口))
t.start() #启动线程对象
#向命令端口发送请求实时数据命令,程序将从数据端口接收到返回的数据
s.send(‘RTS ON\r\n’)
time.sleep(25)
#主动结束与命令端口的socket连接,避免长时间占用端口
s.close()
3.2 参数帧的构建与解析 3.2.1 参数帧的结构为了实现零位的查询,需要向数据采集器数据端口发送查询帧,并对接收到的响应帧进行解析,因此,需要了解参数帧的结构(表 1),表 1示例为1个查询帧在各数据项位置的值。
港震公司数据采集器的查询帧及响应帧采用intel字序,即little-endian。这种字序的特点是数据的高位字节存储在高位地址上,低位字节存储在低位地址上。例如,对于32位的CPU,有数据0x12345678要存储在0x1000开始的地址上,则intel字序存储方式见表 2。
获取地震计零位的查询帧是表 1中各数据项的组合。具体而言,如果地震计序号为0,则查询帧为:0xbf13977400008069000400007f93,其中,各数据项含义见表 1示例。需要特别指出的是,校验和0x7f93的计算方法为
0x0000+0x8069+0x0004+0x0000=0x806D=0b1000000001101101
0b1000000001101101取反为0b0111111110010010
0b0111111110010010+0b1=0b0111111110010011=0x7f93
由于港震公司数据采集器的数据传输采用intel字序,因此,发送给数采的查询帧结构应调整为0xbf1397740000698004000000937f。考虑到向数采发送的查询帧是二进制码,因此程序中查询帧的最终样式为b'\xbf\x13\x97\x74\x00\x00\x69\x80\x04\x00\x00\x00\x93\x7f'。使用3.1.2节代码中的dataSK.send(‘查询帧’)将此查询帧发送给数采的数据端口,很快数采就会返回包含各分量零位的响应帧。一般地,该响应帧会与一般数据帧一起通过数据端口返回。
3.2.4 响应帧的解析对于从数据端口返回的二进制数据流,使用Python binascii模块的b2a_hex()函数,即可将其转换为十六进制的字符串;然后,根据响应帧的帧标志将响应帧拾取出来,通过解析,即可获得获得各通道的零位值。根据港震公司数据采集器通信协议,响应帧结构与参数帧类似(表 3)。
例如,3.1.2节的程序段返回的某次returnData中包含的零位响应帧内容为
$ {\rm BF~~13~~97~~74~~00~~00~~69~~70~~10~~00~~00~~00~~92~~8A~~0C~~00~~0D~~AE~~05~~00~~47~~0F~~03~~00~~8D~~47} $ |
其中,3个通道的零位count值(从intel字序转为正常字序)分别为东西向0x000C8A92、北南向0x0005AE0D、垂直向0x00030F47(表 3)。这里需要注意的是,零位count值可能为正,也可能为负,需要根据零位count值转换为二进制后首位数是0还是1来确定。若首位数为0,则零位count值为正;反之,则零位count值为负。对于零位count值为负的情况,需要将其由补码形式转换回原码形式,可参考3.2.3节校验和的计算方法将其逆序执行。
将前述零位count值经下式转换,即可转换为零位电压值,单位为毫伏(mV)
$ 零位电压 = 零位{\rm{count}}值 * 2.384/1000 $ | (1) |
对于港震公司生产的FSS-3DBH、BBVS-60DBH地震计,可以直接使用式(1)计算;对于BBVS-60、BBVS-120、GL-S120地震计,还需在此结果上乘以6,才能得到零位电压值。以本例中东西向返回值为例,0x000C8A92首位为正,将其直接转换为十进制数,即821906,再经式(1)计算,即可得到东西向零位约为1 959 mV,若地震计为BBVS-60型,还需在1 956 mV的基础上乘以6,即约11 756 mV。
3.2.5 启动调零设置帧的构建如果查询得到的零位电压值超过了规定的范围,则需要对地震计进行调零操作。启动调零设置帧的构建方法与查询帧相似,需要修改的内容是帧标志和校验和。若地震计序号为0,则该帧为0xbf13977400006050000400009fac。将该帧按照intel字序调整后,即可将其发送到数采的数据端口,从而使数采对地震计进行调零操作。
3.3 微信发布采用itchat模块实现信息的微信发布,是一种快捷、经济的信息发布方式。具体实现思路是:导入itchat模块,然后扫码登录,最后发送信息。
import itchat
itchat.auto_login(hotReload=True)
#‘filehelper’为微信“文件传输助手”,本行代码意为将“信息”发送给自己,根据需要,将‘filehelper’替换为目标微信群即可。
itchat.send_msg(‘信息’, ‘filehelper’)
其中,使用hotReload=True参数的目的是:当程序临时退出时,在一定时间内可以保持微信登录状态。
3.4 定时任务定时任务的具体实现思路是:从APScheduler模块中导入BlockingScheduler调度器,然后生成一个调度器对象。将前述零位查询、调零及微信发布的程序整理成为一个可调用的函数sendMsg(),将该函数及任务调度方式作为参数提交给调度器对象的add_job()方法,最后启动该调度器对象即可。调度器启动后,sendMsg()函数将在调度器的管理下按预定模式执行。
from apscheduler.schedulers.background import BlockingScheduler
#新建调度器对象
scheduler = BlockingScheduler()
#将零位查询、调零和微信发布函数sendMsg、调度模式赋予add_job()方法
scheduler.add_job(sendMsg,‘cron’,hour=‘10’,kwargs={‘name’:‘filehelper’})
#启动调度器对象
scheduler.start()
4 软件运行及效果北京市测震台网现有的28个测震台站全部采用港震公司生产的地震监测仪器。目前,台网已实现对全部测震台站的监控,监控内容包括零位、GPS、台站通断情况等,监控结果的发布方式为网页与微信,软件对台站运行状态的巡检周期为1 h,每次巡检结果存入excel文件。
监控网页采用Django框架、Bootstrap前端框架和高德地图构建。在布局上主要分为2个区域,一是台站状态区,包括台站分布图、GPS状态、零位状态、通断状态;二是自动操作信息区,主要展示软件根据触发条件自动对台站设备进行的操作,如调零等。在台站状态区的地图上,可以通过地图覆盖物——台站的颜色形象地展示其运行状态。在地图两侧的表格中,提供了各台站GPS状态以及零位超范围台站的具体数据,运维人员可以根据巡检数据决定台站运维工作的轻重缓急。监控网页的内容可以自动刷新,刷新间隔时间为1 h。在微信通知方面,监控结果以简要的文字形式定时发送给运维人员,主要内容是台站通断状态和零位超范围台站情况。监控微信和监控网页见图 3、图 4。
对于存储下来的台站零位巡视结果,可以使用excel绘图功能将数据整理为图件。若能结合台站或周边气象数据,则可以进一步梳理出台站地震计零位变化规律,查找出影响零位变化的可能原因,进而通过增加防护措施或台站改造使地震计以正常状态运行。对于短期内无法通过台站改造改善地震计运行环境的,软件依据触发条件自动对零位超范围台站发送调零指令,使地震计零位回归正常范围(图 5)。
截至2019年2月底,该软件在北京市测震台网运维部已正常运行约3个月。其间,软件主动发起的零位查询、调零等操作未影响测震台站的正常运行。根据运行期间定时监测的零位数据,个别台站的仪器保温防护措施有待加强。
5 讨论宽频带地震计零位实时监控与发布软件的实现,可以使宽频带地震台站的零位监控工作达到一定程度的自动化。该软件的运行,首先改善了台站零位的获取方式,通过网页与微信的结合,有利于台网运维人员及时准确地把握台站运行状态;其次,将尽可能减轻零位变化过大对宽频带地震台站正常工作的影响,减少日常查台的工作时间,有利于运维人员将精力投入到更重要的工作中;最后,零位查询结果及调零操作情况形成的数据资源,有利于运维人员掌握仪器运行规律,进一步改善台站观测环境,保障地震观测仪器的正常运行。
贾宁, 孙哲, 韶丹. 2016. 地震速报微信自动推送系统设计[J]. 地震地磁观测与研究, 37(2): 165-170. |
王晓蕾.温度对甚宽频地震计的性能及输出影响的研究[D].北京: 中国地震局地震预测研究所, 2012.
|
王晓蕾, 谷国梁, 薛兵, 等. 2018. 温度对宽频地震计观测资料影响的研究方法[J]. 地震, 38(3): 170-180. |
网易科技.腾讯发布Q3财报: 净利润233亿, 同比增长30%[EB/OL]. (2018-11-14)[2018-12-10]. http://tech.163.com/18/1114/18/E0JHNVMK00097U7R.html.
|
魏艳旭, 刘晓丹, 贾军鹏, 等. 2016. 河北地震官方微信公众服务平台[J]. 地震地磁观测与研究, 37(2): 171-176. |
徐丹, 韩艳杰, 张诺男, 等. 2016. 地震信息微信公众平台服务开发[J]. 地震地磁观测与研究, 37(1): 146-150. |
叶佳宁, 何霆. 2014. 地震信息微信自动发布系统的设计与实现[J]. 华北地震科学, 32(4): 23-28. DOI:10.3969/j.issn.1003-1375.2014.04.005 |
赵龙梅, 高业欣, 燕云, 等. 2017. 温度对甚宽带地震计零点及灵敏度的影响[J]. 防灾减灾学报, 33(1): 36-39. |
Hetland M L. Python基础教程[M].司维, 曾君崴, 谭颖华, 译.北京: 人民邮电出版社, 2010: 241-254.
|
LittleCoder. itchat[EB/OL]. (2017-02-15)[2018-11-03]. https://itchat.readthedocs.io/zh/latest/.
|
Melentev N. Advanced python scheduler[EB/OL]. (2017-12-13)[2018-11-03]. http://apscheduler.readthedocs.io/en/latest/.
|
Peterson B. Threading-Higher-level threading interface[EB/OL]. (2015-10-11)[2018-11-03]. https://docs.python.org/2/library/threading.html.
|