一、   引子

首先感谢博客园:第一篇文章、第一个开源项目,算是旗开得胜。可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^。

园友给了我很多支持,并提出了很好的改进意见。现加入屏幕分辨率自适应和OPC Server可CLSID和ProgID自适应加载功能。屏幕自适应本是普遍问题,因为之前都是标配硬件,举手之劳,一懒就忽略了。

仅仅十天前,我还是上github只会点击的菜鸟。Readme文件如何编辑都是现学现卖。

第一次向github上传仓库,下载了发现居然没有任何exe,dll,bak文件!度之,更改忽略文件。总之是赶鸭子上架,各种囧。

然则有园友捧场,我也就不揣浅陋,以见教于大方了。

二、   如何加入一个新驱动

  • 准备工作

我更新了dll文件夹:增加了libnodave.dll、libnodave.net.dll、SiemensPLCDriver.dll。这个SiemensPLCDriver.dll,

就是西门子S7系列PLC的驱动程序(包括源代码,在Program里面)。请先同步或者重新下载最新版本

libnodave开源库(https://github.com/netdata/libnodave)据说是来自西门子的德国大神所作。某前辈当年一句话:能搞定驱动就是大牛。

我找到了libnodave,封装后成功的实现了与西门子200PLC通讯,很受鼓舞,也成为了项目的起点。

  • 注册驱动

打开变量管理器TagConfig,点注册,双击【路径】框,在dll文件夹里找到SiemensPLCDriver.dll。

如果出现在下方列表,打钩,点注册,一般会提示成功。

这时候,右键点树节点S1->参数设置,就会看到S7以太网协议已经成为可选项。

  • 驱动的加载

实际上述一系列动作,就是驱动dll的信息,已经写入了数据库的RegisterModule表。

这张表就是为系统服务反射加载驱动程序提供基本信息:加载的位置、类名 、描述,以便实例化为具体的驱动类。

在DAServer内有一个AddDriver方法,就是Activator.CreateInstance加载驱动并转换为IDriver。

使用反射加载,最大优点就是用户可以自己实现一个驱动,或者引用第三方驱动,并用TagConfig注册,而不需要改动源代码。

三、   如何实现一个新驱动

  • 驱动接口规范

[Description("S7 以太网协议")]

public sealed class SiemensTCPReader : IPLCDriver, IMultiReadWrite

我在前一篇文章里提到,IPLCDriver 是所有PLC都实现的接口。IMultiReadWrite 是支持批量读写的下位机必须实现的接口。

因为PLC都具有可连接性、可读写性,同时西门子的协议还支持批量读写。

SiemensTCPReader 里的Connect方法,就是对libnodave中connectPLC方法的封装。

Dispose方法,就是释放libnodave的非托管资源。

ReadBytes、ReadInt32、ReadBit、ReadFloat、WriteFloat等方法,就是对IReaderWriter接口的实现。也就是单独读写。

ReadMultiple、WriteMultiple方法是对IMultiReadWrite 接口的实现,也是对libnodave中批量读写方法的封装。

这个Description 属性描述符,在注册之后会被反射为驱动的描述字符,存入数据库。

  • 为什么要实现批量读写,如何实现

批量读写的目的,就是为了提高性能。

很多人总是拿C#、.NET的所谓性能说事。首先我认为.NET性能优良。关键是你怎么写。

而对性能影响最大的往往不是语言、框架,而是IO。IO的性能成本往往是语言本身的十倍、百倍、甚至千倍。

在PLC通讯过程中,请求往返就是性能瓶颈。因为大部分下位机不支持订阅-发布(推送)模式,只能采用定期轮询方式。

既然是轮询,如果变量很多,如果一个个去读写,读1000个变量要轮询1000次,一次往返起码几十毫秒,效率差的惊人,还占用PLC大量资源。这是行不通的。

但如果你想一次就能读入1000个变量,要考虑到变量可能是不连续的,散乱的。

所以,就一定要对变量的分布分析整理,类似送快递,客户虽然分布在各个小区,但并不能像醉汉一样漫无目的的投递,而是根据客户的分布,执行最优化的路线选择。

整理的结果,就是将所有要读写的变量分割为块,每块大小不能超过PLC 的PDU。力求往返次数最少、一次读入的区块最大、包含的变量最多。

分割整理变量区块的功能,就是PLCGroup 的UpdatePDUArea函数实现的。不过我在这里只是进行简单的地址归纳,并没有做最优解。最优算法肯定是存在的,但可能与现行方法出入不会太大。

四、   下面的计划

写一系列帖子,把架构、原理讲清楚。大致如下:

  • 网关层接口概述
  • 上下位机通讯原理
  • 如何实现一个设备驱动
  • 如何设计图元
  • VS插件模块及原理
  • 归档模块及文件格式
  • 如何进行功能扩展
  • 组态变量表达式实现

github地址:https://github.com/GavinYellow/SharpSCADA。欢迎大家提出宝贵意见和建议!

开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7的更多相关文章

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

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

  2. 开源纯C#工控网关+组态软件(二)工控网关的实现

    一.   工控网关是什么 网关是物联网和工控系统的核心组件.网关起的是承上启下的作用.上即上位机,电脑/触屏监控系统.MES这些:下即下位机,包括PLC.传感器.嵌入式芯片等. 不同厂家的下位机,往往 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. 开源纯C#工控网关+组态软件(五)从网关到人机界面

    一.   引子 之前都在讲网关,不少网友关注如何实现界面.想了解下位机变量变化,是怎样一步步触发人机界面动画的. 这个步步触发,实质上是变量组(Group)的批量数据变化(DataChange)事件, ...

随机推荐

  1. leetcode 001 Two Sun

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  2. chrome开发工具指南(十)

    检查和删除 Cookie 从 Application 面板检查和删除 Cookie. TL;DR 查看与 Cookie 有关的详细信息,例如名称.值.网域和大小,等等. 删除单个 Cookie.选定网 ...

  3. java 得到以后的日期

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt222 import java.text.ParseException; im ...

  4. 个人作业3-个人总结(Alpha阶段)

    一.个人总结 1.团队状况:这是我们第一次团队开发,小组成员的编程水平都相对一般,要在一周内完成一个APP是一个很大的考验.再加上冲刺的那周团队大半成员都在为一个比赛培训,时间就更少了,曾经有很多次我 ...

  5. GUI记事本+切换面板1.1版

    package com.niit.javagui; import java.awt.Color; import java.awt.MenuBar; import java.awt.event.Inpu ...

  6. 团队作业9--beta版本测试报告及发布说明

    Beta版本测试报告 1.bug的分类 a.修复的bug 部分用户无法获取位置 e. 这个bug的确应该修复,但是没有时间在这个版本修复,延迟到下一个版本修复. 前端无法查看用户签到信息 2.场景测试 ...

  7. 201521123085《Java程序设计》第4周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 2.书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对 ...

  8. Java 第九周总结

    1. 本周学习总结 2. 书面作业 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 以前的代码经常出现空指针的,需 ...

  9. 工厂模式 and 单例模式

    工厂模式:使用工厂类使创建类与使用类分离,从而提高代码的易维护性,可扩展性等 工厂模式分位简单工厂模式和工厂方法模式 使用简单工厂模式的步骤:     1.创建父类及其子类         父类中有[ ...

  10. CSS3 3D环境实现立体 魔方效果代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...