王悅霖 劉立士 韓東奇



摘 ? 要:針對某分布式聯合仿真系統,本文制定了分布式通信算法,利用Redis作為數據通信中間件,來實現前后臺之間的數據傳輸與交互。針對仿真系統進行應用測試與仿真結果分析,從而驗證分布式通信算法的準確性與有效性。
關鍵詞:分布式聯合仿真系統 ?Redis數據通信中間件 ?前后臺通信算法
中圖分類號:TP311.1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻標識碼:A ? ? ? ? ? ? ? ? ? ? ? ?文章編號:1674-098X(2019)09(b)-0138-03
多個領域的建模與聯合仿真的目標是將多個學科的模型進行高效的整合,借此來達成理想的設計、仿真與分析效果。針對某分布式聯合仿真系統,研究其前后臺之間的分布式通信算法,實現前后臺之間數據通信。
1 ?分布式聯合仿真系統
某分布式聯合仿真系統由仿真設計與控制系統(前臺)和通用仿真系統(后臺)兩部分組成,提供統一仿真設計、部署、執行與控制功能[1],完成仿真設計、仿真執行、仿真數據存儲與可視化等主要功能,以及從屬于上述系統軟件的管理功能,如圖1所示,通過對底層通信模塊的封裝實現分布式聯合仿真[2],。
2 ?Redis數據通信中間件
本系統主要采用Redis兩種數據通信模式實現仿真系統前后臺之間的數據通信,即:(1)利用Redis作為數據庫,以鍵值對的形式存儲所有的仿真執行參數、仿真模型以及一些仿真控制參數等實現通信,既保證了數據通信的可靠性又減少了數據冗余;(2)利用Redis頻道的基于訂閱發布的通信模式來完成前后臺間數據的通信。本系統將所有的仿真結果數據通過Redis頻道分發給系統前臺。
3 ?分布式通信算法在仿真系統前后臺的設計
3.1 前臺向后臺發送數據的通信算法設計
仿真系統的前臺利用Redis向后臺發送仿真數據的示意圖如圖2所示,前臺向后臺發送仿真控制命令、仿真參數信息、分布式部署信息、仿真模型參數和模型連接總圖信息。具體的數據包格式如下。
(1)仿真控制命令。
Redis中控制仿真工程的key設置為:root.projectCommand。數據包為:
①開始:{'Type':'CommandStart', 'ProjectName':'p1'};
②結束:{'Type':'CommandStop', 'ProjectName':'p1'};
③暫停:{'Type':'CommandPause', 'ProjectName':'p1'};
④步進:{'Type':'CommandRunOneStep', 'ProjectName':'p1'}。
(2)仿真參數。
Redis數據庫的鍵設置為:{pname}.control.projectParameter。
數據包為:dictParams={'start_time':0.0,'final_time':2.0,'input':None,'simResultFilter':filterDict,'opts':dictOpts};dictParams為總體數據,filterDict是仿真結果輸出端口和仿真時間的數據包,其結構為:
filterDict={'SF_001.mmrus':['tau1'],'__STEP__':10,'SF_001.load1':['phi1','w1']};
dictOpts參數數據包定義仿真步長、仿真開始、仿真結束、仿真延遲等,其結構為:dictOpts={'logging':False,'step_size':0.0001,'simStart':['SH_001.source'],'simEnd':None,'simDelay':{'SF_001.mmrus.tau1':5},'simResultFilter': filterDict,method:”A”};
Method是仿真算法,A表示通用仿真算法。
(3)分布式部署信息。
Redis的鍵設置為:{pname}.dis.config。數據包格式為:{'SF_001.load1':'192.168.229.37','SF_001.load2':'192.168.229.37','SF_001.source':'192.168.229.37','SF_001.mmrus':'192.168.229.37}。
(4)仿真模型參數。
Redis的鍵設置為:{pname}.fmu.fmuname。傳輸的數據包內容則為仿真模型的二進制序列。
(5)仿真模型連接總圖。
Redis的鍵設置為:{pname}.graph.config。數據包格式為:
dictConns = {'Graph':dictGraph, 'SF_001':dictSF_001, 'SH_001':dictSH_001};
dictGraph={'0':['SF_001.load1','phi1','SS_001.s_001','v1'],'1':['SF_001.source','tao1','SH_001.h_001','v1'],'2':['SS_001.s_001','v2','SF_001.source','phi1'],'3':['SH_001.h_001','v2','SF_001.load1','tau1']};
dictSF_001={"0":["source","tau1","load1","tau1"],"1":["load1","phi1","source","phi1"],"2":["load1","phi2","mmrus","phi1"],"3":["load1","w1","mmrus","w1"]};
dictGraph表示宏觀模型連接總圖結構,總圖的節點為各子圖。最后發送的數據包為dictConns。
3.2 后臺向前臺發送數據的通信算法設計
后臺利用Redis頻道向前臺發送仿真結果數據。Redis的頻道為:projectname.chResults2DB。發送的數據格式為:
{"SF_001.load1.w1":[0.0,0.0,0.0,-2.4991779829137363e-20,-1.363233070243509e-19],"step":0.05,"SF_001.mmrus.tau1":[-0.0,-0.0,-0.0,-0.0,-6.713921223149536e-18,-3.3265638919077216e-17]}。
4 ?分布式通信算法在仿真系統中的應用與測試
為了驗證本論文研究的分布式通信算法在某分布式聯合仿真系統前后臺之間的有效性和正確性,利用設計的仿真系統進行仿真,并對測試結果進行分析判斷。
本次測試案例中采用的仿真模型分別為source、load1、load2、mmrus。模型連接總圖為圖3所示。所選擇的仿真模型輸出端口為mmrus模型的tau1端口和load1模型的phi1端口。仿真結果分別如圖4和圖5所示。
使用OpenModelica軟件進行仿真對比實驗,利用相同的仿真模型以及模型接續關系,并且查看相同的模型輸出端口,仿真結果分別如圖6和圖7所示。
對兩個仿真系統的實驗結果進行比較分析,發現仿真結果圖形趨勢走向基本一致,仿真計算出的結果數據相符合,故可驗證本論文設計的基于Redis的分布式通信算法應用在某分布式聯合仿真系統前后臺間是準確有效的。
5 ?結語
本文闡述了某分布式聯合仿真系統的整體架構以及數據通信中間件的通信模式,并針對某系統設計出前后臺之間的分布式通信算法。通過利用仿真模型在系統上進行仿真測試,并且對測試結果進行對比分析,從而驗證分布式通信算法在仿真系統前后臺之間是正確性的。
參考文獻
[1] 魏映琳.等離子通信仿真平臺的分布式架構設計[D].西安電子科技大學,2014.
[2] 李閱歷.基于Java的Web服務器性能測試工具研究[J].河北農業大學學報,2005(1):92-96.