天天看點

C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」

C#工控上位機執行個體_手把手教你基于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窗體應用,這裡的窗體主要是用于測試,然後在此基礎上,建立一個類庫項目:
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
  • 在類庫的基礎上,右擊添加建立項,項目類型選擇自定義控件,取名為AlarmVoiceBroadcast:
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
  • 經過前期的分析,這個語音報警控件應該包含以下内容:報警助手啟用禁用、語音播報啟用禁用、報警檢測上升沿下降沿選擇、報警播報方式單次或循環、系統實時報警顯示、系統報警日志顯示。是以,語音報警助手界面設計如下圖所示:
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
  • 開發過程中,以下幾個問題需要思考:

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

(2)對于檢測到某個變量發生了報警,語音播報的内容應該是什麼?我這裡針對每個報警建立了一個報警說明屬性,是以也相應地建立了20個字元串變量,通過索引與報警變量一一對應。

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

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

  • 語音相關控制,語音控制包括播報音量、播報語速、播報性别及年齡。
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」

3 控件應用

  • 控件開發完成後,最終生成的是一個dll動态連結庫檔案,将該dll複制到WinCC項目中,通過控件欄中的.NET控件右擊添加這個dll。
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
  • 将該控件拖放到WinCC界面中,并建立一些用于測試的按鈕功能,效果如下圖所示:
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
  • 建立一些内部變量,包括3個布爾變量(Alarm1、Alarm2、Alarm3)以及3個模拟量變量(Pressure1、Pressure2、Pressure3)。
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
  • 控件屬性綁定,對于Toogle按鈕及輸入輸出域,直接綁定對應的變量即可,對于語音報警控件,需要設定Alarm1-Alarm6,其中Alarm1-Alarm3直接綁定内部變量Alarm1-Alarm3,對于Alarm4-Alarm6,由于是模拟量,需要通過動态對話框進行設定,如下圖所示:
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
  • 對于報警播報的内容提示,根據實際情況填寫即可:
C#工控上位機執行個體_手把手教你基于C#開發WinCC語音報警插件「附源代碼」
如果需要控件源碼,添加公衆号

公衆号dotNet工控上位機:thinger_swj】,并注明來自知乎。