张鹏程,王爱民
(东南大学仪器科学与工程学院,江苏南京 210000)
色谱仪是进行色谱分离分析[1-2]使用的装置,包含检测器、色谱泵、温度控制等设备。工业色谱仪的操作过程较复杂,计算机技术的发展对色谱分析的自动化起到了极大的促进作用,用户可以通过上位机对各色谱设备进行远程控制,并监控它们的状态,也可以实时接收谱峰信号进行处理。而传统基于LabVIEW、VB等技术研究开发的色谱虚拟仪器大多功能不够完善,依赖特定的操作系统因此兼容性不足,色谱算法性能不高、扩展性也较弱[3]。而随着网络技术的发展,互联网具有不受地域限制以及方便信息共享的优点,因此越来越多的测控系统被部署在Web端。通过网络对色谱设备实现远程监控、数据处理和存储已经成为现代色谱仪器的发展方向[4-5]。因此,本文利用Web技术,设计并实现了一个基于浏览器/服务器架构的工业色谱虚拟仪器,用户可以摆脱地域、时间的限制,通过浏览器远程监控和操作色谱设备,促进了设备的智能化;提供色谱算法分析功能,支持多任务同时执行;开发人员也可以更好地依赖分布式系统对软件功能进行维护和扩展[6],提高虚拟仪器性能。本虚拟仪器的主要功能如图1所示,包括系统管理、实时色谱设备监控、色谱信号分析及渲染等。
图1 在线色谱控制与分析系统模块图
图2 虚拟仪器架构图
本系统使用Web技术,采用浏览器/服务端模式开发,整体设计架构如图2所示。其中浏览器主要进行虚拟仪器监控面板的展现以及色谱信号的谱图渲染。服务端完成具体功能实现,分为系统Web服务、仪器通信服务和色谱算法SDK。Web服务主要使用Python开发,用以响应用户通过浏览器发送的请求,两端之间通过AJAX与WebSocket两种方式交换数据,并提供了基本的项目管理、设备监控、权限管理等功能。为了提高服务端的稳定性,降低各功能模块之间的耦合度,Web服务没有直接实现与色谱设备的通信和色谱信号处理模块,而是通过仪器通信服务和色谱算法SDK提供相关功能。系统Web服务与仪器通信服务通过系统三级消息格式使用Socket通信,从而避免由于仪器通信的出错导致Web服务的崩溃(或反之),做到故障隔离。同时,考虑到色谱信号具有数据量大、流程复杂的特点,为了保证数据处理的速度、精度,方便后期升级维护,开发了色谱信号分析算法库SDK,Web服务通过SDK提供算法分析功能,将算法功能插件化。用户通过浏览器发送监控指令并同时进行色谱信号分析的时序图如图3所示。
图3 功能调用时序图
本文色谱设备由高压流动相输送系统(包括高压泵、压力控制器等)、色谱分离系统(进样器、色谱柱、恒温箱)和色谱检测系统等组成。各色谱设备通过RS232连接到DIGATTO T1008型串口通讯服务设备,该设备具有独立的CPU以及完整的TCP协议栈,可以将RS232传输的数据转换成以太网IP包,从而给传统的串行设备增加联网功能。色谱设备数据传输如图4所示。
图4 色谱设备数据传输
本系统基于浏览器/服务器架构,所有应用功能都通过浏览器网页呈现。因为网页运行在浏览器上,具有无需安装、平台无关的优点,因此在任意的操作系统,任何终端上都可以访问本系统进行相关操作,无需考虑系统层面的兼容性。本虚拟仪器要提供以下功能:(1)用户通过网页管理、操控色谱设备,如设置运行参数,启动仪器运行等。(2)前端页面实时渲染设备采集的数据,如显示温度/压强、绘制色谱信号波形图等,即做到实时监控;在色谱信号分析完成后推送分析的结果。由于数据采集/分析功能都在服务端完成,网页与服务端之间需要交换数据,根据具体场景,本系统采用了AJAX与WebSocket结合的前后端通信方式。
AJAX(Asynchronous JavaScript and XML)是目前比较主流的通信方式,可以避免网页重新加载而实现内容的异步更新[7]。当用户进行操作需要进行数据交换时,将由前端发起HTTP连接请求,并将数据打包成JSON格式传递给服务端。服务端在收到AJAX请求之后解析JSON数据进行后续操作,并将操作结果返回给前端,实现两者之间的对接。这种方式适用于上述需求(1)的场景,即交互的主动权掌握在前端手里,每次由用户点击操作触发相应数据交换,且能在较短时间内得到返回结果。对于需求(2)的实时监控场景,前后端在长时间内都需要进行通信,并且数据交换主要发生在从服务端到前端。此时如果使用AJAX技术来实现,就需要采用轮询的方式,即由前端不断地发起AJAX请求,询问服务器是否有新的数据。使用这样的方式会造成CPU资源、网络带宽资源的浪费,因为前端一直在进行HTTP的连接请求和处理;发送的HTTP请求也会包含较长的头部,但只有部分请求以及数据是有效的,而服务端也需要一直应对无效的连接请求。为了提高性能,本文使用WebSocket技术解决这个问题,这种技术是一种在单个TCP连接上进行的全双工通讯协议,通过这个协议,允许从服务端主动向客户端推送数据,而不需要每次都由浏览器发起[8]。在使用WebSocket时,首先由浏览器发起建立WebSocket连接的请求,这个请求通过HTTP实现,但在附加头信息之中包含“Upgrade:WebSocket”信息,服务端识别出这个附加信息产生应答并建立好TCP连接。两端之间就可以通过TCP连接直接交换数据。在收到WebSocket消息之后,就进行相应的网页内容更新,包括仪器面板和色谱信号的实时渲染,如图5所示。目前主流浏览器都支持了WebSocket接口,服务器只需要按照协议向浏览器推送数据。
图5 WebSocket推送数据
Web服务只用于响应用户的请求,而本虚拟仪器与色谱设备之间的通信由单独的仪器通信服务提供,它与Web服务之间处于不同的进程之中,通过套接字Socket按照系统消息格式交互,两个进程都各自监听对方的消息事件。当用户通过浏览器发送相关指令时,Web服务便与仪器通信服务建立TCP连接;通过Socket将相应指令和数据格式化成系统消息发送给仪器通信服务,仪器通信服务解析出对应的消息内容,再由其写入相应下位机色谱设备;而在色谱设备检测信号时,便通过仪器通信服务向系统Web服务完成相应数据的格式化和发送。
为了提高系统服务之间通信的健壮性,本文设计了系统Web服务与仪器通信服务之间的三级消息格式。如图6所示,应用层根据消息的头部和尾部识别一条完整的消息,并对消息进行CRC校验。对于一条合法消息,HEAD、END、SIZE字段分别标识本条消息的开始、结束、长度;TYPE1字段标明本条消息的一级类型(如区分消息请求、应答、心跳包),Type2和Type3字段分别标明了需要操作的设备类型和具体指令类型,根据DataSize字段和DataX字段可以得到消息中的数据值。根据消息这三级字段可以判断出消息类型对应的对象设备、指令和数据值,然后根据指令类型调用对应的函数对设备进行操作。
(a)系统消息格式
(b)系统消息处理流程图6 系统消息格式和流程
本仪器需要提供对色谱信号进行自动分析的功能。服务端使用了Python开发,主要是考虑到Python具有开发效率高、可移植性强、并具有较多非常强大的第三方库的优点,可以快速开发出需要的功能应用。但是由于它是一门动态脚本语言,执行速度较慢。多线程的Python程序,也因为全局解释锁(GIL)的原因,都只能有一个线程在执行,多线程对计算性能并没有提升。在色谱分析领域,由于数据量较大,1 h的数据量可达数万级。并且色谱信号分析需要多个步骤,包括信号去噪、信号求导、色谱峰识别、重叠峰分解、定量分析等步骤才能完成[9],计算量会成倍增加。因此,色谱分析是一个计算密集型的过程。此时若使用Python进行信号处理模块的编写就不再合适,需要较长时间才能得到计算的结果,这不满足快速、实时的需求。倘若同时需要进行多个项目的分析,将极大地影响整个虚拟仪器的性能。因此,考虑到色谱信号分析领域的特点,设计采用C++编写了色谱信号处理算法SDK,将信号处理模块编译成动态链接库,按C风格导出SDK算法库的接口,Python服务器通过Ctypes调用SDK提供的算法[10]。这样在进行信号处理时,可以利用C++执行效率高的优点,能够快速得到运算结果。除此之外,将色谱算法编写成SDK的方式还降低了服务端应用与算法模块的耦合度,提高了灵活性和可维护性,将来也可复用于其他色谱分析项目。
算法SDK的整体架构图如图7所示。应用层通过引擎类(SDKEngine)初始化和管理算法服务,SDKEngine为全局唯一对象,为整个SDK程序的入口。Engine下包含若干项目代理(SDKManager),以此实现对多项目同时分析的支持。项目代理中的各服务分别实现了色谱算法中的去噪、求导、寻峰、定量计算等算法流程。色谱分析各算法步骤之间为串行处理,不存在较强的耦合关系。因此本文采用了并发模型-生产者/消费者模式实现,使用多线程并发执行各算法步骤,设置BUFFER作为2个步骤的数据缓冲。当上一个步骤处理完一个数据点时,通过缓冲区交由下一步骤进行计算,将串行算法并发化,从而起到了加速计算的效果。而SDK的配置服务、数据库服务与线程服务则为SDK提供了全局的基础功能组件。
图7 色谱算法SDK架构图
本系统的各项功能均已实现,支持PC、平板等多端操作,部分功能截图如图8、图9所示,并已经通过了第三方软件检测中心的验证。因此,以下系统测试和运行的过程侧重于性能测试方面。测试环境为联想V730笔记本电脑,硬件配置为Intel i7-7700处理器,8 GB内存,网络环境为内部局域网。
图8 系统实时设备监控
图9 谱图及信号处理结果渲染
首先对系统基准性能进行测试,测试服务器在空跑和进行色谱分析实验(进行信号实时采集和未调用SDK)时的CPU利用率以及内存使用率。实验对系统Web服务和仪器通信服务进行了分开统计,如表1所示,服务器在忙碌状态的CPU、内存使用率能保持在合理的状态,未出现急速增长的情况。
表1 系统基准性能测试(未包括算法SDK部分)
由于本文使用了Web技术,因此需要测试软件的负载能力, 通过Apache自带的apachebench命令模拟用户并发请求。由于请求的是本地回环地址,因此可以排除网络的因素,测试服务器多用户操作时的稳定性。测试的响应时间如表2所示。
可见,本虚拟仪器的负载压力测试性能良好。对于工业色谱仪器的实际使用而言,一般每s的请求量
表2 系统并发性能测试
不高,以上的并发性能可以满足需求。
为了解决Python执行较慢,不适用于计算密集型任务的缺点,提高虚拟仪器性能,采用SDK色谱算法库提供分析功能的方案。下面就对方案的性能进行了测试,主要包括以下内容:方案性能提升测试;同时多项目分析时的性能测试。
本文使用色谱仪分别对某乙醇溶液、氨基酸溶液、变压油3种信号进行了采集,数据点数分别是3×103、7×104、22×104。本文统计了算法处理以上样品信号所用时间。为了进行对比,还使用Python编写了与本文SDK逻辑相同的代码实现,同时对以上样品信号进行分析。两者的执行时间结果如表3所示。
表3 算法SDK性能测试
可以看到,本文开发的算法SDK的计算效率,是Python实现的10倍以上。即使是22×104数据点的信号,也能在9 s内计算完成。由此可知,本系统采用C++单独开发算法SDK提供信号处理功能的方式,成功避免了Python不适用于密集计算的缺点;通过算法并发模型实现,将串行算法并发化,也达到了提高分析效率的目的。
本文SDK支持同时进行多个项目的分析任务,并能保持较好的性能。使用数据量为7×104的氨基酸信号样本,分别同时开启3、5、10个相同的分析任务,SDK算法库的计算性能如表4所示,运行时间和内存使用基本成线性增长。即使是同时开启10个7×104数据点的分析任务,运行总时间也未超过10 s,运行内存未超过30 MB,可见本软件对于多任务并行具有非常好的支持。
表4 算法SDK多项目分析性能测试
随着互联网的快速发展,网络化的实验工作站将影响现在传统仪器仪表的工作方式。本文设计并实现的基于Web技术的工业色谱虚拟仪器,提供了色谱设备实时监控和色谱信号分析处理等核心功能,实现了色谱仪器的网络化和智能化。试验结果表明:本软件功能完善,性能可靠,算法执行效率良好。本系统使用的Web服务+通信服务+算法SDK的设计模式也可为相似系统的虚拟仪器开发提供参考。