摘要:在分析火電廠報警系統(tǒng)實(shí)際需要和現(xiàn)有系統(tǒng)不足的基礎(chǔ)上,給出了火電廠語音報警系統(tǒng)的硬件結(jié)構(gòu)和軟件組成,重點(diǎn)分析了DirectSound技術(shù)在語音報警系統(tǒng)中的應(yīng)用,給出了語音捕獲、聲音輸出的一般方法和結(jié)合內(nèi)存映射文件提高系統(tǒng)性能的方法。實(shí)際應(yīng)用表明,基于DirectSound的語音報警系統(tǒng)性能優(yōu)良,具有較好的實(shí)用價值。
關(guān)鍵詞:廠級監(jiān)控信息系統(tǒng);實(shí)時畫面;AJAX;Web服務(wù)
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2010)02-455-02
Voice Alarm System in Power Plant Based on DirectSound
LIU Ying
(Department of Electrical and Automation, Nanjing Institute of Industry Technology, Nanjing 210046, China)
Abstract: In the analysis of power plant alarm system less than the actual needs and existing systems based onpower plant are given voice alarm system's hardware architecture and software, focused on analyzing DirectSound technology in the voice alarm system applications, is given audio capture, audio output and integration of the general approach to improve system performance, memory-mapped file approach. Practical application shows that the voice alarm system based on DirectSound excellent performance, and has good practical value.
Key words: voice alarm; directsound; memory-mapped
報警系統(tǒng)作為大型工礦企業(yè)維持正常生產(chǎn)過程安全運(yùn)行的重要組成部分,特別是在自動化程度較高的企業(yè)生產(chǎn)流程(如大容量火電機(jī)組的集控運(yùn)行)中,報警系統(tǒng)在預(yù)防和避免事故發(fā)生方面發(fā)揮著重要作用,目前的報警形式主要有“視覺”和“聲覺”兩種方式,對于DCS等典型電站控制系統(tǒng)而言,視覺主要變現(xiàn)為光字牌或控制臺顯示器中的閃爍、變色等方式,聲覺主要表現(xiàn)為頻率單調(diào)的報警聲音,這些形式均存在操作員發(fā)現(xiàn)、辨別困難,多個報警源并存時故障定位慢等缺點(diǎn),這對電廠的安全生產(chǎn)造成威脅,而語音報警系統(tǒng)則彌補(bǔ)了這些缺陷。
目前大多數(shù)控制系統(tǒng)的語音報警系統(tǒng)是集成在控制系統(tǒng)內(nèi)部作為附屬系統(tǒng)存在的,由于是附屬系統(tǒng),其功能和性能均受到限制,出現(xiàn)如不能調(diào)換語音、不能靈活控制報警級別等問題。專門的語音報警系統(tǒng)則可避免這方面的問題。本文針對火電廠一體化語音報警系統(tǒng)實(shí)現(xiàn)進(jìn)行研究,并重點(diǎn)討論DirectSound技術(shù)的應(yīng)用。
1 系統(tǒng)組成
1.1 硬件結(jié)構(gòu)
語音報警系統(tǒng)硬件上主要通過在工程師站設(shè)置一臺工控機(jī)和相應(yīng)的功放(功放數(shù)目由控制系統(tǒng)數(shù)目決定),以及在主控室放置音箱來實(shí)現(xiàn)的。該工控機(jī)首先使用OPC、MODBUS等協(xié)議從DCS獲得生產(chǎn)實(shí)時數(shù)據(jù),經(jīng)過綜合數(shù)學(xué)和邏輯計(jì)算和數(shù)據(jù)狀態(tài)分析后,找出需要報警的數(shù)據(jù)點(diǎn),按照一定的關(guān)系(報警優(yōu)先級、報警到達(dá)時間等)找出需要報警的數(shù)據(jù)點(diǎn),以語音方式在主控室予以提示,在主控室可設(shè)置專門的消音按鈕或在DCS報警畫面中集成消音按鈕供報警確認(rèn),如圖1所示。
1.2 軟件組成
該系統(tǒng)由兩個核心模塊組成:語音報警主模塊和控制系統(tǒng)接口模塊。
語音報警模塊是語音報警系統(tǒng)的主程序,是重要參數(shù)語音報警輸出的關(guān)鍵程序,該程序可對生產(chǎn)過程中的模擬量、開關(guān)量進(jìn)行計(jì)算分析并語音輸出,且各種數(shù)學(xué)運(yùn)算和邏輯運(yùn)算均可方便配置和更改;該程序在報警過程中遵循先到先報警、優(yōu)先級高先報警、報警點(diǎn)占用時間過長自動調(diào)整等原則,可靈活設(shè)定報警點(diǎn)的報警優(yōu)先級,并可根據(jù)報警到達(dá)時間和持續(xù)時間進(jìn)行調(diào)整,該程序配合有專門的組態(tài)程序?qū)缶c(diǎn)和報警邏輯進(jìn)行配置。
控制系統(tǒng)接口模塊完成從控制系統(tǒng)獲取現(xiàn)場生產(chǎn)數(shù)據(jù)的工作。該模塊一般由兩部分組成,一是數(shù)據(jù)采集部分,使用Modbus、DDE、OPC、TCP/IP等通訊方式從控制系統(tǒng)實(shí)時獲取數(shù)據(jù);另一個是數(shù)據(jù)發(fā)送部分,該部分負(fù)責(zé)將數(shù)據(jù)采用UPD協(xié)議轉(zhuǎn)發(fā)至語音報警組成。
此外,為確保語音報警系統(tǒng)的完善有效運(yùn)行,還具有語音錄制管理模塊、報警歷史數(shù)據(jù)統(tǒng)計(jì)分析模塊、GPS時鐘同步模塊、系統(tǒng)運(yùn)行管理模塊等輔助模塊。
2 DirectSound技術(shù)
有上節(jié)分析可知,一體化報警系統(tǒng)在同一臺主機(jī)上針對多個控制系統(tǒng)進(jìn)行報警,這就需要解決多路語音系統(tǒng)從同一臺工控主機(jī)互不影響輸出的問題。本系統(tǒng)采用DirectSound技術(shù)解決這一問題。
2.1 DirectX概述
DirectX 是 Microsoft 開發(fā)的專門用于開發(fā)游戲和多媒體軟件的應(yīng)用程序接口,它包含編制高級計(jì)算機(jī)游戲和多媒體應(yīng)用程序的最新技術(shù)工具, 可以方便的實(shí)現(xiàn)圖形/圖像、 動畫、多媒體等方面的應(yīng)用開發(fā)。DirectX具有 DOS的直接硬件訪問特性 ,又具有硬件獨(dú)立性 ,免除了添加新硬件時的硬件識別問題。另外 ,DirectX具有利用硬件加速的能力 ,不需要寫任何專用代碼 ,就能自動地實(shí)現(xiàn)硬件加速[1]。
2.2 DirectSound技術(shù)
DirectSound是DirectX的一個音頻處理方面的重要組成部分,使用DirectSound可便捷的對波形聲音進(jìn)行捕獲、播放、混音等操作,并可以直接訪問相關(guān)設(shè)備和相應(yīng)的驅(qū)動程序來獲得更多的服務(wù)。本系統(tǒng)中使用DirectSound技術(shù)初始化具有特定GUID(Global Unique Identifier,全局唯一標(biāo)識符)的設(shè)備并設(shè)定其優(yōu)先級,然后生成特定播放配置和播放緩沖區(qū)對象對聲音進(jìn)行播放和控制。DirectSound是實(shí)現(xiàn)語音報警多路語音信號并行輸出的關(guān)鍵技術(shù),按組態(tài)期和運(yùn)行期分別完成語音捕獲和語音輸出的工作。
2.3 語音捕獲
語音的捕獲主要由捕獲設(shè)備獲取、捕獲緩沖區(qū)對象生成、緩沖區(qū)位置通告幾部分組成[2]。
1)捕獲設(shè)備獲取
為獲取捕獲設(shè)備,首先創(chuàng)建DirectSoundCapture對象從而可以從輸入設(shè)備捕獲數(shù)字聲音信號的接口,該函數(shù)返回該函數(shù)返回 COM 接口 IDirectSoundCapture 的一個指針。應(yīng)該注意這時DirectSoundCapture和DirectSound對象同時存在, 所以要求聲音設(shè)備的兩個DMA通道都可用。
2)捕獲緩沖區(qū)對象生成
調(diào)用函數(shù)CreateCaptureBuffer 方法可以創(chuàng)建一個捕獲緩沖區(qū),用來暫時存放被捕獲到的數(shù)據(jù)。 該函數(shù)中有一個DSCBUFFERDESC結(jié)構(gòu)的參數(shù),用來描述要得到的緩沖區(qū)的特征。
3)緩沖區(qū)位置通告
在聲音捕獲的過程中,希望當(dāng)前的讀取位置指針到達(dá)緩沖區(qū)的某一點(diǎn)或結(jié)尾時候可以及時地通知應(yīng)用程序,以便對捕獲到的數(shù)據(jù)進(jìn)行實(shí)時處理。此時可用 SetNotificationPositions 方法在緩沖區(qū)中設(shè)置通知點(diǎn)。當(dāng)讀取指針到達(dá)設(shè)定的通知點(diǎn)時候,該點(diǎn)對應(yīng)的事件就發(fā)生了。如果通知點(diǎn)不止一個,只需定義一個數(shù)組即可。
在以上基本步驟的基礎(chǔ)上,依次調(diào)用Start函數(shù)開始進(jìn)行捕獲,利用WaitForMultipleObjects監(jiān)視通知點(diǎn)對應(yīng)事件的狀態(tài),最后使用Lock函數(shù)鎖定緩沖區(qū)并調(diào)用Stop停止捕獲即可獲得數(shù)字音頻信號。
2.4 語音輸出
當(dāng)接口程序發(fā)送數(shù)據(jù)中具有報警點(diǎn)時,系統(tǒng)載入語音文件并進(jìn)行指定通道輸出以避免聲音交叉。實(shí)現(xiàn)的主要步驟如下[3]:
1) 創(chuàng)建 DirectSound中的Device對象。
2) 使用SetCooperativeLevel方法設(shè)置用戶設(shè)備的協(xié)作優(yōu)先級別。為使應(yīng)用程序之間可以輪流切換使用聲音設(shè)備,應(yīng)使用一般優(yōu)先級設(shè)定。
3) 調(diào)用CreateSoundBuffer方法創(chuàng)建 DirectSound回放緩沖區(qū)
4) 播放 DirectSound緩沖區(qū)。
5) 釋放 DirectSound。在報警結(jié)束或用戶確認(rèn)報警之后,應(yīng)對各對象進(jìn)行清理。
基本代碼如下[4]:
UseDevice=new Device(iGuid);
UseDevice.SetCooperativeLevel(this,CooperativeLevel.Priority);
BufferDescription desc = new BufferDescription();
UseSecBuff=newSecondaryBuffer(pTagInfo[i].VAFile, desc,UseDevice);
UseSecBuff.Play(0,BufferPlayFlags.Looping);
本系統(tǒng)通過引入DirectSound技術(shù),一方面解決了一體化系統(tǒng)的語音并發(fā)問題,另一方面提高了語音播放的性能和控制的便捷性。
3 內(nèi)存映射文件
在火電廠的語音報警系統(tǒng)中,由于控制系統(tǒng)眾多,單個控制系統(tǒng)預(yù)報警的數(shù)據(jù)點(diǎn)眾多,語音文件總體積往往在一個工控機(jī)內(nèi)達(dá)到數(shù)百兆,如何快速從磁盤上讀取文件是本系統(tǒng)的一個重要的性能瓶頸。為解決該瓶頸,本系統(tǒng)引入內(nèi)存映射技術(shù),預(yù)先將大量音頻數(shù)據(jù)讀入內(nèi)存,并使用與磁盤訪問函數(shù)一致的方法進(jìn)行訪問,可大大提高文件讀取效率。
WIN32 API提供了一種進(jìn)行文件操作的高效途徑,即內(nèi)存映射文件。內(nèi)存映射文件允許在WIN32進(jìn)程的虛擬地址空間中保留一段內(nèi)存區(qū)域,把目標(biāo)文件映射到這段虛擬內(nèi)存之中。可以用存取內(nèi)存數(shù)據(jù)的方式直接操作文件中的數(shù)據(jù),就好像這些數(shù)據(jù)放在內(nèi)存中一樣。而實(shí)際上,并沒有、也不需要調(diào)用API函數(shù)來讀寫文件,更不需要自己提供任何緩沖算法,操作系統(tǒng)將會為我們完成這些工作。使用內(nèi)存映射文件能給程序開發(fā)工作提供極大的方便,程序的運(yùn)行效率也非常高。利用內(nèi)存映射文件進(jìn)行文件I/O操作,進(jìn)行文件I/O操作需要下面幾個步驟[5]:
1) 調(diào)用CreateFile()函數(shù),以適當(dāng)?shù)姆绞絼?chuàng)建或打開一個文件核心對象;
2) 把CreateFile()函數(shù)返回的文件句柄作為參數(shù),傳給CreateFileMapping()函數(shù),由CreateFileMapping()函數(shù)創(chuàng)建一個文件映射核心對象的適當(dāng)屬性;
3) 創(chuàng)建了文件映射核心對象后,調(diào)用MapViewOfFile()函數(shù),告訴系統(tǒng)把文件的哪一部分映射到進(jìn)程的地址空間中,以何種方式映射;
4) 利用MapViewOfFile()函數(shù)返回的指針來使用文件數(shù)據(jù);
5) 操作完畢后,調(diào)用UnmapViewOfFile()函數(shù),告訴系統(tǒng)撤銷對文件映射核心對象的映射;
6) 使用CloseHandle()函數(shù)關(guān)閉文件映射核心對象;
7) 使用CloseHandle()函數(shù)關(guān)閉文件核心對象;
4 總結(jié)
語音報警系統(tǒng)的投用一方面有效的提高了大型火電機(jī)組運(yùn)行工作的有效性,提高了安全生產(chǎn)水平,另一方面也減輕了運(yùn)行人員(特別是夜間值班人員)的壓力和負(fù)擔(dān)。由于DirectSound技術(shù)的應(yīng)用解決了一系列核心問題,本語音報警系統(tǒng)的實(shí)施達(dá)到了很好的效果,為進(jìn)一步完善火電廠語音報警系統(tǒng)功能并提高性能奠定了基礎(chǔ)。
參考文獻(xiàn):
[1] 張晉東.基于 DirectSound技術(shù)的三警合一語音報警系統(tǒng)[J].吉林大學(xué)學(xué)報,2005(6):590-593.
[2] 苑春苗.基于DirectSound技術(shù)的音頻捕獲與多路混音的實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2007(3):613-614.
[3] 徐惠鋼.基于DirectX開發(fā)庫的多路聲音信號實(shí)時采集[J].計(jì)算機(jī)應(yīng)用,2003(10):4-6.
[4] 李春洪.基于DirectSound的聲音實(shí)時仿真研究[J].計(jì)算機(jī)仿真,2001(5):47-49.
[5] 段繼華.基于內(nèi)存映射文件的進(jìn)程間數(shù)據(jù)傳輸[J].無線電工程,2007(11):46-47.