Modbus RTU协议认识

2023-10-29

Modbus RTU协议认识

一、通信模式

  • Modbus RTU协议是一个主从协议
  • 主机发出请求,从机返回响应,从机不能主动发送数据
  • 同一时刻总线上只能有一个主机,但可以有多个从机
  • 从机之间不能相互通信

二、通信角色

主机

主机没有编号,因为总线上的主机是唯一的。

主机可以通过两种方式发出请求:

  • 单播模式:主机访问特定编号的从机,从机响应请求。
  • 广播模式:主机向总线上所有从机发出请求,从机不需要应答。广播请求一般用于写命令。

在这里插入图片描述

从机

总线上的每个从机都有唯一编号,即设备地址,范围为1~255。0为广播地址,所有从机都支持。

三、数据类型

协议将要处理的数据抽象为四种类型:

类型 存储大小 访问类型
离散输入 单个bit 只读
线圈 单个bit 读写
输入寄存器 16bits 只读
保持寄存器 16bits 读写

四、通信报文

Modbus RTU采用大端模式,即发送16位数据0x1234时,先发0x12,再发0x34.

整个通信帧的长度有约束,最大ADU长度为256字节

1. 帧组成

通信帧有三种类型,不过大体组成如下图所示,所不同的是数据区域:

  1. 主机发出的请求
  2. 从机返回的正常响应
  3. 从机返回的异常响应

在这里插入图片描述

  • 地址域:一个字节,从机的设备地址,用来标识从机
  • 功能码:一个字节,指示主机请求的操作
  • 数据区:(Max_Size=256-1-1-2=252)主机的是请求的参数;从机的是返回的数据或者异常码
  • 差错校验:两个字节,校验前面所有字节,CRC16算法

2. 设备地址

0 1~247 248~255
广播地址 单播地址 保留地址

3. 功能码

分类

1~64 65~72 73~99 100~110 111~127
公共功能码 用户定义功能码 公共功能码 用户定义功能码 公共功能码

公共功能码

在这里插入图片描述

4. CRC16

/* 查表法 */
static unsigned char auchCRCHi\[\] = {   
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,  
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,  
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,  
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,  
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,  
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,  
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,  
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,  
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,  
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,  
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,  
0x40 } ;   

static char auchCRCLo\[\] = {   
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,  
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,  
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,  
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,  
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,  
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,  
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,  
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,  
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,  
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,  
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,  
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,  
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,  
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,  
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,  
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,  
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,  
0x40 };

unsigned short CRC16 ( unsigned char \*puchMsg, unsigned short usDataLen )    
{   
 unsigned char uchCRCHi = 0xFF ;  /\* 高字节初始化值   \*/   
 unsigned char uchCRCLo = 0xFF ;  /\* 低字节初始化值   \*/   
 unsigned uIndex ;    
    
 while (usDataLen--)   
 {   
  uIndex = uchCRCLo ^ \*puchMsg++ ;     
  uchCRCLo = uchCRCHi ^ auchCRCHi\[uIndex\] ;   
  uchCRCHi = auchCRCLo\[uIndex\] ;   
 }   
 return (uchCRCHi << 8 | uchCRCLo) ;   
}   


五、注意事项

1. 字节编码格式

每个字节含有8位:

  • 一个起始位
  • 8个数据位,先发送最低有效位
  • 一个校验位,选择无校验的话需要选择两位停止位来填充
  • 一个停止位

2. 帧间隔

协议规定两帧之间的间隔须大于3.5个字节时间,帧中每个字节的间隔须小于1.5个字节时间。

由于 t1.5 和 t3.5 的定时,隐含着大量的对中断的管理。在高通信速率 下,这导致 CPU 负担加重。因此,在通信速率等于或低于 19200 Bps 时,这两个定时必须严格遵 守;对于波特率大于 19200 Bps 的情形,应该使用 2 个定时的固定值:建议的字符间超时时间(t1.5) 为 750µs,帧间的超时时间 (t1.5) 为1.750ms

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Modbus RTU协议认识 的相关文章

  • 【计算机算法】递归——递归实现逆序输出整数

    题目 本题目要求读入1个正整数n 然后编写递归函数reverse int n 实现将该正整数逆序输出 输入格式 输入在一行中给出1个正整数n 输出格式 对每一组输入 在一行中输出n的逆序数 输入样例 12345 输出样例 54321 我的实

随机推荐

  • 规则引擎Drools使用 第十二篇 Drools 的高级语法之RHS加强

    RHS部分是规则体的重要组成部分 当LHS部分的条件匹配成功后 对应的RHS部分就会触发执行 一般在RHS部分中需要进行业务处理 在RHS部分Drools为我们提供了一个内置对象 名称就是drools 本小节我们来介绍几个drools对象提
  • IDEA常用插件之代码规范检查

    Alibaba Java Coding Guidelines 安装 使用 手动扫描 这里扫描可以扫描某一个类 某一个包 整个项目都支持 扫描结果 实时扫描 开启实时扫描在代码编写过程中也会实时提醒
  • 【Objective-C】07-自定义构造方法和description方法

    本文目录 知识回顾 一 自定义构造方法 二 description方法 说明 这个Objective C专题 是学习iOS开发的前奏 也为了让有面向对象语言开发经验的程序员 能够快速上手Objective C 如果你还没有编程经验 或者对O
  • TCP三次握手详解

    TCP 传输控制协议 面向连接的可靠传输协议 在完成了传输层的基础工作外 还需要保障传输的可靠性 面向连接 在传输数据前 需要通过三次握手建立端到端的虚链路 可靠传输 传输过程中使用到4种可靠传输机制 确认 排序 流控 滑动窗口 重传 TC
  • [sdio] Common Information Area (CIA) 分析及初始化过程

    一 CIA 概述 SDIO 卡寄存器存储区中有一固定的公共端口区域 简称为 CIA CIA 中的寄存器包括了对 I O 端口功能 中断产生以及端口工作信息 可以通过读写功能 0 对 CIA 所定义的寄存器进行相关操作 CIA 包含了 CCC
  • 做外贸怎么收款?2020最新外贸B2B收款结汇方法详解!

    做外贸怎么收款 很多做外贸的朋友 因为外贸收款的需要 注册了Payoneer外贸e户通 虽然 大家清楚Payoneer外贸e户通功能非常强大 就如我们的文章 Payoneer推出外贸e户通 5种外贸收款方式 提现仅0 5 里面介绍的一样 但
  • mysql 密码共用_数据库密码加密公用秘要生成器,数据库密码加密解密入口(转)...

    public classEncryptor public static final String HUNDSUN VERSION system 管理平台 version 2 0 1 lastModiDate describe protect
  • 【满分】【华为OD机试真题2023 JS】木板

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 木板 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 小明有n块木板 第i 1 i n 块木板的长度为ai 小明买了一块长度为m的木料 这块木料可以切割成任意块
  • 获得一个类的Class类对象的三种方法(Class.forName()方法;类实例对象.getClass()方法;类名.class;)

    Class forName 方法 注意 需要捕获异常ClassNotFoundException 好处 不用创建实例对象 就可以获得Class引用 只需要知道类的全路径地址即可 类实例对象 getClass 方法 注意 如果有该类型的实例对
  • 【React】 13课 安装react脚手架

    第一步 安装脚手架之前需要电脑已安装node与npm 首先按住 shift 鼠标右键 按下 在此处打开命令行窗口 进入命令行窗口 或者 win R 键 输入cmd 进入命令行窗口 输入 node v 与 npm v 查看有无安装node与n
  • Linux安装MySQL5.7.37

    下载地址 https dev mysql com downloads mysql 5 7 html downloads 点击download进入以下页面 可以找到下载链接地址 https dev mysql com get Download
  • python3 sha256加密用法

    hashlib模块简介 hashlib模块为不同的安全哈希 安全散列 Secure Hash Algorithm 和 信息摘要算法 Message Digest Algorithm 实现了一个公共的 通用的接口 也可以说是一个统一的入口 因
  • vue-router之addRoutes使用遇到的坑

    最近项目中使用了vue router的addRoutes这个api 遇到了一个小坑 记录总结一下 场景复现 做前端开发的同学 大多都遇到过这种需求 页面菜单根据用户权限动态生成 一个常见的解决方案是 前端初始化的时候 只挂载不需要权限路由
  • 解决Tomcat后台修改前端无变化问题

    在用tomcat8 9 eclipse ssm开发java web项目的时候 有时会发现后台代码修改了 而前端显示却没有变化 两种情况及解决方案如下 状况一 修改了JSP页面代码 但是浏览器显示出来的还是之前的页面 原因 服务器为提高响应速
  • 统计单词出现的最多次数(Trie树)

    A Time Limit 60ms Memory limit 65536K 有疑问 点这里 题目描述 给出n 1 lt n n lt 2 10 6 个字符串 每个字符串只包含小写英文字母 且最多有五个 问这n个字符串中出现次数最多的有多少个
  • 1.c++环境配置及第一个环境运行

    开发IDE与环境 最好是使用ubuntu系统进行开发 如果没有的话 基于windows使用vs code 进行ssh连接到远程的ubuntu主机进行开发也可以 开发的过程跟本地差不多 vs code IDE 插件的安装 1 变成中文菜单与提
  • ByteBridge数据标注平台:自动驾驶相关数据标注

    ByteBridge Dashboard是一个Saas型数据采集标注平台 利 强大的标注工具 运 智能算法技术 依靠交叉审核质检机制 借助标注运营及管理 动 体化系统 为客户按时提供安全 稳定 质量的数据标注服务 满 在模式识别领域进 科研
  • BP算法

    只限于自己看 预先说明 首先 这里面什么看成变量 什么看成常量 变量 网络的权值W 偏置b默认在W内 以及输入X 常量 就是target 你可能会说呃呃呃 不是输入都是有值吗 不都是数吗 怎么会是变量啊 一般来说网络的反向传播就是两种类型
  • VS2015--win32工程配置

    一个工程很大 需要很多的文件 如果都是我们自己写的文件 我们一般不会把实现不同功能的两个文件命以相同的名称 但是 如果我们引入了第三方库的源码 这样就很有可能有相同名字的文件存在 比如很多库都喜欢定义一个base h文件用于放置一些最基本的
  • Modbus RTU协议认识

    Modbus RTU协议认识 一 通信模式 Modbus RTU协议是一个主从协议 主机发出请求 从机返回响应 从机不能主动发送数据 同一时刻总线上只能有一个主机 但可以有多个从机 从机之间不能相互通信 二 通信角色 主机 主机没有编号 因