文章目录
概念
modbus是工业通信总线协议,常用于PLC设备中,像水表、电表等。
优势是免费、简单。
采用主从问答通信(用于信息采集和控制)
分类
modbus RTU:运行在串口上 二进制传输 效率高
modbus ASCII:运行在串口上 ascii传输 用于通信数据量较小的情况下
modbus TCP:运行在以太网上 是应用层协议 基于传输层的TCP协议实现 端口号502
协议格式
报文头7字节(4字节序列号+2字节长度+1字节单元标识符) + 功能码(1字节) + 数据

寄存器
一、位寄存器(1字节) 开关量
输出线圈
离散量输入寄存器
二、字寄存器(2字节) 存储数据
保持/输出寄存器
输入寄存器
读写
功能码
0x01:读输出线圈
0x02:读离散量输入寄存器
0x03:读保持寄存器
0x04:读输入寄存器
0x05:写单个线圈
0x06:写单个保持寄存器
0x0F:写多个线圈
0x10:写多个保持寄存器
读写模板 :
读:
主机->从机:报文头7byte+功能码1字节+起始地址2byte+数量2byte
从机->主机:报文头7byte+功能码1字节+字节计数1byte+数据
写单个:
主机->从机:报文头7byte+功能码1字节+起始地址2byte+断通标志/数据2byte
写多个:
主机->从机:报文头7byte+功能码1字节+起始地址2byte+数量2byte+字节计数1byte+数据
注意:"断通标志"字段是2字节,但协议规定:这个字段只能天0x0000(对应"关")或0xFF00(对应"开"),实际有效信息只有1位(其他位是协议要求的固定填充)
案例:


Modbus库
应用modbus时,通常会安装modbus库,调用封装好的modbus接口
读输出线圈:modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
读离散量输入寄存器:modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
读保持寄存器:modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
读输入寄存器:modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
写单个线圈:modbus_write_bit(modbus_t *ctx, int addr, int status);
写单个保持寄存器:modbus_write_register(modbus_t *ctx, int addr, int value);
写多个线圈:modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *val);
写多个保持寄存器:modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16 *val);
代码举例:

