张 旭,邓志光,彭 韬,彭 浩
(中国核动力研究设计院 核反应堆系统设计技术重点实验室,成都 610213)
DCS的仿真主要包括3种技术路线,即纯模拟(Simulation)、虚拟实物(Emulation)和实物模拟(Stimulation)。除了对实物DCS人机界面和使用的特性要求高的场合(培训操纵人员),采用纯模拟的路线,将被仿真对象的算法逻辑翻译到另一套仿真平台,能够高效地实现仿真效果,且开发周期短、通用性强于虚拟实物路线。这种方法被称为翻译模拟(Translation)[1,2]。
基于Simulink的翻译模拟式虚拟DCS,其周期运算调度有两种实现形式:一种形式是仅利用Simulink作为代码生成器,将被翻译平台DCS组态翻译到Simulink上,并利用Simulink生成代码。经过编译生成*.dll、*.lib或其他格式的算法文件,再周期性调用该算法文件;另一种形式是虚拟DCS周期性向Simulink发送仿真运算指令(sim()),实现运算功能。两种形式的虚拟DCS的仿真功能均可在每周期算法运算之后进行处理。本文详细描述后一种形式的虚拟DCS。
图1 基于Simulink的翻译式虚拟DCS系统架构Fig.1 Simulink-based translational virtual DCS system architecture
采用翻译模拟方法的虚拟DCS应按照国家能源标准NB/T 20015—2010[3]实现仿真功能,具体包括仿真状态控制、变量值管理、工况相关功能3个方面。本文开发了一种基于Simulink平台的翻译模拟式虚拟DCS,实现了上述仿真功能。
基于Simulink的翻译模拟式虚拟DCS主要由两部分组成:一部分是组态翻译软件,另一部分是管理调度软件。前者实现从源平台DCS组态逻辑到Simulink组态逻辑的翻译,后者实现虚拟DCS的周期运算与仿真功能,包括每周期同步Level 0(工艺系统过程模型)发来的输入数据,进行本周期的运算,并执行仿真功能。
图1、图2分别为基于Simulink的翻译式虚拟DCS的系统架构图与软件流程图。
组态翻译完成后,算法调度阶段的各步流程如图3所示。先进行初始化阶段,读取点表、设置Simulink的配置信息与路径。然后,启动用户指令线程、计时线程与周期循环线程。用户指令线程循环等待用户输入指令,通过设置指令标志位与参数等形式将用户指令传递给周期循环线程。周期循环线程每周期调用Simulink进行本周期的运算,同时按照指令标志位和参数执行仿真功能。计时线程对仿真时间计时,与设置快慢速折算后的周期时间比较,发送下一周期开始的指令。
图2 基于Simulink的翻译模拟式虚拟DCS软件流程图Fig.2 Simulink-based translation analog virtual DCS software flowchart
图3 算法调度阶段流程图Fig.3 Algorithm scheduling stage flowchart
部分算法逻辑与时间相关,即本次运算结果与上一次或几次的计算结果相关(如RS触发器、PID算法块、回环反馈等)。按照Simulink平台自身的机制,当设置的仿真时间结束时,会清空上述中间变量,因而不能简单地通过每周期调用一次Simulink模型进行运算达到预期效果。在初始化阶段,通过设置Simulink配置参数,实现系统仿真的连续性。
以C#语言为例,通过命令行的方式,设置Simulink模型的配置参数。设置初始状态与结束状态为同一向量,实现上一次仿真的输出的状态值能作为下一次仿真的起始状态,实现多次调度的连续仿真。设置状态名为xFinal,命令行如下:
command = "set_param(modelName" + ",'InitialState'," +"'xFinal'" + ")";
command = "set_param(modelName" + ",'FinalStateName',"+ "'xFinal'" + ")";
修改计算方式为定步长,ode45算法,其命令行如下:
command = "set_param(modelName" + ",'Solver'," +"'ode45'" + ")";
图4 系统状态切换关系图Fig.4 System state switching graph
图5 基于Simulink的翻译模拟式虚拟DCS数据流图Fig.5 Simulink-based translation analog virtual DCS data flow diagram
仿真状态包括运行、冻结、定时长运行,各系统状态及切换关系如图4所示。仿真状态由管理调度软件控制,程序启动时,管理调度软件未向Simulink发出运算指令时,Simulink处于冻结状态,可通过指令进入运行和定时长运行状态。同时,还可设置快慢速变速运行。
可通过手动控制在运行和冻结两种模式之间切换,同时,可由冻结模式进入定时长运行模式。当管理调度软件发出指定时长的仿真运算时,进入定时长运行模式,并在该时长结束后自动进入冻结状态。
变速运行指加快仿真运行速度或减慢仿真运行速度。如前文所述,基于Simulink的翻译式虚拟DCS有两种形式,即仅使用Simulink作为代码生成器或使用Simulink作为核心运算单元。前者的算法提前编译为算法文件,调用时间很短,几乎可忽略不计,其每周期末的延时时间约等于周期时间;后者需使用Simulink运算,调用时间较慢,而且每周期的运算时间不能做到十分精确,因而需单独采用计时线程计时。在上一个周期结束后,周期循环线程将被锁住,等待计时线程发出允许下一周期开始信号。在算法复杂度正常的情况下,Simulink的运算时间一般小于1s,具体时长应考虑实际算法量测试而知。快慢速功能通过改变计时线程的周期计时时长实现。折算后的实际周期时长应大于Simulink的实际运算时间,否则会出现偏差。
管理调度软件维护仿真系统对外的数据点表,外部系统对变量赋值和取值通过管理调度软件实现。变量值分为原始值和超控值,原始值可被实时计算值冲刷代替,超控值不会被实时计算值覆盖。变量值的数据结构体包括原始值、超控标志位、超控值。实时计算值改变原始值,不改变超控值。当超控标志位为True时,认为超控值为该变量的实际使用数值。
对于赋原始值,管理调度软件为点表中的该变量结构体中的原始值位置赋值,对于赋超控值,管理调度软件将该结构体的超控标志位置为True,并为结构体中的超控值赋值。取值时,如果超控标志位为True,则取超控值,反之取原始值。每个周期运算开始时,管理调度软件按照上述规则向Simulink的输入变量存储区写入输入数据。
设置变量值是通过管理调度软件对变量赋值的过程,为了能通过Simulink以外的软件实现赋值功能,此类型的变量在Simulink中用常量Const算法块实现。以C#语言为例,通过如下命令行实现设置变量值功能:
command = "set_param('Model_name/" + VariableName +"','Value','" + VariableValue + "')";
故障模拟实现模拟Level 1平台某个板卡或某个信号通路故障,导致其对应的输入输出信号质量位为坏的情况。
故障模拟由管理调度软件实现,在管理调度软件读取设备组态文件与变量点表,获取每个变量所在板卡和通道。故障模拟时,改变该通道在管理调度软件中的状态记录,同时向Simulink模型置该变量的质量位为坏。对输出变量而言,其质量位会被实时计算值冲刷掉,向Simulink模型置变量质量位信息并没有实际意义。第三方软件可通过管理调度软件得到该故障信息。板卡故障可理解为批量设置的通道故障,即某张板卡的故障等效于该板卡上所有通道的变量的故障。
根据参考文献[3]的定义,工况指某时刻的数据状态,又称初始条件(Initial Condition),表示可从该状态开始新一次的实时模拟,由用户手动保存;回溯条件(Backtrack Condition)表示可重新设置模拟机回到的当前过程前的某一状态,由系统自动保存。工况文件除非用户主动删除,否则永久保存;回溯条件文件在每次仿真关闭系统后失效。
图5为基于Simulink的翻译模拟式虚拟DCS的数据流图。
虚拟DCS以Simulink为计算内核,每个周期计算前,Simulink获取外部程序输入值以及Matlab的workspace的输出变量、时间信息、时间相关变量等存储区的信息,然后调用Simulink计算内核执行1个周期的仿真计算。如有保存或装入工况指令,则将workspace的信息写入或从物理文件读取。周而复始实现周期的计算以及仿真功能。
图6 Simulink平台控制算法图Fig.6 Simulink platform control algorithm diagram
保存与装入工况功能是指系统当前的状态能够保存在物理文件中,不因软件停止或关机而丢失,并且能够按照指令重新装入系统。正常运行中,Simulink计算内核每周期更新MATLAB的workspace,并在下一周期以此为初始状态。收到保存工况指令后,管理调度软件令MATLAB将此时的workspace保存为*.mat格式的物理文件永久保存。装入工况是将*.mat的系统状态文件装回workspace,并在下一周期被系统作为初始状态使用,实现回到保存时的状态。
在与Level 0对接成全范围模拟机(FSS)时,部分写入Simulink输入变量存储区的数值取自Level 0,并由Level 0在每周期末读取Simulink写入物理文件的输出变量值。周期计算指令(定时长运行)由Level 0提供,Level 0每周期向虚拟DCS发送1次Level 0周期时长的定时长指令运行[4]。当Level 0与翻译模拟机构成的Level 1周期不一致时,周期短的一方将多进行1次或多次的重复计算,但这并不影响最终的仿真结果。
以简化的百万千瓦级压水堆核电厂蒸汽发生器水位调节系统为例,验证系统仿真效果。考虑到在FSS中虚拟DCS与过程模型对接的情况,蒸汽发生器水位调节系统拆分为Level 0 与Level 1两部分,其中Level 1部分采用PI控制器,由源DCS平台组态翻译到Simulink平台后如图6所示,具体的翻译过程不在本文中赘述。
与Level 0过程模型对接后形成小型FSS系统,通过两侧的输入输出数据交互,形成控制回路。在水位调节过程中,进行仿真功能的操作,包括修改变量值、冻结、保存与装入工况、设置快慢速等。
图7 仿真实验结果Fig.7 Simulation results
如前文所述,仅使用Simulink作为代码生成器的翻译模拟式虚拟DCS可在代码生成后独立于Simulink使用,而本文采用的以Simulink作为核心运算单元的技术路线需要启动Simulink软件,并实时向其发送指令。实验过程中,可观察到Simulink按周期接收指令被调用运算。
实验结果如图7所示。
由实验结果可知:仿真结果符合预期,各种仿真功能得到验证。说明基于Simulink作为运算内核的翻译模拟式虚拟DCS能够正确地实现仿真功能,且具备在FSS中与过程模型对接的能力。
基于Simulink平台的翻译模拟式虚拟DCS借助通用的高可靠性的Simulink仿真平台作为运算内核,减少了开发内容,降低了开发成本,提高了通用性和结果认可度。通过对Simulink运算数据区的管理和对Simulink平台的仿真调度,实现了仿真功能。