目录

网编高级-day02

网编高级 day02

3. Modbus RTU

3.1. Modbus RTU和Modbus TCP的区别

  1. 报文头:Modbus RTU只有从机id一位,Modbus TCP有7位
  2. CRC校验:Modbus RTU应用于串口通信,需要校验码;Modbus TCP应用于网络通信,网络协议中自带校验
  3. 通信:Modbus TCP通过socket网络通信,需要创建套接字;Modbus RTU需要写入串口信息

3.2. Modbus RTU 特点

  1. 主从问答通信
  2. 串口参数:波特率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. 编程流程

  1. 创建实例——modbus_new_tcp
  2. 设置从机id——modbus_set_slave
  3. 连接从机——modbus_connect
  4. 寄存器操作——功能码对应函数
  5. 关闭套接字——modbus_close
  6. 释放示例——modbus_free