1. 研究对象概述
核电模拟机主要用于核电厂操纵员培训、考试,且为核电厂设计改进、运行规程变更提供重要验证手段 [1]。核动力运行研究所自主开发核动力仿真平台RIMSIM平台 [2],该平台提供过程模型、教练员站、盘台通讯等软件,可用于支撑模拟机全寿期管理开发工作。
核电厂工艺系统主要为核电厂二回路及其辅助系统,其仿真模型多采用单相或两相多组分流体网络软件开发,占据80%以上模拟机开发工作量。工艺系统仿真模型基于RINSIM平台图形化组态工具和流体软件,以详细设计阶段确定的仿真范围为输入进行开发和调试,保障单系统在其各个运行工况下的稳定运行和设备状态准确性,为模拟机多系统集成打下坚实基础。
模拟机测试主要在集成阶段介入,需要极强的核电厂理论知识水平结合模拟机知识,在以往的模拟机项目中,主要由测试人员依据电厂各类运行规程编写模拟机测试规程,然后人工开展重复性测试工作。在国内外模拟机开发过程中,该工作因其复杂程度高缺乏合适的自动化工具来辅助完成,郑明等 [3] 采用实时数据对比测试工具来提高瞬态测试时模拟机精度校验,刘跃锋等 [4] 采用DCS系统制造包含的自动化模拟测试模块提高DCS和模型联合测试效率。模型开发的质量决定了模拟机最终的性能,开发阶段的质量控制往往被忽略,导致在集成阶段出现修改频繁的现象。在华龙一号全范围模拟机项目中,单元测试报告作为业主方要求提交的质量控制成果,测试手段为人为控制,既容易造成人为失误,也浪费大量人力物力,因此设计一种工艺系统仿真模型自动测试方法具有重要意义。
本文基于上述问题,开展对基于RINSIM平台开发的模拟机系统单元自动测试方法的研究。对测试范围、接口、验证软件框架、输出进行研究,形成一套模拟机工艺系统自动测试解决方案及流程、基于Flask框架后端及Vue.js前端技术的Web框架设计及搭建以及基于C++编写函数的python封装技术,为后续大型测试软件开发提供理论依据。
2. 总体流程及架构
本文以基于RINSIM平台的开发核电厂工艺系统为研究对象,开发模拟机工艺系统仿真模型自动测试流程及其验证软件,主要流程如图1所示。
整个系统包括RINSIM平台实时数据交互模块、RINSIM平台配置项读取模块、参数输入模块、参数比较模块以及报告输出模块。具体步骤如下:
1) 用户在前端界面通过手动输入或者批量导入形式将标准数据如电厂阀门行程时间、模拟机传感器上下限、通断式传感器定值、运行数据等输入至人机界面模块并记录。

Figure 1. Procedure of simulator process system simulation model automatic test
图1. 模拟机工艺系统仿真模型自动测试流程
2) RINSIM平台配置项读取模块通过Fileopen的方式采用遍历方法打开平台文件,读取其中内容。这里面涉及到读取的内容包括建模数据的提取,如模型图编号、系统名、仿真设备、设备类型等,并记录。
3) RINSIM平台实时数据库模块(前提是服务器已启动RINSIM平台)通过dataport.dll访问仿真平台的共享内存,读取其中内容,这里面涉及到读取的内容有箱体建模数据、阀门开关阀时间、流量等,并记录。
4) 将读取的内容与标准数据在参数比较模块进行比较;
5) 将比较结果作为报告输出模块的输入,并编制单元测试报告在前端输出。
输入为两个部分:一为标准化参考数据参见步骤1),二为平台的输入,参见步骤2)和步骤3)。软件的核心为测试引擎算法,采用遍历等算法进行设计。输出为偏差报告以及单元测试报告。图形化界面面向用户,可实现用例的基本操作,操作界面友好。单元测试模块属于模型的后处理端,提取模型在RINSIM平台运行的运行结果,质量评估得到单元测试报告。
本文总体架构如图2所示。

Figure 2. Verification software architecture diagram
图2. 验证软件架构图
后端服务器项目的软件基于pycharm开发平台开发,采用Flask服务器框架。Flask框架是采用python编写的轻量级Web应用程序,属于B/S模式,包括Werkzeug和Jinja 2两个核心函数库,能够安全、稳定、高效的实现web程序。后端服务器通过开放API的方式向前端服务器提供数据或数据操作接口,实现前后端的连接。主体开发语言为python。
前端服务器采用JavaScript开发,基于WebStorm集成开发环境,采用vue.js框架。vue.js是一套用于构建用户界面的渐进式框架。Vue的核心库只关注视图层,采用自底向上增量开发的设计,通过API实现数据绑定和组合视图组件,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页应用提供驱动。在该项目中主要用于接收数据创建web界面并提供给用户。前后端程序可在多服务器上部署,本文中在一台服务器上部署。
3. 验证软件开发及实现
3.1. RINSIM平台配置项读取模块
该模块功能下软件通过Fileopen的方式打开RINSIM平台文件,读取其中内容。这里面涉及到读取的内容包括建模数据的提取,如模型图编号、系统名、仿真设备、设备类型等。RINSIM平台文件主要包括图文件(MFG格式)、系统配置文件(XML格式),该类文件均可采用python处理。主要基于以下命令:
打开文件:>>> open(..\\FIGURE\\ModuleFigure\\rcvrcv01.mfg, r+)
读取内容:>>>with open(..\\FIGURE\\ModuleFigure\\rcvrcv01.mfg) as f:
for line in f.readlines:
process(line)
关闭文件:>>>file.close()
以取出RCV002VP阀门类型为例,主要流程如图3所示:

Figure 3. Platform file data extraction process
图3. 平台文件数据提取流程
3.2. RINSIM平台实时数据库交互模块
该模块下软件通过Dataport.dll访问平台数据,读取其中内容,这里面涉及到读取的内容主要为在平台冻结情况下的数据,主要内容有箱体建模数据、阀门开关阀时间等。另外可访问仿真平台的共享内存,RINSIM2.0平台中,单系统模型加载运行后,需提取运行参数与设计参数进行比较,判断模型是否符合设计要求。
在运行模拟机后,可基于封装好的python模块连接实时数据库,以取出RCV002VP阀门开阀时间为例,主要流程如图4所示。

Figure 4. Platform operation data extraction process
图4. 平台运行数据提取流程
该模块难点主要在于与RINSIM平台实时数据库的交互,模拟机采用实时数据库进行变量数据管理和模型数据管理,平台提供dataport.dll动态库提供对模拟机运行数据的读取和更改接口,但是采用C++语言编写,为实现动态库API调用采用Pybind11 [5] 解决C++函数在python的复用问题。
pybind11是一个轻量级的“Header-only”的库,它将C++的类型暴露给python,反之亦然。主要用于将已经存在的C++代码绑定到python,它的目标和语言类似于boost.python库,利用编译时的内省来推断类型信息。采用pybind11对C++编写的dataport.dll进行封装。步骤如下所示:
1) 用C++函数实现函数功能(已在dataport.dll里实现);
2) 编写头文件,将函数的声明包含在头文件中;
3) 编写pybind11封装函数;
4) 用Python编写setup脚本,通过setup脚本调用C++编译器编译生成python模块。在命令行执行python setup.py build_ext --inplace即可生成pyd文件;
5) 生成动态链接库pyd文件;
6) 测试函数功能。封装程序主要开发流程如图5所示:
采用该方法封装后可形成基于RINSIM模拟机接口dataport的python库,可直接在flask框架下使用,封装后的库可直接用import语法导入使用。具体实例如下所示:
>>>from pysimbase import mdd_open,PyDbm,mdd_close #导入模块
>>>mdd_open() #连接模拟机
>>>p = PyDbm('rcv001rcv001mtziylhigh') #获得变量操作权限
>>>p.value = 200 #将变量赋值
其他方法包括与dataport一致,并可实现运算发重载,如表1所示,展示了pydbm函数的所有方法。

Figure 5. Dataport program packaging process
图5. Dataport程序封装流程

Table 1. Main methods of packaging the python library of dataport
表1. 封装dataport的python库的主要方法
3.3. 人机界面模块
该模块下主要为获取用户输入,开发友好的用户界面,通过用户配置文件表格形式输入。图6为Web界面设计图。
该模块基于JavaScript开发,布置在前端服务器。用户通过配置文件(excel形式)载入测试范围及标准数据。后端程序通过读取表格内容实现程序输入操作。主要用户使用流程如下所示:
1) 用户通过点击“载入配置文件”按钮,会弹出选择列表,用户通过选择系统确定测试的系统excel表格。
2) 载入后,在右边显示栏显示测试的系统名,主要界面通过tab页面的形式显示excel中sheet页的测试内容,通过点击标签页可实现显示结果切换。
3) 点击“测试执行”按钮后,测试结果在最右边显示。
3.4. 参数比较模块
该模块的功能为获取前端输入以及自动测试方法的验证开发。在前端获取用户标准数据后,分别采用读取平台配置项及运行数据库的方法获得建模及运行数据,作为输入到参数比较模块,该模块通过简单对比获得相应输出,输入至报告输出模块。主要示例如下:

Figure 6. Web interface design diagram
图6. Web界面设计图
>>> a = xxxx #获取excel表格中某行某列数据
>>> b = xxxx #连接模拟机,获取实时数据至
>>> Outcome = (abs(a-b))
3.5. 报告输出模块
该模块主要用于生成系统偏差及报告工艺系统单元测试报告,输出结果位于人机界面右端显示,显示比较参数是否正确,如果错误则通过此模块向前端输入错误的结果,方便用户查看。
4. 效果及总结
图7展示从RINSIM平台配置项获取的数据进行展示,修改执行频率标准数据为10,测试结果标注错误并显示正确值。

Figure 7. Comparison of platform configuration item reading parameters
图7. 平台配置项读取参数比较
图8展示从RINSIM平台配置项获取的数据进行展示,修改RCV003VP标准数据开阀门数据为10,测试结果标注“错误,正确开阀时间为10”,修改RCV050VP阀门类型为气动阀,测试结果标注“错误,阀门类型应为气动”,另外包括电子教案等功能可在界面实现模拟机顺步执行。

Figure 8. Comparison of platform operation data reading parameters
图8. 平台运行数据读取参数比较
该验证软件目前已投入至漳州、海南大小堆全范围模拟机开发中,在以往模拟机项目中单系统测试需投入10人次约1个月时间,采用该软件后可1人执行,时间也缩减至10天,大幅提高模拟机开发效率。
本文基于RINSIM平台设计一套模拟机工艺系统自动测试解决方案及流程,基于C++编写函数的python封装技术、实现RINSIM平台快速便捷的数据读写功能,基于Flask框架后端及Vue.js前端技术的Web框架设计开发验证软件开发并一定程度实现工艺系统自动测试,可用于指导大型单元测试软件开发,提高模拟机整体开发效率及质量。
参考文献