一、   工控网关是什么

网关是物联网和工控系统的核心组件。网关起的是承上启下的作用。上即上位机,电脑/触屏监控系统、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

开源纯C#工控网关+组态软件(二)工控网关的实现的更多相关文章

  1. 开源纯C#工控网关+组态软件

    一.   前言 在园子潜水也七八年了.说来惭愧,这么多年虽然一直自称.NET铁杆粉丝,然仅限于回几个不痛不痒的贴,既没有发布过代码,也没有写过文章. 看着.NET和C#在国外风生水起,国内却日趋没落, ...

  2. 开源纯C#工控网关+组态软件(八)表达式编译器

    一.   引子 监控画面的主要功能之一就是跟踪下位机变量变化,并将这些变化展现为动画.大部分时候,界面上一个图元组件的某个状态,与单一变量Tag绑定,比如电机的运行态,绑定一个MotorRunning ...

  3. 开源纯C#工控网关+组态软件(九)定制Visual Studio

    一.   引子 因为最近很忙(lan),很久没发博了.不少朋友对那个右键弹出菜单和连线的功能很感兴趣,因为VS本身是不包含这种功能的.   大家想这是什么鬼,怎么我的设计器没有,其实这是一个微软黑科技 ...

  4. !!!易控INSPEC组态软件开发小结——-一次工程文件损坏和处理经过

    从加入红橡开始熟悉和使用易控(INSPEC)组态软件,值得赞扬的是INSPEC的开放性和对C#语言的支持,除此之外,便也没有感觉它与其他组态软件有太多优势,有人说INSPEC软件授权比国内其他同类的组 ...

  5. 开源纯C#工控网关+组态软件(七)数据采集与归档

    一.   引子 在当前自动化.信息化.智能化的时代背景下,数据的作用日渐凸显.而工业发展到如今,科技含量和自动化水平均显著提高,但对数据的采集.利用才开始起步. 对工业企业而言,数据采集日益受到重视, ...

  6. 开源纯C#工控网关+组态软件(十)移植到.NET Core

    一.   引子 写这个开源系列已经十来篇了.自从十年前注册博客园以来,关注了张善友.老赵.xiaotie.深蓝色右手等一众大牛,也围观了逗比的吉日嘎啦.精密顽石等形形色色的园友.然而整整十年一篇文章都 ...

  7. 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

    一.   引子 首先感谢博客园:第一篇文章.第一个开源项目,算是旗开得胜.可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^. 园友给了我很多支持,并提出了很好的改进意见.现加入屏幕分辨率自 ...

  8. 开源纯C#工控网关+组态软件(四)上下位机通讯原理

    一.   网关的功能:承上启下 最近有点忙,更新慢了.感谢园友们给予的支持,现在github上已经有.目标是最好的开源组态,看来又近一步^^ 之前有提到网关是物联网的关键环节,它的作用就是承上启下. ...

  9. 开源纯C#工控网关+组态软件(六)图元组件

    一.   图元概述 图元是构成人机界面的基本单元.如一个个的电机.设备.数据显示.仪表盘,都是图元.构建人机界面的过程就是铺排.挪移.定位图元的过程. 图元设计是绘图和编码的结合.因为图元不仅有显示和 ...

随机推荐

  1. elasticsearch及head插件安装与配置

    1. 环境软件版本说明 系统:ubuntu14.04.1 JDK:1.8 elasticsearch:5.5.2 node:9.11.1 elasticsearch:5.X 2. 环境软件下载说明 1 ...

  2. 一些安全相关的HTTP header

    1.Strict-Transport-Security HTTP Strict-Transport-Security,简称为HSTS. 作用:允许一个HTTPS网站,要求浏览器总是通过HTTPS访问它 ...

  3. python的datetime模块处理时间

    python的datetime模块主要用来处理时间,里面包含很多类,包括timedelay,date,time,datetime等 开发中经常会用到模块里面的datetime类,这是一个表示日期时间的 ...

  4. Python lambda介绍

    转自:http://www.cnblogs.com/evening/archive/2010/03/29/2423554.html Python lambda 介绍   在学习python的过程中,l ...

  5. spring4笔记----spring4国际化

    <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www. ...

  6. c/c++求解图的关键路径 critical path

    c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程. 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以. 完成V2需要a1 ...

  7. Jetbrains IntelliJ IDEA PyCharm 注册激活(2018最新)

    AppCode CLion DataGrip GoLand IntelliJ IDEA PhpStorm PyCharm Rider RubyMine WebStorm下载注册激活 官方下载地址 Ap ...

  8. Django Form和ModelForm组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  9. Nginx使用教程(二):Nginx配置性能优化之worker配置

    配置Nginx workers <br\>NGINX根据指定的配置运行固定数量的工作进程. 这些工作进程负责处理所有处理. 在下面的章节中,我们将调整NGINX worker参数. 这些参 ...

  10. 微信H5开发,页面被缓存,不更新

    原文:https://blog.csdn.net/qq_27471405/article/details/79295348  这里只是备份 前言:每一次请求,我们都知道浏览器会做一定处理,其中就包括对 ...