写在前面

众所周知,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语音报警插件「附源代码」的更多相关文章

  1. Delphi - 手把手教你基于D7+Access常用管理系统架构的设计与实现 (更新中)

    前言 从事软件开发工作好多年了,学的越深入越觉得自己无知,所以还是要对知识保持敬畏之心,活到老,学到老! 健身和代码一样都不能少,身体是革命的本钱,特别是我们这种高危工种,所以小伙伴们运动起来!有没有 ...

  2. 手把手教你使用 Clion 开发 Linux C++ 项目

    手把手教你使用 Clion 开发 Linux C++ 项目 关于CLion CLion是一款专为开发C及C++所设计的跨平台IDE.它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员 ...

  3. 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引

    近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开 ...

  4. 基于Kibana的可视化监控报警插件sentinl入门

    sentinl是什么 Kibi/Kibana Alert & Reporting App Watching your data, 24/7/365 sentinl是一个免费的kibana预警与 ...

  5. 手把手教你搭建织女星开发板RISC-V开发环境

    前言 Windows环境下搭建基于Eclipse + RISC-V gcc编译器的RISC-V开发环境,配合openocd调试软件,可以实现RISC-V内核程序的编译.下载和调试. 准备工作 工欲善其 ...

  6. 手把手教你Chrome扩展开发:本地存储篇

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...

  7. 倒计时0日!Apache DolphineScheduler4月 Meetup 大佬手把手教你大数据开发,离线调度

    随着互联网技术和信息技术的发展,信息的数据化产生了许多无法用常规工具量化.处理和捕捉的数字信息.面对多元的数据类型,海量的信息价值,如何有效地对大数据进行挖掘分析,对大数据工作流进行调度,是保障企业大 ...

  8. 手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...

  9. 从0开始,手把手教你用Vue开发一个答题App01之项目创建及答题设置页面开发

    项目演示 项目演示 项目源码 项目源码 教程说明 本教程适合对Vue基础知识有一点了解,但不懂得综合运用,还未曾使用Vue从头开发过一个小型App的读者.本教程不对所有的Vue知识点进行讲解,而是手把 ...

随机推荐

  1. xutils工具上传日志文件

    首先下载xutils java包: 添加到项目的工程中: 第二在新建一个类继承application package logback.ecmapplication.cetcs.com.myapplic ...

  2. Jmeter系列(31)- 获取并使用 JDBC Request 返回的数据

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 Jmeter 使用 JDBC R ...

  3. openstack迁移计算节点所有云主机

    迁移计算节点所有云主机 -------高德置地 王锦雄   使用host-evacuate-live热迁移主机 查看主机目前的云主机情况 nova hypervisor-servers cloud1 ...

  4. vue与react对比总结(一)

    一.react和vue设计上的共同理念 1.使用 Virtual DOM 2.提供了响应式 (Reactive) 和组件化 (Composable) 的视图组件. 3.将注意力集中保持在核心库,而将其 ...

  5. 08 . Kubernetes之 ingress及Ingress Controller

    Ingress简介 ingress是什么? 上篇文章介绍service时有说了暴露了service的三种方式ClusterIP.NodePort与LoadBalance,这几种方式都是在service ...

  6. 数据解析_bs进行数据解析

    1.bs4进行数据解析 数据解析的原理 1.标签定位 2.提取标签,标签属性中存储的数据值 bs4数据解析的原理 1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中 2.通 ...

  7. 图文详解Prometheus监控+Grafana+Alertmanager告警安装使用

    一:前言 一个服务上线了后,你想知道这个服务是否可用,需要监控.假如线上出故障了,你要先于顾客感知错误,你需要监控.还有对数据库,服务器的监控,等等各层面的监控. 近年来,微服务架构的流行,服务数越来 ...

  8. 记一次使用elasticsearch遇到bug的探索过程

    背景: 练习一个小项目,爬取京东的数据,存到ES库中,然后读取ES库中数据,展示到页面上.效果图如下: 涉及两个接口,一个爬取写入ES接口,一个查询展示接口,当我写完代码信心满满准备看看效果的时候,调 ...

  9. day69 cookie与session

    目录 一.forms源码解析 二.cookie与session发展史 三.cookie操作 四.session操作 五.CBV如何添加装饰器 一.forms源码解析 # from组件的切入点是is_v ...

  10. POJ 1063 Flip and Shift 最详细的解题报告

    题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...