当前位置:网站首页 > Haskell函数式编程 > 正文

modbus RTU报文格式(modbuspoll报文在哪看)



MODBUS详细解析
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

1.Modbus 串行链路协议是一个主-从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点 (最大编号为 247 ) 连接于同一个串行总线。

2.Modbus 通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据子节点之间从不会互相通信。主节点在同一时刻只会发起一个Modbus 事务处理。

3.主节点以两种模式对子节点发出 Modbus 请求:
单播模式
主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个’应答’)。在这种模式,一个 Modbus 事务处理包含 2 个报文:一个来自主节点的请求,一个来自子节点的应答。每个子节点必须有唯一的地址 (1 到 247),这样才能区别于其它节点被独立的寻址。
广播模式
主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。广播请求一般用于写命令。所有设备必须接受广播模式的写功能。地址 0 是专门用于表示广播数据的。

01 - - 255广播地址子节点单独地址保留

地址 0 为广播地址。所有的子节点必须识别广播地址。
Modbus 主节点没有地址,只有子节点必须有一个地址。 该地址必须在 Modbus 串行总线上唯一。

上行链路:
Modbus TCP是Modbus协议在以太网上的一种实现,

串行链路:
1、对于modbus ASCII 模式,使用的是高位字节在前,低位字节在后。使用LRC校验
2、对于modbus rtu 模式,使用的是低位字节在前,高位字节在后。使用CRC校验

工具:
MODBUS POLL (上位机调试主机)
MODBUS SLAVE (上位机调试从机)
虚拟串口vspdp9.0
软件下载连接

Modbus 协议参考网址,这里咱们就参考MODBUS POLL 软件上的协议说明。

在 ASCII 模式下,消息以冒号 ( :) 字符(ASCII 0x3A 十六进制)开头,并以回车换行符 (CRLF)(ASCII 0x0D 和 0x0A 六进制)结尾
在这里插入图片描述
在 RTU 模式下,消息以至少 3.5 个字符的静默间隔开始 ,然后传输的第一个字段是设备地址。
在这里插入图片描述
把常用的功能实现就可以了。
在这里插入图片描述

读取从站中分立线圈的开/关状态.(线圈可以理解成一个Bit状态)
请求
请求消息指定要读取的起始线圈和线圈数量.
从从设备地址 4 读取 13 个线圈地址 10…22(线圈 11 至 23)的请求示例:
在这里插入图片描述
响应
在这里插入图片描述

线圈状态响应消息打包为数据字段的每个位一个线圈。状态表示为:1 是值 ON,0 是值 OFF。第一个数据字节的 LSB 包含在 请求。

请求
请求消息指定要读取的起始寄存器和寄存器数量。
从从设备 1 读取 0…1(寄存器 40001 到 40002)的请求示例:
在这里插入图片描述

响应
响应消息中的 register 数据打包为每个 register两个字节,每个字节内的二进制内容都是正确的。对于每个寄存器,第一个字节包含高阶位,第二个字节包含低位。
在这里插入图片描述

请求
请求消息指定要写入的 register 引用。寄存器从 0 开始寻址,寄存器 1 寻址为 0。
请求的 Write 值在 request data 字段中指定。以下是在从器件 17 中请求将寄存器 40002 写入 00 03 十六进制的示例。
在这里插入图片描述
响应
正常响应是请求的回声,在写入 register 内容后返回。
在这里插入图片描述

请求
请求消息指定要写入的 register 引用。寄存器从 0 开始寻址,寄存器 1 寻址为 0。
请求的写入值在 request data 字段中指定。数据打包为每个 register 两个字节。
下面是一个请求在从器件 17 中写入两个从 40002 到 00 0A 和 01 02 十六进制的寄存器的示例:
在这里插入图片描述
响应
正常响应返回从地址、函数代码、起始地址和写入的寄存器数量。以下是对 请求。
在这里插入图片描述

RS485是半双工通讯,收发不能同时;且建立在串口上进行。在多从机的情况下,可以将一路串口通过具有三态输出的收发器来切换485通讯支路,进而达到两路485的效果;解决同一支路上节点设备过多的硬件限制。

SYS
在这里插入图片描述

RCC
在这里插入图片描述
UART
在这里插入图片描述
在这里插入图片描述
NVIC
我这边只做一个demo,就用SystemTick产生中断提供时基来进行MODBUS时间间隔的测量,超过3.5的字符时间空闲,判断为收到一帧。Hal库的Delay用的也是SystemTick的时间基准,485EN引脚切换收发方向的时候需要用到;故UART的中断优先级要低于SystemTick.
在这里插入图片描述
串口 || 485
引脚PD5 PD6
485_EN PD11
1.采用中断的方式接收数据,阻塞的方式发送数据;
2.采用DMA中断的方式接收数据,阻塞的方式发送数据;

MODBUS RTU帧与帧的间隔是3.5个字符
当波特率是的情况下,传输一个字符的时间是10位/(位/s)=86.73微秒 * 3.5个字符 = 305.555微秒。
当波特率是9600的情况下,传输一个字符的时间是10位/(9600位/s)=1.04ms * 3.5个字符 = 3.64ms.
一般来说,波特率越高,通信距离越短。我们选用9600就可以了。
间隔时间算出来了,可以用定时器计时 、 UART空闲中断、等方式实现帧的分割读取。
如果从机响应的所有数据需要在主机内存Buff进行缓存之后在上传至云端,可以在存储时加上操作,也可以在MODBUS数据帧前添加帧头。

 

参考1:

 

参考2:

 

道理一样;用硬件CRC感觉更好点,不会占用太多空间。

 

直接生成代码后,HAL初始化时默认生成的SystemTick是1KHz,9600波特率,这个时间间隔够用了。
如果想更改为10KHz可以重载这个函数实现即可。
如果想知道中断的间隔时间可以在中断内翻转一个IO输出高低电平,用逻辑分析仪或者示波器测量,将时间校准。

 

串口每接收到一帧数据就将标志位置1,循环MODBUS事件后,并执行。

 
 

如果需要添加缓冲,可以将分割出来每帧数据加入链表中;在MODBUS的结构体内可以存取这个链表的位置和长度;让然后在MODBUS 事件中进行遍历链表即可。

 
 

主机03功能码读取到的寄存器值。
在这里插入图片描述
主机06功能码修改寄存器0的值为0。
在这里插入图片描述

有一点需要注意就是这个软件的配置连接要与UART的配置一致。
在这里插入图片描述

主机定时间隔一定时间 使用0x03功能码读取从机寄存器0,2个寄存器长度的数据。如下图所示打印出来的数据就是表格中获取到的。
在这里插入图片描述
在这里插入图片描述

 

Master主机组包函数和接收数据处理函数。

到此这篇modbus RTU报文格式(modbuspoll报文在哪看)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
                            

版权声明


相关文章:

  • 圈一圈,填一填(圈一圈,填一填,并说说算式中每个数表示什么意思)2025-02-28 09:54:07
  • 华为模拟器怎么进入用户模式(华为模拟器使用教程)2025-02-28 09:54:07
  • ar模块是什么(ar模式是什么)2025-02-28 09:54:07
  • 需要使用安全选项卡win7(windows要使用安全模式启动,需在启动时按)2025-02-28 09:54:07
  • pos机支付方式有哪些(pos机支付方式有哪些)2025-02-28 09:54:07
  • ewma模型(ewma模型计算公式)2025-02-28 09:54:07
  • 软件的格式后缀(软件格式的后缀名)2025-02-28 09:54:07
  • sigmrnd函数(sigmoid 函数)2025-02-28 09:54:07
  • 自定义多级列表编号格式(怎么设置多级列表编号1-1、1-2)2025-02-28 09:54:07
  • ewma模型计算公式(ewma模型和garch)2025-02-28 09:54:07
  • 全屏图片