一、   工控网关是什么

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

    Android SystemProperties设置/取得系统属性的用法总结 通过调查得知,Android系统中取得/设置系统属性的用法参考以下3篇文章就足够了. 1.Android SystemPr ...

  2. 【数据分析】线性回归与逻辑回归(R语言实现)

    文章来源:公众号-智能化IT系统. 回归模型有多种,一般在数据分析中用的比较常用的有线性回归和逻辑回归.其描述的是一组因变量和自变量之间的关系,通过特定的方程来模拟.这么做的目的也是为了预测,但有时也 ...

  3. 服务端如何获取客户端请求IP地址

    服务端获取客户端请求IP地址,常见的包括:x-forwarded-for.client-ip等请求头,以及remote_addr参数. 一.remote_addr.x-forwarded-for.cl ...

  4. mssql sqlserver 判断字符串大小写的方法分享

    摘要:下文讲述使用sql脚本的方法判断字符串为大小写的方法分享,如下所示 实验环境:sqlserver 2008 R2 实现思路: 将字符串转换为大写或小写然后转换为二进制编码, 然后和源字符串做对比 ...

  5. replace函数使用方法

    Replace函数的含义~ 用新字符串替换旧字符串,而且替换的位置和数量都是指定的. replace函数的语法格式 =Replace(old_text,start_num,num_chars,new_ ...

  6. linux ubuntu 关于vim得一些基本命令

    1.vim显示行号 :set number 2. 快捷键 J 向下 K 往上 H 向左 L 向右 ctrl+shift+T 打开新窗口 ctrl+Page Down 所有vim窗口向下切换 ctrl+ ...

  7. Lua5.1 升级 Lua5.3 升级 小结

    Lua的版本差异确实是比较让人头疼的事情,之前在移动端一直采用Android下使用LuaJit,Ios下使用Lua5.1.这次升级到Xlua(lua5.3版本)主要有两方面的原因:一是ulua后续维护 ...

  8. C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者

    投票系统:给定候选人名单,从键盘输入候选人的名字,统计票数,并输出最终获胜者.若投票人输入的名字不在其候选名单上,则该票数无效. //凯鲁嘎吉 - 博客园 http://www.cnblogs.com ...

  9. 《数据库技术基础与应用(第2版)》学习笔记——第7章~

    从这章开始,操作的内容开始增多,概念的东西越来越少,可能跟学校的教学目的有关,但是跟我的学习目的不匹配,就不再继续整理. 总结:这本书适合大学本科生学习和了解数据库的相关知识以及Access和SQL ...

  10. 查看linux中的TCP连接数

    一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议 ...