西门子PLC数据读取 Observer设计模式

当我听到这个需求的时候,我差点爆粗口(实际上可能已经爆了,不过我忘了)。

需求刚开始是:

C#连接PLC Modbus读取值。

我用C#写完了,觉得太简单了,还弄了个窗体。

接着是:

只读值那太简单了吧?这个不就一行代码的事情嘛,要监听值的变化并回调。

好的,我花一下午弄了出来,并整合到.NET项目里面。

又来了:

要监听值的变化,要定时读取值并回调,要比较值的大小,大于或小于并回调,动态订阅,并支持多台PLC设备,用JSON配置文件配置。

FUCK!

那能咋办呢,做呗。

首先想到的就是线程池和订阅模式。

提供一个核心类,比如这个类叫做ModBusMonitor,在多台主机的情况下:

ModBusMonitor plc1 = new ModBusMonitor(“PLC1”)

ModBusMonitor plc2 = new ModBusMonitor(“PLC2”)

这种方式可以保证多台主机的隔离。

接着是订阅模式。

ModBusMonitor对外提供订阅接口,定义一个Observer接口,创建多个Subscriber实现Observer:

比如当值改变时订阅接口:ValueChangeSubscriber

值比较时的订阅接口:ValueComparSubscriber

同时每个订阅接口内部使用回调。

因为我考虑的是,一台主机可以对N个地址进行N个不同的订阅,所以这是比较灵活的实现方式。

所以回调隔离开,一个Subscriber一个Callback。

ValueChangeSubscriber:

ModBusMonitor实现:

每个Subscriber都是一个线程,提供取消订阅和释放主机。

使用时:

很完美,平平无奇却又有些精巧。

Original: https://www.cnblogs.com/yangchaojie/p/15869875.html
Author: 杨超杰
Title: 西门子PLC数据读取 Observer设计模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593203/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 惰性初始化

    在上面两个类定义的方法中,有一个很特殊:toString()。每一个非基本类型的对象都有一个toString()方法,而且当编译器需要一个String而你却只有一个对象时,该方法便…

    Java 2023年6月13日
    079
  • 类加载的机制及过程

    5个步骤:加载–>验证–>准备–>解析–>初始化 加载:读取二进制文件,根据路径找到对应的class文件然后…

    Java 2023年6月14日
    062
  • es篇-es基础

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 es和solr一样,都是基于Lucene的全文检索…

    Java 2023年6月8日
    079
  • Spring Cloud Hystrix Dashboard熔断器-Turbine集群监控(六)

    绿色计数: 表示成功的请求数 蓝色计数: 表示断路器打开后,直接被短路的请求数 黄色计数: 表示请求超时数 紫色计数: 表示因为线程池满而被拒绝的请求数 红色计数: 表示因为异常而…

    Java 2023年5月30日
    092
  • Android 虚拟机总结

    标记出不需要回收的对象,清除没有被标记的对象,它是最基础的收集算法,后续的算法都是对其的不足进行改进。 标记后会产生大量不连续的内存碎片。 将操作区域分为两块,每次只使用一块,当内…

    Java 2023年6月7日
    089
  • 【2022暑期集训】最小生成树专题题解

    题目背景 Farmer John 被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 题目描述 FJ 已经给他的农场安排了一条…

    Java 2023年6月5日
    066
  • 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)

    Spring Security功能多,组件抽象程度高,配置方式多样,导致了Spring Security强大且复杂的特性。Spring Security的学习成本几乎是Spring…

    Java 2023年5月30日
    0114
  • Java IO理解

    Java BIO NIO AIO理解 同步 异步 同步:发起一个调用后,被调用者未处理完请求之前,不返回 异步:发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者…

    Java 2023年6月8日
    079
  • Redis

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    077
  • 数组

    是一种用于存储 多个相同数据类型的存储模型 静态初始化 int [] arr = {1,8,12,3,5,9}; int arr2 [] = {1,8,12,3,5,9};//创建…

    Java 2023年6月8日
    086
  • JAVA UUID 生成

    在Java中生成UUID主要有以下几种方式: JDK1.5如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:java.util.UUID,直…

    Java 2023年5月29日
    055
  • 妄撮小游戏的开发思想-Android开发资料-《妄撮(撕开美女衣服)》游戏源代码外传

    激动!想必大家一定听说过《妄撮》又名《撕开美女衣服》这个手机游戏,体验非常棒,很H很BL啊,现在很难下载到。不过今天哥在一个论坛竟然发现了这个游戏的源代码被外传,赶紧收藏,并慷慨与…

    Java 2023年5月29日
    077
  • 选择结构(Java)

    if选择结构 if语法 if(布尔表达式){如&…

    Java 2023年6月9日
    068
  • FastAPI快速查阅

    官方文档主要侧重点是循序渐进地学习FastAPI, 不利于有其他框架使用经验的人快速查阅故本文与官方文档不一样, 并补充了一些官方文档没有的内容 安装 包括安装 uvicorn $…

    Java 2023年6月7日
    092
  • 线上Java程序占用 CPU 过高,请说一下排查方法?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白…

    Java 2023年5月29日
    095
  • 批量监控关键业务站点nginx的http状态码

    一些业务站点比较关键,比如API接口或者web站点,需要对出现的访问http状态码进行监控,比如监控10分钟以内,或者最近的1000次访问,当出现的50x状态码过多时触发告警,可以…

    Java 2023年5月30日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球