• socket转modbus协议转换应用案例介绍


    目录

    1 Modbus 协议简介

    1.1 什么是modbus

    1.2 两种传输方式

     1.3 三种模式的比较

     2 ModBus-RTU详解

    2.1 MODBUS-RTU功能码

    2.2 MODBUS报文模型 

    2.3 报文解读

    3 案例解析

     3.1 socket通信

    3.2 Socket实现modbus协议服务端

    3.3 netty框架

     3.4 Netty对于Socket抽象

    3.5 Netty 开发实例

    3.6 springboot集成netty


    1 Modbus 协议简介

    1.1 什么是modbus

    Modbus通信协议由Modicon公司(现已经为施耐德公司并购,成为其旗下的子品牌)于1979年发明的,是全球最早用于工业现场的总线规约。 Modbus通信协议具有多个变种,其具有支持串口(主要是RS-485总线),以太网多个版本,其中最著名的是Modbus RTU,Modbus ASCII和Modbus TCP三种。其中Modbus RTU与Modbus ASCII均为支持RS-485总线的通信协议,其中Modbus RTU由于其采用二进制表现形式以及紧凑数据结构,通信效率较高,应用比较广泛。
    而Modbus ASCII由于采用ASCII码传输,并且利用特殊字符作为其字节的开始与结束标识,其传输效率要远远低于Modbus RTU协议,一般只有在通信数据量较小的情况下才考虑使用Modbus ASCII通信协议,在工业现场一般都是采用Modbus RTU协议,一般而言,大家说的基于串口通信的Modbus通信协议都是指Modbus RTU通信协议。

    1.2 两种传输方式

    控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。

     1.3 三种模式的比较

    当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
    当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。

    Modbus RTU与Modbus TCP读指令对比

    Modbus RTU与Modbus TCP写指令对比

    在此我们着重讨论Modbus RTU协议,而Modbus TCP协议则是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码,用一句比较通俗的话说就是:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK.虽然这句话说得不是特别准确,但是也基本上把RTU与TCP之间的区别说得比较清楚了。

     2 ModBus-RTU详解

    2.1 MODBUS-RTU功能码

     最常用功能码:

    下面“线圈”“寄存器”其实分别直的就是“位变量”“16位变量”

    2.2 MODBUS报文模型 

     

    ADU: 应用数据单元
    PDU: 协议数据单元

    2.3 报文解读

     

    例:读取当前运行模式
    010300000001840A
    01:从机地址
    03:功能码,读保持寄存器
    0000:起始地址高8位、低8位,30001寄存器
    0001:寄存器数量高8位、低8位,读取模拟数量为1
    840A:crc校验高8位,低8位
    响应报文
    0103020004B987
    02:返回字节个数
    00 04:返回数据,转二进制位0010000000000000,
    第三位为1,对应为3,解析当前模式为清扫模式

    例:控制柜开关控制
    0110001B00010100F348
    01:从机地址
    10:功能码,写多个寄存器,对应十进制16
    001B:起始地址高8位、低8位,十进制为27
    0001:寄存器数量高8位、低8位,读取模拟数量为1,40028到40029
    0100:对应二进制为000100000000,由低到高为第9位,所以是配电箱9开灯
    F348:crc校验高8位,低8位

    响应报文
    0110001B000171CE
    01:从机地址
    10:功能码,写多个寄存器,对应十进制16
    001B:起始地址高8位、低8位,十进制为27
    0001:寄存器数量高8位、低8位,读取模拟数量为1,40028到40029
    71CE:crc校验高8位,低8位

    3 案例解析

     3.1 socket通信

    socket是应用层和传输层的一种抽象层,是应用层与传输层的接口,是支持TCP网络通信的基本通信单元,完成了不同进程间的通信。在互联网中,通信模式是客户端(client)与服务器(server)的端点对端点的通信模式。标识每个端点IP地址和端口号称为套接字。socket={IP:PORT}。标识源IP地址,源port,目的IP 地址,目的port,协议统称为套接字对。

    3.2 Socket实现modbus协议服务端

    1)根据modbus报文结构抽象消息实体。
    2)利用SocketServer监听对外暴露的端口。
    3)收到新的socket链接丢给新线程去解析消息。
    4)实现相关的业务后利用socket输出流进行返回。

    3.3 netty框架

    什么是netty?
    高性能 事件驱动
    异步非堵塞 基于NIO的客户端,服务器端编程框架
    优势
    API 使用简单,开发门槛低
    功能强大,预置了多种编解码功能,支持主流协议。
    定制能力强,可以通过 ChannelHandler 对通信框架进行灵活的扩展。
    性能高,通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。
    成熟,稳定,Netty 修复了已经发现的所有 NIO BUG,业务开发人员不需再为 NIO 的 BUG 而烦恼。
    有大规模的商业应用考验,质量可靠性有很好的验证。

    Netty的使用场景
    高性能领域、多线程并发领域、异步通信领域

     3.4 Netty对于Socket抽象

    Socket通信与Netty各组件对应关系

    Netty中NioEventLoop主要对应Socket中服务端while循环监听事件,这里的事件循环主要包括“新连接的接入”、“连接当前已存在的连接上的数据流读写”;
    Netty中Channel主要对应Socket连接,IO编程模型主要是Socket,NIO编程模型主要是SocketChannel。Netty统一把它封装成一个自定义Channel,基于这个Channel一系列读写都可以在这条连接上读写,它其实就是对Socket的抽象;
    Netty中ByteBuf主要对应Socket服务端接受数据逻辑,服务端接受数据流的载体都是基于ByteBuf,ByteBuf封装了一些比较好用的API,然后通过这些API就可以跟这些底层的数据流通信,当数据流到了服务端之后,服务端要处理一些业务逻辑;
    Netty中ChannelHandler主要对应Socket服务端处理数据的逻辑,ChannelHandler第一要对数据包进行分包,对于每个类型数据包,都需要进行java对象转换,都需要扔到不同的处理器中处理,那么用户可以自定义不同的ChannelHandler处理;
    Netty中Pipeline主要对应Socket中服务端一连串的逻辑处理,多个ChannelHandler组合成的逻辑链就是Netty的Pipeline。

    3.5 Netty 开发实例

    服务端:

    客户端:

    3.6 springboot集成netty

     

     

     

  • 相关阅读:
    本科毕业论文内容必须有国内外文献综述吗?
    如何设计一个安全的对外接口?
    【测控电路】微积分电路
    计算机毕设(附源码)JAVA-SSM旅行组团服务管理系统
    李开复:未来AI或助力中国成为科技“火车头”
    华为三层交换机与路由器对接上网
    【WIP】Seastar框架学习
    【Python入门】异常处理结构
    Javascript——数组常用的方法
    基于redis实现互斥锁
  • 原文地址:https://blog.csdn.net/qq_41534115/article/details/127830785