一、功能码 03:读保持寄存器,可读多个或者单个寄存器内容

主机请求

域名所占字节数可输入的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x03
寄存器起始地址2个字节根据所要读取的寄存器位置而定,范围是0x0000 至 0xFFFF
寄存器数目2个字节1 至 125(0x7D)
CRC校验码2个字节根据前面的数据计算出来
从机响应
域名所占字节数返回的数据内容
:–::–:–:
从机地址1个字节从机地址
功能码1个字节0x03
字节数1个字节2×N
寄存器的值N×2 个字节根据所读取的保持寄存器内容而定
CRC校验码2个字节根据前面的数据计算出来(先发低字节,后发高字节)
N = 寄存器的数量

从机返回错误帧

域名所占字节数返回的数据内容
从机地址1个字节从机地址
功能码1个字节0x83
异常码1个字节01 或 02 或 03 或 04
CRC校验码2个字节根据前面的数据计算出来


下面是来一个实例:

假如从机地址为1,保持寄存器1~3的内容分别是:0x042B、0x0341、0x0220。现在有一个主机想要从该从机内的保持寄存器地址1处开始读取3个保持寄存器的内容,则下面的报文将是主机所发送的数据帧和接收到的数据帧的内容

主机请求,发送的报文: 01 03 0001 0003 540B

域名十六进制
从机地址01
功能码03
寄存器地址 Hi00
寄存器地址 Lo01
寄存器数目 Hi00
寄存器数目 Lo03
CRC低字节54
CRC高字节0B

从机响应,主机收到的报文:01 03 06 042B 0341 0220 541F

域名十六进制
从机地址01
功能码03
字节数06
(01)寄存器的值 Hi04
(01)寄存器的值 Lo2B
(02)寄存器的值 Hi03
(02)寄存器的值 Lo41
(03)寄存器的值 Hi02
(03)寄存器的值 Lo10
CRC低字节54
CRC高字节1F


二、功能码 06:写单个保持寄存器
写单个保持寄存器的返回帧和写入帧是一模一样
主机------------请求

域名所占字节数可输入的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x06
寄存器地址2个字节根据所要写入的寄存器位置而定,范围是0x0000 至 0xFFFF
寄存器值2个字节0x0000 至 0xFFFF
CRC校验码2个字节根据前面的数据计算出来

从机------------响应

域名所占字节数返回的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x06
寄存器地址2个字节根据从机被读取的地址而定,范围是0x0000 至 0xFFFF
寄存器值2个字节根据从机所存放的数据而定,范围是0x0000 至 0xFFFF
CRC校验码2个字节根据前面的数据计算出来

错误

域名所占字节数返回的数据内容
从机地址1个字节从机地址
差错码1个字节0x86
异常码1个字节01 或 02 或 03 或 04
CRC校验码2个字节根据前面的数据计算出来


来一个实例:
假如从机地址为1,现在有一个主机想要从该从机内的保持寄存器地址1处写入0x0C02,则下面的报文将是主机所发送的数据帧和接收到的数据帧的内容

主机请求,发送的报文:01 06 0001 0C02 5CCB

域名十六进制
从机地址01
功能码06
寄存器地址高字节00
寄存器地址低字节01
(要写入的数据)的高字节0C
(要写入的数据)的低字节02
CRC低字节5C
CRC高字节CB

从机响应,主机收到的报文:01 06 0001 0C02 5CCB

域名十六进制
从机地址01
功能码06
寄存器地址高字节00
寄存器地址低字节01
寄存器的值 HI0C
寄存器的值 Lo02
CRC低字节5C
CRC高字节CB
写单个保持寄存器的成功的话,它的返回帧和写入帧是一模一样


三、功能码 10:写多个保持寄存器

主机------------请求

域名所占字节数可输入的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x10
寄存器起始地址2个字节根据所要写入的寄存器位置而定,范围是0x0000 至 0xFFFF
寄存器数目2个字节根据所要写入的寄存器数目而定,范围是0x0001 至 0x0078
字节数1个字节2×N
寄存器值N×2 个字节要写入的数据值
CRC校验码2个字节根据前面的数据计算出来
N = 寄存器的数量

从机------------响应

域名所占字节数返回的数据内容
从机地址1个字节从机地址
功能码1个字节0x10
寄存器起始地址2 个字节根据被写入的寄存器地址而定,范围是0x0000 至 0xFFFF
寄存器数目2个字节1 至 123(0x7B)
CRC校验码2个字节根据前面的数据计算出来

错误

域名所占字节数返回的数据内容
从机地址1个字节从机地址
差错码1个字节0x90
异常码1个字节01 或 02 或 03 或 04
CRC校验码2个字节根据前面的数据计算出来


来一个实例:
假如从机地址为1,现在有一个主机想要从该从机内的保持寄存器地址1~3写入0x0101 、0x0202、0303 ,则下面的报文将是主机所发送的数据帧和接收到的数据帧的内容

主机请求,发送的报文: 01 10 0001 0003 06 0101 0202 0303 6BDD

域名十六进制
从机地址01
功能码10
寄存器地址 Hi00
寄存器地址 Lo01
寄存器数量 Hi00
寄存器数量 Lo03
字节数06
寄存器的值 Hi(01)01
寄存器的值 Lo(01)01
寄存器的值 Hi(02)02
寄存器的值 Lo(02)02
寄存器的值 Hi(03)03
寄存器的值 Lo(03)03
CRC低字节6B
CRC高字节DD

从机响应,主机收到的报文:01 10 0001 0003 D1C8

域名十六进制
从机地址01
功能码10
寄存器地址Hi00
寄存器地址Lo01
寄存器数量 Hi00
寄存器数量 Lo03
CRC低字节D1
CRC高字节C8


四、功能码 17:读/写多个保持寄存器

主机------------请求

域名所占字节数可输入的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x17
读起始地址2个字节根据所要读取的寄存器位置而定,范围是0x0000 至 0xFFFF
要读的寄存器数目2个字节根据所要读取的寄存器数目而定,范围是0x0001 至近似 0x0076
写起始地址2个字节根据所要写入的寄存器位置而定,范围是0x0000 至 0xFFFF
要写入的寄存器数目2个字节根据所要写入的寄存器数目而定,范围是0x0001 至近似 0x0076
字节数1个字节2×N
要写入的寄存器的值N×2 个字节要写入的数据值
CRC校验码2个字节根据前面的数据计算出来
N = 要写入的寄存器的数量

从机------------响应

域名所占字节数返回的数据内容
从机地址1个字节从机地址
功能码1个字节0x17
字节数1个字节2×N
寄存器的值N×2 个字节根据所读取的保持寄存器内容而定
CRC校验码2个字节根据前面的数据计算出来
*N = 要读取到的寄存器的数量

错误

域名所占字节数返回的数据内容
从机地址1个字节从机地址
差错码1个字节0x97
异常码1个字节01 或 02 或 03 或 04
CRC校验码2个字节根据前面的数据计算出来



来一个实例:
假如从机地址为1,保持寄存器1~3的内容分别是:0x042B、0x0341、0x0210。
现在有一个主机想要从该从机内的保持寄存器地址1处读取3个保持寄存器的数据,并向保持寄存器地址4~5写入0x0101 、0x0202,则下面的报文将是主机所发送的数据帧和接收到的数据帧的内容。

主机请求,发送的报文: 01 17 0001 0003 0004 0002 04 0101 0202 BA28

域名十六进制
从机地址01
功能码17
读寄存起始地址 Hi00
读寄存器起始地址 Lo01
读的寄存器数量 Hi00
读的寄存器数量 Lo03
写寄存起始地址 Hi00
写寄存器起始地址 Lo04
写的寄存器数量 Hi00
写的寄存器数量 Lo02
要写入的数据的字节数04
(04)要写入的值 Hi01
(04)要写入的值 Lo01
(05)要写入的值 Hi02
(05)要写入的值 Lo02
CRC低字节BA
CRC高字节28

**从机响应,主机收到的报文:01 17 06 042B 0341 0210 54F4 **

域名十六进制
从机地址01
功能码17
读取到的字节数06
(01)读取到的寄存器的值 Hi04
(01)读取到的寄存器的值 Lo2B
(02)读取到的寄存器的值 Hi03
(02)读取到的寄存器的值 Lo41
(03)读取到的寄存器的值 Hi02
(03)读取到的寄存器的值Lo10
CRC低字节54
CRC高字节F4


五、功能码 14:读文件记录

主机------------请求

域名所占字节数可输入的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x14
字节数1字节根据此数据帧后面还需要发送的数据的字节数,不包含CRC,范围是0x07 至 0xF5 字节
子请求 x,参考类型1个字节06
子请求 x,文件号2 个字节根据所需要读取的文件号而定,范围是0x0000 至 0xFFFF
子请求 x,记录号2个字节根据所需要读取的记录号而定,也可以说是寄存器起始地址,范围是0x0000 至 0x270F
子请求 x,记录长度2个字节根据所需要读取的寄存器数目N而定,范围是0x0000 至 0x270F
子请求 x+1,…
CRC校验码2个字节根据前面的数据计算出来

从机------------响应

域名所占字节数返回的数据内容
从机地址1个字节从机地址
功能码1个字节0x14
响应数据长度1个字节根据此数据帧后面还需要发送的数据的字节数,不包含CRC,范围是0x07 至 0xF5
子请求 x,文件响应长度1个字节根据当前文件号下的数据长度而定,范围是0x07 至 0xF5
子请求 x,参考类型1字节0x06
子请求 x,记录数据N×2 个字节根据所读取到寄存器数据而定
子请求 x+1,…
CRC校验码2个字节根据前面的数据计算出来
N 该文件下所需要读取的记录长度,也就是寄存器数目

错误

域名所占字节数返回的数据内容
从机地址1个字节从机地址
差错码1个字节0x94
异常码1个字节01 或 02 或 03 或 04 或08
CRC校验码2个字节根据前面的数据计算出来


来一个实例:
假如从机地址为1,它有2个文件:文件号分别是3、4。其中文件3以寄存器地址9开始,有2个寄存器:0x1101、0x2202;文件4以寄存器地址1开始,有4个寄存器:0x3303、0x4404、0x5505、0x6606。
现在主机需要去读取这2个文件的内容。

**主机请求,发送的报文: 01 14 0E 06 0003 0009 0002 06 0004 0001 0004 34DC **

域名十六进制
从机地址01
功能码14
字节数0E
子请求 1,参考类型06
子请求 1,文件号 Hi00
子请求 1,文件号 Lo03
子请求 1,记录号 Hi00
子请求 1,纪录号 Lo09
子请求 1,记录长度 Hi00
子请求 1,纪录长度 Lo02
子请求 2,参考类型06
子请求 2,文件号 Hi00
子请求 2,文件号 Lo04
子请求 2,记录号 Hi00
子请求 2,纪录号 Lo01
子请求 2,记录长度 Hi00
子请求 2,纪录长度 Lo04
CRC低字节34
CRC高字节DC

从机响应,主机收到的报文:01 17 10 05 06 1101 2202 09 06 3303 4404 5505 6606 5BC9

域名十六进制
从机地址01
功能码14
响应数据长度10
子请求 1,文件响应长度05
子请求 1,参考类型06
子请求 1,记录数据Hi11
子请求 1,记录数据Lo01
子请求 1,记录数据Hi22
子请求 1,记录数据Lo02
子请求 2,文件响应长度09
子请求 2,参考类型06
子请求 2,记录数据Hi33
子请求 2,记录数据Lo03
子请求 2,记录数据Hi44
子请求 2,记录数据Lo04
子请求 2,记录数据Hi55
子请求 2,记录数据Lo05
子请求 2,记录数据Hi66
子请求 2,记录数据Lo06
CRC低字节5B
CRC高字节C9


六、功能码 15:写文件记录

写文件记录的发送帧和反馈帧一模一样

主机------------请求

域名所占字节数可输入的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x15
字节数1字节根据此数据帧后面还需要发送的数据的字节数,不包含CRC,范围是0x07 至 0xF5 字节
子请求 x,参考类型1个字节06
子请求 x,文件号2 个字节根据所需要写入的文件号而定,范围是0x0000 至 0xFFFF
子请求 x,记录号2个字节根据所需要写入的记录号而定,也可以说是寄存器起始地址,范围是0x0000 至 0x270F
子请求 x,记录长度2个字节根据所需要写入的寄存器数目N而定,范围是0x0000 至 0x270F
子请求 x,记录数据N×2 个字节要写入的数据值
子请求 x+1,…
CRC校验码2个字节根据前面的数据计算出来

从机------------响应

域名所占字节数可输入的数据内容
从机地址1个字节根据从机地址而定
功能码1个字节0x15
字节数1字节根据此数据帧后面还需要发送的数据的字节数,不包含CRC,范围是0x07 至 0xF5 字节
子请求 x,参考类型1个字节06
子请求 x,文件号2 个字节根据所需要写入的文件号而定,范围是0x0000 至 0xFFFF
子请求 x,记录号2个字节根据写入的记录号而定,也可以说是寄存器起始地址,范围是0x0000 至 0x270F
子请求 x,记录长度2个字节根据写入的寄存器数目N而定,范围是0x0000 至 0x270F
子请求 x,记录数据N×2 个字节被写入的数据值
子请求 x+1,…
CRC校验码2个字节根据前面的数据计算出来

错误

域名所占字节数返回的数据内容
从机地址1个字节从机地址
差错码1个字节0x95
异常码1个字节01 或 02 或 03 或 04 或08
CRC校验码2个字节根据前面的数据计算出来


来一个实例:
假如从机地址为1,它有一个文件4,文件4以寄存器7为起始地址,有3个寄存器。现在主机需要往里面写数据:0x0101、0x0202、0x0303。

**主机请求,发送的报文: 01 15 0D 06 0004 0007 0003 0101 0202 0303 73FC **

域名十六进制
从机地址01
功能码15
字节数0D
子请求 1,参考类型06
子请求 1,文件号 Hi00
子请求 1,文件号 Lo04
子请求 1,记录号 Hi00
子请求 1,纪录号 Lo07
子请求 1,记录长度 Hi00
子请求 1,纪录长度 Lo03
子请求 1,记录数据Hi01
子请求 1,记录数据Lo01
子请求 1,记录数据Hi02
子请求 1,记录数据Lo02
子请求 1,记录数据Hi03
子请求 1,记录数据Lo03
CRC低字节73
CRC高字节FC

从机响应,主机收到的报文:01 15 0D 06 0004 0007 0003 0101 0202 0303 73FC

域名十六进制
从机地址01
功能码15
字节数0D
子请求 1,参考类型06
子请求 1,文件号 Hi00
子请求 1,文件号 Lo04
子请求 1,记录号 Hi00
子请求 1,纪录号 Lo07
子请求 1,记录长度 Hi00
子请求 1,纪录长度 Lo03
子请求 1,记录数据Hi01
子请求 1,记录数据Lo01
子请求 1,记录数据Hi02
子请求 1,记录数据Lo02
子请求 1,记录数据Hi03
子请求 1,记录数据Lo03
CRC低字节73
CRC高字节FC

  本文将大家可能不怎么用到的读写文件记录放到了最后,文中可能会有一些数据或者用词不正确,如有错误,指出后我会立马修正。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐