modbus RTU协议为例

发布时间 2023-10-13 17:00:31作者: huihui不会写代码

1.认识一下

  • 通信协议不区分接口(设备),就像谁都可以讲中文
  • 一个通信协议可以在串口,以太网,无线,蓝牙上面走
  • 是协议是规约

modbus协议是一种应用层的报文传输协议,分三种
RTU
ASCII
TCP

2.存储区

目的:通信->读写

存储区 代号 范围 6位
输出线圈 0 00001-09999 000001-065536
输入线圈 1 10001-19999 100001-165536
输出寄存器 4 40001-49999 400001-465536
输入寄存器 3 30001-39999 300001-365536

(表示最小单位)
2^16所以是65536
image
存储区范围:5位和6位 ->标准地址5位 扩展地址6位
第一位表示存储区
地址:
Y XXXX
Y XXXXX
如地址:
36543
03321
10894


2.读和写,如何通信

多少种动作 功能码
读输出线圈 01
读输入线圈 02
读输出寄存器 03
读输入寄存器 04

写单个输出线圈 05
写单个输出寄存器 06
写多个输出线圈 15
写多个输出寄存器 16

3.报文

modbusRTU/ASCII
报文格式:从站地址(设备编号)(1byte)+功能码(1byte)+数据(N byte)+校验(2byte)

  • 对于读取来说:
    从站地址(设备编号) 找谁
    功能码 干嘛
    数据 具体干嘛
    校验 验证
  • 对于写入来说:
    从站地址(设备编号) 找谁
    功能码 干嘛
    数据 具体干嘛(写入什么数值)(更多)
    校验 验证

例子:

  • 发送:01 03 00 00 00 02 C4 0B
    01 站地址
    03 功能码 读输出寄存器 03
    00 00 起始寄存器(数据)
    00 02 寄存器长度(数据)
    C4 0B CRC校验
  • 收到:01 03 04 01 46 01 3B 5A 59
    01 站地址
    03 读输出寄存器
    04 字节计数(返回了多少个字节)
    01 46 01 3B 具体4个字节 湿度:01 46 温度:01 3B ->31.5转十进制
    5A 59 CRC校验

说明书怎么写
温度的地址 40001
湿度的地址 40002
会给绝对地址,通信报文里面的就是相对地址,相对地址是从0开始的
0对应40001
但是上面例子中并没有写4,而是0001,因为功能码已经指定了寄存器不需要再重复写