网编高级 day02
- 3. Modbus RTU
- 3.1. Modbus RTU和Modbus TCP的区别
- 3.2. Modbus RTU 特点
- 3.3. Modbus RTU协议格式
- 4. Modbus 库
- 4.1. 函数接口
- 4.2. 编程流程
3. Modbus RTU
3.1. Modbus RTU和Modbus TCP的区别
- 报文头:Modbus RTU只有从机id一位,Modbus TCP有7位
- CRC校验:Modbus RTU应用于串口通信,需要校验码;Modbus TCP应用于网络通信,网络协议中自带校验
- 通信:Modbus TCP通过socket网络通信,需要创建套接字;Modbus RTU需要写入串口信息
3.2. Modbus RTU 特点
- 主从问答通信
- 串口参数:波特率9600;数据位8;停止位1;无流控
3.3. Modbus RTU协议格式
地址码+功能码+数据+校验码
地址码: 1字节,从机ID,1~247
功能码: 1字节,同Modbus TCP
数据: 起始地址,数量,数据……同Modbus TCP
校验码: 2字节,校验范围:对前面三部分,可以通过函数生成
4. Modbus 库
4.1. 函数接口
modbus_tcp函数接口
modbus_t* modbus_new_tcp(const char *ip, int port)
功能:以TCP方式创建Modbus实例,并初始化
参数:
ip :ip地址
port:端口号
返回值:成功:Modbus实例,失败:NULL
int modbus_set_slave(modbus_t *ctx, int slave)
功能:设置从机ID
参数:
catx :Modbus实例
slave:从机ID
返回值:成功:0,失败:-1
int modbus_connect(modbus_t *ctx)
功能:和从机(slave)建立连接
参数:
ctx:Modbus实例
返回值:成功:0,失败:-1
void modbus_free(modbus_t *ctx)
功能:释放Modbus实例
参数:ctx:Modbus实例
void modbus_close(modbus_t *ctx)
功能:关闭套接字
参数:ctx:Modbus实例
寄存器操作
int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest)
int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest)
int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)
int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)
功能:0x01 0x02 0x03 0x04
参数:
ctx:modbus句柄
addr:起始地址
nb:寄存器个数
dest:读到的寄存器的值
int modbus_write_bit(modbus_t *ctx, int addr, int status);
int modbus_write_register(modbus_t *ctx, int addr, int value);
功能:0x04 0x05
参数:
status:线圈状态
value:写入的数据
int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *src);
int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src);
功能:0x0f 0x10
参数:
src:多个寄存器的值
4.2. 编程流程
- 创建实例——modbus_new_tcp
- 设置从机id——modbus_set_slave
- 连接从机——modbus_connect
- 寄存器操作——功能码对应函数
- 关闭套接字——modbus_close
- 释放示例——modbus_free