在储液罐液位偏低时会进行语音播报提示与弹窗提示。
注:
博客主页:
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+@"DataMCProjectSoundwarn.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; } }
这样就能控制在首次报警后计时指定的事件再进行报警,因为监控程序是一直监控着的,不然就会一直嘟嘟的报警一直的弹窗。