Modbus协议:
Modbus协议是应用于电子控制器上的一种通用语言,通过此协议,可以实现控制器互相之间或通过网络(总线式的)实现通信。这是工控行业应用最广泛的通讯协议,没有之一。
Modbus协议的特点:
1.协议标准开放、公开发表且无版权要求。
2.支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等。
3.消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络。
Modbus协议的分支:
ModbusRTU \ ModbusASCII ModbusTCP \ ModbusUDP
特性 | RTU模式 | ASCII模式 |
编码 | 二进制 | ASCII(打印字符:0-9,a-z,A-Z) |
每个字符位数 | 起始位:1bit | 起始位:1bit |
数据位:8bits | 数据位:7bits | |
奇偶校验(可选):1位 | 奇偶校验(可选):1位 | |
停止位:1或2位 | 停止位:1或2位 | |
报文校验 | CRC(循环冗余校验) | LRC(纵向冗余校验) |
RTU报文简单,传输快,应用广泛,ASCII唯一的好处是数据容易读懂;
ModbusTCP 和ModbusUDP的区别就是TCP和UDP的区别;
一般用RTU走串口,TCP走网口。
Modbus协议在串行链路上的报文格式:
(任意一帧报文都遵循的原则)
小于3.5个字符的报文间隔时间 | 地址 | 功能码 | 数据 | CRC校验 | 小于3.5个字符的报文时间间隔 |
1*byte | 1*byte | N*bytes | 2*bytes |
没有结束符,靠时间判断。
ModbusRTU报文格式:从站地址+功能码+数据位+校验位。
Modbus协议的四个存储区:
1、输出线圈——Q区 布尔类型 可读可写 0区 00001
2、输入线圈——I区 布尔类型 只读不可写 1区 10001
3、输入寄存器——PIW区 寄存器类型 只读不可写 3区 30001
4、输出寄存器——PQW区 寄存器类型 可读可写 4区 40001
Modbus协议的功能码:
功能码:不同的功能码代表做不同的事情;
● 读取输出线圈 0×01
● 读取输入线圈 0×02
● 读取输入寄存器 0×03
● 读取输出寄存器 0×04
● 写单个线圈 0×05
● 写多个线圈 0×0F
● 写单个寄存器 0×06
● 写多个寄存器 0×10
Modbus协议的机制
一发一回,主从机制;
示例:
主站想读从站输出线圈 功能码:0×01
读哪个从站 从站地址:0×11
读哪个位置开始读,读多少 开始地址,读取长度
主站发送——Tx:11 01 13 00 1B XXXX
从站返回——Rx:11 01 04 CD 6B B2 05 XXXX
从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 线圈数量(高位) | 线圈数量(低位) | CRC |
0×11 | 0×01 | 0×00 | 0×13 | 0×00 | 0×1B | ×××× |
含义:读取11H(17)号从站输出线圈,起始地址=0013H=19,19是索引号,对应地址00020;线圈数=001BH=27;结束地址=00020+27-1=00046。
即读11H(17)号从站输出线圈00020---00046,共27个线圈状态(因为传输的最小单位是字节,27个线圈需要4个字节)。
从站地址 | 功能码 | 字节计数 | 线圈状态20-27 | 线圈状态28-35 | 线圈状态36-43 | 线圈状态44-46 | CRC |
0×11 | 0×01 | 0×04 | 0×CD | 0×6B | 0×B2 | 0×05 | ×××× |
含义:返回11H(17)号从站输出线圈00020---00046,共27个线圈状态,分别是CD 6B B2 05;
CD=1100 1101 对应 00020-00027 6B=0110 1011 对应 00028-00035
B2=1011 0010 对应 00036-00043 05=0000 0101 对应 00044-00046