、hsl:要打开“结构标识管理器”,应该点击菜单:(2分)

按时间排序 按相关度排序

按回复數排序 按相关度排序

工具类 代码类 文档 全部

VIP免费看 按人气排序 按时间排序 按相关度排序

  Inkscape是一个开放原始码的向量绘图软件,而且功能也十分强大,除了基本的点、线、面、圆形、矩形、曲线之外,也可以做到三维颜色等等高级功能


VIP专享文档是百度文库认证用户/機构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档只要带有以下“VIP专享文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档会员用户可以免费随意获取,非会员用户需要消耗下载券/积分獲取只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档会员用户可以通过设定价的8折获取,非會员用户需要原价获取只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文库认证用户/机构上传的专业性文档需要文库用户支付人民币获取,具体价格由上传人自由设定只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库鼡户免费上传的可与其他用户免费共享的文档具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档

本文将使用一个gitHub开源的项目来扩展实现二次协议的开发该项目已经搭建好了基础层架构,并实现了三菱西门子,欧姆龙MODBUS-TCP的通讯示例,也可以参照这些示例开发其他嘚通讯协议并Pull request到这个项目中来实现这个项目的最终目标

联系作者及加群方式(激活码在群里发放):

在Visual Studio 中的NuGet管理器中可以下载安装,也鈳以直接在NuGet控制台输入下面的指令安装

 如果需要教程:Nuget安装教程:

组件的完整信息和其他API介绍参照:   组件的授权协议更新日志,都在该頁面里面

本文将展示如果进行二次扩展通讯协议,来进行远程交互可以是PLC协议,自定义协议等等以一个示例为切入点,根据这个示唎来深入讲解

此处使用到了2个命名空间:


本组件所提供的所有客户端类包括三菱,西门子欧姆龙,modbus-tcp以及SimplifyNet都是继承自双模式基类,双模式包含了短连接和长连接下面就具体介绍下两个模式的区别

短连接:每次读写都是一个单独的请求,请求完毕也就关闭了如果服务器的端口仅仅支持单连接,那么关闭后这个端口可以被其他连接复用但是在频繁的网络请求下,容易发生异常会有其他的请求不成功,尤其是多线程的情况下

长连接:创建一个公用的连接通道,所有的读写请求都利用这个通道来完成这样的话,读写性能更快速即時多线程调用也不会影响,内部有同步机制如果服务器的端口仅仅支持单连接,那么这个端口就被占用了比如三菱的端口机制,西门孓的Modbus tcp端口机制也是这样的以下代码默认使用长连接,性能更高还支持多线程同步。

在短连接的模式下每次请求都是单独的访问,所鉯没有重连的困扰在长连接的模式下,如果本次请求失败了在下次请求的时候,会自动重新连接服务器直到请求成功为止。另外盡量所有的读写都对结果的成功进行判断。


不管是三菱的数据访问类还是西门子的,还是Modbus tcp访问类都有一个LogNet属性用来记录日志,该属性昰一个接口类ILogNet,凡事继承该接口的都可以用来记录日志该日志会在访问失败时,尤其是因为网络的原因导致访问失败时会进行日志记錄(如果你为这个 LogNet 属性配置了真实的日志记录器的话):如果你想使用该记录日志的功能请参照如下的博客进行实例化:


该基类定义了連接方法,单次的数据请求方法但是需要指定消息类型,TNetMessage指示了该消息类型必须继承自接口INetMessage至于TTransform指示了一些数据类型的变换规则,这兩个类型指定完成后后面的事情就是定义地址解析器,定义读写指令创建定义基础的读写方法,然后扩展不同类型的数据读写


先定義消息:消息的接口指示了如果去接收一条完整的消息,通常都是byte[]数据我们看一下这个接口的定义

/// 本系统的消息类,包含了各种解析规則数据信息提取规则 /// 消息头的指令长度 /// 从当前的头子节文件中提取出接下来需要接收的数据长度 /// 检查头子节的合法性 /// 获取头子节里的消息标识 /// 发送的字节信息

举例来说明:例子一:Modbus-Tcp消息,通常如下:

等等不管后面是什么了

OK,现在已经可以写TNetMessage了主要思路是先接收6个长度嘚头子节,接收完后 HeadBytes 就是6个长度的字节如果需要验证,就判断byte[2]byte[3]是不是都为0,然后写一个方法从这个头子节数据里分析出接下来的数據长度, 然后就可以按照下面写

下面的验证消息接收的合法性,还需要根据发送消息的消息号接收的消息号要一致。

/// 消息头的指令长喥 /// 从当前的头子节文件中提取出接下来需要接收的数据长度 /// 检查头子节的合法性 /// 获取头子节里的消息标识 /// 发送的字节信息

消息类写好 接丅来就选取IByteTransform接口的类,这个接口定义了什么呢定义了常用的数据类型和byte[]数组之间的转换方法。为什么要实现这个接口呢因为不同设备嘚数据定义规则是不一样的,比如C#的类库地位在前,高位在后三菱PLC中也是类似的,西门子确实地位在后高位在前,但是modbus-tcp和fins协议却以雙字节为单位

所以本系统系统三个常用的数据转换类,如果有其他的机制后面可以扩展,这三个类如下:

那么我们就选择好了类型嘫后通讯类已经基本成型了

然后创建基础的读取指令方法,和写入指令方法此处简便处理,只针对寄存器进行操作

/// 读取数据的基础指令需要指定指令码,地址长度

然后读取寄存器的基础方法是这样设计,基类里有个方法:

/// 使用底层的数据报文来通讯传入需要发送的消息,返回一条完整的数据指令

这个方法是一次数据交互的成功与否所以我们要封装一个二次方法,不仅仅是进行数据交互进行消息嘚二次验证,如果验证失败就返回错误还有相关的消息

然后在封装一层基础的通信方法,在读取到数据并且验证成功之后把读取到的數据内容单独提取出来,好让后续进行更加方便的处理

/// 读取服务器的数据,需要指定不同的功能码

有了上面两层的基础最终提供了一個读取寄存器的基础方法,也就是第三层的方法

/// 从Modbus服务器批量读取寄存器的信息需要指定起始地址,读取长度

有了上面的读取寄存器的方法那么我们可以方便的扩展其他基础类型的数据读取了。

/// 读取指定地址的int数据 /// 读取指定地址的uint数据 /// 读取指定地址的long数据 /// 读取地址地址嘚String数据字符串编码为ASCII

到这里为止,就写完了寄存器的读取方法实际上会更加复杂点,会把地址解析专门拿出来做成地址解析器因为囿些PLC的地址是比较复杂,例如西门子的"M100.2"就需要写个专门的解析器来解析,针对单次读取上限也可以支持更具地址来多次访问等等操作。

写入的操作通常不会返回数据只要验证完指令的逻辑性即可,我们把地址解析器拿出来看看先写地址解析器

/// 解析数据地址,解析出哋址类型起始地址

解析完地址后,就创建写入的基础指令需要指定字节数组,如下的创建方式是针对了多个寄存器写入的代码

那么写叺数据基础方法就是

/// 将数据写入到Modbus的寄存器上去需要指定起始地址和数据内容

然后我们再想支持其他的数据类型,就好办很多了

/// 向寄存器中写入short数组返回值说明 /// 向寄存器中写入short数据,返回值说明 /// 向寄存器中写入ushort数组返回值说明 /// 向寄存器中写入ushort数据,返回值说明 /// 向寄存器中写入int数组返回值说明 /// 向寄存器中写入int数据,返回值说明 /// 向寄存器中写入uint数组返回值说明 /// 向寄存器中写入uint数据,返回值说明 /// 向寄存器中写入float数组返回值说明 /// 向寄存器中写入float数据,返回值说明 /// 向寄存器中写入long数组返回值说明 /// 向寄存器中写入long数据,返回值说明 /// 向寄存器中写入ulong数组返回值说明 /// 向寄存器中写入ulong数据,返回值说明 /// 向寄存器中写入double数组返回值说明 /// 向寄存器中写入double数据,返回值说明

到这里為止基础的操作和扩展讲的差不多了。接下来就要针对某些特殊的设备进行适配比如我在实际的开发中,发现西门子欧姆龙的通信協议中,没有一个握手信号交互的过程在西门子里还要进行2次握手,在欧姆龙里要进行一次握手这些握手信息在网络连接上之后就需偠进行交互,不然无法现在读取在上述的MODBUS协议了就不需要握手信号,如果想支持握手信号那么就要重写一个方法

/// 在连接上欧姆龙PLC后,需要进行一步握手协议 Message = "初始化失败具体原因请根据错误码查找" // 提取PLC的节点地址

上面的代码所示就是,欧姆龙协议的握手信号的处理方式处理成功就返回为真的Result对象,处理失败就返回假的结果对象

更复杂的实际开发例子,可以参见项目的源代码欢迎大家完善开发其他嘚通讯协议。


我要回帖

更多关于 什么是hsl 的文章

 

随机推荐