Modbus通信协议由Modicon公司(后来被施耐德电气Schneider Electric收购)于1979年制定,最初是用于可编程逻辑控制器(PLC)。目前,Modbus已经成为工业领域通信协议的业界标准,是目前工业领域应用最广泛的协议。
Modbus通讯协议支持单个主机,多个从机。根据官方规范,Modbus地址范围从1到247,地址0用于广播地址。
Modbus协议是一种请求/应答方式的交互过程,主机主动发起通讯请求,从机响应主机的请求,从机在没有收到主机的请求时,不会主动发送数据,从机之间不会进行通讯。
Modbus在7层OSI参考模型中属于第七层应用层,数据链路层有两种:基于标准串口协议和TCP协议,物理层可使用Uart、RS232、RS485、RS422,或光纤、网线、无线等多种传输介质。
Modbus数据格式
地址码 | 功能码 | 数据长度 | 数据 | CRC低字节 | CRC高字节 |
1 byte | 1 byte | n | n bytes | 1 byte | 1 byte |
Modbus常用功能码(十进制)
功能码可以分为位操作和字操作两类。
位操作指令包括:01读线圈状态、02读(开关)输入状态、05写单个线圈和15写多个线圈。
字操作(2个字节)指令包括:03读保持寄存器、04读输入寄存器、06写单个保持寄存器和16写多个保护寄存器。
Modbus协议详解
01功能码:读线圈状态
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 01 | |
起始线圈地址 | 高字节 | 00 |
低字节 | 00 | |
线圈数量 | 高字节 | 00 |
低字节 | 01 | |
CRC校验 | 低字节 | FD |
高字节 | CA |
从机返回:
从机返回 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 01 | |
字节数 | 01 | |
线圈状态 | 01 | |
CRC校验码 | 低字节 | 90 |
高字节 | 48 |
02功能码:读离散输入状态
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 02 | |
起始离散量地址 | 高字节 | 00 |
低字节 | 00 | |
读取数量 | 高字节 | 00 |
低字节 | 04 | |
CRC校验 | 低字节 | FD |
高字节 | CA |
从机返回:
从机返回 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 02 | |
字节数 | 01 | |
离散输入状态 | 0F | |
CRC校验码 | 低字节 | E1 |
高字节 | 8C |
03功能码:读保持寄存器
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 03 | |
起始寄存器地址 | 高字节 | 00 |
低字节 | 05 | |
寄存器数量 | 高字节 | 00 |
低字节 | 02 | |
CRC校验 | 低字节 | D4 |
高字节 | 0A |
从机返回:
从机返回 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 03 | |
字节数 | 04 | |
寄存器数据 | 低字节 | 11 |
高字节 | 22 | |
寄存器数据 | 低字节 | 33 |
高字节 | 44 | |
CRC校验码 | 低字节 | 4B |
高字节 | C6 |
04功能码:读输入寄存器
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 04 | |
起始寄存器地址 | 高字节 | 00 |
低字节 | 02 | |
寄存器数量 | 高字节 | 00 |
低字节 | 01 | |
CRC校验 | 低字节 | 90 |
高字节 | 0A |
从机返回:
从机返回 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 04 | |
字节数 | 02 | |
寄存器数据 | 低字节 | 44 |
高字节 | 33 | |
CRC校验码 | 低字节 | AD |
高字节 | F3 |
05功能码:写单个线圈
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 05 | |
线圈地址 | 高字节 | 00 |
低字节 | 00 | |
控制方式 | 高字节 | 00(断开)、FF(闭合) |
低字节 | 01 | |
CRC校验 | 低字节 | XX |
高字节 | XX |
从机返回:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 05 | |
线圈地址 | 高字节 | 00 |
低字节 | 00 | |
控制方式 | 高字节 | 00(断开)、FF(闭合) |
低字节 | 01 | |
CRC校验 | 低字节 | XX |
高字节 | XX |
06功能码:写单个保持寄存器
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 06 | |
寄存器地址 | 高字节 | 00 |
低字节 | 50 | |
写入值 | 高字节 | 99 |
低字节 | 88 | |
CRC校验 | 低字节 | E3 |
高字节 | ED |
从机返回:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 06 | |
寄存器地址 | 高字节 | 00 |
低字节 | 50 | |
写入值 | 高字节 | 99 |
低字节 | 88 | |
CRC校验 | 低字节 | E3 |
高字节 | ED |
15功能码:写多个线圈
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 0F | |
起始线圈地址 | 高字节 | 00 |
低字节 | 00 | |
线圈数量 | 高字节 | 00 |
低字节 | 04 | |
写入字节数 | 01 | |
控制方式 | 00(全部断开)、0F(全部闭合) | |
CRC校验 | 低字节 | XX |
高字节 | XX |
从机返回:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 0F | |
寄存器地址 | 高字节 | 00 |
低字节 | 00 | |
写入值 | 高字节 | 00 |
低字节 | 04 | |
CRC校验 | 低字节 | 54 |
高字节 | 08 |
16功能码:写多个保持寄存器
主机发送:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 10 | |
起始寄存器地址 | 高字节 | 00 |
低字节 | 20 | |
寄存器数量 | 高字节 | 00 |
低字节 | 02 | |
写入字节数 | 04 | |
寄存器待写入值 | 低字节 | 00 |
高字节 | 05 | |
寄存器待写入值 | 低字节 | 22 |
高字节 | 33 | |
CRC校验 | 低字节 | B9 |
高字节 | 03 |
从机返回:
主机发送 | 发送数据(HEX) | |
地址码 | 01 | |
功能码 | 10 | |
起始寄存器地址 | 高字节 | 00 |
低字节 | 20 | |
寄存器数量 | 高字节 | 00 |
低字节 | 02 | |
CRC校验 | 低字节 | 40 |
高字节 | 02 |
如果需要给传感器增加无线传输功能,可以通过增加无线物联网控制器实现。
● 内置电池或外接5V电源供电
● 无线传输方式支持4G、NB、WIFI、LORA等
● 支持所有传感器接口
【单片机-传感器】项目定制开发 |