場景
在儲液罐液位偏低時會進行語音播報提示與彈窗提示。
注:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載
實現
首先在監控程序中循環讀取是否低液位的信號,如果低液位時預警
WarningHelper.LowerLevelWarn("儲液罐", KillPool.WaterTank);
調用預警的方法,因為這里有三個部件需要預警,所以設置了兩個參數,一個是預警時提示的文本,一個是枚舉類標識當前報警的部件是哪個。
枚舉類KillPool代碼:
public enum KillPool { /// <summary> /// 儲液罐 /// </summary> WaterTank = 1, /// <summary> /// 上霧化池 /// </summary> UpWuHuaPool = 2, /// <summary> /// 下霧化池 /// </summary> DownWuHuaPool = 3 }
然后在預警的工具類方法中
一部分是進行語音播報一部分是進行彈窗提示,因為這兩項操作是同時進行的,所以為了防止語音播報卡住彈窗提示,所以將語音播報放在一個新線程中
//語音提示 System.Threading.Thread t = new System.Threading.Thread(PlayWarnSound);//創建了線程 t.Start();//開啟線程
在新線程所對應的方法PlayWarnSound中
private static void PlayWarnSound(object obj) { Global.PublicVar.Instance.WarnPlayer.PlayLooping();//循環播放 }
循環播報音頻文件,此音頻文件是發出“嘟嘟”聲的音頻文件,音頻文件來源於網絡。
然后這里使用的全局播放器對象進行播放這樣可以在彈窗按鈕的點擊事件中進行停止播放。
在全局變量中定義全局播放器對象
/// <summary> /// 警報播放器 /// </summary> private System.Media.SoundPlayer _warnPlayer = new System.Media.SoundPlayer(System.Windows.Forms.Application.StartupPath+@"\Data\MCProject\Sound\warn.wav"); /// <summary> /// 警報播放器 /// </summary> public System.Media.SoundPlayer WarnPlayer { get { return _warnPlayer; } set { _warnPlayer = value; } }
語音播報后再彈出彈窗提示,首先新建一個Dialog窗體
然后進入其代碼中
public partial class LowLevelWarning : Form { #region 字段定義 /// <summary> /// 報警的名稱 /// </summary> private string _warnComponentName; /// <summary> /// 報警的消殺池 /// </summary> private KillPool _warnKillPool; #endregion #region 屬性定義 public KillPool WarnKillPool { get { return _warnKillPool; } set { _warnKillPool = value; } } public string WarnComponentName { get { return _warnComponentName; } set { _warnComponentName = value; this.lb_component.Text = value; } } #endregion public LowLevelWarning() { InitializeComponent(); } private void bt_ok_Click(object sender, EventArgs e) { //停止播放警報 Global.PublicVar.Instance.WarnPlayer.Stop(); this.DialogResult = System.Windows.Forms.DialogResult.OK; }
這樣就能接受到傳遞過來的顯示的提示文本以及標識當前預警是哪個部件
繼續上面語音播報的同時彈窗提示的代碼
//彈窗提示 LowLevelWarning lowLevelWarnDialog = new LowLevelWarning(); lowLevelWarnDialog.WarnComponentName = warnComponentName; lowLevelWarnDialog.WarnKillPool = killPool; lowLevelWarnDialog.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; lowLevelWarnDialog.ShowDialog();
上面在窗體的按鈕的點擊事件中
停止播放音頻文件並將當前Dialog的結果返回為OK
//停止播放警報 Global.PublicVar.Instance.WarnPlayer.Stop(); this.DialogResult = System.Windows.Forms.DialogResult.OK;
然后繼續上面顯示彈窗的代碼后
if (lowLevelWarnDialog.DialogResult == System.Windows.Forms.DialogResult.OK) { switch (lowLevelWarnDialog.WarnKillPool) { case KillPool.WaterTank: //將是否監控低液位置為false Global.PublicVar.Instance.IsGoOnMonitorWaterPool = false; //計時 Global.PublicVar.Instance.TimerWaterTank.Enabled = true; break; case KillPool.UpWuHuaPool: //將是否監控低液位置為false Global.PublicVar.Instance.IsGoOnMonitorUpWuHuaPool = false; //計時 Global.PublicVar.Instance.TimerUpWuHuaPool.Enabled = true; break; case KillPool.DownWuHuaPool: //將是否監控低液位置為false Global.PublicVar.Instance.IsGoOnMonitorDownWuHuaPool = false; //計時 Global.PublicVar.Instance.TimeDownWuHuaPool.Enabled = true; break; } }
為了能實現停止監控程序中繼續對報警的部件繼續報警,所以根據當前的部件從而將全局的標識變量設置為false
同理在進行是否報警之前的代碼就要根據這個全局變量來判斷是否報警
//報警 if (Global.PublicVar.Instance.IsGoOnMonitorWaterPool) { WarningHelper.LowerLevelWarn("儲液罐", KillPool.WaterTank); }
上面開始計時器的代碼
Global.PublicVar.Instance.TimeDownWuHuaPool.Enabled = true;
是將計時器放在一個全局變量中
/// <summary> /// 儲液罐低液位收到報警到下一次報警倒計時 /// </summary> private System.Timers.Timer _timerWaterTank = new System.Timers.Timer(1000);//實例化Timer類,設置間隔時間為1000毫秒; /// <summary> /// 儲液罐低液位收到報警到下一次報警倒計時的計時器 /// </summary> public System.Timers.Timer TimerWaterTank { get { _timerWaterTank.Elapsed += new System.Timers.ElapsedEventHandler(_timerWaterTank_Tick);//到達時間的時候執行事件; _timerWaterTank.AutoReset = true;//設置是執行一次(false)還是一直執行(true); return _timerWaterTank; } set { _timerWaterTank = value; } } /// <summary> /// 儲液罐低液位收到報警到下一次報警倒計時執行事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _timerWaterTank_Tick(object sender, EventArgs e) { System.Timers.Timer timer = sender as System.Timers.Timer; this.LowLevelSecondsWaterTank--; if (this.LowLevelSecondsWaterTank <= 0) { Global.PublicVar.Instance.IsGoOnMonitorWaterPool = true; timer.Enabled = false; this.LowLevelSecondsWaterTank = Global.LOW_LEVEL_MONITOR_SECONDS; } }
這樣就能控制在首次報警后計時指定的事件再進行報警,因為監控程序是一直監控着的,不然就會一直嘟嘟的報警一直的彈窗。