基于Simulink代码生成器的翻译模拟式虚拟DCS实现方案
2020-03-25邓志光
张 旭,邓志光,彭 韬
(中国核动力研究设计院 核反应堆系统设计技术重点实验室,成都 610213)
0 引言
DCS 的仿真方法主要有3 种,包括纯模拟(Simulation)、虚拟实物(Emulation)和实物模拟(Stimulation)[1,2]。采用纯模拟的方法,将被仿真DCS 系统的算法逻辑翻译到另一套仿真平台,这种方法被称为翻译模拟(Translation)[3-5]。翻译模拟与虚拟实物和实物模拟相比具有技术简单、成本低的优势;同时,比根据顶层设计,在仿真平台人工绘制组态图的方法,节约了大量的工作量。
图1 基于Simulink代码生成器的翻译式虚拟DCS流程图Fig.1 Flow chart of a translating virtual DCS based on Simulink code generator
以Simulink 作为仿真平台的仿真方法有两种:一种是以Simulink 作为运算内核,通过外部程序调用Simulink 进行运算;另一种是以Simulink 作为组态显示工具及代码生成器,通过组态翻译软件将DCS 系统的组态逻辑翻译到Simulink 上,由Simulink 生成代码,再将其编译成*.dll 或*.lib 算法文件,并被周期性调用,构成基于Simulink 代码生成器的翻译模拟式虚拟DCS,实现仪控系统的仿真功能。本文详细介绍第二种方法构建的翻译模拟式虚拟DCS。
1 系统设计
1.1 总体设计
系统主要包括两部分,即虚拟DCS 与Simulink。虚拟DCS 实现组态翻译、代码编译、周期调用算法运算等功能。Simulink 实现组态画面显示、代码生成等功能。如图1 所示,其中,虚拟DCS 主要由两部分组成,即组态翻译软件与运算调度软件。
基于Simulink 代码生成器的翻译式虚拟DCS 系统架构,如图2 所示。组态翻译软件读取被翻译DCS 平台的组态文件,按照翻译逻辑识别,通过向Matlab 发送命令行的方式,调用Simulink 绘制算法块与连接线,构成组态图;再使用Simulink 作为代码生成器,把图形组态转换为C++代码,再编译为*.lib 格式的算法文件。
运算调度软件既与第三方软件接口,实现外部数据指令的交互,又周期性调用算法文件实现逻辑运算,是翻译模拟式虚拟DCS 的核心模块。
1.2 Simulink代码生成器
Simulink 代码生成器将每个模型(*.mdl)文件对应生成一个头文件(*.h)、一个源文件(*.cpp)以及一个主函数ert_main.cpp 和类型定义头文件rtwtypes.h。
图2 基于Simulink代码生成器的翻译式虚拟DCS系统架构Fig.2 Simulink code generator based translation virtual DCS system architecture
模型代码的头文件中内容根据算法不同而异,主要包括模型类的定义以及结构体定义。模型类包括初始化函数(initialize())、单步运算函数(step())、结束函数(terminate())、获取私有时间相关模型变量函数(getRTM())、构造函数和析构函数、输入成员变量、输出成员变量、状态成员变量、实时模型成员变量。结构体定义包括ExtU_ModelName_T、ExtY_ModelName_T、tag_RTM_ModelName_T、DW_ModelName_T,分别表示输入变量、输出变量、实时模型结构体(Real-time Model Data Structure)、算法块状态结构体(Block states)。
Simulink 模型分为Level 1 与Level 0 两部分,因而代码也分为Level 1 与Level 0 两部分。代码生成过程可由Simulink 自动完成。
1.3 算法文件编译与调用
生成代码的编译过程可借助Visual Studio 等集成开发环境实现,也可使用GNU-gcc 套件,通过Makefile 来描述工程文件的编译顺序、编译规则,并集成在运算调度软件中。Simulink 模型代码编译生成文件的配置类型选择*.lib 静态链接库。编译后的Level 1 与Level 0 为两个静态链接库。
以C++语言编写的运算调度软件为例,调度函数引用模型代码的头文件并加载静态链接库。根据模型代码引用的头文件另外再包含rtwtypes.h 等头文件。根据使用到的算法不同,可能用到其它头文件类型,如rtw_continuous.h、rtw_solver.h。以模型名为Model 为例,具体实现如下:
#include " Model.h"
#include " Model_types.h"
#pragma comment(lib,"Model.lib")
使用Level 1 或Level 0 模型时可采用静态类的形式,如:
static level1ModelClass Level1_Obj;
然后,可通过对该类的成员变量赋值、调用初始化函数(initialize())与单步运算函数(step())实现算法调用。
2 功能实现
2.1 周期调度
图3 Simulink平台算法库Fig.3 Simulink platform algorithm library
图4 组态逻辑翻译示例图Fig.4 Example of configuration logic translation
软件的主要流程包括组态翻译、算法生成与调度两部分,这两部分相对独立。组态翻译过程在本文中不详细阐述,算法生成过程在上文中已有描述。以简单的逻辑示例该过程,图3 为Simulink 平台建立的算法库。图4(a)、图4(b)分别表示翻译前的DCS 系统组态与翻译到Simulink 平台的逻辑图。
算法周期调度部分流程图,如图5 所示。
图5 算法周期调度流程图Fig.5 Algorithm cycle scheduling flowchart
软件先进入初始化阶段,读取Level 1 与Level 0 的IO清单,然后读取Level 1 与Level 0 变量的对点表。IO 清单包括了包含的变量、变量类型、所在机箱板卡通道号等信息。对点表分为Level 1 输出至Level 0 的对点表与Level 0输出至Level 1 的对点表,该表标志了两个系统间的变量对应关系,在周期运行的数据同步过程中分别从输出端向输入端进行数据同步[6,7]。
用户指令线程等待用户输入的仿真状态改变或执行仿真功能的指令。对于退出指令,设置退出标志位,退出本循环以及其他线程,并结束程序;对于其他指令,改变记录仿真状态或工况等参数的静态变量的内容,实现将该信息传递至其他线程。
周期循环线程周期性循环,每周期执行用户输入的仿真功能并进行本周期的算法运算。在判断到退出标志位时退出。
Level 0 与Level 1 的数据交互通过运算调度软件实现,闭环控制的原理与虚拟DCS 的闭环控制实现方式如图6 所示。运算调度软件解析Level 0 与Level 1 的*.lib 格式的算法文件,生成Level 0 与Level 1 的对象,分别代表反应堆与一二回路模型和DCS 控制算法。在非冻结模式下,运算调度软件在每周期之初根据对点表将其中Level 1 去往Level 0 的输出赋值给Level 0 的输入,将Level 0 去往Level 1 的输出赋值给Level 1 的输入。
2.2 仿真功能
图6 闭环控制原理图与翻译式虚拟DCS闭环控制原理图Fig.6 Schematic diagram of closed-loop control and schematic diagram of translated virtual DCS closed-loop control
可执行的仿真功能包括:仿真模式控制类的运行、冻结、加减速运行功能,以及仿真指令类的设置变量值、获取变量值、保存工况、装入工况、保存回溯条件、装入回溯条件、变量超控、通道故障设置等功能。
运行和冻结状态切换在用户指令线程接收,通过静态变量传递给周期循环线程,周期循环线程在判断是冻结状态时,不执行本周期的Level 1 与Level 0 的数据交互和算法运算,直接进行指令判断执行,并等待本周期时间结束。加减速功能通过用户指令线程接收速度因子,传递给周期循环线程,以此计算本周期总时间。由于算法运算的速度很快,因而实际上速度因子改变的是本周期算法及其它功能执行之后的等待时间。
设置变量值、获取变量值通过解析Level 1 与Level 0的头文件,计算待设置值或获取值变量在Level 1 与Level 0静态类中的偏移地址,通过指针操作实现设置值或取值。
保存工况、保存回溯条件功能通过将当前时刻的Level 1 与Level 0 的静态类的内容保存至物理文件,实现对该工况的保存。其内容包括输入数据、输出数据、算法中间数据(如时间相关算法块的中间数据)等。装入工况、装入回溯条件的过程与上述过程相反,将数据从物理文件写入Level 1 与Level 0 的静态类。
变量超控功能是指中断或修改Level 0 与Level 1 之间的输入输出数据。设置了超控状态的变量,在Level 1 与Level 0 交互的过程中,使用超控的变量值代替对方发来或发送给对方的数据值,以实现超控功能。
通道故障设置根据Level 1 点表中配置的每个变量所在的机箱、板卡、通道将该变量与虚拟的硬件设备绑定,设置通道故障时,其上变量的质量位会置坏,实现故障的模拟。
3 实例分析
图7 蒸汽发生器水位控制系统回路图Fig.7 Circuit diagram of steam generator water level control system
图8 工程师站组态逻辑图Fig.8 Configuration logic diagram of the engineering station
图9 Simulink平台的Level 1控制逻辑图Fig.9 Level 1 control logic diagram of Simulink platform
以简化的百万千瓦级压水堆核电厂蒸汽发生器水位控制系统为例,验证系统仿真效果。图7 为蒸汽发生器水位控制系统回路图。
该控制回路可分为Level 1 与Level 0 两部分。Level 1组态逻辑在工程师站实现。以中国核动力研究设计院研制的龙鳞(NASPIC)系统为例,在其工程师站绘制Level 1组态逻辑图,如图8 所示。
通过组态翻译软件将其自动地翻译到Simulink 平台,形成图9 所示的Simulink 平台的Level 1 控制逻辑图。
Level 0 部分的Simulink 模型由人工在Simulink 平台绘制,如图10 所示。
图10 Level 0部分Simulink模型Fig.10 Simulink model of Level 0
图11 仿真实验结果Fig.11 Simulation experiment results
如前文所述,Level 1 与Level 0 分别由运算调度软件调度,构成闭环仿真系统。仿真实验结果如图11 所示。仿真时水位设定值0mm 代表额定功率下水位稳定的相对值,而非实际水位。在蒸汽发生器水位调节过程中,验证冻结、运行、设置变量值、保存与装入工况等功能,并且能观察到虚假水位现象。结果符合预期。
4 结论
基于Simulink 代码生成器的翻译模拟式虚拟DCS 通过映射翻译的方法,将DCS 平台的组态逻辑翻译到Simulink,再借助Simulink 作为代码生成器,将逻辑转换为C++代码,再由编译器编译为*.lib 格式的算法文件,被虚拟DCS 周期调用。这种借助Simulink 作为代码生成器的方法降低了软件开发工作量,提高了代码安全可靠性。在周期循环中,执行仿真指令,实现仿真功能,并且能够周期性与Level 0进行数据交互,满足全范围模拟机的要求。