C#開發(fā)WinCC語音報警插件
前言
眾所周知,WinCC本身是可以利用C腳本或者VBS腳本來做語音報警,但是這種方式的本質(zhì)是調(diào)用已存在的音頻文件,想要實現(xiàn)實時播報報警信息是不行的,靈活性還不夠,本文主要介紹基于C#開發(fā)語音報警插件,集成到WinCC中,實現(xiàn)更加靈活的語音報警功能。
開發(fā)思路
如果想實現(xiàn)C#開發(fā)語音報警控件,植入到WinCC中,需要解決以下幾個技術(shù)要求:WinCC支持.NET控件、C#可以實現(xiàn)語音播報功能、報警邏輯要清晰。
對于WinCC支持.NET控件, WinCC 從V7.0開始支持.NET自定義控件。其次,C#可以實現(xiàn)語音播報功能,可以通過調(diào)用系統(tǒng)自帶的語音類庫文件,實現(xiàn)語音播報。而對于報警邏輯,主要是對沿信號的檢測,包括上升沿及下降沿。
開發(fā)流程
1、首先通過 VS2019 創(chuàng)建一個Windows窗體應(yīng)用,這里的窗體主要是用于測試,然后在此基礎(chǔ)上,創(chuàng)建一個類庫項目:

2、在類庫的基礎(chǔ)上,右擊添加新建項,項目類型選擇自定義控件,取名為AlarmVoiceBroadcast:
3、經(jīng)過分析,這個語音報警控件應(yīng)該包含以下內(nèi)容:報警助手啟用禁用、語音播報啟用禁用、報警檢測上升沿下降沿選擇、報警播報方式單次或循環(huán)、系統(tǒng)實時報警顯示、系統(tǒng)報警日志顯示。因此,語音報警助手界面設(shè)計如下圖所示:

4、開發(fā)過程中,以下幾個問題需要思考:
(1)整個控件的思想,就是通過檢測N個變量的實時狀態(tài)(這里都是布爾變量),結(jié)合上升沿/下降沿,當(dāng)發(fā)現(xiàn)某個變量報警時,進(jìn)行語音播報,并將報警狀態(tài)顯示到實時報警及報警日志中。經(jīng)過測試發(fā)現(xiàn),這里如果將報警變量設(shè)置為數(shù)組或者集合,WinCC均不支持,因此沒法將監(jiān)測報警變量的數(shù)量動態(tài)化,只能按照單個布爾類型,我這里是根據(jù)實際需求創(chuàng)建了20個布爾變量,如果大家有更好的方法實現(xiàn)動態(tài)化,可以反饋給我。
(2)對于檢測到某個變量發(fā)生了報警,語音播報的內(nèi)容應(yīng)該是什么?我這里針對每個報警創(chuàng)建了一個報警說明屬性,因此也相應(yīng)地創(chuàng)建了20個字符串變量,通過索引與報警變量一一對應(yīng)。
(3)由于需要實時檢測,因此需要循環(huán)執(zhí)行。C#中循環(huán)執(zhí)行一般有兩種方式,一種是定時器,一種是多線程,經(jīng)過測試發(fā)現(xiàn),多線程的形式無法實現(xiàn),似乎是WinCC不支持,最終采用的是定時器的方式。
(4)循環(huán)檢測實現(xiàn)思路:針對上升沿:循環(huán)針對每個報警變量,將當(dāng)前值與緩存值做對比,如果當(dāng)前值為True,緩存值為False,則表示報警觸發(fā),如果當(dāng)前值為False,緩存值為True,則表示報警消除。針對下降沿:循環(huán)針對每個報警變量,將當(dāng)前值與緩存值做對比,如果當(dāng)前值為False,緩存值為True,則表示報警觸發(fā),如果當(dāng)前值為True,緩存值為False,則表示報警消除。
5、語音相關(guān)控制,語音控制包括播報音量、播報語速、播報性別及年齡。

控件應(yīng)用
1、控件開發(fā)完成后,最終生成的是一個dll動態(tài)鏈接庫文件,將該dll復(fù)制到WinCC項目中,通過控件欄中的.NET控件右擊添加這個dll。

2、將該控件拖放到WinCC界面中,并創(chuàng)建一些用于測試的按鈕功能,效果如下圖所示:

3、創(chuàng)建一些內(nèi)部變量,包括3個布爾變量(Alarm1、Alarm2、Alarm3)以及3個模擬量變量(Pressure1、Pressure2、Pressure3)。

4、控件屬性綁定,對于Toogle按鈕及輸入輸出域,直接綁定對應(yīng)的變量即可,對于語音報警控件,需要設(shè)置Alarm1-Alarm6,其中Alarm1-Alarm3直接綁定內(nèi)部變量Alarm1-Alarm3,對于Alarm4-Alarm6,由于是模擬量,需要通過動態(tài)對話框進(jìn)行設(shè)置,如下圖所示:

5、對于報警播報的內(nèi)容提示,根據(jù)實際情況填寫即可:
