手把手教你基于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窗体应用,这里的窗体主要是用于测试,然后在此基础上,创建一个类库项目:
- 在类库的基础上,右击添加新建项,项目类型选择自定义控件,取名为AlarmVoiceBroadcast:
- 经过前期的分析,这个语音报警控件应该包含以下内容:报警助手启用禁用、语音播报启用禁用、报警检测上升沿下降沿选择、报警播报方式单次或循环、系统实时报警显示、系统报警日志显示。因此,语音报警助手界面设计如下图所示:
- 开发过程中,以下几个问题需要思考:
(1)整个控件的思想,就是通过检测N个变量的实时状态(这里都是布尔变量),结合上升沿/下降沿,当发现某个变量报警时,进行语音播报,并将报警状态显示到实时报警及报警日志中。经过测试发现,这里如果将报警变量设置为数组或者集合,WinCC均不支持,因此没法将监测报警变量的数量动态化,只能按照单个布尔类型,我这里是根据实际需求创建了20个布尔变量,如果大家有更好的方法实现动态化,可以反馈给我。
(2)对于检测到某个变量发生了报警,语音播报的内容应该是什么?我这里针对每个报警创建了一个报警说明属性,因此也相应地创建了20个字符串变量,通过索引与报警变量一一对应。
(3)由于需要实时检测,因此需要循环执行。C#中循环执行一般有两种方式,一种是定时器,一种是多线程,经过测试发现,多线程的形式无法实现,似乎是WinCC不支持,最终采用的是定时器的方式。
(4)循环检测实现思路:针对上升沿:循环针对每个报警变量,将当前值与缓存值做对比,如果当前值为True,缓存值为False,则表示报警触发,如果当前值为False,缓存值为True,则表示报警消除。针对下降沿:循环针对每个报警变量,将当前值与缓存值做对比,如果当前值为False,缓存值为True,则表示报警触发,如果当前值为True,缓存值为False,则表示报警消除。
- 语音相关控制,语音控制包括播报音量、播报语速、播报性别及年龄。
3 控件应用
- 控件开发完成后,最终生成的是一个dll动态链接库文件,将该dll复制到WinCC项目中,通过控件栏中的.NET控件右击添加这个dll。
- 将该控件拖放到WinCC界面中,并创建一些用于测试的按钮功能,效果如下图所示:
- 创建一些内部变量,包括3个布尔变量(Alarm1、Alarm2、Alarm3)以及3个模拟量变量(Pressure1、Pressure2、Pressure3)。
- 控件属性绑定,对于Toogle按钮及输入输出域,直接绑定对应的变量即可,对于语音报警控件,需要设置Alarm1-Alarm6,其中Alarm1-Alarm3直接绑定内部变量Alarm1-Alarm3,对于Alarm4-Alarm6,由于是模拟量,需要通过动态对话框进行设置,如下图所示:
- 对于报警播报的内容提示,根据实际情况填写即可:
如果需要控件源码,可以关注【公众号dotNet工控上位机:thinger_swj】,并注明来自博客园。
手把手教你基于C#开发WinCC语音报警插件「附源代码」的更多相关文章
- Delphi - 手把手教你基于D7+Access常用管理系统架构的设计与实现 (更新中)
前言 从事软件开发工作好多年了,学的越深入越觉得自己无知,所以还是要对知识保持敬畏之心,活到老,学到老! 健身和代码一样都不能少,身体是革命的本钱,特别是我们这种高危工种,所以小伙伴们运动起来!有没有 ...
- 手把手教你使用 Clion 开发 Linux C++ 项目
手把手教你使用 Clion 开发 Linux C++ 项目 关于CLion CLion是一款专为开发C及C++所设计的跨平台IDE.它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员 ...
- 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引
近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开 ...
- 基于Kibana的可视化监控报警插件sentinl入门
sentinl是什么 Kibi/Kibana Alert & Reporting App Watching your data, 24/7/365 sentinl是一个免费的kibana预警与 ...
- 手把手教你搭建织女星开发板RISC-V开发环境
前言 Windows环境下搭建基于Eclipse + RISC-V gcc编译器的RISC-V开发环境,配合openocd调试软件,可以实现RISC-V内核程序的编译.下载和调试. 准备工作 工欲善其 ...
- 手把手教你Chrome扩展开发:本地存储篇
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
- 倒计时0日!Apache DolphineScheduler4月 Meetup 大佬手把手教你大数据开发,离线调度
随着互联网技术和信息技术的发展,信息的数据化产生了许多无法用常规工具量化.处理和捕捉的数字信息.面对多元的数据类型,海量的信息价值,如何有效地对大数据进行挖掘分析,对大数据工作流进行调度,是保障企业大 ...
- 手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)
在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...
- 从0开始,手把手教你用Vue开发一个答题App01之项目创建及答题设置页面开发
项目演示 项目演示 项目源码 项目源码 教程说明 本教程适合对Vue基础知识有一点了解,但不懂得综合运用,还未曾使用Vue从头开发过一个小型App的读者.本教程不对所有的Vue知识点进行讲解,而是手把 ...
随机推荐
- Hibenate面试
5. 对比总结 返回值: get()返回的是查询出来的实体对象,而load()查询出来的是一个目标实体的代理对象. 查询时机: get()在调用的时候就立即发出SQL语句查询,而load()在访问非I ...
- MongoDB via Dotnet Core数据映射详解
用好数据映射,MongoDB via Dotnet Core开发变会成一件超级快乐的事. 一.前言 MongoDB这几年已经成为NoSQL的头部数据库. 由于MongoDB free schema ...
- 基于 Blazor 开发五子棋⚫⚪小游戏
今天是农历五月初五,端午节.在此,祝大家端午安康! 端午节是中华民族古老的传统节日之一.端午也称端五,端阳.此外,端午节还有许多别称,如:午日节.重五节.五月节.浴兰节.女儿节.天中节.地腊.诗人节. ...
- 学习python的基本了解
1) 使用python打印信息,分别打印你的名字.年龄.爱好# print('wang,23,shopping')# 2)使用变量,分别打印你的名字.年龄.爱好# name='wang'# age=2 ...
- Python实用笔记 (11)高级特性——迭代器
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 可以使用isinstance()判断一个对象是否是Iterable对象: >>> from collectio ...
- 洛谷 P1186 【玛丽卡】
这道题题目真的想吐槽一下...是在机房同学的解释下才看懂的.就是让你求在可以删一条边的情况下,并且删后保证可以到达终点时,求删了后的最大的最短路径. 70分暴力思路: 枚举删边,然后跑一下最短路即可, ...
- Bootstrap 3.3
https://jeesite.gitee.io/front/bootstrap/3.3/v3.bootcss.com/index.htm
- 大厂程序员因厌恶编程,辞去月薪2w+的工作去当司机?
世界好小啊,刚在一个 UP 主的群里看到一个视频,标题叫做:"失业了工作没找到,却稀里糊涂上了知乎热搜,2000 多万人围观,我--" 说实话,看到视频的封面,我的下巴当时就掉到了 ...
- 很实用的h5实现名片扫描识功能快速结合市场运营
功能描述: 点击名片识别按钮,将名片上的个人信息扫描并解析出来显示. 实现步骤: 1.点击第一个页面上的名片识别按钮,调出手机摄像头和相册,让用户进行选择 2.获取照片或者图片的base64数据,传值 ...
- css重设样式_清除浏览器的默认样式
由于不同的浏览器默认的样式也不同,所以在网页开发前设置一个公用样式,来清除各个浏览器的默认样式,已达到做的网页在各个浏览器中达到统一. 收集的默认样式的链接地址: 1.eric-meyer-reset ...