張 旭,鄧志光,彭 韜,彭 浩
(中國(guó)核動(dòng)力研究設(shè)計(jì)院 核反應(yīng)堆系統(tǒng)設(shè)計(jì)技術(shù)重點(diǎn)實(shí)驗(yàn)室,成都 610213)
DCS的仿真主要包括3種技術(shù)路線,即純模擬(Simulation)、虛擬實(shí)物(Emulation)和實(shí)物模擬(Stimulation)。除了對(duì)實(shí)物DCS人機(jī)界面和使用的特性要求高的場(chǎng)合(培訓(xùn)操縱人員),采用純模擬的路線,將被仿真對(duì)象的算法邏輯翻譯到另一套仿真平臺(tái),能夠高效地實(shí)現(xiàn)仿真效果,且開發(fā)周期短、通用性強(qiáng)于虛擬實(shí)物路線。這種方法被稱為翻譯模擬(Translation)[1,2]。
基于Simulink的翻譯模擬式虛擬DCS,其周期運(yùn)算調(diào)度有兩種實(shí)現(xiàn)形式:一種形式是僅利用Simulink作為代碼生成器,將被翻譯平臺(tái)DCS組態(tài)翻譯到Simulink上,并利用Simulink生成代碼。經(jīng)過編譯生成*.dll、*.lib或其他格式的算法文件,再周期性調(diào)用該算法文件;另一種形式是虛擬DCS周期性向Simulink發(fā)送仿真運(yùn)算指令(sim()),實(shí)現(xiàn)運(yùn)算功能。兩種形式的虛擬DCS的仿真功能均可在每周期算法運(yùn)算之后進(jìn)行處理。本文詳細(xì)描述后一種形式的虛擬DCS。

圖1 基于Simulink的翻譯式虛擬DCS系統(tǒng)架構(gòu)Fig.1 Simulink-based translational virtual DCS system architecture
采用翻譯模擬方法的虛擬DCS應(yīng)按照國(guó)家能源標(biāo)準(zhǔn)NB/T 20015—2010[3]實(shí)現(xiàn)仿真功能,具體包括仿真狀態(tài)控制、變量值管理、工況相關(guān)功能3個(gè)方面。本文開發(fā)了一種基于Simulink平臺(tái)的翻譯模擬式虛擬DCS,實(shí)現(xiàn)了上述仿真功能。
基于Simulink的翻譯模擬式虛擬DCS主要由兩部分組成:一部分是組態(tài)翻譯軟件,另一部分是管理調(diào)度軟件。前者實(shí)現(xiàn)從源平臺(tái)DCS組態(tài)邏輯到Simulink組態(tài)邏輯的翻譯,后者實(shí)現(xiàn)虛擬DCS的周期運(yùn)算與仿真功能,包括每周期同步Level 0(工藝系統(tǒng)過程模型)發(fā)來的輸入數(shù)據(jù),進(jìn)行本周期的運(yùn)算,并執(zhí)行仿真功能。
圖1、圖2分別為基于Simulink的翻譯式虛擬DCS的系統(tǒng)架構(gòu)圖與軟件流程圖。
組態(tài)翻譯完成后,算法調(diào)度階段的各步流程如圖3所示。先進(jìn)行初始化階段,讀取點(diǎn)表、設(shè)置Simulink的配置信息與路徑。然后,啟動(dòng)用戶指令線程、計(jì)時(shí)線程與周期循環(huán)線程。用戶指令線程循環(huán)等待用戶輸入指令,通過設(shè)置指令標(biāo)志位與參數(shù)等形式將用戶指令傳遞給周期循環(huán)線程。周期循環(huán)線程每周期調(diào)用Simulink進(jìn)行本周期的運(yùn)算,同時(shí)按照指令標(biāo)志位和參數(shù)執(zhí)行仿真功能。計(jì)時(shí)線程對(duì)仿真時(shí)間計(jì)時(shí),與設(shè)置快慢速折算后的周期時(shí)間比較,發(fā)送下一周期開始的指令。

圖2 基于Simulink的翻譯模擬式虛擬DCS軟件流程圖Fig.2 Simulink-based translation analog virtual DCS software flowchart

圖3 算法調(diào)度階段流程圖Fig.3 Algorithm scheduling stage flowchart
部分算法邏輯與時(shí)間相關(guān),即本次運(yùn)算結(jié)果與上一次或幾次的計(jì)算結(jié)果相關(guān)(如RS觸發(fā)器、PID算法塊、回環(huán)反饋等)。按照Simulink平臺(tái)自身的機(jī)制,當(dāng)設(shè)置的仿真時(shí)間結(jié)束時(shí),會(huì)清空上述中間變量,因而不能簡(jiǎn)單地通過每周期調(diào)用一次Simulink模型進(jìn)行運(yùn)算達(dá)到預(yù)期效果。在初始化階段,通過設(shè)置Simulink配置參數(shù),實(shí)現(xiàn)系統(tǒng)仿真的連續(xù)性。
以C#語言為例,通過命令行的方式,設(shè)置Simulink模型的配置參數(shù)。設(shè)置初始狀態(tài)與結(jié)束狀態(tài)為同一向量,實(shí)現(xiàn)上一次仿真的輸出的狀態(tài)值能作為下一次仿真的起始狀態(tài),實(shí)現(xiàn)多次調(diào)度的連續(xù)仿真。設(shè)置狀態(tài)名為xFinal,命令行如下:
command = "set_param(modelName" + ",'InitialState'," +"'xFinal'" + ")";
command = "set_param(modelName" + ",'FinalStateName',"+ "'xFinal'" + ")";
修改計(jì)算方式為定步長(zhǎng),ode45算法,其命令行如下:
command = "set_param(modelName" + ",'Solver'," +"'ode45'" + ")";

圖4 系統(tǒng)狀態(tài)切換關(guān)系圖Fig.4 System state switching graph

圖5 基于Simulink的翻譯模擬式虛擬DCS數(shù)據(jù)流圖Fig.5 Simulink-based translation analog virtual DCS data flow diagram
仿真狀態(tài)包括運(yùn)行、凍結(jié)、定時(shí)長(zhǎng)運(yùn)行,各系統(tǒng)狀態(tài)及切換關(guān)系如圖4所示。仿真狀態(tài)由管理調(diào)度軟件控制,程序啟動(dòng)時(shí),管理調(diào)度軟件未向Simulink發(fā)出運(yùn)算指令時(shí),Simulink處于凍結(jié)狀態(tài),可通過指令進(jìn)入運(yùn)行和定時(shí)長(zhǎng)運(yùn)行狀態(tài)。同時(shí),還可設(shè)置快慢速變速運(yùn)行。
可通過手動(dòng)控制在運(yùn)行和凍結(jié)兩種模式之間切換,同時(shí),可由凍結(jié)模式進(jìn)入定時(shí)長(zhǎng)運(yùn)行模式。當(dāng)管理調(diào)度軟件發(fā)出指定時(shí)長(zhǎng)的仿真運(yùn)算時(shí),進(jìn)入定時(shí)長(zhǎng)運(yùn)行模式,并在該時(shí)長(zhǎng)結(jié)束后自動(dòng)進(jìn)入凍結(jié)狀態(tài)。
變速運(yùn)行指加快仿真運(yùn)行速度或減慢仿真運(yùn)行速度。如前文所述,基于Simulink的翻譯式虛擬DCS有兩種形式,即僅使用Simulink作為代碼生成器或使用Simulink作為核心運(yùn)算單元。前者的算法提前編譯為算法文件,調(diào)用時(shí)間很短,幾乎可忽略不計(jì),其每周期末的延時(shí)時(shí)間約等于周期時(shí)間;后者需使用Simulink運(yùn)算,調(diào)用時(shí)間較慢,而且每周期的運(yùn)算時(shí)間不能做到十分精確,因而需單獨(dú)采用計(jì)時(shí)線程計(jì)時(shí)。在上一個(gè)周期結(jié)束后,周期循環(huán)線程將被鎖住,等待計(jì)時(shí)線程發(fā)出允許下一周期開始信號(hào)。在算法復(fù)雜度正常的情況下,Simulink的運(yùn)算時(shí)間一般小于1s,具體時(shí)長(zhǎng)應(yīng)考慮實(shí)際算法量測(cè)試而知??炻俟δ芡ㄟ^改變計(jì)時(shí)線程的周期計(jì)時(shí)時(shí)長(zhǎng)實(shí)現(xiàn)。折算后的實(shí)際周期時(shí)長(zhǎng)應(yīng)大于Simulink的實(shí)際運(yùn)算時(shí)間,否則會(huì)出現(xiàn)偏差。
管理調(diào)度軟件維護(hù)仿真系統(tǒng)對(duì)外的數(shù)據(jù)點(diǎn)表,外部系統(tǒng)對(duì)變量賦值和取值通過管理調(diào)度軟件實(shí)現(xiàn)。變量值分為原始值和超控值,原始值可被實(shí)時(shí)計(jì)算值沖刷代替,超控值不會(huì)被實(shí)時(shí)計(jì)算值覆蓋。變量值的數(shù)據(jù)結(jié)構(gòu)體包括原始值、超控標(biāo)志位、超控值。實(shí)時(shí)計(jì)算值改變?cè)贾担桓淖兂刂怠.?dāng)超控標(biāo)志位為True時(shí),認(rèn)為超控值為該變量的實(shí)際使用數(shù)值。
對(duì)于賦原始值,管理調(diào)度軟件為點(diǎn)表中的該變量結(jié)構(gòu)體中的原始值位置賦值,對(duì)于賦超控值,管理調(diào)度軟件將該結(jié)構(gòu)體的超控標(biāo)志位置為True,并為結(jié)構(gòu)體中的超控值賦值。取值時(shí),如果超控標(biāo)志位為True,則取超控值,反之取原始值。每個(gè)周期運(yùn)算開始時(shí),管理調(diào)度軟件按照上述規(guī)則向Simulink的輸入變量存儲(chǔ)區(qū)寫入輸入數(shù)據(jù)。
設(shè)置變量值是通過管理調(diào)度軟件對(duì)變量賦值的過程,為了能通過Simulink以外的軟件實(shí)現(xiàn)賦值功能,此類型的變量在Simulink中用常量Const算法塊實(shí)現(xiàn)。以C#語言為例,通過如下命令行實(shí)現(xiàn)設(shè)置變量值功能:
command = "set_param('Model_name/" + VariableName +"','Value','" + VariableValue + "')";
故障模擬實(shí)現(xiàn)模擬Level 1平臺(tái)某個(gè)板卡或某個(gè)信號(hào)通路故障,導(dǎo)致其對(duì)應(yīng)的輸入輸出信號(hào)質(zhì)量位為壞的情況。
故障模擬由管理調(diào)度軟件實(shí)現(xiàn),在管理調(diào)度軟件讀取設(shè)備組態(tài)文件與變量點(diǎn)表,獲取每個(gè)變量所在板卡和通道。故障模擬時(shí),改變?cè)撏ǖ涝诠芾碚{(diào)度軟件中的狀態(tài)記錄,同時(shí)向Simulink模型置該變量的質(zhì)量位為壞。對(duì)輸出變量而言,其質(zhì)量位會(huì)被實(shí)時(shí)計(jì)算值沖刷掉,向Simulink模型置變量質(zhì)量位信息并沒有實(shí)際意義。第三方軟件可通過管理調(diào)度軟件得到該故障信息。板卡故障可理解為批量設(shè)置的通道故障,即某張板卡的故障等效于該板卡上所有通道的變量的故障。
根據(jù)參考文獻(xiàn)[3]的定義,工況指某時(shí)刻的數(shù)據(jù)狀態(tài),又稱初始條件(Initial Condition),表示可從該狀態(tài)開始新一次的實(shí)時(shí)模擬,由用戶手動(dòng)保存;回溯條件(Backtrack Condition)表示可重新設(shè)置模擬機(jī)回到的當(dāng)前過程前的某一狀態(tài),由系統(tǒng)自動(dòng)保存。工況文件除非用戶主動(dòng)刪除,否則永久保存;回溯條件文件在每次仿真關(guān)閉系統(tǒng)后失效。
圖5為基于Simulink的翻譯模擬式虛擬DCS的數(shù)據(jù)流圖。
虛擬DCS以Simulink為計(jì)算內(nèi)核,每個(gè)周期計(jì)算前,Simulink獲取外部程序輸入值以及Matlab的workspace的輸出變量、時(shí)間信息、時(shí)間相關(guān)變量等存儲(chǔ)區(qū)的信息,然后調(diào)用Simulink計(jì)算內(nèi)核執(zhí)行1個(gè)周期的仿真計(jì)算。如有保存或裝入工況指令,則將workspace的信息寫入或從物理文件讀取。周而復(fù)始實(shí)現(xiàn)周期的計(jì)算以及仿真功能。

圖6 Simulink平臺(tái)控制算法圖Fig.6 Simulink platform control algorithm diagram
保存與裝入工況功能是指系統(tǒng)當(dāng)前的狀態(tài)能夠保存在物理文件中,不因軟件停止或關(guān)機(jī)而丟失,并且能夠按照指令重新裝入系統(tǒng)。正常運(yùn)行中,Simulink計(jì)算內(nèi)核每周期更新MATLAB的workspace,并在下一周期以此為初始狀態(tài)。收到保存工況指令后,管理調(diào)度軟件令MATLAB將此時(shí)的workspace保存為*.mat格式的物理文件永久保存。裝入工況是將*.mat的系統(tǒng)狀態(tài)文件裝回workspace,并在下一周期被系統(tǒng)作為初始狀態(tài)使用,實(shí)現(xiàn)回到保存時(shí)的狀態(tài)。
在與Level 0對(duì)接成全范圍模擬機(jī)(FSS)時(shí),部分寫入Simulink輸入變量存儲(chǔ)區(qū)的數(shù)值取自Level 0,并由Level 0在每周期末讀取Simulink寫入物理文件的輸出變量值。周期計(jì)算指令(定時(shí)長(zhǎng)運(yùn)行)由Level 0提供,Level 0每周期向虛擬DCS發(fā)送1次Level 0周期時(shí)長(zhǎng)的定時(shí)長(zhǎng)指令運(yùn)行[4]。當(dāng)Level 0與翻譯模擬機(jī)構(gòu)成的Level 1周期不一致時(shí),周期短的一方將多進(jìn)行1次或多次的重復(fù)計(jì)算,但這并不影響最終的仿真結(jié)果。
以簡(jiǎn)化的百萬千瓦級(jí)壓水堆核電廠蒸汽發(fā)生器水位調(diào)節(jié)系統(tǒng)為例,驗(yàn)證系統(tǒng)仿真效果??紤]到在FSS中虛擬DCS與過程模型對(duì)接的情況,蒸汽發(fā)生器水位調(diào)節(jié)系統(tǒng)拆分為L(zhǎng)evel 0 與Level 1兩部分,其中Level 1部分采用PI控制器,由源DCS平臺(tái)組態(tài)翻譯到Simulink平臺(tái)后如圖6所示,具體的翻譯過程不在本文中贅述。
與Level 0過程模型對(duì)接后形成小型FSS系統(tǒng),通過兩側(cè)的輸入輸出數(shù)據(jù)交互,形成控制回路。在水位調(diào)節(jié)過程中,進(jìn)行仿真功能的操作,包括修改變量值、凍結(jié)、保存與裝入工況、設(shè)置快慢速等。

圖7 仿真實(shí)驗(yàn)結(jié)果Fig.7 Simulation results
如前文所述,僅使用Simulink作為代碼生成器的翻譯模擬式虛擬DCS可在代碼生成后獨(dú)立于Simulink使用,而本文采用的以Simulink作為核心運(yùn)算單元的技術(shù)路線需要啟動(dòng)Simulink軟件,并實(shí)時(shí)向其發(fā)送指令。實(shí)驗(yàn)過程中,可觀察到Simulink按周期接收指令被調(diào)用運(yùn)算。
實(shí)驗(yàn)結(jié)果如圖7所示。
由實(shí)驗(yàn)結(jié)果可知:仿真結(jié)果符合預(yù)期,各種仿真功能得到驗(yàn)證。說明基于Simulink作為運(yùn)算內(nèi)核的翻譯模擬式虛擬DCS能夠正確地實(shí)現(xiàn)仿真功能,且具備在FSS中與過程模型對(duì)接的能力。
基于Simulink平臺(tái)的翻譯模擬式虛擬DCS借助通用的高可靠性的Simulink仿真平臺(tái)作為運(yùn)算內(nèi)核,減少了開發(fā)內(nèi)容,降低了開發(fā)成本,提高了通用性和結(jié)果認(rèn)可度。通過對(duì)Simulink運(yùn)算數(shù)據(jù)區(qū)的管理和對(duì)Simulink平臺(tái)的仿真調(diào)度,實(shí)現(xiàn)了仿真功能。