|
龍海兒
關(guān)注《電氣外傳》公眾號(hào),知乎,CSDN等同號(hào)
級(jí)別: 論壇先鋒
|
圖片:
圖片:
圖片:
圖片:
圖片:
1111MicrosoftInternetExplorer402DocumentNotSpecified7.8 磅Normal0如題,聲音報(bào)警我們用的很多,但是如何實(shí)現(xiàn)差異化的語音報(bào)警呢?直接先看圖看效果。 那語音報(bào)警都好理解,差異化又具體體現(xiàn)在哪里呢? 因?yàn)槭忻嫔弦呀?jīng)有前輩開發(fā)出了語音報(bào)警,但是不能靈活單獨(dú)的應(yīng)用到每一條報(bào)警上面。比如我只想要一條或者兩條重要信息實(shí)現(xiàn)語音播報(bào),其它報(bào)警靜默顯示就行。那么通過本例可輕松解決。 特別說明!開發(fā)不易,本例所用腳本原件放在文章末尾,小額支持即可下載!感謝理解,歡迎交流。 第一步,打開WinCC創(chuàng)建內(nèi)部變量(alarmComing)二進(jìn)制類型與(alarmText)(prevAlarmText1)(prevAlarmText2)三個(gè)16位文本類型。(如需要多個(gè)報(bào)警可多建立兩個(gè)Text變量) 第二步,用Win+r輸入services.msc然后找到Windows Audio服務(wù),啟動(dòng)它(一般都啟動(dòng)著)。 第三步,把gmsgfunc.fct腳本放到C:\Program Files (x86)\SIEMENS\WinCC\aplib\Alarm中替換掉以前的。 第四步,把Voice腳本vbs放到wincc項(xiàng)目ScriptAct文件夾中。 第五步,打開報(bào)警記錄找到想要播報(bào)的變量勾選屬性里面觸發(fā)動(dòng)作如圖(不勾選的變量不會(huì)播報(bào))。 通過以上操作就可以實(shí)現(xiàn)單獨(dú)變量的聲音報(bào)警,其它變量依然按照普通設(shè)置呈現(xiàn)。如果想觸發(fā)報(bào)警之后一直播報(bào),直到人員點(diǎn)擊消音按鈕才消失。那請(qǐng)看之下進(jìn)階操作。 將剛才第二步的Voice替換成cycle腳本(注意一定要替換,不可以都保留),然后在報(bào)警控件中將事件里面的OnToolbarButtonClicked屬性加上記事本中的c腳本用于取消循環(huán),也可以自己外加按鈕來實(shí)現(xiàn)。 記得拷貝進(jìn)去的每個(gè)腳本都打開再次保存一下,否則可能不能發(fā)聲。以下是本例用到的腳本,各位也可以再次優(yōu)化腳本生成更多功能。 更過截圖和腳本鏈接請(qǐng)移步同名公眾號(hào)查看 |
|
|---|---|---|
|
|
qwerty_123
www
級(jí)別: 略有小成
|
//wincc聲音報(bào)警C腳本版,和wincc自身的報(bào)警沒有任何關(guān)系,所以不要和wincc自帶的報(bào)警相關(guān)聯(lián) //曾經(jīng)用于工程中的語音報(bào)警,事先將語音先錄好,然后將變量和語音關(guān)聯(lián)起來 #include "apdefap.h" //播放聲音的函數(shù)聲明 #pragma code("winmm.dll") VOID WINAPI PlaySoundA(char *,char *,DWORD); #pragma code() struct datainfo //變量名和聲音文件名的對(duì)應(yīng)關(guān)系 { const char * const tagname; //變量名 const char * const soundname; //聲音文件名 }; struct statusdatainfo //保存報(bào)警變量的狀態(tài)信息 { int prevStatus; int playing; }; //所有的報(bào)警變量和聲音文件名對(duì)應(yīng)關(guān)系表 //注意:變量名和文件名要和實(shí)際的變量名、文件名完全一致 //注意:聲音文件只支持wav文件 //注意:變量越靠前,則優(yōu)先級(jí)越高,在同時(shí)發(fā)生多個(gè)報(bào)警時(shí),優(yōu)先級(jí)最高的聲音優(yōu)先播放,而且任一時(shí)刻只能播放一個(gè)聲音 static struct datainfo data[]= { {"www","Windows XP 啟動(dòng).wav"}, {"testalarm","ringin.wav"}, {"qqq","Windows XP 關(guān)機(jī).wav"}, {"eee","Windows XP 注銷音.wav"} }; static struct statusdatainfo statusdata[sizeof(data)/sizeof(data[0])]; //////////////////////////////////// int gscAction( void ) { int totalnum=0; //總的報(bào)警變量數(shù)量,也等于總的報(bào)警聲音數(shù)量 int index=0; //循環(huán)變量 int hasfound=0; //已找到優(yōu)先級(jí)最高的報(bào)警變量 char * filename=NULL; //當(dāng)前要播放聲音的文件名 char * dirname="D:\\WINDOWS\\Media\\"; //聲音文件存放的目錄 static char * currfilename=NULL; //當(dāng)前正在播放聲音的文件名,注意:該變量是靜態(tài)變量 static char FullName[200]; //當(dāng)前正在播放聲音的文件全名,注意:文件名全名不能太長,該變量是靜態(tài)變量 char * ack_name="ack"; //報(bào)警確認(rèn)變量的名字,一次只能確認(rèn)優(yōu)先級(jí)最高的報(bào)警 int ack_status=0; //當(dāng)前確認(rèn)變量的狀態(tài) totalnum=sizeof(data)/sizeof(struct datainfo); //報(bào)警變量的數(shù)量 ack_status=GetTagBit(ack_name); for(index=0;index<totalnum;index++) //查找當(dāng)前第一個(gè)報(bào)警的變量所對(duì)應(yīng)的聲音文件名,搜索的順序決定了優(yōu)先級(jí) { if (statusdata[index].playing) { statusdata[index].prevStatus=GetTagBit(data[index].tagname); if (ack_status) //確認(rèn)報(bào)警變量 { ack_status=0; statusdata[index].playing=0; } else { if (0==hasfound) { hasfound=1; filename=data[index].soundname; } } } else { statusdata[index].playing=!statusdata[index].prevStatus && GetTagBit(data[index].tagname); statusdata[index].prevStatus=GetTagBit(data[index].tagname); if (statusdata[index].playing) { if(0==hasfound) { filename=data[index].soundname; hasfound=1; } } } } SetTagBit(ack_name,0); if (filename!=currfilename) //當(dāng)要播放的聲音文件和當(dāng)前正在播放的聲音文件不同時(shí)才播放新的聲音 { currfilename=filename; //修改當(dāng)前正在播放的聲音文件名 if (NULL==currfilename) //如果沒有報(bào)警則停止播放聲音 { FullName[0]=0x0; PlaySoundA(NULL,NULL,0x2000|1|8); //停止播放聲音 } else //循環(huán)播放新的聲音文件 { strcpy(FullName,dirname); //復(fù)制目錄名 strcat(FullName,currfilename); //合成聲音文件全名 PlaySoundA(FullName,NULL,0x2000|1|8); //播放聲音 } } return 0; } |
|---|---|
|
|