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 ...
随机推荐
- java四大特性理解(封装继承多态抽象)
封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...
- 修改flume源码,使其HTTPSource具备访问路径功能
目前有一个需求,就是Flume可以作为一个类似于tomcat的服务器,可以通过post请求进行访问,并且路径需要:ip:port/contextPath格式. 经过一些资料获悉,httpSource只 ...
- MySQL 库名重命名
MySQL ( RENAME database olddbname TO newdbname ) 对库名的重命名上会出现一些奇怪的错误.有丢失数据的风险. 所以如何去重命名呢: 1 用mysqldu ...
- neo4j-rest-client使用摘要
1.使用它的原因,与django搭配的最好的neomodel目前只支持到v2.2,我已给官方发了issue,官方也回复了,马上修改并发布(老外对开源项目的负责态度让人感动) 2.这个库的文档中大概描述 ...
- Vue、AngularJS 双向数据绑定解剖
数据与视图的绑定与同步,最终体现在对数据的读写处理过程中,也就是 Object.defineProperty() 定义的数据 set.get 函数中.Vue 中对于的函数为 defineReactiv ...
- Django模型层之字段查询参数及聚合函数
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 字段查询是指如何指定SQL WHERE子句的 ...
- 使用webpack打包vue工程
记得去年十月份的时候,自己在研究webpack,当时只是知道大致的用法,写了一个简单的demo,现在,经过了7个月对公司产品架构的使用,以及对vue-cli的使用,在了解了实际应用中各种需求之后,我自 ...
- 2、前端学习笔记之——css
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python 面向对象进阶之元类metaclass
一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为local ...
- 原生javascript写自己的运动库(匀速运动篇)
网上有很多JavaScript的运动库,这里和大家分享一下用原生JavaScript一步一步写一个运动函数的过程,如读者有更好的建议欢迎联系作者帮助优化完善代码.这个运动函数完成后,就可以用这个运动函 ...