1、简介
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式,由于其开放性,现大量用于智能仪表。
2、协议版本
Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。
基于串口通信,存在两个变种,即RTU和ASCII两种通信模式。
3、通信和设备
Modbus协议是一个master/slave架构的协议,但只可以有一个主设备,1-247个从设备,每个从设备有唯一的设备地址。
4、报文格式
RTU 模式:
起始位(T3-T5) + 设备地址(8bit) + 功能码(8bit) + 数据 + CRC校验 + 结束符
ASCII 模式:
起始位(':') + 设备地址(8bit) + 功能码(8bit) + 数据 + LRC校验 + 结束符
(1)起始位:ASCII模式下起始符是一个冒号 “:” ,RTU模式下是一段时间间隔
(2)设备地址:即从设备地址1-247
(3)功能码:03表示读取,06表示写入(单寄存器)
(4)数据:发送时(寄存器首地址 + 寄存器读取数量);接收时(字节数 + 实际数据)
(5)校验:略
(6)结束符:略
5、常用功能码
01 :读取线圈状态
02 :读取输入状态
03 :读取保持寄存器
04 :读取输入寄存器
05 :强置单线圈
06 :预置单寄存器
07 :读取异常状态
16 :预置多寄存器
6、通讯参数
波特率:一秒钟传送的位数,也就是通讯速率,常用有9600、19200、115200;
校验方式:奇校验('O')或偶校验('E')或无校验('N'),目的是判断传输过程中是否有错误;
数据位:传输一个字符由几个位组成,计算机的基本单位就是“位”,其值非“0”即“1”,又如传送A,定义通讯格式时,是定义的八位,其传送的数据可能就是:00001010;
停止位:传输一个字符有几个停止位,用天判断某个字符是否传输结束,以便开始接收下一个字符。
7、建立modbus通讯相关函数
//创建通讯对象
modbus_t* modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit);
//设置从机地址
int modbus_set_slave(modbus_t* ctx, int slave);
//设置超时
int modbus_set_response_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);
//建立连接
int modbus_connect(modbus_t *ctx);
//读取寄存器值
int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
//写入寄存器值
int modbus_write_register(modbus_t *ctx, int reg_addr, int value);
8、示例