modbus 学习笔记

modbus 学习笔记

学习资料链接

  • modbus协议讲解及stm32实现视频讲解链接

  • SSCOM串口助手下载链接

  • RS485通信及MODBUS通信协议

  • MCU作主机基于MODBUS协议读取温湿度传感器数据并显示OLED

知识点记录

  1. 一个寄存器两个字节 0x0000 ~ 0x65535
  2. 通信地址(ID号取值范围):1~247
  3. 指定地址0的指令是广播指令,所有收到指令的从机设备都会运行,不过不回应指令
  4. 当我们接受当前帧的数据包与上次接受的数据包之间相隔时间大于包间最大传输时间间隔,就说明当前接受的数据包是一个新的数据包(超时时间一般设为==4ms~10ms==个)
  5. 包与包之间的最大传输时间间隔是传输 3.5个字符的时间,假如传输的波特率是9600bit/s,发送一个字符需要10个bit,即1个起始位,8个数据位,1个校验位共10个bit,即发送3.5个字符要35个bit,即35*1/9600 = 0.0036 大概 3.5ms。(字节与字节之间的传输时间不能大于1.5个字符时间)

已知功能码有3种

  1. 0x03 主机向从机索要数据,即从起始地址索要n个寄存器数目
  2. 0x06 主机向从机写入单个数据,即将数据写入从机的某个寄存器
  3. 0x10 主机向从机写入多个数据, 即将数据写入从机的连续寄存器

三种功能码的具体案例体现

主机向从机索要数据 (0x03)

modbus 学习笔记_第1张图片

在这里插入图片描述

  • 主机 TX

01 == ID号
03 == 功能码
00 00 == 从机的起始地址
00 05 == 向从机索取5个寄存器中的数据(寄存器长度)
85 C9 == 校验位

功能向从机索要从00 00 这个起始地址,索要5个寄存器数据内容

格式
ID号 功能码 读取从机的寄存器起始地址 读取的寄存器个数 校验位

  • 从机 RX

01 == ID号
03 == 功能码
0A == 发送回给主机数据的字节数
00 01 == 从机起始地址的第1个寄存器的数据内容
00 02 == 从机起始地址的第2个寄存器的数据内容
00 04 == 从机起始地址的第3个寄存器的数据内容
00 02 == 从机起始地址的第4个寄存器的数据内容
00 02 == 从机起始地址的第5个寄存器的数据内容
DB 27 == 校验位

其格式:
ID号 功能码 发送给主机字节数 数据内容 校验位


主机向从机写入单个数据 (0x06)

modbus 学习笔记_第2张图片
在这里插入图片描述

  • 主机 TX

01 == ID号
06 == 功能码
00 03 == 从机的寄存器地址
00 04 == 写入寄存器的数据内容
78 09 == 校验位

功能向从机的00 03 地址下的寄存器中写入00 04

格式
ID号 功能码 写入从机的寄存器地址 写入的数据内容 校验位

modbus 学习笔记_第3张图片

  • 从机 RX

返回内容与主机发送的内容一致


主机向从机写入多个数据 (0x10)

在这里插入图片描述

  • 主机 TX

01 == ID号
10 == 功能码
00 01 == 写入从机的寄存器起始地址
00 03 == 写入从机的寄存器个数
06 == 写入从机的字节个数(寄存器个数的两倍)
00 FE == 写入从机的第1个数据内容
00 FF == 写入从机的第2个数据内容
00 01 == 写入从机的第3个数据内容
6F 61 == 校验码

功能向从机的00 01 起始地址,连续写入3个数据内容

格式
ID号 功能码 写入从机的寄存器起始地址 写入的寄存器个数 写入的字节数 写入的数据内容 校验位

modbus 学习笔记_第4张图片

  • 从机 RX

01 == ID号
10 == 功能码
00 01 == 写入到从机的寄存器起始地址
00 03 == 写入到从机的寄存器个数
D1 C8 == 校验码

格式
ID号 功能码 写入从机的寄存器起始地址 写入的寄存器个数 校验位

你可能感兴趣的:(stm32学习,modbus,嵌入式,stm32)