Modbus概要
https://www.bilibili.com/video/BV1LK4y1D776?zw
Modbus为PLC而生,是一个总线协议。
Modbus有以下几种协议(不全):Modbus RTU/Modbus Ascii/Modbus Tcp / ModbusRTUOverTcp
特性:
- 开源免费
- 在多种电气接口(RS232、RS485)以及通信介质(串口、以太网、蓝牙、4G)中使用
- 报文帧简单紧凑
对于PLC而言,其存储区的数据类型可以分为 布尔量和寄存器,根据读写性又分为只读和读写。
于是可以分为以下四个区:
- 读写布尔量:输出线圈 0区 40001-49999
- 只读布尔量: 输入线圈 1区 10001-19999
- 只读寄存器: 输入寄存器 3区 30001-39999
- 读写寄存器: 输出寄存器 4区 40001-49999
功能码,则是对这些布尔量或寄存器进行读写操作的一个编号。比如 读取输出线圈是0x01
RTU和ASCII的区别:
- RTU发10会发0x0A,ASCII码会发0x31 0x30;
- RTU是CRC循环冗余校验,ASCII是LCR纵向冗余校验
- RTU是Modbus标准里的必备项
测试软件
ModbusPoll
ModbusSlave
VSPD——虚拟串口
串行链路报文格式
串行链路上的报文格式为:
从站地址:设备编号,Modbus一主多从
举例1 功能码 03 读取输出寄存器
发送报文:
接收报文:
注意到,读2个寄存器,返回的是4个字节,这是因为每个寄存器里的存储内容是2个字节的。
类库写法
读取寄存器分为五个步骤:
- 拼接报文
按照自己的需求拼接出问询报文,即从站地址+功能码+数据区+校验位
- 发送问询报文
- 接收回复报文
可以加个延时
- 验证报文
- 解析报文
TCP报文格式
38分钟开始为有效内容
https://www.bilibili.com/video/BV1R5411M7ys?zw
TCP本身就有校验,因此RTU原有的CRC校验位就不需要了。去除了设备地址,因为有ip地址这个概念了。
此外,TCP相比于DTU会多一个MBAP报文头。单元标识符默认固定为01。
- 读指令0x04对比
- 写指令0x10对比