手把手教你基於C#開發WinCC語音報警插件「附源代碼」


 

寫在前面

眾所周知,WinCC本身是可以利用C腳本或者VBS腳本來做語音報警,但是這種方式的本質是調用已存在的音頻文件,想要實現實時播報報警信息是不行的,靈活性還不夠,本文主要介紹基於C#/.NET開發報警插件,集成到WinCC中,實現更加靈活的語音報警功能。

公眾號dotNet工控上位機:thinger_swj】

        對於WinCC,我相信很多人都比較熟悉,WinCC自帶報警控件,可以實現報警的監測及顯示。在之前做的一個比較大的項目中,項目已經使用WinCC開發並調試完畢,但是客戶提出系統有報警時,需要語音播報的需求,因為當時沒做過這樣的,所以便查找資料,找了很多也無法通過WinCC實現,最后決定通過C#開發一個語音播報控件,集成到WinCC中,經過2天的研究測試(當時剛開始學習C#),終於實現了所有的功能,並且也得到了客戶的認可。

        現在有時候想起這個事,仍然心有余悸,如果當初沒有提前學習C#,也許這個項目就沒法完美交差,客戶也會不滿意,后續也不會有更多的業務合作,所以我始終堅信一句話:凡事預則立,不預則廢。轉型學習上位機也是一樣,從今天開始,也許明天就會不一樣。之所以會提及這個事情,最近有位學員一直在研究這個,所以我就稍微做了一下整理,把這個案例分享給大家。

1  開發思路

如果想實現C#開發語音報警控件,植入到WinCC中,需要解決以下幾個技術要求:WinCC支持.NET控件、C#可以實現語音播報功能、報警邏輯要清晰。

  • 對於WinCC支持.NET控件, WinCC 從V7.0開始支持.NET自定義控件。
  • 其次,C#可以實現語音播報功能,可以通過調用系統自帶的語音類庫文件,實現語音播報。
  • 而對於報警邏輯,主要是對沿信號的檢測,包括上升沿及下降沿。

2 開發流程

  • 首先通過 VS2019 創建一個Windows窗體應用,這里的窗體主要是用於測試,然后在此基礎上,創建一個類庫項目:

 

  • 在類庫的基礎上,右擊添加新建項,項目類型選擇自定義控件,取名為AlarmVoiceBroadcast:

 

  • 經過前期的分析,這個語音報警控件應該包含以下內容:報警助手啟用禁用、語音播報啟用禁用、報警檢測上升沿下降沿選擇、報警播報方式單次或循環、系統實時報警顯示、系統報警日志顯示。因此,語音報警助手界面設計如下圖所示:

 

  • 開發過程中,以下幾個問題需要思考:

(1)整個控件的思想,就是通過檢測N個變量的實時狀態(這里都是布爾變量),結合上升沿/下降沿,當發現某個變量報警時,進行語音播報,並將報警狀態顯示到實時報警及報警日志中。經過測試發現,這里如果將報警變量設置為數組或者集合,WinCC均不支持,因此沒法將監測報警變量的數量動態化,只能按照單個布爾類型,我這里是根據實際需求創建了20個布爾變量,如果大家有更好的方法實現動態化,可以反饋給我。

(2)對於檢測到某個變量發生了報警,語音播報的內容應該是什么?我這里針對每個報警創建了一個報警說明屬性,因此也相應地創建了20個字符串變量,通過索引與報警變量一一對應。

(3)由於需要實時檢測,因此需要循環執行。C#中循環執行一般有兩種方式,一種是定時器,一種是多線程,經過測試發現,多線程的形式無法實現,似乎是WinCC不支持,最終采用的是定時器的方式。

(4)循環檢測實現思路:針對上升沿:循環針對每個報警變量,將當前值與緩存值做對比,如果當前值為True,緩存值為False,則表示報警觸發,如果當前值為False,緩存值為True,則表示報警消除。針對下降沿:循環針對每個報警變量,將當前值與緩存值做對比,如果當前值為False,緩存值為True,則表示報警觸發,如果當前值為True,緩存值為False,則表示報警消除。

  • 語音相關控制,語音控制包括播報音量、播報語速、播報性別及年齡。

3 控件應用

  • 控件開發完成后,最終生成的是一個dll動態鏈接庫文件,將該dll復制到WinCC項目中,通過控件欄中的.NET控件右擊添加這個dll。

 

  • 將該控件拖放到WinCC界面中,並創建一些用於測試的按鈕功能,效果如下圖所示:

 

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

 

  • 控件屬性綁定,對於Toogle按鈕及輸入輸出域,直接綁定對應的變量即可,對於語音報警控件,需要設置Alarm1-Alarm6,其中Alarm1-Alarm3直接綁定內部變量Alarm1-Alarm3,對於Alarm4-Alarm6,由於是模擬量,需要通過動態對話框進行設置,如下圖所示:

 

  • 對於報警播報的內容提示,根據實際情況填寫即可:

 

 如果需要控件源碼,可以關注公眾號dotNet工控上位機:thinger_swj】,並注明來自博客園。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM