Modbus-RTU通讯协议

基本介绍

Modbus是工业常用的通讯协议,plc中应用较多,基本情况见下表

寄存器种类数据类型访问类型功能码PLC地址寄存器地址
线圈寄存器读写01H 05H 0FH00001-099990000H-FFFFH
离散输入寄存器只读02H10001-199990000H-FFFFH
输入寄存器只读04H30001-399990000H-FFFFH
保持寄存器读写03H 06H 10H40001-499990000H-FFFFH

功能码作用

功能码描述PLC地址寄存器地址位/字操作操作数量
01H读线圈寄存器00001-099990000H-FFFFH位操作单个或多个
02H读离散输入寄存器10001-199990000H-FFFFH位操作单个或多个
03H读保持寄存器40001-499990000H-FFFFH字操作单个或多个
04H读输入寄存器30001-399990000H-FFFFH字操作单个或多个
05H写单个线圈寄存器00001-099990000H-FFFFH位操作单个
06H写单个保持寄存器40001-499990000H-FFFFH字操作单个
0FH写多个线圈寄存器00001-099990000H-FFFFH位操作多个
10H写多个保持寄存器40001-499990000H-FFFFH字操作多个

功能码01H

功能码01H读取Modbus从机中线圈寄存器的状态,可以是单个寄存器,或者多个连续的寄存器。

3.1 发送
假设从机地址为01H,读取的线圈寄存器的起始地址为0017H,读取38个寄存器,指令如表3.1所示:

表3.1 读线圈寄存器指令:

从机地址功能码起始地址高位起始地址低位寄存器数量高位寄存器数量低位CRC低位CRC高位
0101001700260DD4

3.2 响应
各线圈的状态与数据内容的每个bit对应,1代表ON,0代表OFF。如果查询的线圈数量不是8的倍数,则在最后一个字节的高位补0。

表3.2.1 读线圈状态的返回结果

从机地址功能码返回字节数数据1数据2数据3数据4数据5CRC低位CRC高位
010105CD6BB20E1B44EA

其中,第一个字节CDH对应线圈0017H到001E的状态,转为二进制是11001101,其中bit0对应0017H,bit7对应001E,如表3.2.2所示:

表3.2.2 线圈0017H到001EH的状态

001EH001DH001CH001BH001AH0019H0018H0017H
11001101
ONONOFFOFFONONOFFON

最后一个字节为1BH,对应线圈0037H到003CH的状态,转为二进制是00011011,其中bit0对应0037H,bit5对应003CH,其余两位用0填充,如表3.2.3所示:

表3.2.3 线圈0037H到003CH的状态

003CH003BH003AH0039H0038H0037H0036H0035H
00011011
填充填充OFFONONOFFONON

4 读离散输入寄存器——02H
功能码02H读取Modbus从机中离散输入寄存器的状态,可以是单个寄存器,或者多个连续的寄存器。

4.1 发送
假设从机地址为01H,读取的离散输入寄存器的起始地址为00C4H,读取22个寄存器,指令如表4.1所示:

表4.1 读离散输入寄存器指令:

从机地址功能码起始地址高位起始地址低位寄存器数量高位寄存器数量低位CRC低位CRC高位
010200C40016B839

4.2 响应
各个离散输入寄存器的状态与数据内容的每个bit对应,1代表ON,0代表OFF。如果查询的线圈数量不是8的倍数,则在最后一个字节的高位补0。

表4.2.1 读离散输入寄存器的返回结果

从机地址功能码返回字节数数据1数据2数据3CRC低位CRC高位
010203ACDB352288

其中,第一个字节ACH对应00C4H到00CBH寄存器的状态,转为二进制是10101100,其中bit0对应00C4H,bit7对应00CB,如表4.2.2所示:

表4.2.2 寄存器00C4H到00CBH的状态

00CBH00CAH00C9H00C8H00C7H00C6H00C5H00C4H
10101100
ONOFFONOFFONONOFFOFF

最后一个字节为35H,对应寄存器00D4H到00D9H的状态,转为二进制是00110101,其中bit0对应00D4H,bit5对应00D9H,其余两位用0填充,如表4.2.3所示:

表4.2.3 寄存器00D4H到00D9H的状态

00DBH00DAH00D9H00D8H00D7H00D6H00D5H00D4H
00110101
填充填充ONONOFFONOFFON

5 读保持寄存器——03H
功能码03H读取Modbus从机中保持寄存器的数据,可以是单个寄存器,或者多个连续的寄存器。

5.1 发送
假设从机地址为01H,读取的保持寄存器的起始地址为006BH,读取3个寄存器,指令如表5.1所示:

表5.1 读保持寄存器指令:

从机地址功能码起始地址高位起始地址低位寄存器数量高位寄存器数量低位CRC低位CRC高位
0103006B00037417

5.2 响应
每个保持寄存器的长度为2个字节。保持寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个保持寄存器,高字节数据先传输,低字节数据后传输。

表5.2.1 读保持寄存器的返回结果

从机地址功能码字节数006BH高字节006BH低字节006CH高字节006CH低字节006DH高字节006DH低字节CRC低位CRC高位
010306006B00130000F579

6 读输入寄存器——04H
功能码04H读取Modbus从机中输入寄存器的数据,可以是单个寄存器,或者多个连续的寄存器。

6.1 发送
假设从机地址为01H,读取的保持寄存器的起始地址为0008H,读取2个寄存器,指令如表6.1所示:

表6.1 读输入寄存器指令:

从机地址功能码起始地址高位起始地址低位寄存器数量高位寄存器数量低位CRC低位CRC高位
0104006B00020017

6.2 响应
每个输入寄存器的长度为2个字节。输入寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个输入寄存器,高字节数据先传输,低字节数据后传输。

表6.2.1 读输入寄存器的返回结果

从机地址功能码字节数0008H高字节0008H低字节0009H高字节0009H低字节CRC低位CRC高位
010404000A000B9A41

原先参考别人的做的笔记,现在找不到出处了,如有侵权,请联系我删帖或注明出处

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值