Modbus:报文介绍
2021-11-11 09:43:05 2 举报
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协议原理与安全性分析<br>
一文看懂Modbus协议
Modbus通讯协议原来是这么回事!看完秒懂了 <br>
图文详解Modbus-RTU协议<br>
WinCC通过MODBUS TCP通信读取PAC3200仪表的电能值<br>
WinCC V7.2 Modbus TCP 通讯<br>
WinCC V7.5 SP2:组态和通信<br>
概念术语
字节单位
位(bit)
0、1
字节(byte)
一个字节是8位
bit7, bit6, ..., bit0
字(word)
一个字是2个字节
双字(dword)
一个双字是4个字节
寄存器
一个寄存器2个字节
字节序
1234<br>ABCD
Big-endian
大端
Swap Mode
N/A
地址低位存储值的高位 <br>地址高位存储值的低位
场景
主机字节序:PowerPC 、SPARC和Motorola处理器是Big-Endian
JAVA字节序:BIG-ENDIAN
网络字节序:BIG-ENDIAN
网络字节顺序是TCP/IP协议栈中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,<br>从而可以保证数据在不同主机之间传输时能够被正确解释。<br>
4321<br>DCBA
Little-endian
小端
Swap Mode
byte and word swap
地址低位存储值的低位 <br>地址高位存储值的高位
场景
主机字节序:IA架构(Intel、AMD)的CPU中是Little-Endian
2143<br>BADC
Big-endian byte swap
大端字节互换
Swap Mode
byte swap
3412<br>CDAB
Little-endian byte swap
小端字节互换
Swap Mode
word swap
控制数据四种型式(参考PLC)
DI
DigitalInput(数字输入,离散输入)
一个地址一个数据位,用户只能读取它的状态,不能修改。以一个 bit表示 On/Off,用来记录控制信号的状态输入<br>
例如:开关,接触点,马达运转,超限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开始。<br>假如要读取寄存器编号为40005(4为块编号,5为modbus中寄存器地址)的寄存器的数据,则应把0x0004放入报文的地址域。<br>寄存器定义,又名码表或者信息点表,应由厂家提供的。<br>
常用地址表示方法
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]原<br>[-1] = [1000 0001]原<br>
反码
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [0000 0001]原 = [0000 0001]反<br>[-1] = [1000 0001]原 = [1111 1110]反
补码
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
计算机用补码存储数据,以及进行计算
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补<br>[-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)<br>Protocol Data Unit<br>
功能码
1字节
数据域
可变长度
应用数据单元(ADU)<br>Application Data Unit<br>
地址域
1字节
PDU(帧结构)
差错校验
2字节
传输方式
RTU模式
串口传输
采用16 位CRC校验
图例
ASCII模式
串口传输
采用LRC校验<br>
纵向冗余校验(Longitudinal Redundancy Check ,LRC)
消息帧以英文冒号(":",ASCII "3A" Hex)开始,以回车和换号(CRLF,ASCII "0D" and "0A" Hex)符号结束,<br>允许的传输的字符集为十六进制的0~9和A~F<br>
图例
TCP/IP模式
以太网传输
不使用校验
常用TCP端口: 502
图例
MBAP(报文头)
图例
【1】传输标志可理解为序列号,防止 MODBUS TCP通信错位,例如后发生的响应先到了主机,而早发生的响应后到主机<br>【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<br>从机回复:01 03 04 01 02 03 04 xx xx<br>
主机所发送的命令表示,想要读取1号从机从0x32开始的2个寄存器的内容,<br>而从机回复0x32和0x33寄存器内的数据,总共4个字节。<br>最后两个字节是校验码。<br>
0x04 读输入寄存器
0x05 写单个线圈状态
主机发送:11 05 00 AC FF 00 xx xx<br>从机回复:11 05 00 AC FF 00 xx xx<br>
FF00H值请求线圈处于ON状态,<br>0000H值请求线圈处于OFF状态<br>
0x06 写单个保持寄存器
主机发送:01 06 00 32 12 32 xx xx<br>从机回复:01 06 00 32 12 32 xx xx<br>
该功能码,从机所回复的数据和主机下发的数据是一致的。<br>该条指令的含义为:主机想给1号从机的0x32寄存器中写入0x1232数据,<br>最后所跟的是校验码。<br>
0x0F 写多个线圈状态
0x10 写多个保持寄存器
图例
0x10功能码也是写寄存器,但是与0x06所不同的是该功能码可以连续写多个寄存器
主机下发的数据结构为:地址、功能码、寄存器起始地址、寄存器个数、要写入数据的字节数、数据、校验码等。<br>从机回复的数据格式为:地址、功能码、寄存器起始地址、寄存器个数、校验码等<br>
所表示的含义是,从0x0034开始连续写入四个字节的数据到2个寄存器中,<br>最后两个字节是校验码。<br>
异常响应报文
异常报文格式
地址(1字节)、功能码+0x80(1字节)、异常码(1字节)、校验码(2字节)
异常响应报文由从站地址、功能码以及异常码构成。<br>其中,功能码与正常响应报文不同,在异常响应报文中,功能码最高位(即MSB)被设置为1。<br>因为Modbus协议中功能码占用一个字节,故用表达式描述为:异常功能码=正常功能码+0x80。<br>
主机发送 :01 10 01 8E 00 01 02 00 00 69 BE(向寄存器0x018E写入一个数值为0的数据)<br>从机正确回复:01 10 01 8E 00 01 60 1E (向寄存器地址0x018E写操作一个寄存器)<br>从机错误回复:01 90 01 8D C0(写操作非法功能,可能是向输入寄存器写数据)
0 条评论
下一页