MODBUS协议整理——写多个线圈寄存器0FH,写多个保持寄存器10H

2.7 写多个线圈寄存器 0FH

1) 说明

写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。

2) 查询

从机地址为11H,线圈寄存器的起始地址为0013H,线圈寄存器的结束地址为001CH。总共访问10个寄存器。寄存器内容如下表所示。

表2.7.1 线圈寄存器0013H到001CH

001AH

0019H

0018H

0017H

0016H

0015H

0014H

0013H

1

1

0

0

1

1

0

1

0022H

0021H

0020H

001FH

001EH

001DH

001CH

001BH

0

0

0

0

0

0

0

1

传输的第一个字节 CDH 对应线圈为0013H到001AH,LSB(最低位)对应线圈0013H,传输第二个字节为 01H,对应的线圈为001BH到001CH,LSB 对应线圈001CH,其余未使用位使用0 填充。

表2.7.1 写多个线圈寄存器——查询

 

Hex

从机地址

11

功能码

0F

寄存器地址高字节

00

寄存器地址低字节

13

寄存器数量高字节

00

寄存器数量低字节

0A

字节数

02

数据1(0013H-001AH)

CD

数据2(001BH-001CH)

01

CRC校验高字节

BF

CRC校验低字节

0B

 


 

3) 响应

表2.7.1 写多个线圈寄存器——响应

 

Hex

从机地址

11

功能码

0F

寄存器地址高字节

00

寄存器地址低字节

13

寄存器数量高字节

00

寄存器数量低字节

0A

字节数

02

CRC校验高字节

99

CRC校验低字节

1B

 


 

2.8 写多个保持寄存器10H

1) 说明

写多个保持寄存器。

2) 查询

从机地址为11H。保持寄存器的其实地址为0001H,寄存器的结束地址为0002H。总共访问2个寄存器。保持寄存器0001H的内容为000AH,保持寄存器0002H的内容为0102H。

表2.8.1 写多个保持寄存器——请求

 

Hex

从机地址

11

功能码

10

寄存器起始地址高字节

00

寄存器起始地址低字节

01

寄存器数量高字节

00

寄存器数量低字节

02

字节数

04

数据1高字节

00

数据1低字节

0A

数据2高字节

01

数据2低字节

02

CRC校验高字节

C6

CRC校验低字节

F0

表2.8.2 保持寄存器0001H到0002H内容

地址

0001H高字节

0001H低字节

0002H高字节

0003H低字节

数值

00

0A

01

12


 

3) 响应

表2.8.3 写多个保持寄存器——响应

 

Hex

从机地址

11

功能码

10

寄存器起始地址高字节

00

寄存器起始地址低字节

01

寄存器数量高字节

00

寄存器数量低字节

02

CRC校验高字节

12

CRC校验低字节

98

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题的解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。
Modbus 主站测试软件 这是一个小巧的Modbus Master测试工具,综合了Modbus TCP、Modbus UDP、Modbus RTU、Modbus ASCII 四种工作模式.是现场通讯测试的最佳助手。适合运行在任何Windows平台下。无需任何运行库。软件不需要安装,解压后可直接运行。 #### 功能简介 1. 选定连接方式为 以太网TCP、以太网UDP、串口RTU、串口ASCII 2. 如果是串口RTU、ASCII:设定串口客户端串口及参数,点击打开,可选择不同的寄存器进行读操作。 如果是TCP、UDP:设定客户端IP和端口(默认502),点击连接,连接成功后,可选择不同的寄存器进行读操作。 3. 该软件作为Modbus 主站(即Mdobus 客户端)使用,可以读取线圈寄存器(Output Coil)、离散输入寄存器(Input Relay)、保持寄存器(Holding Register)、输入寄存器(Input Register)的数据,同时可以线圈寄存器(Output Coil)、保持寄存器(Holding Register)数据;数据可以按格式格式进行显示,为测试工作带来便利。 #### 最后更新 v.5.1.12.46(Build 2020/12/11) - 双击快速修改线圈寄存器(Output Coil) - 线圈寄存器(Output Coil)添加HEX,BIN格式输入 v.5.0.0.42(Build 2020/12/03) - 新增收发时间显示,及时间格式 - 新增收发数据显示不同颜色 - 新增数据保存功能 - 修订线圈寄存器、离散输入寄存器数据显示 - 新增0FH功能码功能 - 完善各功能码反馈提示信息及异常信息 - 新增本地端口参数 - 完善各种数据换位格式,可选择以下显示方式 - 1: Signed (2 Byte)有符号整数(AB)* - 2: Signed (2 Byte)有符号整数(BA) - 3: UnSigned(2 Byte)无符号整数(AB)* - 4: UnSigned(2 Byte)无符号整数(BA) - 5: LongWord (4 Byte)无符号整数(AB CD)* - 6: LongWord (4 Byte)无符号整数(CD AB) - 7: LongWord (4 Byte)无符号整数(BA DC) - 8: LongWord (4 Byte)无符号整数(DC BA) - 9: LongInt (4 Byte)有符号整数(AB CD)* - 10: LongInt (4 Byte)有符号整数(CD AB) - 11: LongInt (4 Byte)有符号整数(BA DC) - 12: LongInt (4 Byte)有符号整数(DC BA) - 13: Float(4 Byte)单精度浮点(AB CD)* - 14: Float(4 Byte)单精度浮点(CD AB) - 15: Float(4 Byte)单精度浮点(BA DC) - 16: Float(4 Byte)单精度浮点(DC BA) - 17: Double(8 byte)双精度浮点(AB CD EF GH)* - 18: Double(8 byte)双精度浮点(GH EF CD AB) - 19: Double(8 byte)双精度浮点(BA DC FE HG) - 20: Double(8 byte)双精度浮点(HG FE DC BA) - 21: String 字符(AB) 包含以下功能码: - 01H--读取线圈寄存器(Output Coil),位操作,可读单个或者多个 - 02H--读取离散输入寄存器(Input Relay),位操作,可读单个或多个 - 03H--读保持寄存器(Holding Register),字节指令操作,可读单个或者多个 - 04H--读取输入寄存器(Input Register),字节指令操作,可读单个或者多个 - 05H-单个线圈寄存器(Output Coil),位操作,只能一个 - 06H--单个保持寄存器(Holding Register),字节指令操作,只能一个 - 0FH--多个线圈寄存器(Output Coil),字节指令操作,可多个 - 10H--多个保持寄存器(Holding Register),字节指令操作,可多个
【资源说明】 基于stm32的uart串口modbus通讯协议源码+说明文档.zip modbus-RTU协议 **Modbus报文帧结构** 一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据 Modbus协议在串行链路上的报文格式如下所示: ![image](https://github.com/KeyL-SJ/stm32_uart_modbus/assets/78483846/bcec2fe4-3a28-42b3-b2aa-8d75f8fe1f36) | 从机地址 | 功能码 | 数据 | CRC校验 | | :------: | :----: | :-----: | :-----: | | 1 byte | 1 byte | N bytes | 2 bytes | **帧结构 = 从机地址 + 功能吗 + 数据 + 校验** - 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答) - 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能. - 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。 - 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确 # Modbus功能码 **Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。** Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读,如下表所示: | 功能码 | 功能说明 | | :----: | :------------: | | 01H | 读取输出线圈 | | 02H | 读取输入线圈 | | 03H | 读取保持寄存器 | | 04H | 读取输入寄存器 | | 05H | 入单线圈 | | 06H | 入单寄存器 | | 0FH | 入多线圈 | | 10H | 入多寄存器 | 当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。 # CRC校验 **错误校验(CRC)域占用两个字节包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。** 例如若主机向从机发送报文`01 03 00 00 00 01 84 0A` 其中, 最后两个字节`84 0A`就是CRC校验位,从机接收到主机发送的报文之后,根据报文的非校验位`01 03 00 00 00 01`计算CRC校验位,若从机计算出的校验位与主机发送的校验位相同,则证明数据在发送的过程中没有发生错误,反之,则代表数据传输发生错误。 ## CRC校验流程 1、预置一个16位寄存器为`0FFFFH`(全1),称之为CRC寄存器。 2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。 3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。 4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值`0A001H`进行异或运算。 5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。 6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。 7、最终CRC寄存器的值就是CRC的值。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值