Modbus:报文介绍
2021-11-11 09:43:05 1 举报
AI智能生成
工业控制规约modbus协议基础概念
作者其他创作
大纲/内容
参考资料
官方资料
Modbus官网
Modbus协议
Modbus技术资源
Jamod - Java Modbus implementation
ModbusPal
Modbus4J
JLibModbus
Modbus协议手册
Modbus Application Protocol specification V1.1b3
Modbus Protocol Reference Guide
Modbus用户手册
Modbus 通信使用手册
Java实现ModbusTCP通信
MODBUS通讯协议完整介绍
【工控协议专题01】Modbus协议原理与安全性分析
一文看懂Modbus协议
Modbus通讯协议原来是这么回事!看完秒懂了
图文详解Modbus-RTU协议
WinCC通过MODBUS TCP通信读取PAC3200仪表的电能值
WinCC V7.2 Modbus TCP 通讯
WinCC V7.5 SP2:组态和通信
概念术语
字节单位
位(bit)
0、1
字节(byte)
一个字节是8位
bit7, bit6, ..., bit0
字(word)
一个字是2个字节
双字(dword)
一个双字是4个字节
寄存器
一个寄存器2个字节
字节序
1234
ABCD
ABCD
Big-endian
大端
Swap Mode
N/A
地址低位存储值的高位
地址高位存储值的低位
地址高位存储值的低位
场景
主机字节序:PowerPC 、SPARC和Motorola处理器是Big-Endian
JAVA字节序:BIG-ENDIAN
网络字节序:BIG-ENDIAN
网络字节顺序是TCP/IP协议栈中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,
从而可以保证数据在不同主机之间传输时能够被正确解释。
从而可以保证数据在不同主机之间传输时能够被正确解释。
4321
DCBA
DCBA
Little-endian
小端
Swap Mode
byte and word swap
地址低位存储值的低位
地址高位存储值的高位
地址高位存储值的高位
场景
主机字节序:IA架构(Intel、AMD)的CPU中是Little-Endian
2143
BADC
BADC
Big-endian byte swap
大端字节互换
Swap Mode
byte swap
3412
CDAB
CDAB
Little-endian byte swap
小端字节互换
Swap Mode
word swap
控制数据四种型式(参考PLC)
DI
DigitalInput(数字输入,离散输入)
一个地址一个数据位,用户只能读取它的状态,不能修改。以一个 bit表示 On/Off,用来记录控制信号的状态输入
例如:开关,接触点,马达运转,超限switch…等等
于PLC上被称为Input relay、input coil等。
DO
DigitalOutput(数字输出,线圈输出)
一个地址一个数据位,用户可以置位、复位,可以回读状态。以一个 bit表示 On/Off,用来输出控制信号
例如:激活或停止马达,警铃,灯光…等等
于PLC上被称为Output relay、Output coil等。
AI
AnalogInput(模拟输入,输入寄存器)
一个地址16位数据,用户只能读,不能修改,以16 bits integer表示一个数值,用来记录控制信号的数值输入
例如:温度、流量、料量、速度、转速、文件板开度、液位、重量…等等
于PLC上被称为Input register
AO
AnalogOutput(模拟输出,保持寄存器)
一个地址16位数据,用户可以写,也可以回读,以16 bits integer表示一个数值,用来输出控制信号的数值
例如:温度、流量、速度、转速、文件板开度、饲料量…等等设定值
于PLC上被称为Output register、Holding register
寄存器地址
Modbus协议中寄存器地址从1开始,而实际存储中地址从0开始。
假如要读取寄存器编号为40005(4为块编号,5为modbus中寄存器地址)的寄存器的数据,则应把0x0004放入报文的地址域。
寄存器定义,又名码表或者信息点表,应由厂家提供的。
假如要读取寄存器编号为40005(4为块编号,5为modbus中寄存器地址)的寄存器的数据,则应把0x0004放入报文的地址域。
寄存器定义,又名码表或者信息点表,应由厂家提供的。
常用地址表示方法
0x,DO,输出(线圈)位寄存器
01功能码-读
05功能码-单写
15功能码-单写
开关量。该区域地址空间可读可写
1x,DI,输入(触点)位寄存器
02功能码-读
开关量。该区域地址空间只读
3x,输入寄存器
04功能码-读
模拟量。该区域地址空间只读
操作 WORD
3x-bit,输入寄存器-字位
操作 Bit
3x-D,输入寄存器-双字
操作 DWORD
4x,保持寄存器
03功能码-读
06功能码-单写
16功能码-多写
模拟量。该区域地址空间可读可写
例如:
400001,400002,400003.....等
4x-bit,保持寄存器-字位
例如
400006.00,400006.01,400006.02...等
(4x-bit)600.00,或(4x-bit)600 【威纶通MT8000】
4x-D,保持寄存器-双字
二进制存储
原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1] = [0000 0001]原
[-1] = [1000 0001]原
[-1] = [1000 0001]原
反码
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [0000 0001]原 = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反
[-1] = [1000 0001]原 = [1111 1110]反
补码
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
计算机用补码存储数据,以及进行计算
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
浮点数值类型
Float
1bit(符号位)
8bits(指数位)
指数范围:-127~+128
数值范围:
-2^128 ~ +2^128
-3.40E+38 ~ +3.40E+38
23bits(尾数位)
精度是由尾数的位数来决定的
2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
Double
1bit(符号位)
11bits(指数位)
指数范围:-1023~+1024
数值范围:
-2^1024 ~ +2^1024
-1.79E+308 ~ +1.79E+308
52bits(尾数位)
精度是由尾数的位数来决定的
2^52 = 4503599627370496,一共16位,同理,绝对能保证的为15位,double的精度为15~16位
Modbus 通用数据帧格式
图例
协议数据单元(PDU)
Protocol Data Unit
Protocol Data Unit
功能码
1字节
数据域
可变长度
应用数据单元(ADU)
Application Data Unit
Application Data Unit
地址域
1字节
PDU(帧结构)
差错校验
2字节
传输方式
RTU模式
串口传输
采用16 位CRC校验
图例
ASCII模式
串口传输
采用LRC校验
纵向冗余校验(Longitudinal Redundancy Check ,LRC)
消息帧以英文冒号(":",ASCII "3A" Hex)开始,以回车和换号(CRLF,ASCII "0D" and "0A" Hex)符号结束,
允许的传输的字符集为十六进制的0~9和A~F
允许的传输的字符集为十六进制的0~9和A~F
图例
TCP/IP模式
以太网传输
不使用校验
常用TCP端口: 502
图例
MBAP(报文头)
图例
【1】传输标志可理解为序列号,防止 MODBUS TCP通信错位,例如后发生的响应先到了主机,而早发生的响应后到主机
【2】单元标志可理解为从机地址,此时已经不再重要
【2】单元标志可理解为从机地址,此时已经不再重要
功能代码
图例
异常码、错误代码
0x01 读线圈状态
图例
主机发送
[设备地址] [功能码01] [起始线圈地址高8位] [低8位] [读取的线圈数量高8位] [低8位] [CRC低8位] [CRC高8位]
[11][01][00][13][00][37][CRC低][CRC高]
主机询问,起始地址为0x0013,线圈数量是0x0037个
从机回复
[11][01][05][CD][6B][B2][0E][1B] [CRC高] [CRC低]
字节数是0x05,数据域为[CD][6B][B2][0E][1B]
由于每一个字节数据是一个8位的数,所以每一个字节数据表示8个开关量的值,每一位为0表示对应的开关断开,为1表示闭合。
如果询问的开关量不是8的整倍数,那么最后一个字节的高位部分无意义,置为0。
查询37bit数据,
4byte+(3个0+5bit)
bit0 - bit24
[CD]
1100,1101
bit7, ..., bit0
[6B]
0110,1011
bit15, ..., bit8
[B2]
[0E]
[1B]
0001,1011
0, 0, 0, bit36, bit35, bit34, bit33, bit32
0x02 读离散量输入状态
0x03 读保持寄存器
图例
主机发送:01 03 00 32 00 02 xx xx
从机回复:01 03 04 01 02 03 04 xx xx
从机回复:01 03 04 01 02 03 04 xx xx
主机所发送的命令表示,想要读取1号从机从0x32开始的2个寄存器的内容,
而从机回复0x32和0x33寄存器内的数据,总共4个字节。
最后两个字节是校验码。
而从机回复0x32和0x33寄存器内的数据,总共4个字节。
最后两个字节是校验码。
0x04 读输入寄存器
0x05 写单个线圈状态
主机发送:11 05 00 AC FF 00 xx xx
从机回复:11 05 00 AC FF 00 xx xx
从机回复:11 05 00 AC FF 00 xx xx
FF00H值请求线圈处于ON状态,
0000H值请求线圈处于OFF状态
0000H值请求线圈处于OFF状态
0x06 写单个保持寄存器
主机发送:01 06 00 32 12 32 xx xx
从机回复:01 06 00 32 12 32 xx xx
从机回复:01 06 00 32 12 32 xx xx
该功能码,从机所回复的数据和主机下发的数据是一致的。
该条指令的含义为:主机想给1号从机的0x32寄存器中写入0x1232数据,
最后所跟的是校验码。
该条指令的含义为:主机想给1号从机的0x32寄存器中写入0x1232数据,
最后所跟的是校验码。
0x0F 写多个线圈状态
0x10 写多个保持寄存器
图例
0x10功能码也是写寄存器,但是与0x06所不同的是该功能码可以连续写多个寄存器
主机下发的数据结构为:地址、功能码、寄存器起始地址、寄存器个数、要写入数据的字节数、数据、校验码等。
从机回复的数据格式为:地址、功能码、寄存器起始地址、寄存器个数、校验码等
从机回复的数据格式为:地址、功能码、寄存器起始地址、寄存器个数、校验码等
所表示的含义是,从0x0034开始连续写入四个字节的数据到2个寄存器中,
最后两个字节是校验码。
最后两个字节是校验码。
异常响应报文
异常报文格式
地址(1字节)、功能码+0x80(1字节)、异常码(1字节)、校验码(2字节)
异常响应报文由从站地址、功能码以及异常码构成。
其中,功能码与正常响应报文不同,在异常响应报文中,功能码最高位(即MSB)被设置为1。
因为Modbus协议中功能码占用一个字节,故用表达式描述为:异常功能码=正常功能码+0x80。
其中,功能码与正常响应报文不同,在异常响应报文中,功能码最高位(即MSB)被设置为1。
因为Modbus协议中功能码占用一个字节,故用表达式描述为:异常功能码=正常功能码+0x80。
主机发送 :01 10 01 8E 00 01 02 00 00 69 BE(向寄存器0x018E写入一个数值为0的数据)
从机正确回复:01 10 01 8E 00 01 60 1E (向寄存器地址0x018E写操作一个寄存器)
从机错误回复:01 90 01 8D C0(写操作非法功能,可能是向输入寄存器写数据)
从机正确回复:01 10 01 8E 00 01 60 1E (向寄存器地址0x018E写操作一个寄存器)
从机错误回复:01 90 01 8D C0(写操作非法功能,可能是向输入寄存器写数据)
0 条评论
下一页