ModBus 通信协议详解 ModBus 通信协议是工业控制领域中常用的通讯协议之一,它定义了设备之间的通讯格式和规则。ModBus 协议包括 RTU、ASCII、TCP 三种协议,其中 MODBUS-RTU 是最常用的协议之一。MODBUS-RTU 协议简单易懂,易于实现,但协议资料和手册说得太专业了,起初很多内容都很难理解。 协议的定义是什么?协议就是互相之间的约定,例如定义一个新的最简单协议,例如协议: “A” --“LED 灭” “B” --“报警” “C” --“LED 亮”,单片机接收到“A”控制一个 LED 灭,单片机接收到“B”控制报警,单片机接收到“C”控制 LED 亮,这就是协议,很简单吧。 MODBUS-RTU 报文结构分析 MODBUS-RTU 报文是一串完整的指令数据,例如:01 06 00 01 00 17 98 04 ,其中: * 从机地址:01 * 功能号:06 * 数据地址:00 01 * 数据:00 17 * CRC 校验:98 04 报文的意思是:把数据 0x0017(十进制 23)写入 1 号从机地址 0x0001 数据地址。 报文的组成部分: 1. 报文:一个报文就是一帧数据,一个数据帧就是一个报文。 2. CRC 校验:例如上面的 98 04 是它前面的数据(01 06 00 01 00 17)通过一算法计算出来的结果,其实就像是计算累加和那样。作用:在数据传输过程中可能数据会发生错误,CRC 检验检测接收的数据是否正确。 3. 功能号:Modbus 定义,见附录 1。 作用:指示具体的操作。 MODBUS-RTU 协议的应用 在单片机中拿出一部分内存(RAM)进行两个设备通讯,例如: * 数组后面的注释,说明:OX[20] 代表是输出线圈,用功能码 0x01, 0x05, 0x0F 访问,开头地址是 0(这个后续说明) * IX[20] 代表是输入线圈,用功能码 0x02 访问,开头地址是 1(这个后续说明) 注意:所谓的“线圈”,“寄存器”就是“位变量”和“16 位变量”,不要被迷惑。之所以称“线圈”我觉得应该是对于应用的设备,MODBUS 协议是专门针对 485 总线设备(例 PLC)开发的。 MODBUS-RTU 协议的操作 1. 主机对从机写数据操作 如果单片机接收到一个报文那么就对报文进行解析并执行相应的处理,如上面报文:01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC 校验 假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算 CRC 校验判断数据是否正确,如果判断数据无误,则结果是: HoldDataReg[1] = 0x0017; MODBUS 主机就完成了一次对从机数据的写操作,实现了通讯。 2. 主机对从机读数据操作 主机进行读 HoldDataReg[1] 操作,则报文是:01 03 00 01 00 01 D5 CA 从机地址 功能号 数据地址 读取数据个数 CRC 校验 那么单片机接收到这串数据根据数据计算 CRC 校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:返回内容: 01 03 02 0017 F8 4A 从机地址 功能号 数据字节个数两个字节数据 CRC 校验 MODBUS 主机就完成了一次对从机数据的读操作,实现了通讯。
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 10、安徽省大学生学科和技能竞赛A、B类项目列表(2019年版).xlsx
- 9、教育主管部门公布学科竞赛(2015版)-方喻飞
- C语言-leetcode题解之83-remove-duplicates-from-sorted-list.c
- C语言-leetcode题解之79-word-search.c
- C语言-leetcode题解之78-subsets.c
- C语言-leetcode题解之75-sort-colors.c
- C语言-leetcode题解之74-search-a-2d-matrix.c
- C语言-leetcode题解之73-set-matrix-zeroes.c
- 树莓派物联网智能家居基础教程
- YOLOv5深度学习目标检测基础教程
评论0