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.注意,高位在前。
modbus学习笔记——帧的更多相关文章
- EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO
0 前言 本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机. 在该从机中定义了线圈寄存器.当中线圈寄存器地址较低的4位和EasyARM的P2 ...
- 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus
物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...
- freemodbus modbus TCP 学习笔记
1.前言 使用modbus有些时间了,期间使用过modbus RTU也使用过modbus TCP,通过博文和大家分享一些MODBUS TCP的东西.在嵌入式中实现TCP就需要借助一个以太网协议 ...
- 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二
今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- 离屏渲染学习笔记 /iOS圆角性能问题
离屏渲染学习笔记 一.概念理解 OpenGL中,GPU屏幕渲染有以下两种方式: On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. O ...
- cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)
目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...
随机推荐
- python---面向对象高级进阶
静态方法,调用静态方法后,该方法将无法访问类变量和实例变量 class Dog(object): def __init__(self,name): self.name = name def eat(s ...
- RA layer request failed
新整的Eclipse环境出现这个问题,细化内容是不能connect,后来想起切换Eclipse底层库的事情,然后打开Eclipse的SVN设置.把SVN Client借口由JavaHL改为PureJa ...
- 小试cordova
Cordova就是以前的PhoneGap捐献给Apache的最新开源版本. 安装一定要走npm网络方式,需要装Node.js,npm(windows nodejs安装包包含npm),Git.因为必须要 ...
- websocket通信 实现java模拟一个client与webclient通信
发文原由: 熟悉socket通信的同学,对于socket模拟server与client,实现相互通信, 或者使用websocket与java模拟的websocket服务器通信(比如一个聊天室),对于这 ...
- 用js来实现那些数据结构16(图02-图的遍历)
上一篇文章我们简单介绍了一下什么是图,以及用JS来实现一个可以添加顶点和边的图.按照惯例,任何数据结构都不可或缺的一个point就是遍历.也就是获取到数据结构中的所有元素.那么图当然也不例外.这篇文章 ...
- 实现MyArrayList类深入理解ArrayList
ArrayList简介 ArrayList是一个动态数组,Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处. MyArray ...
- SpringMVC解决跨域的两种方案
1. 什么是跨域 2. 跨域的应用情景 3. 通过注解的方式允许跨域 4. 通过配置文件的方式允许跨域 1. 什么是跨域 跨域,即跨站HTTP请求(Cross-site HTTP request),指 ...
- python字符串基本编码
综述:python中字符串分为字节字符和非字节字符python3中默认输入字符串以非字节字符编码,使用unicode字符集表示,可以使用encode方法转化为ascii,utf-8, utf-16等各 ...
- 利用box-shadow属性实现页面层叠效果
效果图如下 box-shadow的语法 代码展示 .footer { color: #777; padding: 10px 15px; height: 20px; text-align: center ...
- Vue数据双向绑定原理及简单实现
嘿,Goodgirl and GoodBoy,点进来了就看完点个赞再go. Vue这个框架就不简单介绍了,它最大的特性就是数据的双向绑定以及虚拟dom.核心就是用数据来驱动视图层的改变.先看一段代码. ...