C#开发WinCC语音报警插件
Posted 常哥说编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#开发WinCC语音报警插件相关的知识,希望对你有一定的参考价值。
-Begin-
前言
众所周知,WinCC本身是可以利用C脚本或者VBS脚本来做语音报警,但是这种方式的本质是调用已存在的音频文件,想要实现实时播报报警信息是不行的,灵活性还不够,本文主要介绍基于C#开发语音报警插件,集成到WinCC中,实现更加灵活的语音报警功能。
开发思路
如果想实现C#开发语音报警控件,植入到WinCC中,需要解决以下几个技术要求:WinCC支持.NET控件、C#可以实现语音播报功能、报警逻辑要清晰。
对于WinCC支持.NET控件, WinCC 从V7.0开始支持.NET自定义控件。其次,C#可以实现语音播报功能,可以通过调用系统自带的语音类库文件,实现语音播报。而对于报警逻辑,主要是对沿信号的检测,包括上升沿及下降沿。
开发流程
1、首先通过 VS2019 创建一个Windows窗体应用,这里的窗体主要是用于测试,然后在此基础上,创建一个类库项目:
2、在类库的基础上,右击添加新建项,项目类型选择自定义控件,取名为AlarmVoiceBroadcast:
3、经过分析,这个语音报警控件应该包含以下内容:报警助手启用禁用、语音播报启用禁用、报警检测上升沿下降沿选择、报警播报方式单次或循环、系统实时报警显示、系统报警日志显示。因此,语音报警助手界面设计如下图所示:
4、开发过程中,以下几个问题需要思考:
(1)整个控件的思想,就是通过检测N个变量的实时状态(这里都是布尔变量),结合上升沿/下降沿,当发现某个变量报警时,进行语音播报,并将报警状态显示到实时报警及报警日志中。经过测试发现,这里如果将报警变量设置为数组或者集合,WinCC均不支持,因此没法将监测报警变量的数量动态化,只能按照单个布尔类型,我这里是根据实际需求创建了20个布尔变量,如果大家有更好的方法实现动态化,可以反馈给我。
(2)对于检测到某个变量发生了报警,语音播报的内容应该是什么?我这里针对每个报警创建了一个报警说明属性,因此也相应地创建了20个字符串变量,通过索引与报警变量一一对应。
(3)由于需要实时检测,因此需要循环执行。C#中循环执行一般有两种方式,一种是定时器,一种是多线程,经过测试发现,多线程的形式无法实现,似乎是WinCC不支持,最终采用的是定时器的方式。
(4)循环检测实现思路:针对上升沿:循环针对每个报警变量,将当前值与缓存值做对比,如果当前值为True,缓存值为False,则表示报警触发,如果当前值为False,缓存值为True,则表示报警消除。针对下降沿:循环针对每个报警变量,将当前值与缓存值做对比,如果当前值为False,缓存值为True,则表示报警触发,如果当前值为True,缓存值为False,则表示报警消除。
5、语音相关控制,语音控制包括播报音量、播报语速、播报性别及年龄。
控件应用
1、控件开发完成后,最终生成的是一个dll动态链接库文件,将该dll复制到WinCC项目中,通过控件栏中的.NET控件右击添加这个dll。
2、将该控件拖放到WinCC界面中,并创建一些用于测试的按钮功能,效果如下图所示:
3、创建一些内部变量,包括3个布尔变量(Alarm1、Alarm2、Alarm3)以及3个模拟量变量(Pressure1、Pressure2、Pressure3)。
4、控件属性绑定,对于Toogle按钮及输入输出域,直接绑定对应的变量即可,对于语音报警控件,需要设置Alarm1-Alarm6,其中Alarm1-Alarm3直接绑定内部变量Alarm1-Alarm3,对于Alarm4-Alarm6,由于是模拟量,需要通过动态对话框进行设置,如下图所示:
5、对于报警播报的内容提示,根据实际情况填写即可:
大家可以自行试一下
以上是关于C#开发WinCC语音报警插件的主要内容,如果未能解决你的问题,请参考以下文章