一、   工控网关是什么

网关是物联网和工控系统的核心组件。网关起的是承上启下的作用。上即上位机,电脑/触屏监控系统、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. [20190319]shared pool latch与library cache latch的简单探究.txt

    [20190319]shared pool latch与library cache latch的简单探究.txt --//昨天看Oracle DBA手记3:数据库性能优化与内部原理解析.pdf 电子书 ...

  2. Java读取.properties配置文件

    一.介绍 Properties文件在Java中主要为配置文件,文件类型为:.properties,格式为文本文件,内容格式为"键=值" 二.读取 这里我采用的是getResourc ...

  3. Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    1.第一步,在本地数据库中建一个与服务器同名的数据库 2.第二步,右键源数据库,任务>导出数据,弹出导入导出提示框,点下一步继续 3.远程数据库操作,确认服务器名称(服务器地址).身份验证(输入 ...

  4. Django之--通过MVC架构的html模板展示Hello World!

    上一篇:Django之--网页展示Hello World! 初步说明了如何使用Django来显示hello world,本文略微进阶下使用html模板来展示hello world~ 首先在mysite ...

  5. SQL Server 事务隔离级别

    一.事务隔离级别控制着事务的如下表现: 读取数据时是否占用锁以及所请求的锁类型. 占用读取锁的时间. 引用其他事务修改的行的读操作是否: 在该行上的排他锁被释放之前阻塞其他事务. 检索在启动语句或事务 ...

  6. js在前端json字符串和对象互相转化

    js在前端json字符串和对象互相转化 //对象转json串 注意:参数必须是对象,数组不起作用,对象格式{'0'=>'a'} JSON.stringify( arr ); //json字符串转 ...

  7. 几个常用dos网络命令

    ping www.baidu.com 测试网络的同时,查看ip地址 1. 如图:百度的ip为  14.215.177.39.浏览器直接输入ip即可进入百度首页. 另外还有,14.215.177.38 ...

  8. PHP中cURL的应用

    这里是慕课网上讲cURL 的一张图,觉得吧这个过程说的很清楚,因此就不错了. 1, 打开一个网页,下载网页内容 <?php $curl = curl_init("http://www. ...

  9. SSL 原理及 https 配置

    目录 1. SSL 原理 1.1. SSL 简介 1.2. 主要概念 1.3. 建立安全连接的过程 2. https 配置 (以 nginx 为例) SSL 原理 SSL 简介 SSL (Secure ...

  10. sq

    CREATE TABLE `message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NUL ...