modbus报文解析,modbus功能码详解
modbus报文解析,modbus功能码详解详细介绍
本文目录一览: modbus报文识别中主设备请求报文:06+01+00+16+00+21+1C+61表示的意思?
这是典型的八字节MODBUS RTU协议指令报,八个字节均是十六进制表示,第一字节的06,是设备地址码,如果同一条通讯线路上搭载若干MODBUS设备,每个设备的地址不能相同,一般都能现场设置,第二个字节01为指令码,不同的寄存器读写,指令码都不一样,01是连续读保若干个持线圈(线圈也可理解为继电器,开关,逻辑变量等)的指令码,第三第四字节 00 16 为保持线圈寄存器存储区地址偏移量,也就是说在保持线圈寄存器区的 0016地址(按二进制位编址)处开始读取线圈状态,第五第六字节0021 是连续读取的线圈寄存器个数,最后第七第八字节1C61是CRC16校验码,是对前面六个字节进行CRC16换算的结果,用于数据正确性验证。
modbus功能码详解
modbus功能码详解:Modbus功能码是Modbus消息帧(报文)的重要组成部分,是Modubs协议中通信事务处理的基础,代表消息将要执行的动作。简而言之,Modbus功能码占用一个字节,取值范围是1127,之所以127以上不能使用,是因为Modbus规定出现异常时,功能码+0x80(十进制128)代替异常状态,因此129(1+128)255(127+128)的取值代表异常码。读取从设备的线圈或离散量输出的状态,即各DO的ON/OFF状态。消息帧中指定了需读取的线圈起始地址和线圈数目。需要注意的一点是,在Modbus协议规定的PDU中,规定所有线圈或寄存器地址从0开始计算。
新手遇到问题:关于modbus的报文
发送的报文数据01 03 01 86 00 02 24 1E
第一个字节 01 是前端设备的ID号,在同一485信道上串接多个设备,每个设备的ID号码不能重复,这是一个单字节的ID,0-255,一般0不用,从1开始,设备出厂默认ID一般都是1 ;第二个字节 03 是读连续多个输出寄存器的MODBUS指令码,MODBUS分输入寄存器、输出寄存器、保持寄存器、线圈寄存器等不同寄存器种类,03是一条专用于输出寄存器的指令;第三和第四字节 01 86 是起始地址,从0开始计数寄存器地址,这条指令的起始地址是十六进制的0x0186(指令的所有数码均为十六进制);第五第六两个字节 00 02 是读取的寄存器数量,0x0002,也就是从0x0186开始读取两个寄存器的数值;最后的第七第八两个字节是这条指令的CRC16校验码,根据前面的六个字节计算而得,低字节在前,高字节在后,24 1E CRC16校验码应该是0x1E24 。指令解读完毕,下面再说返回报文数据。
返回报文01 03 08 CD CC CF 43 CD CC D0 43 E2 80,第一个字节01 还是设备ID,表示是从ID为1的设备返回的数据,03表示指令码,表示是03连续读取输出寄存器指令的返回结果,第三个字节08表示返回的数据长度,为8个字节,从第四个开始的八个字节 CD CC CF 43 CD CC D0 43 就是返回的数据,最后两个字节 E2 80 位前面11个字节计算出来的CRC校验码,与前面的一样,不再赘述。
通过分析,这个返回的报文肯定不是前面的指令的返回数据,因为根据前面的指令,读取两个寄存器,每个寄存器两个字节长度,应该返回四个字节数据才对,而返回数据是八个字节。
modbus_RTU协议报文解析我发:01 03 9F 2E 00 04 0A 14收到:01 03 08 00 00 00 01 00 00 00 00 A8 17。
接收完整的数据序列以后再解析。
查看01地址是否正确
核对CRC校验是否正确
再判断功能码是否正确
再核对存储器地址是否在范围内
然后根据数量提取数据
最后应答
MODBUS RTU协议理解
一、MODBUS 工业上常用的一种串口通讯协议,协议包括RTU、TCP、ASCII;其中MODBUS RTU协议最常用;
二、串口参数
设备地址:1~247? (仪表的设备地址)
波特率:50、75、100、150、300、600、1200、2400、4800、9600、115200、19200、38400;
校验位:偶校验、奇校验、无校验;
数据位:8、7、6
停止位:1、1.5、2
三、报文格式
设备地址(两个字节)、功能码(两个字节)、寄存器地址(四个字节)、寄存器数量(四个字节)、CRC校验码(四个字节)
发报文:01 03 00 00 00 01 84 0A
解释:01:仪表的地址;? ? ? 03:功能码;
00:寄存器地址高位;? 00:寄存器地址低位;
00:寄存器数量高位;? 01:寄存器数量低位;
84 0A:校验位
接收报文:01 03 00 02 00 DC 7B F1
解释:01:仪表的地址;? ? ? ? 03:功能码;
00:数据字节长度高位;? 00:数据字节长度低位;
00:寄存器数据高位;? ? DC:寄存器数据低位;
7B F1:校验位
四、功能码定义
发数据时:设备地址(两个字节)、功能码(两个字节)、寄存器地址(四个字节)、寄存器数量(四个字节)、数据的字节长度(两个字节)、数据(四个字节)、CRC校验码(四个字节)
接收数据时:设备地址(两个字节)、功能码(两个字节)、寄存器地址(四个字节)、寄存器数量(四个字节)、CRC校验码(四个字节)
根据功能码的不同,主机和从机都可接收数据和发送数据.
CRC校验码
modbus 报文不知道协议时怎么破译 ,有大神指点下吗
以第一组报文解析为例:
主站询问:03(3号站) 03(读保持型寄存器) 00 00(地址从0000开始) 00 03(连续3个字) 04 29(CRC校验)
从站回答:03 (3号站)03 (读保持型寄存器响应)06(6个字节数据) 5E 59 (第一个字)42 6B(第2个字) 00 00 (第3个字) 4C C2(CRC校验)
其中 5E 59 42 6B 交换高低字后为42 6B 5E 59, 随便找个浮点数转换工具,可得
MODBUS RTU 返回报文异常帮忙分析一下
你的请求报文怎么写的?
正常报文是:01 03 01 01 00 01 aa bb
其中,0101是寄存器地址,0001是读取寄存器的数量, aabb是crc检验码。
返回正常报文是:01 03 02 03 03 cc dd
其中,02是返回字节数,0203是数据,ccdd是校验码。
modbus TCP通讯,返回数据总说总长错误,哪位大神知道该返回什么才对啊?
把端口号换成502试试。
发送报文:图片中的这modbustcp报文里面的从站地址是06,功能码是01,读起始地址为00 00,读数据格式为00 01。
接收报文:前面的报文头都一样的,00 09表示的是后面的modbus数据有9个字节,数据是【06 10 00 00 00 01 02 00 00 】,意思是从站地址06、功能码变成了10H,也就是16,这应答报文是错的。起始地址是 00 00,数据个数是 00 01 ,字节数是 02,具体的数据内容是 00 00。
-----------------------------------
你的modbustcp的应答报文,好像不是读线圈状态的,而是功能码16——写多个保持型寄存器。
矩形PLC,支持Modbus rtu和Modbus tcp协议。
ModBus通信规约的异常响应报文格式
由于软件编程错误,对协议理解错误或通讯干扰等原因,MODBUS通信子站接收到主站的报文后,可以采用异常响应报文给予回答,异常响应报文格式举例如下:FC 05H 主站=>子站:远方复归 报文 内容含义 备注 1字节 MODBUS地址 01H 举例 1字节 功能码 05H 1字节 线圈地址高字节 01H 1字节 线圈地址低字节 07H 1字节 强制线圈数值高字节 FFH 1字节 强制线圈数值低字节 00H 1字节 CRC高字节 3CH 1字节 CRC低字节 07H 异常响应报文 子站=>主站 报文 内容含义 备注 1字节 MODBUS地址 01H 举例 1字节 功能码 85H 1字节 异常代码 02H 1字节 CRC高字节 C3H 1字节 CRC低字节 51H 子站通过校验,发现主站报文有问题,将响应报文将主站的功能码最高位(D7)置1,如例子中的02H,异常响应报文中有固定的一个字节作为“异常代码”,表示异常原因。 异常代码 含义 01 非法功能码。子站无法处理主站报文中的功能码。 02 非法数据地址。子站无法处理主站报文中的数据地址。 03 非法数据内容。主站报文中的数据不能满足子站的要求格式。 04 子站设备错误。 05 确认帧。 06 子站忙。
一文看懂Modbus协议
自从 1979 年出现工业串行链路的事实标准以来,Modbus使成千上万的自动化设备能够通信。Modbus?是OSI模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。Modbus应用层协议和服务规范主要包含两类:一类是串行链路上的Modbus(Modbus 串行链路取决于TIA/EIA 标准:232-F 和 485-A),另一类是TCP/IP 上的Modbus(Modbus?TCP/IP 取决于IETF 标准:RFC793 和 RFC791 有关)。Modbus通信栈示意图如下所示:
Modbus协议允许在各种网络体系结构内进行简单通信,每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用 Modbus协议来启动远程操作。在基于串行链路和以太 TCP/IP 网络的 Modbus上可以进行相同通信,一些网关允许在几种使用 Modbus协议的总线或网络之间进行通信。Modbus网络体系结构的实例如下所示:
Modbus协议本质上和我们平时自定义的协议一致,就是一种数据传输格式,也是由起始帧、数据帧、校验帧等组成,只不过Modbus协议更为规范。
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域,通用Modbus帧协议如下图所示:
具体解析如下:?
地址域:子节点的地址信息;
功能码:指明服务器要执行的动作,有效的码字范围是十进制 1-255(128-255 为异常响应保留),当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作(功能码内容较多,建议查阅Modbus协议说明手册,上面介绍的很清晰)。
数据:传输的数据内容,在某种请求中,数据可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息,功
能码仅说明操作。
差错校验:验证收、发的数据是否正确。
如果在一个正确接收的 ModbusADU 中,不出现与请求Modbus功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求 Modbus功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。Modbus事务处理的状态图如下所示:
一旦服务器处理请求,使用合适的 Modbus服务器事务建立 Modbus响应,根据处理结果,可以建立两种类型响应:
一个正确Modbus响应:响应功能码 = 请求功能码 ;
一个 Modbus异常响应:用来为客户机提供处理过程中与被发现的差错相关的信息,提供一个异常码来指示差错原因。响应功能码 = 请求功能码 + 0x80。
将上述图示分解理解,例如,客户机与服务器执行Modbus?通信协议,当服务器对客户机响应时,它使用功能码来指示正常(无差错)响应或者出现某种差错(称为异常响应)。
对于一个正常响应来说,服务器仅对原始功能码响应,Modbus事务处理(无差错)如下图所示:
对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑 1,Modbus事务处理(异常响应)如下图所示:
Modbus使用一个Big-Endian 表示地址和数据项。这意味着当发射多个字节时,首先发送最高有效位。例如:
寄存器? ? 数据
0x4001? 0x1234
发送的第一字节为 0x12,第一字节为0x34。
Modbus以一系列具有不同特征表格上的数据模型为基础,四个基本表格如下表所示:
对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。
数据模型这个概念有限抽象,让我们通过以下两个示例加深理解。
示例1 :有 4 个独立块的设备
示例描述:一个设备中的数据结构,含有数字量和模拟量、输入量和输出量。由于不同块中的数据不相关,每个块是相互独立。使用Modbus数据模型,按不同 Modbus功能码访问每个块,实现原理如下所示:
示例2:仅有 1 个块的设备
示例描述:一个设备仅有 1 个数据块,使用Modbus数据模型,通过几个Modbus功能码可能得到一个相同数据,或者通过 16 比特访问或 1 个访问比特,实现原理如下所示: