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 ...
随机推荐
- 一个SQL存储过程面试题(比较简单)
三个月前刚毕业的时候,听到存储过程就头疼. 写一个SQL存储过程,建立一个表USER 字段是姓名,年龄,职位,权限,然后向里面插入6条数据,然后查询出年龄大于18的所有信息. 下面是答案: 复制代码 ...
- php namespace与use
实验代码 ~/aa.php ~/bb.php 1.命名空间与文件加载的关系 本人在命名空间与文件加载上一直有一个误区,用了命名空间文件不用加载了? 实验1:去掉requre语句 可以看到就算使用命名空 ...
- uwsgi 服务 invalid request block size: 4161 (max 4096)...skip问题的解决
问题报错: invalid request block size: 4161 (max 4096)...skip 问题原因:默认的uwsgi分配一个小的buffer(4k)来接收每个请求的头信息,如果 ...
- Codable实现json转Model,是时候干掉HandyJSON了!
自从开始使用Swift做项目,一直都在使用HandyJSON,不可否认,HandyJSON在Swift4.0是个好东西,也尝试过其它json转mode的工具,最终发现还是HandyJSON最好用. 去 ...
- SOFA 源码分析 — 链路数据透传
前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 re ...
- 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能
一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...
- 上传本地代码及更新代码到GitHub教程
上传本地代码及更新代码到GitHub教程 上传本地代码 第一步:去github上创建自己的Repository,创建页面如下图所示: 红框为新建的仓库的https地址 第二步: echo " ...
- 类的父类object的一些属性、方法
# class Test: # """文档字符串""" # name = 'scolia' # # print(Test.__doc__) ...
- 为什么「margin:auto」可以让块级元素水平居中?
知乎链接:http://www.zhihu.com/question/21644198 关于BFC的解释:W3CFans http://www.w3cfuns.com/thread-5595727-1 ...
- 最详细的JavaWeb开发基础之java环境搭建(Windows版)
阅读文本大概需要 3 分钟. 首先欢迎大家来学习JavaWeb,在这里会给你比较详细的教程,从最基本的开始,循序渐进的深入.会让初学者的你少踩很多坑(大实话),如果你已经掌握了JavaWeb开发的基础 ...