MODBUS RTU通讯

2024-02-27 08:30
文章标签 通讯 modbus rtu

本文主要是介绍MODBUS RTU通讯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. modbus通讯

1.1 modbus通讯数据格式

地址码(1个字节)+功能码(1个字节)+数据区(N个字节)+校验码(16位crc)

1.2功能码

功能码->描述->说明->modbus地址

01 -> 读输出线圈寄存器->位操作->00001-09999

02 -> 读离散输入寄存器 -> 位操作->10001-19999

03 -> 读保持(输出)寄存器 ->字操作->40001-49999

04 -> 读输入寄存器 ->资操作 ->30001-39999

05 -> 写单线圈寄存器 ->位操作 ->00001-09999

06 -> 写单线圈保持寄存器 ->字操作 ->40001-49999

15 -> 写多线圈寄存器 -> 位操作 ->00001-09999

16 ->写多个保持寄存器 -> 字操作 ->40001-49999

其余自行了解吧。

1.3数据格式

数据格式不固定,需要查看从机设备的通讯资料

开始编号/寄存器地址

数据个数

数据1

……

数据n

2个字节

2个字节

2个字节

2个字节

2个字节

寄存器地址

通常Modbus地址由5位数字组成,包括起始的数据类型代号,以及后面的偏移地址。Modbus Master协议库把标准的Modbus地址映射为所谓Modbus功能号,读写从站的数据。

Modbus Master协议库支持如下地址:

编号范围

含义

00001~09999

数字量输出(线圈)

10001~19999

数字量输入(触点)

30001~39999

输入数据寄存器(通常为模拟量输入)

40001~49999

数据保持寄存器

1.4CRC校验

(1)设置crc变量存储器并初始化 0xFFFF

(2) 把第一个参与校验的数据和crc变量的低八位进行异或运算,结果存到crc存储器中

(3)把crc右移一位,最高位补0

(4)检查刚移出的最低位b0,如果b0=1,则CRC变量和0xA001进行异或运算,结果仍存在CRC 变量存储器中,然后执行下一步。如果b0=0,则直接执行下一步

(5)重复3、4两步,只到右移8次。这样第一个数据处理就完成了,结果仍存在CRC变量存储器中

(6)重复2~5步,处理下一个数据,只到参与校验的数据均处理完毕。

最后获得的16位校验值,要在传输时,低在前,高在后。

1.5 C语言

#include <stdio.h>
//需要生成crc校验的数据个数
#define num 6 
int main()
{unsigned char buf[num]={0x01,0x04,0x00,0x0a,0x00,0x0a};int i , n;unsigned int crc16;unsigned int temp;crc16=0xffffi=0;n=0;for(n=0;n<num;n++){crc16 = buf[n]^crc16;for(i=0;i<8;i++) //位移8次{temp = crc16 & 0x0001;crc16 = crc16>>1;if(temp){crc16 = 0xa001^crc16;}printf("CRC校验为:%x\n",crc16);    }printf("---------------------------------\n");    }printf("CRC校验为:%x\n",crc16);        
}

1.6 S7-1200 MODBUS通讯指令介绍

MB_COMM_LOAD指令:用于设置Modbus(RTU)端口。

参数

说明

EN

使能

REQ

上升沿启动该指令

PORT

扩展模块的硬件标识符

BAUD

波特率

PARITY

0:无校验;1:奇校验;2:偶校验

RESP_TO

每个从站的读取延时时间

MB_DB

MB_MASTER / MB_SLAVE 指令的背景数据块

MB_MASTER指令

参数说明

EN使能

REQ上升沿发送有一个读/写请求

MB_ADDR从站地址

MODE读写控制位;0:读;1:写;

PARITY0:无校验;1:奇校验;2:偶校验

DATA_ADDR将要读/写的从机寄存器地址

DATA_LEN访问寄存器的连续数量

DNE完成标志位,可以用来激活下一个指令

BUSY繁忙标志位

ERROR错误标志位

STAUS错误代码

1.7 C#

待更。。。。。

这篇关于MODBUS RTU通讯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751810

相关文章

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

Modbus从基地址 1 和基地址 0 开始的区别

Modbus 是一种应用于工业自动化领域的通信协议,在设备之间进行数据交换。它支持多种数据类型(如线圈、离散输入、输入寄存器、保持寄存器),每种数据类型都有特定的地址范围。在使用 Modbus 通信时,设备的地址可以从 1 或 0 开始计数,这取决于具体实现。这种不同的基地址(1 或 0)选择,可能导致实际读取或写入的地址存在偏差,因此理解其差异是十分重要的。 1. Modbus 地址的基本概念

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。 1. 问题背景 假设我们在一个应用程序中使用多线程处理串口或TCP通讯,通常会在子线程中实现持续的数据读取。为了确保实时处理数据,常见的做法是在子线程的 run() 方法中使用 while

QQ通讯协议

不管UDP还是TCP,最终登陆成功之后,QQ都会有一个TCP连接来保持在线状态。这个TCP连接的远程端口一般是80,采用UDP方式登陆的时候,端口是8000。因此,假如你所在的网络开放了80端口(80端口是最常用端口。。就是通常访问Web的端口,禁掉它的话,你的网络对你来说价值已经不大了),但没有屏蔽腾讯的服务器IP,恭喜你,你是可以登陆成功QQ的。 二、聊天消息通信。       采用UDP协

串口与Labview通讯的调试

在学习Labview和串口的通讯和调试的时候。首先必须先了解一些Labview的基础知识,然后就是了解串口,在调试的过程中,我们需要下位机来辅助我们的程序编写与调试,也就是我们平时使用的单片机,如果没有单片机也不要紧,可以使用虚拟串口来把电脑的串口相连接,这样也可以达到我们的预期效果 工欲善其事,必先利其器 让我们先来做一些准备工作 在这里可以把两个虚拟的串口相连接,在上图的左边,可以看到我

网关桥梁:modbus 转 profinet 网关中频加热机的智能融合之旅

一、项目序章:金属热处理的智慧曙光在金属锻造的辉煌舞台上,中频感应加热电源以其高效节能、精准控温的卓越才艺,成为了热处理、焊接与成型艺术中不可或缺的幕后英雄。然而,随着工业自动化的浪潮汹涌而至,如何让这位英雄融入智能工厂的广阔天地,实现远程指挥与智能操控,成为了新时代的命题。本案例,便是一场关于中频感应加热电源与工业网关携手,共绘智能工厂新蓝图的壮丽篇章。 二、系统蓝图:织就智慧互联的经纬1

不等了,华为计划在5.5G阶段就实现6G的空天地一体通讯网络功能

朋友们,你们是否曾经幻想过,无论身处何地,都能保持与世界的无缝连接?在偏远的山区、在茫茫的大海、甚至是在飞机上,都能享受畅通无阻的网络服务? 现在,这不再是幻想,华为正计划将这一切变为现实。在最近召开的空天信息产业国际生态大会上,华为的余承东宣布了一项激动人心的计划——在5.5G时代就实现6G的空天地一体通讯网络功能。 一、星地融合,永不失联 华为一直在探索如何将卫星通信技术与地面网络相