行业产品

  • 行业产品

无锡易尔昌智能科技有限公司


当前位置:无锡易尔昌智能科技有限公司>公司动态>Modbus-RTU协议报文信息帧中的代码解析

经营模式:其他

商铺产品:27条

所在地区:

联系人: 刘经理

公司动态

Modbus-RTU协议报文信息帧中的代码解析

阅读:70发布时间:2021-11-16

Modbus-RTU协议报文信息帧中的代码解析
1、地址码
地址码是信息帧的个字节(8位),从0到255。每个从机都必须有的地址。在下行帧中,表明只有符合地址码的从机才能接收由主机发送来的信息。在上行帧中,表明该信息来自于何处。
备注:如果地址为0x00,则认为是一个广播命令,就是所有从机要接收主机发来的信息。规约规定广播命令必须是写命令,并且从站也不发送回答。
2、功能码
功能码是信息帧的第二个字节。ModBus通讯规约定义功能号为1到127。大多数设备只利用其中一部分功能码。下行帧中,通过功能码告诉从机执行什么动作。在上行帧中,从机发送的功能码与主机发送来的功能码一样,并表明从机已响应主机进行的操作,否则表明从机没有响应操作或发送出错。其常用功能码如下所示:
3、数据
它因不同的功能码及不同的从机而不同。数据区可以是实际数据、状态值、参考地址、数据长度等等。
4、CRC码
Modbus-CRC校验码由发送设备计算,放置于发送信息的尾部。接受信息的设备再重新计算接收到的信息的CRC码,比较计算得到的CRC码是否与接收到的相符(或将接收到的信息除以约定的除数,应无余数),如果不相符(有余数),则表明出错。它用于保证主机或从机对传送过程中出错的信息起不了作用,增加了系统的安全与效率。
下面我就来说一下CRC码是如何计算出来的。
在介绍CRC码的计算过程之前,我们先来谈谈“模2除法”。
A、模2运算
“模2除法”与“算术除法”类似,但它既不向上借位,也不比较除数和被除数的相同位数值大小,只要以相同位数进行相除即可。
“模2加法”为1+1=0,1+0=1,0+0=0,0+1=1;
“模2减法”为1-1=0,1-0=1,0-0=0,0-1=1;
仔细看看上面的运算,非常像一种逻辑运算,[老化试验箱]
没错,上述运算相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。下面以100101除以1110为例,为大家展示一下“模2除法”的运算,如下图示:
上述算式的商为11,余数为1。
B、CRC校验步骤
1、先选择一个用于在接收端进行校验时,对接收的帧进行除法运算的除数。此除数可以随机选择,也可按标准选择。通常以多项式的方式表示,这个多项式也称之为“生成多项式”。
备注:除数的位和位必须为1。
2、看已选定的除数二进制位数k,,然后在要发送的数据帧(m位)后面加上k-1位“0”,然后用已经加上k-1位“0”的新帧(m+k-1位)以“模2除法”方式除以上面所说的除数,所得到的余数就是该帧的CRC校验码,也称为FCS(帧校验序列)。
备注:余数的位数一定要是比除数位数只能少一位,哪怕前面的位是0,甚至全为0也不能省略。
3、再把这个校验码附加在原在原数据帧后面,构成一个新帧发送到接收端,最后在接收端再把这个新帧以“模2除法”方式除以前面选择的余数,如果没有余数,则该帧在传输过程中没有出错,否则就是出现了差错。(或者重新计算CRC码)。
C、示例
下面举个例子来说明,CRC码的计算过程。
更改设备地址:
写地址命令:
设备地址 功能码 起始寄存器地址 寄存器个数 数据长度 数据 CRC校验
00 10 02 00xx CRCloCRChi(XX=0X01-0XFF)
设备回复:
设备地址 功能码 起始寄存器地址 寄存器个数 CRC校验
00 10 00 01 00 01 CRCloCRChi
读取设备地址:
读站号:(固定命令)
设备地址 功能码 起始寄存器地址 寄存器个数 CRC校验
00 03 CRCloCRChi
备注:/,在网站中下载串口软件可以方便地计算CRC码。
二、modbus报文实例解析
注:以下报文的CRC算法为CRC-16/MODBUS。
A、01号命令
下行帧:11 01 00 13 00 25 F9 C8
11为从机地址(1byte),地址号17;
01为功能码(1bye),读线圈状态;
0013为寄存器起始地址(2byte),起始地址19;
备注:程序的起始地址为0。起始地址19实际上是第20号接触器。
0025为数据数量(2byte),37个状态量,需要5个字节的空间;
F9C8为CRC码(2byte)。
释义:读取来自17号从机以20号接触器为起始的37个接触器状态。
上行帧:11 01 05 CD 6B B2 0E 1B 18 8D
11为从机地址(1byte),地址号17;
01为功能码(1byte),读线圈状态;
05为数据区字节数(1byte),5个字节;
CD 6B B2 0E 1B为数据(5byte),仅解析个数据(CD),CD转为二进制序列为11001101,从低位到高位读,每一位对应一个接触器的状态,0为分,1为合。
综上数据段中的CD,表示20号接触器合位、21号分位、22号合位、23号合位、24号分位、25号分位、26号合位、27号合位;
18 8D为CRC码(2byte)。
释义:上送来自17号从机的接触器状态,其数据字节数为5,信息为20号接触器合位、21号分位、22号合位、23号合位、24号分位、25号分位、26号合位、27号合位……
备注:
若询问的数据数量不是8的整倍数,那么字节的多余位补0,此时的0不代表任何意义。在此例里,数据段中的1B,低位B则表示52号分位,53号合位,54号分位,55号合位;它的高位1表示,56合位,其余位补0,无意义。
B、02号命令
下行帧:11 02 00 13 00 25 F9 40
11为从机地址(1byte),地址号17;
02为功能码(1byte),读离散输入状态;
0013为寄存器起始地址(2byte),起始地址19;
0025为数据数量(2byte),37个状态量,需要5个字节的空间;
F940为CRC码(2byte)。
释义:读取来自17号从机以20号开关为起始的37个断路器状态。
说明:
01读取的是线圈状态,只能代表电保持的开关器件的状态,如是断路器这种只需要短时合闸脉冲,线圈不需要长期得电,无法用01取得位置信号。
02读取的是开入状态,可以是断路器的辅助触点,也可以行程开关等等器件,所以可以读取机械保持的断路器的位置信号。
上行帧:11 02 05 CD 6B B2 0E 1B 1B BD
11为从机地址(1byte),地址号17;
02为功能码(1byte),读离散输入状态;
05为数据区字节数(1byte),5个字节;
CD 6B B2 0E 1B为数据(5byte),此次解析第二个数据(6B),6B转为二进制序列为01101011,从低位到高位读,每一位对应一个断路器的状态,0为分,1为合。
综上数据段中的6B,表示28号断路器合位、29号合位、30号分位、31号合位、32号分位、33号合位、34号合位、35号分位;
1BBD为CRC码(2byte)。
释义:上送来自17号从机的断路器状态,其数据字节数为5,信息为20号断路器合位、21号分位、22号合位、23号合位、24号分位、25号分位、26号合位、27号合位……
C、03号命令
下行帧:11 03 00 6B 00 03 FF 8C
11为从机地址(1byte),地址号17;
03为功能码(1byte),读保持寄存器;
006B为寄存器起始地址(2byte),起始地址107;
0003为数据数量(2byte),3个模拟量;
FF 8C为CRC码(2byte)。
下面开始报文分析:
下行帧:11 04 00 00 00 01 5A 33
11为从机地址(1byte),地址号17;
04为功能码(1byte),读输入寄存器;
0000为事件交换字地址(2byte),地址号0;
0001为SOE读指针地址(2byte),地址号1;
5A33为CRC码(2byte)
释义:询问17号从机的事件交换字及当前SOE指针位置。
上行帧:11 04 04 00 02 00 2e 5A AA
11为从机地址(1byte),地址号17;
04为功能码(1byte),读输入寄存器;
04为数据区字节数(1byte),4个字节;
0002为事件交换字(2byte),表示有2个SOE数据滞留在SOE缓冲区内;
002e为当前指针位置(2byte),表示指针移动到46的位置;
5AAA为CRC码(2byte)。
释义:17号从机回应主机:事件交换字为2,当前SOE指针位置为46。
下行帧:11 04 01 00 00 10 AA F2
11为从机地址(1byte),地址号17;
04为功能码(1byte),读输入寄存器;
0100为指针46位置对应的地址,地址号256;
0010为数据占用寄存器个数,16个;
AAF2为CRC码(2byte)。
释义:读取17号从机的以256为起始地址的SOE数据,共16个寄存器。
上行帧:11 04 20 02 01 09 02 0B 0C 0E 0D 01 02 00 02 00 01 00 0001 03 09 02 0C 0B 09 0F 03 14 00 04 01 01 00 00 2E 7D
11为从机地址(1byte),地址号17;
04为功能码(1byte),读输入寄存器;
20为数据区字节数(1byte),32字节;
02 01 09 02 0B 0C 0E 0D 01 02 00 02 00 01 00 00为组SOE数据,其中尾部的四个字节00 01 00 00为备用数据,无任何意义。个字节为SOE类型,第二个字节为SOE的源,随后8个字节为时标,而后两个字节为SOE的测点。
表示2009年2月11日12点14分13秒25.8毫秒2号开关手动分闸。
01 03 09 02 0C 0B 09 0F 03 14 00 04 01 01 00 00 为第二组SOE数据,其中尾部的四个字节01 01 00 00为备用数据,无任何意义。个字节为SOE类型,第二个字节为SOE的源,随后8个字节为时标,而后两个字节为SOE的测点。
表示2009年2月12日11点9分15秒78.8毫秒4号开关通讯合闸。
2E7D为CRC码。
释义:17从机上送32字节的SOE数据:2009年2月11日12点14分13秒25.8毫秒2号开关手动分闸;2009年2月12日11点9分15秒78.8毫秒4号开关通讯合闸。
E、05号命令
下行帧:11 05 00 AC FF 00 F3 F6
11为从机地址(1byte),地址号17;
01为功能码(1byte),写单个线圈;
00AC为下置的寄存器地址(2byte),寄存器地址号为172;
FF00为下置的数据;
F3F6为CRC码(2byte)。
释义:合上17号从机的173号开关。
备注:开关的分闸命令为0x00,合闸命令为FF00,其余数值均为非法。
上行帧:11 05 00 AC FF 00 F3 F6
此帧*重复下行帧的命令,相当于确认命令已执行。
释义:17号从机的173号开关已合闸。
F、06号命令
下行帧:11 06 00 01 00 32 79 B9
11为从机地址(1byte),地址号17;
06为功能码(1byte),写单个保持寄存器;
0001为下置的寄存器地址(2byte),寄存器地址号为1;
0032为下置的数据,数据为50;
79B9为CRC码(2byte)。
释义:将17号从机里地址为1的保持寄存器中数据置为50。此条数据可以是将18号从机的第2号变频器的输出频率置为50HZ。
上行帧:11 06 00 01 00 32 79 B9
释义:表示置位成功,即17号从机的第2号变频器的输出频率已置为50HZ。
G、15号命令
下行帧:110F 00 13 00 02 01 01 98 9B
11为从机地址(1byte),地址号17;
0F为功能码(1byte),写多个线圈;
0013为起始地址(2byte),起始地址为19;
0002为强置个数(2byte),个数为2;
01为强置字节数(1byte),1个字节;
01为强置数据(1byte),强置数据为0001,由于强置个数为2个,所以与第二位无效;
989B为CRC码(2byte)。
释义:合上17号从机的20号开关,分开其21号开关。此命令可以作消防联动,将风柜出风口阀门配置21号开关,防排烟风机的启动开关配置为20号开关,可组成的消防联动。
上行帧:11 0F 00 13 00 02 5F 27
11为从机地址(1byte),地址号17;
0F为功能码(1byte),写多个线圈;
0013为起始地址(2byte),起始地址为19;
0002为强置个数(2byte),个数为2;
5F23为CRC码(2byte)。
释义:已合上17号从机的20号开关,已分开其21号开关。
H、16号命令
设系统时间地址为10000~10004。
下行帧:11 10 27 10 00 05 0A 07 D2 0A 09 00 0C 0E 0D 00 00 DD D5
11为从机地址(1byte),地址号17;
10为功能码(1byte),写多个保持寄存器;
2710为起始地址(2byte),起始地址为10000;
0005为写寄存器个数,占用5个寄存器;
0A为数据区字节数,10个字节;
07 D2 0A 09 00 0C 0E 0D 00 00为数据(10byte),表示2002年9月10日12点14分13秒0毫秒;
DDD5为CRC码(2byte)。
释义:将系统时间置为2002年9月10日12点14分13秒0毫秒。
上行帧:11 10 27 10 00 05 EB 09
11为从机地址(1byte),地址号17;
10为功能码(1byte),写多个保持寄存器;
2710为起始地址(2byte),起始地址为10000;
0005为写寄存器个数,占用5个寄存器;
EB09为CRC码(2byte)。
下面来简要说明一下这种物理层的校验方式:
1、当通信开始时,信号线为空闲(逻辑1),当检测到由1跳变至0时,开始“接收时钟”计数。
2、当计到8个时钟时,对输入信号进行检测,若依旧为低电平,则确认此跳变信号为“起始位(B)”信号(逻辑0),而不是干扰信号。
3、当接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值作为D0位数据。
4、再隔16个接收时钟,对输入信号检测一次,把对应的值作为D1位数据,直到全部数据位都输入完毕。
注意:在发送时,顺序为LSB发至MSB,即由低往高发。如图中所示,其数据是45H=0100 0101,但其发送顺序是1010 0010,切莫倒置。
5、接收奇偶校验位。
6、当接收完规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑1),若此时未收到逻辑1,说明出现了错误,在状态寄存器中置“帧错误”标志。若没有错误,对全部数据进行奇偶校验,校验无错误时,把数据位从移位寄存器送入数据输入寄存器,若校验错误,在状态寄存器中置奇偶错误标志。
还是以上图数据45H为例,说明一下奇偶校验。45H的二进制序列为0100 0101。
如果采用奇校验,奇偶校验位就是0。这样才能保证发送出去的数据“1”的个数为奇数,本例中数据中“1”个数为3,所以奇偶校验位就是0。
如果采用偶校验,奇偶校验位就是1,这样才能保证发送出去的数据“1”的个数为偶数,本例中数据中“1”个数为3,所以奇偶校验位就是1,这样数据中就有了4个“1”,这样才能满足偶校验。
7、本帧信息接收完毕,把线路上的高电平作为空闲位。
备注:本段文字中提到的时钟,是指时钟周期,是晶振频率的倒数。它是计算机中最基本,最小的时间单位。
新闻分享:刘经理">/yrckj/CN/C_html/news20210317a-6.html [刘经理 | 无锡易尔昌智能科技有限公司]

仪表网 设计制作,未经允许翻录必究 .      Copyright(C) 2021 https://www.ybzhan.cn,All rights reserved.

以上信息由企业自行提供,信息内容的真实性、准确性和合法性由相关企业负责,仪表网对此不承担任何保证责任。 温馨提示:为规避购买风险,建议您在购买产品前务必确认供应商资质及产品质量。

会员登录

×

请输入账号

请输入密码

=

请输验证码

收藏该商铺

登录 后再收藏

提示

您的留言已提交成功!我们将在第一时间回复您~