CSNS多物理谱仪T0信号监测系统设计与实现

2021-12-22 08:21李嘉杰王小胡
核技术 2021年12期
关键词:谱仪序列化中子

严 泽 李嘉杰 王小胡 庄 建

1(西南科技大学国防科技学院 绵阳621010)2(散裂中子源科学中心 东莞523803)3(中国科学院高能物理研究所 北京100049)4(深圳技术大学先进材料测试技术研究中心 深圳518118)

中子是组成原子核的粒子之一,和质子一起组成氢之外其他元素的原子核[1]。中子散射是研究物质微观结构和动态过程的理想工具之一,散裂中子源能为中子散射提供高通量的脉冲中子。散裂中子源是加速器驱动的、产生强流中子束的大型科学实验装置,其中子产生的机制为原子核的散裂反应[2-3]。中国散裂中子源(Chinese Spallation Neutron Source,CSNS)是我国首台散裂中子源,主要由一台负氢离子直线加速器、一台快循环同步加速器(Rapid Cycling Synchrotron,RCS)、两条束流输运线、一个靶站、多台谱仪以及相关配套设施组成[3-5]。CSNS多物理谱仪位于16号束线,多物理谱仪主要用于不同有序度材料的结构分析,应用领域主要集中在长程有序但局域无序材料或长程无序但中短程有序材料的结构研究中[6]。CSNS属于脉冲式中子源,加速器束流最高重复频率为25 Hz,以加速器定时系统提供的质子打靶时刻T0作为触发信号,对多物理谱仪配备的多台中子斩波器和众多中子探测及测量电子学进行触发,用于实现高效的斩波功能和准确的飞行时间计算,因此T0信号的准确性和稳定性决定了该谱仪是否能高效运行。

基于实验物理和工业控制系统(Experimental Physics and Industrial Control System,EPICS)开发T0信号监测系统,借用CSNS的高精度时间同步系统,将接入T0扇出器的T0信号标记高精度时间戳,用于各个T0扇出器的频率计算和各级扇出设备之间的时间差值计算,将数据上传Kafka消息中间件,解决了高并发大量数据的写入,有助于控制和优化数据流传输的速度,解决生产消息和消费消息处理速度不一致问题,同时提供异步处理机制,有利于对数据的处理和计算。最后实现数据的可视化功能,便于观察T0信号的抖动情况。

1 应用需求

散裂中子源多物理谱仪的电子学系统作为中子科学研究和中子数据分析的重要基础,其数字化触发平台需要接入一个准确的T0信号来进行触发,触发系统采用星型扇出结构,利用专用光纤逐级扇出的方法从位于靶站谱仪中控室的主站分发给各个谱仪和谱仪电子学。

中子斩波器是飞行时间中子散射谱仪不可缺少的关键设备之一,要实现与加速器触发T0定时信号同步的斩波功能[6-7],准确地接入T0触发信号至关重要。对于探测器电子学和测量电子学,T0作为开窗信号,开启采集时间窗,用于飞行时间的计算,通过测量中子的飞行时间来获得中子能量信息是脉冲中子源中测定中子能量的关键[8-10]。不准确的T0会导致斩波器的斩波相位与加速器中子束团之间产生偏差,同时也会引起探测器的中子飞行时间计算错误从而影响多物理谱仪实验数据的准确性和实验结果的可靠性。在多物理谱仪的散射腔周围分布着12组探测器阵列,每个阵列包含多个探测器模块,分布图如图1所示。为了保证每个探测器模块都能准确地接收到T0信号,各级扇出设备间采用的是相同长度的光纤来保证T0信号的准确性,但是探测器模块对于T0信号触发的及时性要求极高,因此建立触发监测系统对T0信号的频率和在传输过程中的时间延迟进行监测,从而保证T0对多物理众多探测器模块的准确触发,这是高效探测和高可靠测量的基本保证。

图1 多物理谱仪探测器分布图Fig.1 Layout of multi-physical spectrometer detectors

2 监测系统的设计

该监测系统采集前端T0设备的原始数据,经过统计分析,在靶站谱仪监控平台上显示。主要包括硬件和软件设计,硬件设计部分用于时间戳的标记及原始数据上传;软件设计部分针对T0信号频率快、数据量大的特点,采用了Kafka消息中间件对数据进行持久化达到快速计算与分析的目的,同时对监测数据进行了可视化并设置报警。

2.1 系统的硬件设计

在多物理谱仪T0信号分发系统主要分发T0信号和束团ID编号,由自研电子学硬件构成,自研电子学部分接入T0信号和WR(White Rabbit)的时间同步信号分别用于T0信号的扇出和标记高精度时间戳。可从该硬件部分通过串行接口输出束团ID、时间戳等内容,因此可作为数据源。由于谱仪综合监控系统是使用Open-Falcon软件,同时后端连接Kafka,所以考虑使用SOC(System on Chip)通过串行输出数据并作为Kafka数据的生产者。在SOC上运行相应的操作系统可以完成复杂的任务管理与调度,同时支持上层应用的开发,适合应用场景的SOC比常见的微控制单元(Microcontroller Unit,MCU)(如STM系列)更加符合与具备Kafka生产者的开发环境。系统的硬件组成如图2所示,由自研电子学硬件和SOC共同组成T0的扇出设备T0扇出器。

图2 硬件结构框图Fig.2 Block diagram of hardware structure

根据数据的频率、大小,可选用具有Linux系统的树莓派作为数据的输出和上传,其中树莓派3B搭载博通的四核64位ARM Cortex-A53处理器,树莓派4搭载了博通的四核64位ARM Cortex-A72处理器,参数如表1所示,通过对CPU性能、主频、网络、内存等的对比,选择树莓派4更能符合实际的需求。

表1 硬件参数对比Table 1 Hardware parameter comparison

2.2 系统的软件设计

监测系统的监测量为多物理谱仪T0扇出器束团ID(pulse_ID)的频率,和T0信号与真实质子打靶时间的偏差,量级为ns。T0在传输过程中,一条链路上有多个节点每个节点都分配有T0扇出器。加速器定时系统的频率为25 Hz,当束流开机时,需对每次脉冲产生的T0进行监测,在一定的时间内产生的数据量较大、频率较快且数据是持续产生直到束流结束。当对时间差值以及频率进行计算时需要多台T0扇出器的时间戳数据,因此需将数据进行暂存来实现链路上各个节点、多台设备的之间的延迟时间的计算,同时保证数据的实时性进行快速计算。

根据上述T0信号的特点和计算的需要,采用Kafka来保证多台设备大量数据同时、持续地写入并暂存。Kafka的构架如图3所示,Kafka是一种高吞吐量的分布式发布订阅消息系统,主要包括:生产者(producer)负责创建消息,消费者(consumer)连接Kafka并订阅消息,broker为服务代理节点[11]。一个或多个broker组成一个Kafka集群,Zookeeper是Kafka用来负责集群元数据的管理[12]。将多台T0扇出器分别作为数据的生产者向Kafka写入数据,将数据持久化到Kafka的topic中,然后通过消费者对数据订阅进行计算与处理,为保证监测数据能够合理地显示,计算每秒25次时间差值的最大值、平均值、最小值,将差值作为PV上传EPICS。

图3 Kafka架构框图Fig.3 Block diagram of Kafka architecture

CSNS采用的是EPICS分布式控制架构,EPICS的组成包括三部分:运行在客户端的操作员接口模块OPI(Operator Interface)、运行在服务器端的输入输出控制模块IOC(Input Output Controller)和网络通讯模块CA(Channel Access)[13]。将监测量作为过程变量(Process Variable,PV)通过pyepics接口上传到EPICS对应IOC中的记录(record),IOC的扫描时间为1 s,实现对变量的监控,将监测系统集成于整个CSNS的EPICS控制架构下。为实现远程监控与监测量的直观展示采用监控框架Open-Falcon和可视化工具Grafana接入来自EPICS的PV量,Open-Falcon数据刷新频率为60 s,所以数据在Grafana的进行展示的刷新频率也是60 s。整个监测系统的结构如图4所示。

图4 监测系统结构示意图Fig.4 Schematic diagram of monitoring system structure

3 系统实现

系统的实现部分主要包括数据序列化与反序列化处理、Kafka生产者、消费者的开发以及监控系统的数据可视化工作。

3.1 Kafka生产者

树莓派作为数据生产者以串行接口的方式从T0信号扇出器的自研电子学部分获取数据,需要安装树莓派的C语言开发库wiringPi,用于树莓派的串口通信。同时需要上传数据到Kafka服务器,需要安装Kafka的C/C++接口librdKafka库。安装序列化库flatbuffers,不同的数据生产者由于开发语言不同而需要建设不同的Kafka接口,需要使用序列化工具将数据封装后上传至Kafka集群。

生产者程序如图5所示,组成部分包括:树莓派获取数据、解析数据、数据序列化、数据发送Kafka。由于串口接收到的数据是二进制流,根据数据格式接收21个字节为完整的数据,并根据标志位将数据切分为三部分,包括质子打靶脉冲编号(pulse_id)、秒下(time_nano)信息、秒上(time_second)信息,将数据解析为十进制数据,读取和解析过程如图6所示。给设备定义T0扇出器设备编号(device_id)、设备名称(device_name),备用值(value)同pulse_id和时间值一起定义需要序列化的数据结构,数据类型如表2,编写schema文件MetaData.fbs,通过序列化工具flatbuffer进行序列化转化为二进制数据用于传输。序列化后的数据通过Kafka生产者上传动作即produce函数(virtual ErrorCode produce)上传数据。

图5 生产者程序流程图Fig.5 Producer program flow chart

图6 读取与解析子程序流程图Fig.6 Flowchart of reading and parsing subroutine

表2 Schema文件数据类型Table 2 Schema file data type

3.2 Kafka消费者

消费者采用python开发,环境搭建需要安装Kafka python API、flatbuffer python API、EPICS python API,分别用于连接Kafka建立消费动作、反序列化数据、数据上传EPICS软件。调用flatc使schema文件生成python对应的Data包,程序开发时导入,方便调用生成的schema实列方法MD.MetaData.GetRootAsMetaData(buf,0)进行反序列化。通 过 函 数Kafkaconsumer(topic,group_id,bootstrap_servers)连接Kafka服务器,主要参数包括订阅的主题、消费组名、Kafka服务器的地址。Consumer的消费动作是循环的流式消费处理:for msg in consumer,循环内通过buf=msg.value获取数据,再调用schema实例方法进行反序列化,然后依次读取数据,Kafka的消费动作即完成。

在实际工程中,质子流强监测器中真实质子打靶的数据和T0扇出器的上传到了不同的Kafka服务器,需要在不同的Kafka服务器中去消费,因此开启两个进程去读取数据。以不同的设备编号作为区分,以同一ID为基准来对齐数据,找到不同T0扇出器设备同一ID的时间值和质子流强监测器对应的ID时间值,然后计算差值。程序流程如图7所示,主要使用队列来实现进程间的通信,使用队列的方法put()和get(),该队列是阻塞队列,当队列中没有数据的情况下,消费该队列的进程会被自动阻塞(挂起),直到有数据放入队列。当队列中填满数据的情况下,生产该队列的进程被自动阻塞(挂起),当队列中有空的位置,进程被自动唤醒。

图7 程序流程图Fig.7 Program flow chart

进程p1为从Kafka1服务器(T0扇出器的数据上传的服务器)中消费,进程p2为从Kafka2服务器(真实质子打靶数据上传的服务器)消费。两个进程都从最后的offset消费,利用阻塞队列使他们对齐。p1消费最后的offset得到初始ID,将初始ID通过队列queue1发送给进程p2然后阻塞。进程p1要得到进程p2中的数据,只有当队列queue2中有数据时才可以,即进程p2消费得到的ID和进程p1消费得到的ID相同时,其他时候被阻塞,当ID对齐时开始计算差值。

在Linux系统下安装EPICS base搭建softIoc,通过pyepics接口将计算的时间差值作为PV量上传到EPICS。在使用EPICS的softIoc时需要设计softIoc实时数据库,EPICS IOC实时数据库能够实时接收和存储上传的数据,编写数据库记录db文件,启动softIoc时链接自定义的db文件。

3.3 数据可视化

数据可视化的工作主要是将上传到EPICS的PV量作为自定义数据上传到Open-Falcon作为数据源,然后利用Grafana软件进行数据的直观展示。自定义数据的格式要求是json格式,包括7个字段:1)metric:最核心的字段,即采集数据的名称;2)endpoint:标明Metric的主体(属主);3)timestamp:表示上传数据时的unix时间戳;4)value:代表该metric在当前时间点的值;5)step:表示该数据采集项的汇报周期;6)counterType:有COUNTER和GAUGE两种选择,前者表示该数据采集项为计时器类型,后者表示其为原值;7)tags:一组逗号分割的键值对,对metric进一步描述和细化,可以是空字符串。在python脚本中定义字典record,对应参数如表3。

表3 自定义数据格式Table 3 Custom data format

4 系统性能测试及结果验证

针对系统的稳定性进行测试分析,主要测试传输不同数据量对生产者程序的影响,从而得到数据传输数据量的参考值;同时对每个周期的数据进行用时监测,计算数据生产到消费的时间,判断数据是否有堆积;最后用Grafana软件对数据进行展示得到结果。

4.1 系统性能测试

为保证树莓派能够正常生产数据,不存在内存崩溃,CPU占用率过高问题导致响应不及时。测试传输数据量与系统影响,对Kafka生产者程序进行运行测试。测试发送不同字节数数据时系统负载的变化,通过Linux下的top命令查看生产者程序的CPU和内存。根据散裂中子源工程中可能会出现的数据量大小,从小往大倍数式测试,每个测试点均测试运行20 min,取最大值,最终形成图8的曲线图。由图8可见,当数据量少于23 000字节时,CPU占用率低于14%,内存占用也低于0.4%,即使在234 000字节时,CPU和内存占用率都在合理范围内。通过对具体数据的实际需求分析,设置每个脉冲发送120字节数据,此数据量在测试曲线中处于较低且较平稳的范围内,因此可评估生产者程序在树莓派硬件中能稳定运行。

图8 不同数据长度生产者程序CPU和内存占用率Fig.8 CPU and memory usage of producer programs for data of different length

为了验证监测数据能每周期上传及计算统计,对数据产生至消费的过程进行用时检测,以确保监测结果的实时有效性。利用数据在生产者和消费者的时间戳进行计算测试,如图9(a)所示。

ntp时间同步在局域网内精度可以达到毫秒级[14],使用ntp时间同步将生产者的主机和消费者的主机进行时间同步,设置同步间隔为60 s,使用clockdiff测得两台主机间的时间差值为1 ms,对每一条消息产生后标记生产者主机的时间戳,连同数据一起上传至Kafka服务器,用消费者消费每条消息后的时间戳减去该条消息中生产者的时间,得到数据上传Kafka服务器到消费耗费的时间。统计10万条数据,设置组距为0.1,从图9(b)可以看出,最小值为9.5 ms,最大值为19.9 ms,耗费的时间主要集中在12.5 ms左右,且呈正态分布,而生产者生产消息的周期是40 ms,说明每个周期内生产的数据都在该周期内上传与消费,没有产生数据堆积的问题,消费者能够进行及时消费,符合实际工程需求。

图9 用时计算结构图(a)和传输时间频数分布图(b)Fig.9 Structure diagram of time calculation(a)and distribution diagram of time transmission frequency(b)

4.2 数据可视化监控界面

在Grafana中下载Open-Falcon插件安装并添加数据源的地址。在Grafana中主要使用Graph Panel插件,将数据展示成折线、条状、点状等风格,并设定的报警阈值。图10为现场设备安装测试,得到最后的监控界面如图11所示。从结果可以得出,监测系统实现对传输链路上各个节点设备的监控,同时对各个节点的平均值、最大值、最小值进行了统一显示便于对比。

图10 硬件设备现场安装和测试图Fig.10 Photos of hardware equipment installation and test on site

图11 数据可视化界面Fig.11 Data visualization interface

5 结语

本文根据CSNS多物理谱仪T0信号的扇出路径和T0信号触发的重要性出发,对T0信号的监测做出需求分析,在EPICS平台下设计了多物理谱仪的T0监测系统。利用Kafka消息中间件来实现数据的暂存,便于数据的处理,同时采用Open-Falcon软件与Grafana可视化工具对监测量进行了直观的曲线展示、报警反馈等,达到了良好的监测效果,并投入使用。

猜你喜欢
谱仪序列化中子
Java Web反序列化网络安全漏洞分析
VVER机组反应堆压力容器中子输运计算程序系统的验证
散裂中子源大气中子辐照谱仪研制成功
一种磁共振成像谱仪数字化发射系统设计
新型X波段多功能EPR谱仪的设计与性能
不稳定平台OTT-Parsivel雨滴谱仪测量速度订正
如何建构序列化阅读教学
某物资管理调度系统的数据序列化技术
(70~100)MeV准单能中子参考辐射场设计
3D打印抗中子辐照钢研究取得新进展