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

一、   引子

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

园友给了我很多支持,并提出了很好的改进意见。现加入屏幕分辨率自适应和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中批量读写方法的封装。

GetDeviceAddress/GetAddress方法很重要,在TagConfig里编辑的地址是西门子约定俗成的,比如DB3,DD122.1,要翻译成下位机理解的设备地址DeviceAddress。

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

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

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

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

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

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

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

但如果你想一次就能读入1000个变量,要考虑到变量地址可能是不连续的,散乱的。而每次读取的大小受PDU所限。

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

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

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

四、   下面的计划

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

  • 网关层接口概述

  • 上下位机通讯原理

  • 如何实现一个设备驱动

  • 如何设计图元

  • VS插件模块及原理

  • 归档模块及文件格式

  • 如何进行功能扩展

  • 组态变量表达式实现

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


相关文章: 

  • .NET十年回顾

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

原文地址:http://www.cnblogs.com/evilcat/p/7647775.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有没有完全自助的国产化数据库技术?

大家好,我是雄雄。 SPL资料 SPL官网SPL下载SPL源代码 前段时间世界部分地区不断的起冲突,Oracle宣布“暂停在俄罗斯的所有业务”,相信大家的心情绝不是隔岸观火,而是细思恐极。 数据库号称IT领域三大核心之一(其他两…

我为啥不看好ServiceMesh

转载自 我为啥不看好ServiceMesh 前言 今年,ServiceMesh(服务网格)概念在社区里头非常火,有人提出2018年是ServiceMesh年,还有人提出ServiceMesh是下一代的微服务架构基础。作为架构师,如果你现在还不了解ServiceMesh的话&…

USACO2.4のP1519-穿越栅栏(Overfencing)【bfs】

正题 题目大意 一个迷宫&#xff0c;有许多出口&#xff0c;求一个点到最近的出口最远。 解题思路 直接bfs暴力搜索&#xff0c;然后保存上次的答案 code // luogu-judger-enable-o2 #include<cstdio> #include<queue> #include<cstring> #define N 210 u…

人生路漫漫,还得多输出

今天看了下别人的博客&#xff0c;感觉有点受打击&#xff0c;自己写博客花的时间还是太少&#xff0c;感觉到现在还是没有写博客的习惯。回头想想&#xff0c;其实要写的东西挺多的&#xff0c;就是不愿意写&#xff0c;莫名其妙的觉得很简单&#xff0c;写出来肯定很水&#…

ASP.NET Core 2.0 支付宝当面付之扫码支付

前言 自从微软更换了CEO以后&#xff0c;微软的战略方向有了相当大的变化&#xff0c;不再是那么封闭&#xff0c;开源了许多东西&#xff0c;拥抱开源社区&#xff0c;.NET实现跨平台&#xff0c;收购xamarin并免费提供给开发者等等。我本人是很喜欢.net的&#xff0c;并希望.…

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教

转载自 Git使用教程&#xff1a;最详细、最傻瓜、最浅显、真正手把手教 一&#xff1a;Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统。 工作原理 / 流程&#xff1a; Workspace&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Repository&…

【git】如何在github上推送并部署自己的项目

口令快捷 git add . git commit --m "XXXX" git remote add origin https://github.com/lifeload/new-problem.git git push -f origin master修改或删除文件 git add 对应文件/. git commit -m “xxx” git push origin master 1、上传代码 2、设置&#xff0c;建立…

USACO2.4のP1522-牛的旅行(Cow Tours)【最短路Flody】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1522 题目大意 有n个点&#xff0c;连接任意两个不同联通块上的点&#xff0c;使这个新的联通块之间最远的两个点的距离最远。 解题思路 先FlodyO(n3)O(n^3)O(n3)计算两两之间的距离 然后计算出每个…

一起聊聊Microsoft.Extensions.DependencyInjection

Microsoft.Extensions.DependencyInjection在github上同样是开源的&#xff0c;它在dotnetcore里被广泛的使用&#xff0c;比起之前的autofac,unity来说&#xff0c;它可以说是个包裹&#xff0c;或者叫适配器&#xff0c;它自己提供了默认的DI实现&#xff0c;同时也支持第三方…

这 10 道 Spring Boot 常见面试题你需要了解下

转载自 这 10 道 Spring Boot 常见面试题你需要了解下 1.什么是Spring Boot&#xff1f; 多年来&#xff0c;随着新功能的增加&#xff0c;spring变得越来越复杂。只需访问https://spring.io/projects页面&#xff0c;我们就会看到可以在我们的应用程序中使用的所有Spring项…

【git】如何给github绑定ssh

首先在git上输入 &#xff1a; ssh-keygen 会在c盘的用户账号的文件夹.ssh上生成两个密钥 &#xff08;如果没有生成&#xff0c;请注意自己是否按了enter&#xff0c;出现一个小方框为止&#xff09; 将.pug用笔记本打开 全选复制 来到github的设置上 将刚刚复制的东西黏…

nssl1231-Gift【01背包,dp】

正题 题目大意 n个物品&#xff0c;每个物品有cic_ici​元&#xff0c;求有多少种方案数使得无法再买另外任何的东西。 解题思路 我们发现其实对于每种方案判断只需要考虑剩下的最小的哪一个&#xff0c;所以我们可以将ccc从小到大排序。然后用fi,jf_{i,j}fi,j​表示选择了1∼…

【杭州】Hack for Cloud Beginner微软黑客松大赛

在这美丽的西子湖畔&#xff0c;我们欢迎各行各业的开发者参与此次Hack for Cloud Beginner微软黑客松大赛。我们致力于为开发者们提供在技术、社区领域中的交流平台&#xff0c;重在参与&#xff0c;意于创新。 此次黑客松大赛将于10月22日在中国杭州拉开帷幕&#xff0c;参与…

Java高级开发必会的50个性能优化的细节(珍藏版)

转载自 Java高级开发必会的50个性能优化的细节&#xff08;珍藏版&#xff09; 在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。 ● 1. 尽量在合适的场合使用单例…

nssl1232-函数【数论,欧拉函数,莫比乌斯反演】

正题 题目大意 ∑d∣nf(d)n\sum_{d|n}f(d)nd∣n∑​f(d)n 对于n个aia_iai​ 求 ∑i1nf(ai)\sum_{i1}^nf(a_i)i1∑n​f(ai​) 解题思路——莫比乌斯反演 这个方法对于aia_iai​比较大时比较好用&#xff0c;但是事实证明本题过不了。 用莫比乌斯反演可得到此公式 f(n)∑d∣nμ(…

从0部署一个动态网站

准备&#xff1a;购买域名和服务器 下载软件&#xff1a;服务器上下载宝塔面板和xampp 首先区分动态网站和静态网站区别&#xff1a;动态网站是指数据可以交互的&#xff0c;根据不同的人出现不同的页面&#xff0c;要用到数据库和php。登录注册是动态网站最基础的部分 而静态…

最新的.NET Framework聚焦于改进可访问性

Microsoft宣布预发布.NET Framework 4.7.1&#xff0c;其中包括了各种全面的改进。这里&#xff0c;我们关注一下在WPF应用可访问性上所做的改进。改进的设想针对领域是屏幕报读器&#xff08;Screen Reader&#xff09;和高对比度场景。Microsoft的Preeti Krishna表示&#xf…

MYSQL 入门全套

转载自 MYSQL 入门全套 MySQL简介 1、什么是数据库 &#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;它产生于距今六十多年前&#xff0c;随着信息技术和市场的发展&#xff0c;特别是二十世纪九十年代以后&am…

nssl1230-序列【位运算】

正题 题目大意 长度为n的序列&#xff0c;求两个长度大于等于kkk的连续序列&#xff0c;一个位运算“和”后最大的答案&#xff0c;和“或”后最大的答案。 解题思路 首先ororor baorxba\ or\ xba or x的话&#xff0c;b⩾ab\geqslant ab⩾a 所以答案就是所有的或起来 然后a…

ImageSharp一个专注于NetCore平台图像处理的开源项目

今天大家分享的是一个专注于NetCore平台图像处理的开源项目&#xff0c;老实说为这篇文章取名字想了5分钟&#xff0c;可能是词穷亦或是想更好的表达出这款开源项目的作用&#xff1b;这个项目在图像处理方面有很多功能&#xff0c;如&#xff1a;缩放&#xff0c;裁剪&#xf…