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通信协议。
控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
当控制器设为在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之间的区别说得比较清楚了。
最常用功能码:
下面“线圈”“寄存器”其实分别直的就是“位变量”“16位变量”
ADU: 应用数据单元
PDU: 协议数据单元
例:读取当前运行模式
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位
socket是应用层和传输层的一种抽象层,是应用层与传输层的接口,是支持TCP网络通信的基本通信单元,完成了不同进程间的通信。在互联网中,通信模式是客户端(client)与服务器(server)的端点对端点的通信模式。标识每个端点IP地址和端口号称为套接字。socket={IP:PORT}。标识源IP地址,源port,目的IP 地址,目的port,协议统称为套接字对。
1)根据modbus报文结构抽象消息实体。
2)利用SocketServer监听对外暴露的端口。
3)收到新的socket链接丢给新线程去解析消息。
4)实现相关的业务后利用socket输出流进行返回。
什么是netty?
高性能 事件驱动
异步非堵塞 基于NIO的客户端,服务器端编程框架
优势
API 使用简单,开发门槛低
功能强大,预置了多种编解码功能,支持主流协议。
定制能力强,可以通过 ChannelHandler 对通信框架进行灵活的扩展。
性能高,通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。
成熟,稳定,Netty 修复了已经发现的所有 NIO BUG,业务开发人员不需再为 NIO 的 BUG 而烦恼。
有大规模的商业应用考验,质量可靠性有很好的验证。Netty的使用场景
高性能领域、多线程并发领域、异步通信领域
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。
服务端:
客户端: