Modbus协议学习

Modbus协议是OSI模型的第七层的应用层通讯协议,定义了不同类型设备间交换信息方式,以及信息的格式。

Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单播,从站响应指令,并按要求应答,或者报告异常。当主站不发送请求时,从站不会自己发出数据,从站和从站之间不能直接通讯。

Modbus协议的报文(或帧)的基本格式是:

表头 + 功能码 + 数据区 + 校验码

功能码和数据区在不同类型的网络都是固定不变的,表头和校验码则因网络底层的实现方式不同而有所区别。表头包含了从站的地址,功能码告诉从站要执行何种功能,数据区是具体的信息。

图1是一次请求和应答的过程。

https://i-blog.csdnimg.cn/blog_migrate/236ac921c57c5ffaa645798d48a554f0.jpeg图1

先以串行通讯的Modbus为例(注意Modbus TCP的报文表头和校验码是不一样的),主站发送了:

09 03 00 04 00 03 XX

主站告诉从站09,我要读取的地址偏移为4、5、6的Holding Register的数值。其中"03"是读Holding Register的功能码,"00 04 00 03"是数据区,"00 04"是寄存器的地址,"00 03"说明要连续读三个寄存器的值。"XX"代表最后的校验位,校验方法是LRC或CRC。

从站收到信息后,就从对应的寄存器找到数值,回复:

09 03 06 02 2B 00 01 00 64 XX

从站回答,该地址偏移为4的寄存器值为02 2B,地址偏移为5的寄存器值为00 01,地址偏移为6的寄存器值为00 64。其中"09 03"是复制了主站发来的地址和功能码,"06"代表接下来的数据共有6个字节。

如果从站收到了一个错误的请求,例如发现要读的寄存器地址是错误的,则回复:

09 83 02 XX

其中"83"是把功能码"03"的最高位置1,告诉主站发生了异常,"02"是异常码,说明发生了无效地址的异常。


Modbus的四种数据类型

Coil:大小只有1位,ON或OFF,可读可写,既可以是一个输出量输出点,也可以是数字量输入点,有效的地址范围是1-9999。

Input Status:大小只有1位,ON或OFF,只读,即数字量输出点,有效地址范围是10001-19999。

Input Register:16位的寄存器,只读,可以用作模拟量或16位打包输入点,有效地址范围是30001-39999。

Holding Register:16位的寄存器,可读可写,既可以是一个模拟量或16位打包输入点,也可以是模拟量或16位打包输出点,有效地址范围是40001-49999。

在PLC或DCS上用点名标记不同的变量,在Modbus则以数据地址来标记每个点。以上所说的地址都是参考地址,而不是实际的物理地址。上述的地址是在设备中的地址,按照PLC的习惯从1开始递增,而Modbus报文中是从0开始递增。例如地址偏移为4、5、6的Holding Register,其实是指参考地址是40005、40006、40007的寄存器。

Modbus TCP、Modbus RTU和Modbus ASCII的区别

对于不同类型的网络,Modbus的第7层实现是一样的,区别在于下层的实现方式,常见的有TCP/IP和串行通讯两种。

Modbus TCP基于以太网和TCP/IP协议,Modbus RTU和Modbus ASCII则是使用异步串行传输(通常是RS-232/422/485)。

https://i-blog.csdnimg.cn/blog_migrate/40441b56515c1b3f4586163f6418cc59.jpeg

图2

对于Modbus TCP而言,主站通常称为Client,从站称为Server;而对于Modbus RTU和Modbus ASCII来说,主站是Master,从站是Slave。

如图2所示,串行传输的物理层是RS-485或RS-232,数据链路层是Modbus的串行传输协议;Modbus TCP的1、2、3、4层实现和日常所见的以太网、因特网一样。Modbus默认采用的TCP端口号是502。

图3说明了Modbus TCP的改动:

  1. 取消了校验位。数据链路层上就进行了CRC-32的校验,TCP/IP是面向连接的可靠性的协议,因此没必要再加上校验位。
  2. Slave地址换成了Unit Identifier。当网络里的设备全是使用TCP/IP,这个地址是没有意义的,因为IP就能进行路由寻址。如果网络里还有串行通讯的设备,则需要网关来实现Modbus TCP到Modbus RTU或ASCII之间的协议转换,这时用Unit Identifier来标识网关后面的每个串行通讯设备。
  3. Length是指后面的字节总数。实际上数据区的长度是能确定的,有的功能码就可以确定数据区的长度,有的功能码虽不能确定数据区长度,但是数据区有字节计数,参见上文举的从站应答的例子。表头增加的Length是为了应对有些情况下TCP/IP协议会将应用层的数据拆包传输。
  4. Transaction Identifier和Protocol Identifier由Client生成,Server的响应将复制这些参数。

https://i-blog.csdnimg.cn/blog_migrate/12063958ef7e7eb1312f05041bdb5307.jpeg

图3

RTU和ASCII的区别

RTU模式下,一个字节的数据,传输的就是一个字节。ASCII模式下,同样一个字节数据用了两个字节来传输。

例如,要传输数字0x5B,RTU传输的是0101 1011(二进制),而ASCII传输的是00110101和01000010。可见,ASCII传输的速率是RTU的一半。

ASCII模式采用LRC校验,RTU模式采用16位CRC校验。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值