蜜桃免费av-一级中文片-久久青青草原av免费观看-香蕉在线观看视频-少妇丰满极品嫩模白嫩-成人妇女免费播放久久久-久久国产精品_国产精品-少妇69xx-国产网站免费在线观看-sese婷婷-最近中文字幕在线中文视频-欧美色xxx-亚洲a∨国产av综合av-免费观看日批视频-午夜福利免费0948视频-亚洲一二三视频-可以免费观看的av毛片下载-日韩综合精品-国产精品福利久久久-亚洲精品综合一区二区

龍海兒
關(guān)注《電氣外傳》公眾號,知乎,CSDN等同號
級別: 論壇先鋒
精華主題: 0
發(fā)帖數(shù)量: 369 個
工控威望: 1392 點
下載積分: 914 分
在線時間: 104(小時)
注冊時間: 2018-04-13
最后登錄: 2025-11-23
查看龍海兒的 主題 / 回貼
樓主  發(fā)表于: 2025-07-02 12:35
圖片:
圖片:
圖片:
圖片:
圖片:
1111MicrosoftInternetExplorer402DocumentNotSpecified7.8 磅Normal0如題,聲音報警我們用的很多,但是如何實現(xiàn)差異化的語音報警呢?直接先看圖看效果。
那語音報警都好理解,差異化又具體體現(xiàn)在哪里呢?
因為市面上已經(jīng)有前輩開發(fā)出了語音報警,但是不能靈活單獨的應(yīng)用到每一條報警上面。比如我只想要一條或者兩條重要信息實現(xiàn)語音播報,其它報警靜默顯示就行。那么通過本例可輕松解決。
特別說明!開發(fā)不易,本例所用腳本原件放在文章末尾,小額支持即可下載!感謝理解,歡迎交流。
第一步,打開WinCC創(chuàng)建內(nèi)部變量(alarmComing)二進(jìn)制類型與(alarmText)(prevAlarmText1)(prevAlarmText2)三個16位文本類型。(如需要多個報警可多建立兩個Text變量)
第二步,用Win+r輸入services.msc然后找到Windows Audio服務(wù),啟動它(一般都啟動著)。
第三步,把gmsgfunc.fct腳本放到C:\Program Files (x86)\SIEMENS\WinCC\aplib\Alarm中替換掉以前的。
第四步,把Voice腳本vbs放到wincc項目ScriptAct文件夾中。
第五步,打開報警記錄找到想要播報的變量勾選屬性里面觸發(fā)動作如圖(不勾選的變量不會播報)。
通過以上操作就可以實現(xiàn)單獨變量的聲音報警,其它變量依然按照普通設(shè)置呈現(xiàn)。如果想觸發(fā)報警之后一直播報,直到人員點擊消音按鈕才消失。那請看之下進(jìn)階操作。
將剛才第二步的Voice替換成cycle腳本(注意一定要替換,不可以都保留),然后在報警控件中將事件里面的OnToolbarButtonClicked屬性加上記事本中的c腳本用于取消循環(huán),也可以自己外加按鈕來實現(xiàn)。
記得拷貝進(jìn)去的每個腳本都打開再次保存一下,否則可能不能發(fā)聲。以下是本例用到的腳本,各位也可以再次優(yōu)化腳本生成更多功能。
更過截圖和腳本鏈接請移步同名公眾號查看

關(guān)注《電氣外傳》公眾號,知乎,CSDN等同號
往事如風(fēng)
科技改變制造
級別: 網(wǎng)絡(luò)英雄

精華主題: 0
發(fā)帖數(shù)量: 11980 個
工控威望: 19775 點
下載積分: 15375 分
在線時間: 2835(小時)
注冊時間: 2013-01-31
最后登錄: 2025-12-14
查看往事如風(fēng)的 主題 / 回貼
1樓  發(fā)表于: 2025-07-05 20:50
  
三人行者必有我?guī)?,擇其善者而從之
hqokabc
級別: 正式會員
精華主題: 0
發(fā)帖數(shù)量: 74 個
工控威望: 84 點
下載積分: 423 分
在線時間: 6(小時)
注冊時間: 2025-01-02
最后登錄: 2025-12-14
查看hqokabc的 主題 / 回貼
2樓  發(fā)表于: 3天前
全局腳本怎么寫?
qwerty_123
www
級別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 159 個
工控威望: 284 點
下載積分: 5878 分
在線時間: 51(小時)
注冊時間: 2010-09-26
最后登錄: 2025-12-14
查看qwerty_123的 主題 / 回貼
3樓  發(fā)表于: 前天
//wincc聲音報警C腳本版,和wincc自身的報警沒有任何關(guān)系,所以不要和wincc自帶的報警相關(guān)聯(lián)
//曾經(jīng)用于工程中的語音報警,事先將語音先錄好,然后將變量和語音關(guān)聯(lián)起來

#include "apdefap.h"


//播放聲音的函數(shù)聲明
#pragma code("winmm.dll")
VOID WINAPI PlaySoundA(char *,char *,DWORD);
#pragma code()

struct datainfo    //變量名和聲音文件名的對應(yīng)關(guān)系
{
    const char * const tagname;    //變量名
    const char * const soundname;    //聲音文件名
};
struct statusdatainfo        //保存報警變量的狀態(tài)信息
{
    int prevStatus;
    int playing;
};
//所有的報警變量和聲音文件名對應(yīng)關(guān)系表
//注意:變量名和文件名要和實際的變量名、文件名完全一致
//注意:聲音文件只支持wav文件
//注意:變量越靠前,則優(yōu)先級越高,在同時發(fā)生多個報警時,優(yōu)先級最高的聲音優(yōu)先播放,而且任一時刻只能播放一個聲音
static struct datainfo data[]=  
{
{"www","Windows XP 啟動.wav"},    
{"testalarm","ringin.wav"},
{"qqq","Windows XP 關(guān)機.wav"},
{"eee","Windows XP 注銷音.wav"}
};

static struct statusdatainfo  statusdata[sizeof(data)/sizeof(data[0])];
////////////////////////////////////

int gscAction( void )
{
int totalnum=0;    //總的報警變量數(shù)量,也等于總的報警聲音數(shù)量
int index=0;    //循環(huán)變量
int hasfound=0;    //已找到優(yōu)先級最高的報警變量
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"; //報警確認(rèn)變量的名字,一次只能確認(rèn)優(yōu)先級最高的報警
int ack_status=0;    //當(dāng)前確認(rèn)變量的狀態(tài)

totalnum=sizeof(data)/sizeof(struct datainfo);    //報警變量的數(shù)量
ack_status=GetTagBit(ack_name);

for(index=0;index<totalnum;index++)    //查找當(dāng)前第一個報警的變量所對應(yīng)的聲音文件名,搜索的順序決定了優(yōu)先級
{
    if (statusdata[index].playing)
    {
        statusdata[index].prevStatus=GetTagBit(data[index].tagname);
        if (ack_status)    //確認(rèn)報警變量
        {
            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)前正在播放的聲音文件不同時才播放新的聲音
{
    currfilename=filename;        //修改當(dāng)前正在播放的聲音文件名
  
    if (NULL==currfilename)    //如果沒有報警則停止播放聲音
    {
        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;


}