基于RS485的Modbus协议

RS485:用来传输数据,RS485是一种差分传输的串行通信标准,以其强大的抗干扰能力、长距离传输和多点通信能力,在工业控制领域得到广泛应用。RS485使用一对差分信号线(A和B)来传输数据,差分信号能有效抵抗共模干扰,提高通信的可靠性。RS485通信可以是半双工或全双工,具体取决于应用配置。在半双工模式下,同一时刻只能发送或接收数据。

Modbus:用来解析数据,Modbus是一种用于电子控制器上的一种通用语言,通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议是一个master/slave(主/从)架构的协议。有一个节点是master节点(一般为上位机),其他使用Modbus协议参与通信的节点是slave节点(一般为下位机)。每一个slave设备都有一个唯一的地址。特点:完全公开发表并且无版权要求、易于部署和维护、对供应商来说,修改移动本地的比特或字节没有很多限制。

RS485通信

RS485的电气特性:逻辑“1”,VA>VB,以两线间的电压差为+(2~6)V表示;逻辑“0”,VB>VA,以两线间的电压差为-(2~6)V表示。

TTL电气特性:逻辑“1”,表示3.3~5V;逻辑“0”,表示0V;

        由于STM32的UART/USART接口输出的是TTL电平信号,而RS485接口需要差分信号(抗干扰能力强,传输距离远),因此需要通过RS485收发器(如SP3485)进行电平转换。

 如图所示的485芯片,接到单片机上的引脚有三个,USART的TX引脚连接到RS485收发器的DI(数据输入)引脚,USART的RX引脚连接到RS485收发器的RO(数据输出)引脚。,同时将RS485收发器的DE(驱动器使能)和RE(接收器使能)引脚连接到STM32的一个GPIO引脚,用于控制收发器的发送和接收模式。

引脚A和B:这是RS485通信中的一对差分信号线,用于传输数据。在RS485收发器芯片上,这两个引脚是必需的,用于连接到通信总线。

引脚RE(Receiver Enable,接收使能)和DE(Driver Enable,驱动使能):这两个引脚用于控制RS485收发器的工作模式。RE引脚低电平时,收发器处于接收状态;DE引脚高电平时,收发器处于发送状态。在某些自动收发设计的RS485收发器中,可能不需要这两个引脚,而是通过内部逻辑自动切换收发状态。在上图中是将这两个引脚接到一个GPIO口上,用于控制RS485收发器的RE和DE引脚。STM32的一个或多个GPIO引脚被配置为输出模式,用于在发送和接收数据时切换RS485收发器的工作模式。当RS485_EN是高电平为发送状态,低电平为接收状态。(RS485与串口通信区别可能就在于需要使能引脚去控制数据的接收或者发送)

MODBUS协议

Modbus RTU:运行在串口上的协议,采用二进制表现形式以及紧凑的数据结构,通信效率较高,应用比较广泛。它使用串行通信方式,并且后续的命令/数据带有循环冗余校验的校验和。

Modbus ASCII:同样运行在串口上的协议,但采用ASCII码进行传输,每个字节的开始和结束都有特殊字符作为标志,传输效率低于Modbus RTU,一般只在通讯量较少时使用。

Modbus TCP/IP:基于以太网的变体,使用TCP/IP协议栈进行数据传输。它使用标准的以太网物理层和IP网络连接,可以通过以太网进行设备间的通信。与Modbus RTU和Modbus ASCII相比,Modbus TCP/IP具有更高的通信速度和更好的可靠性。

 Modbus协议的功能码

常用的功能码一般就是03读命令、06写命令、16写命令

 通信报文或数据包格式

用一个字节编码 MODBUS 数据单元的功能码域。有效的码字范围是十进制 1-255(128-255 为
异常响应保留) 。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。
通信地址:1~247,指定地址0的指令是广播指令,所有收到指令的设备都会运行,不过不回应指令。

利用Modbus_poll和Modbus_slave演示

首先下载一个串口模拟助手比如VSPD;

下载Modbus_poll和Modbus_slave后打开两个软件

这里我用的是模拟串口,将端口10与端口11连接起来,在poll软件中选择的是COM10->COM11,在slave软件中选择的是COM11->COM10。

 03读命令功能码

 分析一下上述的报文协议

Tx:01 03 00 00 00 01 84 0A
Rx:01 03 02 00 10 B9 88

 主机发送的报文TX:01(地址码8bit)、03(功能码8bit,03为读命令)、0000(寄存器起始地址16bit)、0001(读取寄存器个数N*16bit)、840A(CRC校验16bit);读取01从机的起始地址为0000的一位寄存器数据。

从机的应答RX:01(地址码8bit)、03(功能码8bit,03为读命令)、02(字节数=寄存器数*2)、0010(数据区)、B988(CRC校验);
数据区的0010就是刚才在slave软件中填写的寄存器数据16的十六进制表达,如果刚才写的是32,现在的数据区就为0020。02字节数就是表示读取到两个字节,后面的两个字节表示读取的数据。如果是04,则表示后面的4个字节就是从从机中读取的数据。

如何确定主机接收和从机发送的数据包,靠的是两者的时间间隔。如果两个数据包之间间隔3.5个字符,则确定一包数据发送完成。115200波特率,3.5个字符的时间:1个字符位10bit,3.5*10=35bit,35/115200=3ms左右的时间,只要超过这个时间就认为一包数据发送完成。
在一包数据中字符与字符之间不能超过1.5个字符时间。

06写命令功能码

注意,06写命令只能写一个寄存器,所以在修改配置的时候需要将寄存器值quantity需要改成1。

Tx:01 06 00 00 00 20 88 12
Rx:01 06 00 00 00 20 88 12

 主机发送的报文TX:01(地址码8bit)、06(功能码8bit,06为写命令)、0000(寄存器起始地址16bit)、0020(数据区,写入寄存器的值16bit)、8812(CRC校验16bit);向01从机的起始地址为0000的一位寄存器数据写入数据32。

从机的应答RX:在接收完成后,06功能码将主机发送的数据包原样返回给主机。

16写命令功能码(写多个寄存器)

分析数据协议
Tx:01 10 00 00 00 02 04 00 07 00 0F 02 6A
Rx:01 10 00 00 00 02 41 C8

 主机发送的报文TX:01(地址码8bit)、10(十六进制功能码8bit,16为写命令,)、0000(寄存器起始地址16bit)、0002(寄存器个数)、04(字节数)、0007(数据区,写入寄存器的值16bit)、000F(数据区,写入寄存器的值16bit)、026A(CRC校验16bit);向01从机的起始地址为0000的寄存器1数据写入数据7,后面的寄存器2写入15。

从机的应答RX:01(地址码8bit)、10(功能码8bit,16为写命令)、0000(寄存器起始地址)、0002(寄存器个数)、41C8(CRC校验);相当于告诉主机,数据接收完成,从0000地址接收了4个寄存器的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

eclipse ui bug

eclipse ui bug界面缺陷,可能项目过多,特别maven项目过多,下载,自动编译,加载更新界面异常 所有窗口死活Restore不回去了 1)尝试创建项目,还原界面,失败 2)关闭所有窗口&…

Django学习(二)

get请求 练习: views.py def test_method(request):if request.method GET:print(request.GET)# 如果链接中没有参数a会报错print(request.GET[a])# 使用这个方法,当查询不到参数时,不会报错而是返回你设置的值print(request.GET.get(c,n…

winrar安装好后,鼠标右键没有弹出解压的选项

本来安装挺好的,可以正常使用,有天我把winrar相关的文件挪了个位置,就不能正常使用了。 然后我去应用里面找,找到应用标识了,但是找不到对应的文件夹(因为我挪到另外一个文件夹里了)。 于是我找…

语言转文字

因为工作原因需要将语音转化为文字,经常搜索终于找到一个免费的好用工具,记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

Android 软键盘挡住输入框

Android原生输入法软键盘挡住输入框,网上各种解法,但不起效。 输入框都是被挡住了,第二张图的小点,实际就是输入法的光标。 解法: packages\inputmethods\LatinIME\java\res\values-land config.xml <!-- <fraction name="config_min_keyboard_height"&g…

pikachu靶场之目录遍历、敏感信息泄露

一、目录遍历 漏洞概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量&#xff0c;从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时&#xff0c;便会将请求的这个文件的值(比如文件名称)传递到后台&#xff0c;后台再执行其对应的文件。 在这个过…

如何评价估计量的好坏

目录 三大方法 概念 无偏性 如何计算估计量的无偏性&#xff1f; 步骤 有效性 有效性在不同类型的数据分析中如何评估&#xff1f; 步骤 一致性 一致性原则在实际应用中的挑战有哪些&#xff1f; 挑战 在大样本情况下&#xff0c;如何准确测量估计量的一致性&#xf…

AcWing-差分矩阵

insert函数影响范围&#xff0c;在b差分数组这样操作影响到是a里面的&#xff0c;所以下图的矩阵表示的是a数组 b[x1][y1]c;会导致a里面仅绿色范围的a[i][j]c b[x1][y21]-c;会导致a里面仅黄色范围的a[i][j]-c b[x21][y1]-c;会导致a里面仅蓝色范围的a[i][j]-c b[x21][y21]c;会导…

SQL Server 设置端口号:详细步骤与注意事项

目录 一、了解SQL Server端口号的基础知识 1.1 默认端口号 1.2 静态端口与动态端口 二、使用SQL Server配置管理器设置端口号 2.1 打开SQL Server配置管理器 2.2 定位到SQL Server网络配置 2.3 修改TCP/IP属性 2.4 重启SQL Server服务 三、注意事项 3.1 防火墙设置 3…

数据结构与算法-归并排序

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、归并排…

MySQL笔记3——高级数据查询语句DQL

多表联查 多表联查可以通过连接运算实现&#xff0c;即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查 时用到的数据库表之间的关系。 等值查询和非等值查询 非等值查询&#xff1a;SELECT * FROM 表1&#xff0c;表2 等值查询&#xff1a;SELECT * FROM 表…

Oracle对比两表数据的不一致

MINUS 基本语法如下 [SQL 语句 1] MINUS [SQL 语句 2];举个例子&#xff1a; select 1 from dual minus select 2 from dual--运行结果 1-------------------------------- select 2 from dual minus select 1 from dual--运行结果 2所以&#xff0c;如果想找所有不一致的&a…

Codeforces Round 962 (Div. 3)

链接 C题&#xff1a; 思路&#xff1a; 直接暴力求每个字母的前缀和&#xff0c;对于区间l&#xff0c;r的最小操作就是区间不同数的一半&#xff0c;因为可以把一个数变成另一个不一样的数&#xff0c;一下抵消两个。 #include<bits/stdc.h> using namespace std; //…

苹果CMS V10萌芽采集插件Pro v10.7.3

苹果CMS V10萌芽采集插件Pro v10.7.3 插件下载:萌芽采集插件Pro v10.7.3.zip 使用说明: 将addons文件和static文件放到你苹果cms程序的根目录并覆盖&#xff0c; 在登录后台在应用-应用市场启用。http://你的域名/admin.php/admin/mycj/union.html

等保测评练习卷19

等级保护初级测评师试题19 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1.为了有效处理等级保护对象运行过程中可能发生的重大安全事件&#xff0c;需要在统一的框架下制定针对不同安全事件的应急预…

FPGA开发——呼吸灯的设计

一、原理 呼吸灯的原理主要基于‌PWM&#xff08;脉冲宽度调制&#xff09;技术&#xff0c;通过控制LED灯的占空比来实现亮度的逐渐变化。这种技术通过调整PWM信号的占空比&#xff0c;即高电平在一个周期内所占的比例&#xff0c;来控制LED灯的亮度。当占空比从0%逐渐变化到1…

java计算机毕设课设—记账管理系统(附源码和安装视频)

这是什么系统&#xff1f; java计算机毕设课设—记账管理系统&#xff08;附源码和安装视频&#xff09; 记账管理系统主要用于财务人员可以从账务中判断公司的发展方向。对个人和家庭而言&#xff0c;通过记账可以制定日后的 消费计划&#xff0c;这样才能为理财划出清晰合理…

C++初学者指南-6.函数对象--lambdas(基础)

C初学者指南-6.函数对象–lambdas(基础) 文章目录 C初学者指南-6.函数对象--lambdas(基础)提醒:函数类和对象Lambdas变量捕获保存闭包通用Lambdas (C14)广义捕获 (C14)相关内容 幻灯片 提醒:函数类和对象 类至少提供一个operator () (…) {…} 函数能像一个函数一样被调用可以…

Nginx制作下载站点

使用nginx制作一个类似nginx官网的下载站点 如何制作一个下载站点,首先需要ngx_http_autoindex_module模块 该模块处理以斜杠(“/”)结尾的请求&#xff0c;并生成目录列表。 nginx编译的时候会自动加载该模块&#xff0c;但是该模块默认是关闭的&#xff0c;需要使用下来指令…

苦学Opencv的第九天:模板匹配

Python OpenCV入门到精通学习日记&#xff1a;模板匹配 前言 模板匹配是一种最原始、最基本的识别方法&#xff0c;可以在原始图像中寻找特定图像的位置。模板匹配经常应用于简单的图像查找场景中&#xff0c;例如&#xff0c;在集体合照中找到某个人的位置。 #mermaid-svg-N…