modbus学习笔记——帧
几个需要先搞懂的概念
1.modbus的数据类型
modbus定义了四种数据类型,这四种数据类型分别叫“离散量输入”“线圈”“输入寄存器”“保存寄存器”,这四种数据类型的功能见上表,其实他这名字很容易让人搞混了,我们只要记住这四个仅仅是四种数据类型的名字就行了,不要与现实中其他同名的东西搞混就行(例如“线圈”在这了就是一个数据类型,这种数据类型是可读可写的,不要与物理上的线圈混为一谈)
数据类型功能解析:
离散量输入——只读,获取某个IO状态(1bit)。
线圈——读写,主要用于设置某个值。
输入寄存器——只读,获取某个16bit数据的值。
保持寄存器——读写,设置某个16bit数据的值。
2.modbus的功能码
下图是一个modbus的帧格式,其中PDU由两部分组成,功能码和数据。
功能码是一个8位的数据,的作用是说明该帧是干什么的。比如,0x01代表读取线圈,0x02代表读取输入离散量,详细功能见下图
下面正式开始说明modbus的帧。
上图中,左边是请求,右边是响应。
请求帧的PDU数据是:02 00 C4 00 16
02 是功能码,根据功能码的定义(上表)02的意思是读取离散数据量。
00 C4 这两个是起始地址,00是高8位,C4是低8位。离散数据量可以有很多,都被放置在一个数组中(比如A[100])。
00 16 是要读取的数据的数量,00 是高8位,16是低8位。意思就是读取0x16个数据(注意这里是16进制,转换成10进制就是22)连同上一行数据(00C4)合起来的意思就是从0x00C4开始,读取0x0016个数据。
右边是响应。
响应的PDU是:02 03 AC DB 35
02 功能码。
03 说明返回了0x03个字节的数据。
AC DB 35 这三个字节的数据就是请求中需要读取的从ox00C4开始的0x0016个数据,由于0x16(十进制是22)个数据(就是22个bit,因为离散数据量是单个bit的)在
两个字节(两个字节只有16个bit)里放不下,所有这里需要3个字节(并未全部占全,剩下的两个用0补齐)。
那么数据如何对应地址呢?
请求中需要得到的数据是0x00C5——0x00DA(共0x16个)。
于是,0xC5——0xCC、0xCD——0xD4、0xD5——0xDA。
对应的就是上面图中响应帧的204-197,212-205,218-213.注意,高位在前。
相关文章
- 仿百思不得其姐项目开发(粗略笔记,后期规范排版和更新)
- python基础知识笔记-集合
- [Aaronyang] 写给自己的WPF4.5 笔记21 [3d课 2/4]
- 排序算法笔记说明
- 笔记4:WEB服务器
- RHCE 学习笔记(3)- 文件,目录和帮助
- 机器学习笔记 - CRAFT(文本检测的字符区域感知)论文解读
- 机器学习笔记 - 构建推荐系统(2) 深度推荐系统概览
- 机器学习笔记 - 怎么确认是否有足够的训练数据?
- OAuth 2.0 协议学习笔记
- vuejs学习:带你入门vue2.0慕课笔记
- uni-app 前后端实战课 - 《悦读》学习笔记:【部署 php 环境】小程序开发实例教程4
- es6学习笔记(三)对象
- 【Android笔记89】Android之全局加载框Gloading的使用
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
- 笔记:在 Windows 10 WSL Ubuntu 18.04 安装 Odoo12 (2019-06-09)
- 2.21日学习笔记|2.22日学习笔记|2.23学习笔记
- Go学习笔记--Go语法
- OPENCV的GUI特性:鼠标事件笔记
- Shell脚本攻略学习笔记十二之mktemp命令
- java学习笔记——权限修饰符、内部类
- pytorch学习笔记(七):加载数据集
- 个人笔记应用 - 思源笔记
- 【硬件架构的艺术】学习笔记(1)亚稳态的世界