<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動化 > 設(shè)計應(yīng)用 > 柴油發(fā)電機組轉(zhuǎn)速控制半物理仿真的分析

          柴油發(fā)電機組轉(zhuǎn)速控制半物理仿真的分析

          作者: 時間:2008-11-12 來源:網(wǎng)絡(luò) 收藏

            1 引言

            電子調(diào)速器是柴油機的關(guān)鍵部件之一,當實際柴油機及其負載性能發(fā)生變化且與調(diào)速器設(shè)計參數(shù)不匹配時,就無法正常工作,這時需要修改調(diào)速器的。另外,電子調(diào)速器在出廠前和維修后都需要進行性能試驗,以設(shè)定合適的滿足其調(diào)節(jié)性能。在柴油機上直接進行電子調(diào)速器的參數(shù)整定、性能測試、維修后性能恢復(fù)既不安全、又不經(jīng)濟。進行是調(diào)速器進行實際配機試驗之前不可缺少的環(huán)節(jié),其工程思路是建立柴油機發(fā)電機組全工作范圍動態(tài)仿真模型,通過輸入輸出接口電路與電子調(diào)速器相連構(gòu)成一閉環(huán)控制系統(tǒng),從而完成電子調(diào)速器的性能測試的相關(guān)試驗。

            建立的仿真模型是Simulink的強項。由于系統(tǒng)需要連接特定的硬件設(shè)備,仿真程序需要定制人機界面實現(xiàn)參數(shù)設(shè)置等功能,這部分功能的實現(xiàn)對于Simulink來講則難以完成,而這恰恰是Visual C++(VC)的強項。VC可視化C++編程環(huán)境具有強大的硬件控制功能和靈活豐富的人機界面設(shè)計功能。但直接采用VC建立的仿真模型則難度很大。

            針對這一問題本文提供一種從Simulink仿真模型平滑過渡到Visual C++集成開發(fā)環(huán)境的方法。具體實現(xiàn)是在Simulink中建立柴油發(fā)電機組的仿真模型,然后通過Matlab實時工作間(RTW)將Simulink仿真模型轉(zhuǎn)化成可移植的嵌入式C++,最后和Visual C++的項目文件進行整合構(gòu)成完全獨立運行的實時系統(tǒng)。

            2 柴油發(fā)電機組模型的構(gòu)建及半物理仿真系統(tǒng)結(jié)構(gòu)

            柴油機的建模一般有2種途徑,一種是數(shù)學機理建模,一種是試驗辨識建模。數(shù)學機理建模主要從柴油機各部件的原始特性和結(jié)構(gòu)參數(shù)入手,根據(jù)動力學和熱力學關(guān)系方程建立機理模型其建模的工作量大,計算復(fù)雜而且為模型的求解帶來一定的難度。試驗辨識建模是根據(jù)柴油機試驗臺試驗數(shù)據(jù),采用不同的數(shù)學擬合方法建立柴油機的數(shù)學模型。對于研究電子調(diào)速器參數(shù)整定以及配機試驗,這里關(guān)心柴油機外部性能參數(shù)的關(guān)系,可以不考慮柴油機內(nèi)部的熱力過程。只要柴油發(fā)電機組仿真模型能較真實地模擬柴油機及其負載特性,則測試結(jié)果就能較為真實地反映出電子調(diào)速器的實際配機性能。

            因此選用試驗辨識建模法,應(yīng)用BP神經(jīng)網(wǎng)絡(luò)建立柴油機發(fā)電機組模型。如圖1所示。MTU396柴油發(fā)電機組控制半物理仿真系統(tǒng)的輸人輸出信號,主要有3種類型:

            (1)脈寬調(diào)制(PWM)信號,即執(zhí)行機構(gòu)齒條驅(qū)動信號;

            (2)頻率信號,即模擬柴油脈沖信號;

            (3)信號,即對電子調(diào)速器的各種控制信號,如啟動、停止、增速減速控制等。

            本系統(tǒng)選用研華的PCI-1780計數(shù)器卡,他提供8個16位計數(shù)器通道8路數(shù)字量輸出和8路數(shù)字量輸入,可以滿足上述需要。如圖2所示。

            

            3 半物理仿真系統(tǒng)的實現(xiàn)

            3.1 利用RTW生成可移植的C++模型

            RTW是Matlab圖形建模和仿真環(huán)境Simulink的一個重要的補充功能,簡而言之,他是一個基于Simulink的自動生成環(huán)境。他能直接從Simulink的模型中產(chǎn)生優(yōu)化的,可移植的代碼以加速仿真系統(tǒng)開發(fā)的過程和降低研發(fā)成本。

            RTW能把Simulink模型中的某些參數(shù)或信號設(shè)置為,模型自動生成的可執(zhí)行代碼在目標系統(tǒng)中運行時,可以方便地與Simulink模型交互,實現(xiàn)在線參數(shù)調(diào)整和信號通訊。利用RTW這種功能,可把模型中需要調(diào)整、監(jiān)測的參數(shù)或者信號設(shè)置為。這些變量構(gòu)成后面所述VC仿真程序中間交互的橋梁。

            RTW支持多種目標,所以RTW自動生成C++模型代碼有多種選擇,對于VC而言有3種目標可以選擇:通用實時(GRT)目標、通用實時(GRTM)目標、嵌入式目標。通用實時(GRT)目標采用實時代碼格式,其內(nèi)存的分配在編譯時被靜態(tài)聲明。通用實時(GRTM)目標采用實時代碼格式,他與實時代碼格式非常相似,主要的區(qū)別在于實時malloc代碼格式對內(nèi)存進行動態(tài)聲明。嵌入式目標可按嵌入式代碼格式生C++代碼,在運行速度、內(nèi)存使用量和簡化等方面都進行了優(yōu)化。嵌入式代碼采用靜態(tài)內(nèi)存分配方式。本文選擇嵌入式目標來自動生成嵌入式代碼。

            RTW自動生成的代碼分為2部分:一部分是模型代碼;另一部分是代碼運行界面(run-time interface)。這些代碼被切分成很多源代碼文件,為了管理這個龐大的項目,RTW還為其自動生成一個make文件。用VC打開make文件并編譯,然后將此項目中引用的所有源文件從Matlab安裝目錄中復(fù)制出來,并和模型代碼共同組成仿真模型代碼。

            3.2 模型代碼和VC程序的集成

            模型代碼同VC程序整合過程比較簡單,把3.1節(jié)仿真運算所有涉及的源文件添加到VC程序項目中,需要注意2點:仿真模塊的源文件添加到VC程序項目后默認應(yīng)用預(yù)編譯頭文件選項,必須手工取消此項設(shè)置否則編譯出錯;為了需要在VC程序中調(diào)用仿真代碼的接口函數(shù)需要進行全局聲明。

            3.3 VC中仿真系統(tǒng)進一步開發(fā)與整合

            半物理仿真軟件一般由人機界面模塊、數(shù)據(jù)采集模塊、仿真運算模塊、數(shù)據(jù)處理模塊組成。MTU396柴油發(fā)電機組控制半物理仿真系統(tǒng)原理如圖3所示。下面簡單介紹各模塊的實現(xiàn)過程。

            (1)人機界面模塊的實現(xiàn)

            人機界面模塊構(gòu)成了VC程序的,主要完成變量的實時顯示、參數(shù)在線調(diào)整、設(shè)置和程序的運行控制等功能,其他模塊都由他來調(diào)度。本系統(tǒng)中涉及的實時變量有柴油機轉(zhuǎn)速、齒桿位移、柴油機負載等,筆者分別設(shè)計了轉(zhuǎn)速表、棒圖、趨勢曲線、調(diào)整滑桿、功能按鈕等圖元,充分利用面向?qū)ο蠓椒ǖ姆庋b、繼承等特點實現(xiàn)整個圖元庫,從而提高了軟件系統(tǒng)的可修改性、可重用性和可擴展性。

            (2)數(shù)據(jù)采集模塊的實現(xiàn)

            數(shù)據(jù)采集模塊通過PCI-1780設(shè)備卡同電子調(diào)速器進行數(shù)據(jù)交互,電子調(diào)速器的供油量信號以脈寬調(diào)制(PWM)的形式由PCI-1780設(shè)備卡傳給仿真程序,仿真程序通過仿真計算把柴油機的轉(zhuǎn)速以頻率信號的形式經(jīng)PCI-1780設(shè)備卡反饋給電子調(diào)速器。數(shù)據(jù)采集模塊由廠家提供的設(shè)備驅(qū)動API函數(shù)實現(xiàn)。

            (3)仿真運算模塊的實現(xiàn)

            仿真運算模塊在RTW轉(zhuǎn)化韻仿真模型代碼基礎(chǔ)上還要加入仿真同步控制,以滿足仿真的實時性要求。實時性的關(guān)鍵就是I/O數(shù)據(jù)定時的準確性。眾所周知Windows不是實時操作系統(tǒng)而是多任務(wù)的操作系統(tǒng),采用VC編制的仿真程序很難實現(xiàn)硬件中斷,采用軟件定時是比較可行的方法,因為現(xiàn)在的計算機速度都很快,能夠保證一般硬件在回路仿真的實時性的需要。

            VC中實現(xiàn)精確定時基本上有2種方法:①使用多媒體定時器。他使用單獨線程調(diào)用一個特殊的回調(diào)函數(shù)優(yōu)先級很高,最小定時間隔為1ms能夠滿足一般實時任務(wù)的定時要求。②使用高性能計數(shù)器。在Windows2000中由硬件實現(xiàn)高精度的計數(shù)器(high-resolution performancecounter),利用他可以獲得高精度的定時間隔。由于本應(yīng)用中電子調(diào)速器輸出頻率為80 Hz,本文選擇多媒體計時器實現(xiàn)仿真控制,定時間隔選為2 ms。即多媒體定時器每隔2 ms就在其回調(diào)函數(shù)中調(diào)用模型代碼接口函數(shù)rt_On-eStep(模型單步運算),保證整個仿真的向前推進,滿足系統(tǒng)實時性要求。仿真運算模塊完成模型實時計算是整個系統(tǒng)的核心。

            

            (4)數(shù)據(jù)處理模塊的實現(xiàn)

            數(shù)據(jù)處理模塊完成仿真數(shù)據(jù)的實時記錄和定時保存功能。為了滿足數(shù)據(jù)記錄的實時性,仿真程序采用了多線程的技術(shù),將數(shù)據(jù)定時保存功能放在獨立的數(shù)據(jù)保存線程中執(zhí)行。數(shù)據(jù)處理線程和的之間的同步由事件信號驅(qū)動。在C++標準模板庫(STL),deque容器基礎(chǔ)上創(chuàng)建了CPointsCollection類來完成數(shù)據(jù)的實時記錄和定時保存。采用的策略是:CPointsCollection首先在內(nèi)存中開辟2塊緩沖區(qū)。第一緩沖區(qū)數(shù)據(jù)放滿后,數(shù)據(jù)開始存放到第二緩沖區(qū),然后同時通知數(shù)據(jù)保存線程將第一緩沖區(qū)中的數(shù)據(jù)采用VC序列化功能保存到硬盤的文本文件中;等第二緩沖區(qū)數(shù)據(jù)放滿后,數(shù)據(jù)開始存放到第一緩沖區(qū),主線程同時通知數(shù)據(jù)保存線程將第二緩沖的數(shù)據(jù)保存到硬盤的文本文件中,這樣依次循環(huán)保證數(shù)據(jù)記錄的實時性。為了驗證利用該方法開發(fā)的半物理仿真系統(tǒng)的有效性,運行該系統(tǒng)與R082電子調(diào)速器物理連接進行配機試驗,仿真結(jié)果表明仿真系統(tǒng)相應(yīng)符合理論分析結(jié)果。限于篇幅給出空載起動運行時的運行界面。如圖4所示。

            

            4 結(jié) 語

            結(jié)合科研實例詳細介紹一種基于RTW和VisualC++的半物理仿真系統(tǒng)快速開發(fā)方法,該方法充分利用Simulink和Visual C++各自的優(yōu)勢。首先利用Simulink可視化的建模方法建立系統(tǒng)的仿真模型,然后通過RTW將Simulink仿真模型轉(zhuǎn)化成可移植的嵌入式C++代碼,最后利用Visual C++靈活的可定制性和強大的界面功能實現(xiàn)完全獨立運行的實時半物理仿真系統(tǒng)。該仿真程序在Visual C++環(huán)境下可以對仿真程序方便的進行調(diào)試a與傳統(tǒng)設(shè)計方法相比這種方法具有費用低、效率高的特點。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();