Modbus RTU协议简介即CRC算法实现

目录

  • 1 Modbus 介绍
  • 2 Modbus RTU协议传输方式
    • 2.1 地址码
    • 2.2 功能码
    • 2.3 数据码
    • 2.4 校验码
  • 3 CRC算法实现
    • 2.1 代码
    • 3.2 运行结果

1 Modbus 介绍

  Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
  Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。大多数Modbus设备通信通过串口EIA-485物理层进行。
  对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。这两个变种都使用串行通信(serial communication)方式。RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。
  本文描述是正是Modbus RTU中使用的校验和算法。
  MODBUS 通讯方式采用主从方式的查询相应机制,只有主站发出查询时,从站才能给出响
应,从站不能主动发送数据。主站可以向某一个从站发出查询,也可以向所有从站广播信息。
从站只响应单独发给它的查询,而不响应广播消息。

2 Modbus RTU协议传输方式

  串口配置每个字节的数据位:1 个起始位、8 个数据位、1 个停止位(无奇偶校验位)。
MODBUS-RTU 数据帧的结构:
 数据帧的结构

说明:

  • 数据字段中多字节成员是按网络字节序即高位在前。
  • 校验字段两个字节是小端字节序即低位在前。
  • 校验码是对其前面地址码,功能码和数据码的校验值。

2.1 地址码

  由一个字节(8 位二进制码)组成,各从机设备的寻址范围 01~F7(转成十进制 1~247),
其它地址保留。

2.2 功能码

  功能码告诉了被寻址到的终端执行何种功能。

2.3 数据码

  数据码包含了 终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者设置值。例如:功能域码告诉终端 读取一个寄存器,数据域则需要反映明从哪个寄存器开始及读取多少个数据,而从机数据码回送内容则包含了数据长度和相应的数据。

2.4 校验码

  校验码错误校验(CRC)域占用两个字节,包含了一个 16 位的二进制值。CRC 值由传输设
备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算 CRC 值,然后与接收到的
CRC 域中的值进行比较。如果这两个值不相等,就发生了错误。
  生成一个 CRC 的流程为:

  1. 预置一个 16 位寄存器为 OFFFFH(16 进制,全 1),称之为 CRC 寄存器。
  2. 把数据帧中的第一个字节的 8 位与 CRC 寄存器中的低字节进行异或运算,结果存回 CRC
    寄存器。
  3. 将 CRC 寄存器向右移一位,最高位填以 0,最低位移出并检测。
  4. 上一步中被移出的那一位如果为 0:重复第三步(下一次移位);为 1:将 CRC 寄存器与
    一个预设的固定值(多项式 0A001H)进行异或运算。
  5. 重复第三点和第四步直到 8 次移位。这样处理完了一个完整的八位。
  6. 重复第 2 步到第 5 步来处理下一个八位,直到所有的字节处理结束。
  7. 最终 CRC 寄存器的值就是 CRC 的值。

3 CRC算法实现

2.1 代码

#include <cstdint>
#include <cstdio>

//MODBUS-RTU协议使用的CRC16算法
uint16_t modbus_crc16(uint8_t *data, uint16_t size)
{
    uint16_t crc = 0xFFFF;
    for(uint16_t i = 0; i < size; ++i)
    {
        crc ^= (*data++);
        for(uint8_t b = 0; b < 8; ++b)
        {
            if(!(crc & 0x1))
                crc >>= 1;
            else
            {
                crc >>= 1;
                crc ^= 0xA001;
            }
        }
    }
    return crc;
}

int main()
{
    uint8_t data1[] = { 0x01, 0x06, 0x00, 0x10, 0x00, 0x03 };
    uint8_t data2[] = { 0x01, 0x06, 0x00, 0x10, 0x00, 0x01 };
    uint16_t crc1 = modbus_crc16(data1,sizeof(data1));
	uint16_t crc2 = modbus_crc16(data2,sizeof(data2));
    printf("crc1: %02X %02X\n", (crc1 & 0xFF), (crc1 >> 8));
	printf("crc2: %02X %02X\n", (crc2 & 0xFF), (crc2 >> 8));
    return 0;
}

3.2 运行结果

运行结果:

$ ./modbuscrc
crc1: C8 0E
crc2: 49 CF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/767624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 6G无线通信AI大赛分享交流会暨颁奖典礼圆满落幕

7月1日&#xff0c;由IMT-2030(6G)推进组、IMT-2020(5G)推进组5G与AI融合研究任务组主办&#xff0c;OPPO广东移动通信有限公司承办的2024 6G无线通信AI大赛在北京顺利举行分享交流会暨颁奖典礼。主承办方专家、10支获奖团队代表及6G无线通信相关领域专业人才齐聚北京&#xff…

企业元宇宙3D云端数字化展厅扩大客户触及面

在浩瀚无垠的元宇宙中&#xff0c;一个立体、虚拟的数字空间正在等待您的探索与创造。如何在这片无边界的数字领域中快速搭建起属于您自己的虚拟展馆&#xff0c;已成为当今企业关注的焦点。 元宇宙数字展馆搭建&#xff0c;不仅是对新技术领域的探索&#xff0c;更是品牌创新与…

股指期货看盘技巧和方法分享!

股指期货看盘技巧&#xff0c;简单来说&#xff0c;就是要找到适合自己的方法&#xff0c;同时要考虑大的经济环境。做交易时&#xff0c;要勇敢&#xff0c;不要后悔。 1. 了解自己&#xff1a;首先&#xff0c;你得清楚自己是哪种类型的投资者。你是喜欢长期投资&#xff0c;…

迅睿CMS 后端配置项没有正常加载,上传插件不能正常使用

首先&#xff0c;尝试迅睿CMS官方提供的【百度编辑器问题汇总】解决方案来解决你的问题。你可以访问这个链接&#xff1a;官方解决方案。 如果按照【百度编辑器问题汇总】解决方案操作后&#xff0c;依然遇到“后端配置项没有正常加载&#xff0c;上传插件不能正常使用”的问题…

JL-33 手持式气象站/便携式气象站 小型气象站厂家 微型气象站

产品概述 手持式气象站是一款携带方便&#xff0c;操作简单&#xff0c;集多项气象要素于一体的可移动式气象观测仪器。产品采用传感器及芯片&#xff0c;能同时对空气温度、空气湿度、风速、风向、光照、大气压力、颗粒物、噪声等要素进行准确测量、记录并存储。仪器带有机械…

未对文件 xxx.ps1 进行数字签名,无法在当前系统上运行该脚本解决

无法执行PS1脚本&#xff1a; 解决方法: 启用远程签名策略 set-ExecutionPolicy RemoteSigned 启用签名策略后&#xff0c;成功执行ps1脚本 解决方法2: 使用当前用户签名策略&#xff1a; Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 成功运行ps1脚本 PowerShell I…

【计算机网络】网络层(作业)

【一】 1、某主机的 IP 地址为 166.199.99.96/19。若该主机向其所在网络发送广播 IP 数据报&#xff0c; 则目的地址可以是&#xff08;D&#xff09;。 A. 166.199.99.255B. 166.199.96.255C. 166.199.96.0D. 166.199.127.255 解析&#xff1a; 166.199.99.96/19166.199.0…

【FPGA】STA静态时序分析

文章目录 一.定义二.分类1. 静态时序分析2. 静态时序分析 三. 概念四. 时间余量1.场景2.建立时间余量3.保持时间余量 一.定义 时序分析:检查电路是否满足时序要求&#xff1b; 二.分类 1. 静态时序分析 STA,遍历所有的时序路径&#xff0c;根据时序库&#xff08;.lib文件&…

【前端】HTML+CSS复习记录【5】

文章目录 前言一、padding、margin、border&#xff08;边框边距&#xff09;二、样式优先级三、var&#xff08;使用 CSS 变量更改多个元素样式&#xff09;四、media quary&#xff08;媒体查询&#xff09;系列文章目录 前言 长时间未使用HTML编程&#xff0c;前端知识感觉…

分享 6 款用于管理Docker容器的免费开源工具

Docker 是一个开源平台&#xff0c;可自动执行应用程序的部署、扩展和管理。它使用容器化技术将应用程序及其依赖项打包到软件开发的标准化单元中。 这使得使用容器创建、部署和运行应用程序变得更加容易&#xff0c;容器允许开发人员将应用程序及其所需的所有部分&#xff08…

使用Scrapy进行网络爬取时的缓存策略与User-Agent管理

缓存策略的重要性 缓存策略在网络爬虫中扮演着至关重要的角色。合理利用缓存可以显著减少对目标网站的请求次数&#xff0c;降低服务器负担&#xff0c;同时提高数据抓取的效率。Scrapy提供了多种缓存机制&#xff0c;包括HTTP缓存和Scrapy内置的缓存系统。 HTTP缓存 HTTP缓…

Conmi的正确答案——ESP32-C3开启安全下载模式

IDF版本&#xff1a;4.4.7 注意事项&#xff1a;一旦烧录“安全下载模式”&#xff0c;模组将无法被读取或清理&#xff0c;只能通过eclipse原项目烧录程序进行重新烧录&#xff0c;无法再烧录其他固件。 20240703110201——追加解法&#xff0c;暂时无法解安全下载模式 &…

运营商如何与第三方服务商合作,共同建设PCDN网络?

运营商与第三方服务商合作&#xff0c;共同建设PCDN&#xff08;P2P CDN&#xff09;网络是一个复杂且涉及多方面的过程。以下是具体的操作步骤&#xff1a; 一&#xff0e;明确合作目标与需求&#xff1a; 1.运营商与第三方服务商首先需明确合作目标&#xff0c;如提升内容分…

【YOLOv5进阶】——引入注意力机制-以SE为例

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、站在巨人的肩膀上 SE模块即Squeeze-and-Excitation 模块&#xff0c;这是一种常用于卷积神经网络中的注意力机制&#xff01;&#xff01; 借鉴代码的代码链接如下&a…

Shiro框架1

入门概述 1 权限的管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理&#xff0c;权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权(被赋予权限)的…

Java 7新特性深度解析:提升效率与功能

文章目录 Java 7新特性深度解析&#xff1a;提升效率与功能一、Switch中添加对String类型的支持二、数字字面量的改进三、异常处理&#xff08;捕获多个异常&#xff09;四、增强泛型推断五、NIO2.0&#xff08;AIO&#xff09;新IO的支持六、SR292与InvokeDynamic七、Path接口…

【VScode】常用配置

1.indenticator 增加白色竖条&#xff0c;显示方法范围 2.Git Graph 给git变换分支增添颜色区分 3.Vue 系列 vue 系列&#xff1a;给纯白色代码添加 颜色区分 3.eslint eslint警告&#xff0c;比如{ } 只写了半个会标红提示错误 等错误信息提示 需要配置js等页面 非下…

python提取图片中的文字写入excel文件,并打包为exe可执行文件

python提取图片数据写入excel&#xff0c;并打包为exe可执行文件 1. 以下面的图片为例2. python环境需要的依赖包3. 创建交互式窗口4. 读取文件夹下的所有文件并提取数据5. 提取图片中字段的代码6. 打包代码为exe可执行文件安装打包依赖文件运行打包代码 1. 以下面的图片为例 2…

Omniverse、Isaac Sim、Isaac Lab入门必会之 Nucleus 部署

新手入门Omniverse、Isaac Sim、Isaac Lab时经常发现&#xff0c;要想跑通例程&#xff0c;总是usd等资源加载不出来&#xff0c;软件傻傻的进程阻塞卡在那里&#xff0c;点两下就崩溃&#xff0c;这对新手来说非常的不友好&#xff0c;这都是由于没有安装 Nucleus 或者 Nucle…

14. Java中 volatile 关键字

1. 前言 本节内容主要是对 volatile 关键字进行讲解&#xff0c;具体内容点如下&#xff1a; volatile 关键字概念介绍&#xff0c;从整体层面了解 volatile 关键字&#xff1b;volatile 关键字与 synchronized 关键字的区别&#xff0c;这是本节的重点内容之一&#xff0c;了…