Modbus 规约报文全解析:结构、实例与异常处理_第1页
Modbus 规约报文全解析:结构、实例与异常处理_第2页
Modbus 规约报文全解析:结构、实例与异常处理_第3页
Modbus 规约报文全解析:结构、实例与异常处理_第4页
Modbus 规约报文全解析:结构、实例与异常处理_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Modbus规约报文全解析:结构、实例与异常处理Modbus是工业领域最常用的串行通信规约之一,通过标准化的报文格式实现主从设备间的数据交互(如PLC与传感器、SCADA系统与控制器)。其报文核心由“地址域-功能码域-数据域-校验域”四部分组成,根据传输模式(RTU/ASCII)的不同,在编码方式、校验规则上存在差异。以下从基础结构、分模式解析、典型场景实例、异常处理四个维度展开详解。一、Modbus报文核心结构(通用框架)无论RTU还是ASCII模式,Modbus报文均遵循“主从问答”逻辑(主设备发送请求报文,从设备返回响应报文),核心结构一致,仅在数据编码与校验方式上有区别,通用框架如下:字段名称字节长度核心作用取值范围/说明从站地址域(SlaveAddress)1字节指定通信的从设备地址(主设备无地址)0-247(0为广播地址,1-247为从站地址,248-255保留)功能码域(FunctionCode)1字节定义操作类型(如读寄存器、写线圈)1-255(1-64为标准功能码,65-255为扩展功能码)数据域(Data)可变长度(1-N字节)携带请求/响应的具体数据(如寄存器地址、数值)随功能码变化,如读寄存器需包含“起始地址+寄存器数量”校验域(Checksum)RTU:2字节;ASCII:2字节(LRC)/4字节(CRC,可选)验证报文完整性,防止传输错误RTU用CRC16校验;ASCII用LRC校验或CRC16校验关键概念区分主从设备:主设备(如PLC、上位机)主动发起请求,同一总线最多1个主设备;从设备(如传感器、变频器)被动响应,最多支持247个从设备。广播地址:从站地址=0时,主设备发送的请求为广播报文(所有从设备接收,但不返回响应),仅适用于“写操作”(如批量复位线圈)。二、分模式解析:RTU模式vsASCII模式Modbus最常用的两种传输模式为RTU(远程终端单元)和ASCII(美国信息交换标准代码),两者在报文编码、校验、传输效率上差异显著,需针对性解析。(一)RTU模式报文解析(二进制编码,高效紧凑)RTU模式是工业现场最常用的模式,采用二进制编码,数据密度高、传输速度快(波特率支持9600-115200bps),校验方式为CRC16循环冗余校验(2字节,低位在前、高位在后)。1.RTU报文结构细节编码方式:每个字节用8位二进制表示,无额外字符填充,直接传输数据(如十进制“10”编码为十六进制“0A”,二进制“00001010”)。CRC16校验计算:基于多项式\(x^{16}+x^{15}+x^2+1\)(十六进制“8005”),计算范围为“从站地址域+功能码域+数据域”,结果高低位互换后作为校验域(示例:数据“010300000002”的CRC16为“C40B”)。帧间隔:报文帧之间需保持≥3.5个字符时间的间隔(如波特率9600bps时,1个字符时间=1.04ms,帧间隔≥3.64ms),用于区分不同报文。2.RTU模式实例:主设备读从设备保持寄存器场景:主设备(如PLC)读取从站地址=1的设备,起始地址=0x0000的2个保持寄存器(功能码=03,保持寄存器是Modbus中用于存储长期数据的寄存器,地址范围0-65535)。请求报文(主→从):字段十六进制值十进制值含义说明从站地址011目标从设备地址为1功能码033操作类型:读保持寄存器数据域-起始地址(高位)000寄存器起始地址高位(0x00)数据域-起始地址(低位)000寄存器起始地址低位(0x00),总起始地址=0x0000数据域-寄存器数量(高位)000读取寄存器数量高位(0x00)数据域-寄存器数量(低位)022读取寄存器数量低位(0x02),总数量=2CRC16校验(低位)C4-CRC16计算结果低位CRC16校验(高位)0B-CRC16计算结果高位完整报文010300000002C40B-主设备发送的请求帧响应报文(从→主):若从设备正常响应,返回“从站地址+功能码+字节数+寄存器数据+CRC校验”,假设两个寄存器值分别为0x1234、0x5678:字段十六进制值含义说明从站地址01响应设备地址(与请求一致)功能码03操作类型(与请求一致,无异常)数据域-字节数04后续数据域的总字节数(2个寄存器×2字节/寄存器=4字节)数据域-寄存器1(高位)12第一个寄存器值高位(0x12)数据域-寄存器1(低位)34第一个寄存器值低位(0x34),总数值=0x1234(十进制4660)数据域-寄存器2(高位)56第二个寄存器值高位(0x56)数据域-寄存器2(低位)78第二个寄存器值低位(0x78),总数值=0x5678(十进制22136)CRC16校验7A88响应报文的CRC16校验值完整报文010304123456787A88从设备返回的响应帧(二)ASCII模式报文解析(文本编码,易调试)ASCII模式采用文本编码(每个字节用2个ASCII字符表示,如十六进制“0A”编码为字符“0”和“A”),可读性强、便于人工调试,但数据密度低(传输相同数据比RTU多1倍字节),校验方式为LRC纵向冗余校验(2字节)或CRC16(可选)。1.ASCII报文结构细节帧头帧尾:每个报文以“起始字符(:,ASCII码0x3A)”开头,以“结束字符(CR+LF,ASCII码0x0D+0x0A)”结尾,便于识别帧边界。编码方式:每个数据字节转换为2个十六进制ASCII字符(0-9、A-F,大写),如十进制“1”编码为字符“0”和“1”(十六进制“3031”)。LRC校验计算:将“从站地址域+功能码域+数据域”的所有字节按二进制加法求和,取反加1(即补码),结果转换为2个ASCII字符作为校验域(示例:数据“010300000002”的LRC为“37”)。2.ASCII模式实例:主设备写单个线圈场景:主设备向从站地址=2的设备,写入线圈地址=0x0005的状态为“置1”(功能码=05,线圈是Modbus中用于控制开关状态的位变量,地址范围0-65535,值为0x0000=置0,0xFF00=置1)。请求报文(主→从):字段ASCII字符十六进制值含义说明起始字符:3A报文起始标识从站地址023032目标从设备地址=2(编码为“0”“2”)功能码053035操作类型:写单个线圈数据域-线圈地址(高位)003030线圈地址高位=0x00数据域-线圈地址(低位)053035线圈地址低位=0x05,总地址=0x0005数据域-线圈状态(高位)FF4646状态高位=0xFF(置1标识)数据域-线圈状态(低位)003030状态低位=0x00,总状态=0xFF00=置1LRC校验373337LRC计算结果(编码为“3”“7”)结束字符CR+LF0D0A报文结束标识完整报文:02050005FF0037\r\n3A30323035303030354646303033370D0A主设备发送的请求帧(\r\n代表CR+LF)响应报文(从→主):从设备正常响应时,返回与请求报文完全一致的内容(除校验域重新计算),表示确认执行写操作:完整响应报文:02050005FF0037\r\n含义说明从设备确认已将线圈0x0005置1三、核心功能码报文解析(典型场景)Modbus功能码定义了主从设备的操作类型,不同功能码对应的数据域格式不同,以下解析工业现场最常用的6个标准功能码报文结构。(一)读离散量输入(功能码02)用途:读取从设备的离散量输入(如传感器检测状态,只读,不可写)。请求报文数据域:2字节起始地址(高位在前)+2字节输入数量(高位在前,最大64个)。响应报文数据域:1字节数据字节数(=ceil(输入数量/8))+N字节输入状态(每字节8个输入,高位在前,bit0对应起始地址)。实例:主设备读从站1的离散量输入,起始地址0x0000,数量8个,请求报文(RTU):0102000000089804。(二)读保持寄存器(功能码03)用途:读取从设备的保持寄存器(如设备运行参数,可读可写)。请求报文数据域:2字节起始地址+2字节寄存器数量(最大125个)。响应报文数据域:1字节数据字节数(=寄存器数量×2)+N字节寄存器值(每个寄存器2字节,高位在前)。实例:前文RTU模式“读2个保持寄存器”即为此功能码。(三)读输入寄存器(功能码04)用途:读取从设备的输入寄存器(如模拟量采集值,只读,不可写)。报文结构:与功能码03完全一致,仅功能码不同(04vs03),用于区分“保持寄存器”与“输入寄存器”的地址空间。实例:主设备读从站3的输入寄存器,起始地址0x0002,数量1个,请求报文(RTU):030400020001600A。(四)写单个线圈(功能码05)用途:控制从设备的单个线圈状态(置0或置1)。请求报文数据域:2字节线圈地址+2字节状态(0x0000=置0,0xFF00=置1)。响应报文:与请求报文完全一致(确认执行)。实例:前文ASCII模式“写线圈置1”即为此功能码。(五)写单个保持寄存器(功能码06)用途:修改从设备的单个保持寄存器值(如设定变频器频率)。请求报文数据域:2字节寄存器地址+2字节写入值(高位在前)。响应报文:与请求报文完全一致(确认写入)。实例:主设备向从站4的寄存器0x0008写入值0x0064(十进制100),请求报文(RTU):040600080064680B。(六)写多个保持寄存器(功能码16)用途:批量修改从设备的多个保持寄存器(如同时设定多个参数)。请求报文数据域:2字节起始地址+2字节寄存器数量+1字节数据字节数(=数量×2)+N字节写入值(每个寄存器2字节)。响应报文数据域:2字节起始地址+2字节寄存器数量(确认写入范围)。实例:主设备向从站5的寄存器0x0001-0x0002,分别写入0x1234、0x5678,请求报文(RTU):05100001000204123456784B3A。四、异常报文解析与故障排查当从设备无法正常执行主设备请求时,会返回“异常响应报文”,核心特征是“功能码最高位=1”(如正常功能码03变为83),数据域包含“异常码”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论