一.适用性
适用所有兼容.NET控件的上位组态软件。
二.功能简介
主要是利用控件外部属性接口获取上位组态软件例如WINCC中变量的值与名称,再调用电脑语音合成器进行语音播报。此次制作为了即时性采用沿触发方式而不是一直触发。
三.逻辑核心
这个简单控件没有复杂逻辑,只有一个沿触发的检测需要注意下,因为CSharp中没有类似我们平常使用的PLC里面的LDP/LDF上升沿下降沿,这些其实都是PLC厂家为了简化编程打包好的指令块而已。所以我们需要自己去写一个边缘检测的获取。很简单,准备一个实时数据集合与一个缓冲数据集合,两个集合进行比较即可。要在一次比较的进程开始前根据上升沿/下降沿的选择来初始化缓冲集合,在一次比较的进程末对缓冲集合进行更新。
四.控件布局
五.边缘检测代码
此处单独贴一下边缘检测的代码
按照我第三点写的步骤,进程前根据选择初始化:
public List alarmTagList;
public List AlarmTagList
{
get
{
return new List()
{
AlarmTag01, AlarmTag02, AlarmTag03, AlarmTag04, AlarmTag05, AlarmTag06, AlarmTag07, AlarmTag08,
AlarmTag09, AlarmTag10, AlarmTag11, AlarmTag12, AlarmTag13, AlarmTag14, AlarmTag15, AlarmTag16,
AlarmTag17, AlarmTag18, AlarmTag19, AlarmTag20
};
}
set
{
alarmTagList = value;
}
}
public List alarmInfList;
public List AlarmInfList
{
get
{
return new List()
{
AlarmInf01, AlarmInf02, AlarmInf03, AlarmInf04, AlarmInf05, AlarmInf06, AlarmInf07, AlarmInf08,
AlarmInf09, AlarmInf10,AlarmInf11,AlarmInf12,AlarmInf13,AlarmInf14,AlarmInf15,AlarmInf16,
AlarmInf17,AlarmInf18,AlarmInf19,AlarmInf20
};
}
set
{
alarmInfList = value;
}
}
//报警存放集合
public List AlarmDataList = new List();
//缓冲集合
public List AlarmCacheList;
进程内:
private void EdgeMethod()
{
edgeSign = false;
//if (!AlarmHelperEnable || AlarmHelperModel)
//{
// //speekTimer.Enabled = false;
//}
if (AlarmHelperUpedge)//上升沿
{
for (int i = 0; i < AlarmTagList.Count; i++)
{
if (AlarmTagList[i] > AlarmCacheList[i])
{
AddAlarm(true, AlarmInfList[i]);
if (!AlarmDataList.Contains(AlarmInfList[i]))
{
AlarmDataList.Add(AlarmInfList[i]);
}
if (AlarmHelperEnable)
{
speechSynthesizer.SpeakAsync(AlarmInfList[i] + "触发");
}
else
{
speechSynthesizer.Dispose();
}
}
if (AlarmTagList[i] < AlarmCacheList[i])//消除
{
if (AlarmDataList.Contains(AlarmInfList[i]))
{
AlarmDataList.Remove(AlarmInfList[i]);
}
AddAlarm(false, AlarmInfList[i]);
if (AlarmHelperEnable)
{
speechSynthesizer.SpeakAsync(AlarmInfList[i] + "消除");
}
else
{
speechSynthesizer.Dispose();
}
}
}
AlarmCacheList = AlarmTagList;//缓存
}
else//下降沿
{
for (int i = 0; i < AlarmTagList.Count; i++)
{
if (AlarmTagList[i] < AlarmCacheList[i])
{
AddAlarm(true, AlarmInfList[i]);
if (!AlarmDataList.Contains(AlarmInfList[i]))
{
AlarmDataList.Add(AlarmInfList[i]);
}
if (AlarmHelperEnable)
{
speechSynthesizer.SpeakAsync(AlarmInfList[i] + "触发");
}
else
{
speechSynthesizer.Dispose();
}
}
if (AlarmTagList[i] > AlarmCacheList[i])
{
if (AlarmDataList.Contains(AlarmInfList[i]))
{
AlarmDataList.Remove(AlarmInfList[i]);
}
AddAlarm(false, AlarmInfList[i]);
if (AlarmHelperEnable)
{
speechSynthesizer.SpeakAsync(AlarmInfList[i] + "消除");
}
else
{
speechSynthesizer.Dispose();
}
}
}
AlarmCacheList = AlarmTagList;
}
edgeSign = true;
}
六.dll文件地址,有需要可以去下载,暂时无期限限制
链接:https://pan.baidu.com/s/1HvujzzdMTr8Gq3s52AnLvg
提取码:hxnr
七.使用演示
1.以WNCC为例,如图,添加.NET控件,选择此dll文件拖放到画面中
2.在控件属性的AlarmTag属性接口的动态属性中关联需要的报警变量,并在AlarmInf的静态属性中添加对应的报警文本信息。
3.激活WINCC,可以看到语音播报报警的同时将信息记录在当前报警和报警日志控件中。红色表示触发报警,蓝色表示消除报警。
由于采用边缘检测,所以暂时的语音播报只在报警触发/消除时播报一次,暂未作循环报警功能。此种类似功能也可以直接访问WINCC的报警归档数据库,可以不需要做变量采集代码直接报警。WINCC归档数据库访问后续贴出。



