Modbus协议,首先从字面理解它包括Mod和Bus两部分,首先它是一种bus,即总线协议。
Modbus支持单主机,多个从机,最多支持247个从机设备。
Modbus在7层OSI参考模型中属于第七层应用层,数据链路层有两种:基于标准串口协议和TCP协议,物理层可使用3线232、2线485、4线422,或光纤、网线、无线等多种传输介质。
Modbus协议是一种请求/应答方式的交互过程,主机主动发起通讯请求,从机响应主机的请求,从机在没有收到主机的请求时,不会主动发送数据,从机之间不会进行通讯。
Modbus通讯协议使用请求-应答机制在主(Master)(客户端Client)和从(Slave)(服务器Server)之间交换信息。Client-Server原理是通信协议的模型,其中一个主设备控制多个从设备。这里需要注意的是:Modbus通讯协议当中的Master对应Client,而Slave对应Server。
数据类型【4种】
Modbus协议规定,进行读写操作的数据类型,按照读写属性和类型可分为以下4种:
- 离散量输入(Discretes Input ):1位,只读
- 线圈(Coils):1位,读写
- 输入寄存器(Input Registers ):16位,只读
- 保持寄存器(Holding Registers):16位,读写
传输模式【3种】
1、基于串口的Modbus-RTU
数据按照标准串口协议进行编码,是使用最广泛的一种Modbus协议,采用CRC-16_Modbus校验算法。
2、基于串口的Modbus-ASCII
所有数据都是ASCII格式,一个字节的原始数据需要两个字符来表示,效率低,采用LRC校验算法。
3、基于网口的Modbus-TCP
Modbus-TCP基于TCP/IP协议,占用502端口,数据帧主要包括两部分:MBAP(报文头)+PDU(帧结构),数据块与串行链路是一致的。
所以当我们提及Modbus协议时,要确定是哪种模式:RTU、ASCII或TCP,3种模式区别还是很大的。
Modbu**s-RTU与****Modbus Tcp的区别:**
Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MODBUS寄存器地址来交换数据,但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,而Modbus TCP一般采用以太网口。现在市场上有很多协议转换器,可以轻松的将这些不同的协议相互转换。
Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式。
Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验。ModbusTCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。
TCP和RTU协议非常类似,只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。
1.概念不同:MODBUS是一种标准的工业控制数据交换协议,可以通过RTU和ASCII交换协议数据。RTU通过二进制数据直接传输数据,而TCP通过将每个字节的二进制数据转换成固定的二位十六进制字符串,然后依次串联,以TCP代码的形式传输数据。RTU通常使用最多。
2.不同的通信方式:以太网,相应的通信模式是MODBUS TCP。异步串行传输(各种介质,如有线RS-232-/422/485/;光纤、无线等。),相应的通信模式是MODBUS RTU或MODBUSASCII。高速令牌传输网络,相应的通信模式是ModbusPLUS。
功能码【3类】
Modbus功能码,是写在主机请求数据帧中的,决定主机进行读还是写操作,是读线圈、离散量还是寄存器,是写单个寄存器还是多个寄存器等等,决定主机请求什么类型的数据。
主要包括3类功能码:公共功能码、用户定义功能码和保留功能码。实际最常用的是公共功能码中的4个功能码:03/04/06/10
- 0x03:读多个寄存器
- 0x04:读输入寄存器
- 0x06:写单个保持寄存器
- 0x10:写多个保持寄存器
这里需要特别注意的一点是:写保持寄存器,需要区分0x06写单个寄存器和0x10写多个寄存器,而读保持寄存器不区分读单个和读多个,当需要读单个保持寄存器时,也是使用0x03指令,指定读取数量为1。
数据帧格式
无论是3种传输模式中的哪一种,Modbus帧格式都是一样的:
主要包括:
- 地址域:1字节,即从机设备地址,通常1-247为有效地址,0为广播地址
- 功能码:1字节,表明主机请求数据的类型。
- 数据:N字节,
- 差错校验:对数据进行冗余校验的结果,CRC或LRC。
Modbus-RTU
Modbus-RTU数据帧,帧长度最大为256字节,由以下4部分构成:
- 子节点地址:1字节,范围0-247
- 功能代码:1字节
- 数据块:0-252字节
- CRC校验值:2字节,低8位在前
Modbus-ASCII
Modbus-TCP数据帧
由MBAP报文头与PDU组成:
Modbus-TCP基于4种报文类型:
- MODBUS 请求
是客户机在网络上发送用来启动事务处理的报文
- MODBUS 证实
是在客户端接收的响应信息
- MODBUS 指示
是服务端接收的请求报文
- MODBUS 响应
是服务器发送的响应信息
两种请求模式
Modbus协议中主机可以以两种模式对从机设备发出请求:单播和广播。
单播模式
在单播模式下,从机地址必须唯一,地址范围1-247。主机以特定地址访问指定的某个从机,发出一个请求数据帧,这个数据帧功能可以是读取或写入数据,从机接收到并处理完成后,会回报一个应答数据帧,以表示读取或写入成功。
广播模式
在广播模式下,主机向所有的从机发出请求数据帧,所有的从机都会处理这条命令,对于广播请求,所有的从机无需做出应答操作。一般地址0表示广播地址。
Java的开源库
- Jamod:Java Modbus实现:Java Modbus库。该库由Dieter Wimberger实施。
- ModbusPal:ModbusPal是一个正在进行的Java项目,用于创建逼真的Modbus从站模拟器。由于预定义的数学函数和/或Python脚本,寄存器值是动态生成的。ModbusPal依赖于RxTx进行串行通信,而Jython则依赖于脚本支持。
- Modbus4J:Serotonin Software用Java编写的Modbus协议的高性能且易于使用的实现。支持ASCII,RTU,TCP和UDP传输作为从站或主站,自动请求分区,响应数据类型解析和节点扫描。
- JLibModbus:JLibModbus是java语言中Modbus协议的一种实现。jSSC和RXTX用于通过串行端口进行通信。该库是一个经过积极测试和改进的项目。