【开源】纯C#工控网关+组态软件之工控网关的实现

2017 年 10 月 15 日 DotNet

(点击上方蓝字,可快速关注我们)


来源:老坏猫

cnblogs.com/sweetwxh/p/face_recognization.html


一、工控网关是什么


网关是物联网和工控系统的核心组件。网关起的是承上启下的作用。上即上位机,电脑/触屏监控系统、MES这些;下即下位机,包括PLC、传感器、嵌入式芯片等。


不同厂家的下位机,往往讲的是不同的语言,西门子的语言叫ProfiBus,施耐德的语言叫Modbus,AB的语言叫Ethernet IP。在楼宇自控领域,又有BACnet 。


网关要担当沟通上、下位机的重任,它的基本功能就是翻译,即协议转换。管你说哪种方言,最后转给上位机的都是普通话。



二、如何实现软网关:启下


  • 网关是对下位机的抽象


程序就是对客观事物的抽象。网关如果要完整无误的转述各种下位机的“方言”,那一定是它能够提取出下位机的共性。


共性的部分,抽象成接口。特性的部分,在各自的类里实现。


分析之后,我认为下位机最重要的两个共性是:可读写性。可连接性。


这样就有了两个基本接口(在Dataservice项目中):IReaderWriter,描述读写性。IDriver,描述连接性。


  • 接口类图及继承关系



IReaderWriter接口的方法,都是和读写有关的:读入/写入一个位,读入/写入一字节、一个整数、一个浮点数、一个字符串。


这些方法都有一个共同的参数,DeviceAddress。代表一个下位机地址。


DeviceAddresss 是一个结构体。包含区域号Area,区块号DBNumber,起始位置Start,位号Bit。


区域包含区块,区块有起始地址,逻辑变量有位号。加上VarType描述数据类型(布尔型、整型、浮点型、字符型等等),DataSize描述数据长度。


这样的四级地址加上数据描述,足够映射到任何一个下位机变量地址了。


IDriver 接口的方法,都是和连接有关的。Connect方法负责连接、IsClosed判断连接是否断开、TimeOut设置超时、OnClose事件在连接断开时触发。


ServerName属性表示下位机的IP或者主机名。由这样一些属性、方法,就可以定义一个下位机的连接了。


也许大家会问,为什么不把两个接口合并为一个?


因为一定有某种只具备连接性,不具备可读写性,或者只有可读写性,并没有可连接性的对象存在。


比如内存数据库对象。因为所有下位机的地址,都是各有各的表述方式,我在A小区X栋X号,我在B小区住独栋。


下位机的地址小区不同,门牌号不同,而且很可能是不连续的,散乱的。


要对这些乱七八糟的地址进行统一管理,就像这些来自五湖四海的客人,住到同一家大酒店。每个人从此只有一个标准化的地址:房号。


内存数据库ICache就是对下位机地址变量的映射。映射到一个连续的内存地址空间,便于统一编号,统一管理。


对内存数据库而言,它具有可读写性,但不需要可连接性。也就是只要继承IReaderWriter。



在这个继承图里,有一个抽象类专门描述PLC类型下位机的,就是IPLCDriver。


首先所有的PLC都具有可连接性,可读写性。因此两个接口都继承。


同时,PLC的地址往往表示为格式化的字符串。比如西门子地址可写为DB3,D122.1,Modubs为30001.1。


 GetDeviceAddress\GetAddress两个方法就是对DeviceAddress 与字符串之间编码、解码。


PDU 是PLC的一个特殊属性。也就是报文的数据单元。


所有的PLC如西门子、三菱、AB、Modbus都继承于IPLCDriver 。


IFileDriver代表另一类下位机,比如来自数据库、文件流等。它们的共性是具有文件名FileName。


在类图里看到一个孤零零的IMultiReadWrite ,它是做什么的?


因为部分下位机支持批量读写,尤其在注重效率的场合,批量读写十分重要。一次读入几百个变量,和几百次读入单个变量,效率天壤之别。


因此IMultiReadWrite 要实现两个方法,ReadMultiple(批量读),WriteMultiple(批量写),参数都是一个DeviceAddress 数组。


如果你的下位机支持批量读写,直接继承这个接口并实现就可以了。如果读写时发现继承了这个接口,系统就会自动调用更高效的方式。


三、如何实现软网关:承上


  •  网关是对上位机变量的映射


一个能连接、能读写的下位机如果实现了,要想在界面显示,必须做一件事,


就是让下位机数据的变化,反映为上位机图形的变化。



比如这幅界面里的电机,启动后变绿;电流温度数据会显示并刷新。


要做到这一点,就必须有一个上下位机的中介:Tag。


Tag 这个对象,必须有一个上位机设计者理解的名字,比如1号马达运行信号,就叫做Motor1_Running。


这个名字,在下位机是不存在的。下位机只有呆板的地址,比如DB3,D122.1。


这些上位机设计者没必要知道。但他们一定知道这是一个布尔量,名字叫Motor1_Running。


因此网关还有一个必要的功能,下位机数据变化了,Tag值会相应变化,反过来也一样。


  • Tag的结构 



因为上位机设计员只知道Tag的数据类型是整型、还是浮点数、还是布尔量,因此Tag也分IntTag、FloatTag、BoolTag等类型。


不管哪种类型的Tag,一定继承ITag抽象类。 ITag有Address属性,就是映射到DeviceAddress 。同时还有TimeStamp(时间戳),Value(值),Quailty(数据质量)。


同样的,Tag本身也具有读写功能(Read,Write方法),也就是上位机对Tag的读写,最终反映为下位机对地址的读写。


而不同类型的Tag,自然就对应到上面所提到的IReaderWriter 接口,正好有匹配的读/写布尔量,读/写整型,读/写浮点型等等的方法。


这样,就把下位机设备和Tag变量的读写对应起来 了。


四、下面的计划


完善功能


请继续关注我的帖子,并提出宝贵意见和建议。


写一系列帖子,把架构、原理讲清楚


提纲和目录也拟好了。大致如下:


  1. 《网关层接口概述》


  2. 上下位机通讯原理


  3. 如何实现一个设备驱动


  4. 如何设计图元


  5. VS插件模块及原理


  6. 归档模块及文件格式


  7. 如何进行功能扩展


github地址:https://github.com/GavinYellow/SharpSCADA。


看完本文有收获?请转发分享给更多人

关注「DotNet」,提升.Net技能 

登录查看更多
1

相关内容

C# 是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C# 由 C 语言和 C++ 派生而来,继承了其强大的性能,同时又以 .NET 框架类库作为基础,拥有类似 Visual Basic 的快速开发能力。
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【ICMR2020】持续健康状态接口事件检索
专知会员服务
17+阅读 · 2020年4月18日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
118+阅读 · 2019年12月31日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
86+阅读 · 2019年11月25日
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
使用 Canal 实现数据异构
性能与架构
20+阅读 · 2019年3月4日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
我的if else代码纯净无暇,一个字也不能简化
机器之心
3+阅读 · 2018年12月28日
Neural Response Generation with Meta-Words
Arxiv
6+阅读 · 2019年6月14日
Mesh R-CNN
Arxiv
4+阅读 · 2019年6月6日
Arxiv
5+阅读 · 2018年5月1日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【ICMR2020】持续健康状态接口事件检索
专知会员服务
17+阅读 · 2020年4月18日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
118+阅读 · 2019年12月31日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
86+阅读 · 2019年11月25日
相关资讯
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
使用 Canal 实现数据异构
性能与架构
20+阅读 · 2019年3月4日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
我的if else代码纯净无暇,一个字也不能简化
机器之心
3+阅读 · 2018年12月28日
Top
微信扫码咨询专知VIP会员