当我听到这个需求的时候,我差点爆粗口(实际上可能已经爆了,不过我忘了)。
需求刚开始是:
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/
转载文章受原作者版权保护。转载请注明原作者出处!