首页 > 编程知识 正文

HDLC帧格式所有例题,HDLC帧格式的数据信息段是由()构成

时间:2023-05-06 04:45:24 阅读:215062 作者:1029

DLMS通信链路帧基本采用HDLC帧格式,HDLC除几个特殊域,其他域均为16进制数据,这章我主要分享什么是HDLC帧格式

如图一则为基本的HDLC帧格式:

图一

接下来的每个帧的解释我将按照一次标准报文应答进行解释HDLC帧格式,报文如下

客户端:7E A0 46 48 68 FE FF 75 10 05 C1 E6 E6 00 60 35 A1 09 06 07 60 85 74 05 08 01 01 8A 02 07 80 8B 07 60 85 74 05 08 02 01 AC 0A 80 08 41 42 43 44 45 46 47 48 BE 10 04 0E 01 00 00 00 06 5F 04 00 00 00 14 00 00 BD BF 7E

一,标志帧

        即为标志头,不同的网络协议标志头不同,此处报文头为7E。一次数据传输,假如是单帧,则一次请求的请求头和请求尾都为7E(此处7E标志着结束)。假如是多帧数据传输7E为第一帧请求头,也标志着下一帧的开始。此处需要注意的是多帧传输的等待时间一般由服务端设定,且多帧传输不能超过此等待时间。

二,帧格式域

        帧格式域一般为两个字节,如文章头部报文即 A0 46 为帧格式域,它由三个子域组成:Frame_type子域(4 bit),分段位(S, 1 bit)和帧长度子域(11 bit),如下图二

图二

客户端:7E A0 46 48 68 FE FF 75 10 05 C1 E6 E6 00 60 35 A1 09 06 07 60 85 74 05 08 01 01 8A 02 07 80 8B 07 60 85 74 05 08 02 01 AC 0A 80 08 41 42 43 44 45 46 47 48 BE 10 04 0E 01 00 00 00 06 5F 04 00 00 00 14 00 00 BD BF 7E

      看着好像A0 46与图二没有关系,其实在此处需要把 A0 46分别转化为二进制然后拼接,并且不足8位二进制数据需要补0,如A0转为二进制即为10100000,46转为1000110,此时1000110为7位,我们需要把它转化为8位补0,可以得到01000110,此处拼接起来可得到1010000001000110,此时二进制数据即可和图二关系对应。

       格式类型子域(Frame_type)的值为1010(二进制)。

       分段位S表示是否有后续帧,如果服务端给客户端传送的数据能在一帧内传送完,那么S=0,如果有后续帧那么S=1,此处S=0。

       长度子域的值是除两个7E标志之外的8位位组数。在一般情况下,帧长度不会超过256,因此帧格式域第一个字节为 A0或者A8 ,第二个字节表示该帧的长度

三,地址域

        这个帧有两个地址域:一个目的HDLC地址和一个源HDLC地址。根据数据的传输方向,客户机端地址和服务器地址都可以是目标地址或源地址。客户机端地址总是用一个字节表示。扩展地址的使用把客户机地址的范围限制在128。

        在服务器端,为了能在一个物理设备内寻址一个以上的逻辑装置并且支持多站配置,可以将HDLC地址分为两部分。 一部分称为“高端HDLC地址”用于逻辑设备(一个物理设备内可独立寻址的实体)寻址,而第二部分——“低端HDCL地址”将用于物理设备(多站配置的一个物理设备)寻址。高端HDLC地址总是存在,而低端HDCL地址在不需要时可不用。  

        HDLC地址扩展机制应用于以上两种地址域。这种地址扩展说明可变长度的地址域,但是考虑到该协议,一个完整的HDLC地址域的长度被限制为一字节,两字节或四字节如下图三:

     · 一字节:只有高端HDLC地址存在。

     · 两字节:一字节高端HDLC地址和一字节低端HDLC地址。

    · 四字节:两字节高端HDLC地址和两字节低端HDLC地址。

图三

     看着好像有点麻烦,我们继续按照文章顶部报文进行解释地址域的解析方法,首先这条报文是客户端发给服务端的报文,目的地址为服务端(1到4个字节),源地址为客户端(固定为一个字节),然后我们之前的包括标志域,格式域已经解析完7E A0 46,地址域(目的地址)我们从48开始解析,首先将48转为二进制数据01001000(实际结果应该是1001000,我们要对对所有的16进制转二进制数据进行8位补0),此时01001000的第八位即是LSB位,此位为0表示地址域未结束,1表示结束,我们继续解析下一字节68,转为二进制01101000,继续解析FE转为二进制11111110,继续解析FF转为二进制11111111,此时可以看到第八位为1表示目的地址结束,继续解析(源地址)75转化为二进制位01110101。到此处,所有的地址域(目的地址和源地址)解析结束。可参考图四学习。

客户端:7E A0 46 48 68 FE FF 75 10 05 C1 E6 E6 00 60 35 A1 09 06 07 60 85 74 05 08 01 01 8A 02 07 80 8B 07 60 85 74 05 08 02 01 AC 0A 80 08 41 42 43 44 45 46 47 48 BE 10 04 0E 01 00 00 00 06 5F 04 00 00 00 14 00 00 BD BF 7E 

 

图四

四,控制帧格式

        控制帧为一个字节,此处可以得到10为控制帧字节。

客户端:7E A0 46 48 68 FE FF 75 10 05 C1 E6 E6 00 60 35 A1 09 06 07 60 85 74 05 08 01 01 8A 02 07 80 8B 07 60 85 74 05 08 02 01 AC 0A 80 08 41 42 43 44 45 46 47 48 BE 10 04 0E 01 00 00 00 06 5F 04 00 00 00 14 00 00 BD BF 7E 

命令/应答帧控制字段的编码方式为模式8,如ISO/IEC 13239的5.5及图五规定。

图五

将10转为二进制00010000,即可对应上图

这里RRR是接收序列号N(R),SSS是发送序列号N(S),P/F是查询/结束位。

链路层链接好即SNRM UA帧后,RRR和SSS均为000,发送一帧I帧SSS加1,接收到一帧I帧RRR加1,客户端和服务端都是如此。P/F标志位中P是对客户端而言的,需要响应P=1,那么广播帧时P=0;F是对服务端而言的,F表示发送是否结束,也就是是不是没有后续帧,F=1表示有后续帧,因此当客户端收到服务端发送来的帧格式域中S=1和此处的F=1的帧时,需回应RR帧等待接收未接收完的数据。

五,头校验序列(HCS)域

        HCS的长度是两个字节。HCS计算除开始标志和HCS本身外的头的字节数。HCS的计算方法跟帧校验序列(FCS)类似。不包含信息域的帧,仅含FCS(在这种情况下,HCS被看作FCS)。HCS(和FCS)的计算方法采用CRC校验算法,不等式X**0+X**5+X**12+X**16。CRC具体算法可百度查询,此处用到的X**0+X**5+X**12+X**16的算法,我自己写了一个JAVA版本,可供小伙伴参考一下,图六。

图六

具体计算方式依旧通过报文进行解释

客户端:7E A0 46 48 68 FE FF 75 10 05 C1 E6 E6 00 60 35 A1 09 06 07 60 85 74 05 08 01 01 8A 02 07 80 8B 07 60 85 74 05 08 02 01 AC 0A 80 08 41 42 43 44 45 46 47 48 BE 10 04 0E 01 00 00 00 06 5F 04 00 00 00 14 00 00 BD BF 7E 

根据HCS的长度是两个字节。HCS计算除开始标志和HCS本身外的头的字节数。我们先找出计算部分:A0 46 48 68 FE FF 75 10  对应的校验值05 C1,然后通过上述java算法进行比较即可算法是否正确,错误情况服务端不处理该报文。

六,信息域

客户端:7E A0 46 48 68 FE FF 75 10 05 C1 E6 E6 00 60 35 A1 09 06 07 60 85 74 05 08 01 01 8A 02 07 80 8B 07 60 85 74 05 08 02 01 AC 0A 80 08 41 42 43 44 45 46 47 48 BE 10 04 0E 01 00 00 00 06 5F 04 00 00 00 14 00 00 BD BF 7E

        信息域即是任意的通讯数据等等,具体解析方法,我将会在下一章解释

七,帧校验序列(FCS)域

客户端:7E A0 46 48 68 FE FF 75 10 05 C1 E6 E6 00 60 35 A1 09 06 07 60 85 74 05 08 01 01 8A 02 07 80 8B 07 60 85 74 05 08 02 01 AC 0A 80 08 41 42 43 44 45 46 47 48 BE 10 04 0E 01 00 00 00 06 5F 04 00 00 00 14 00 00 BD BF 7E 

根据FCS的长度是末尾除7E标志尾两个字节。FCS域的长度是两个字节,用来计算除开始标志和FCS本身 外的完整的帧长度。不包含信息域的帧只包含FCS(这里HCS被看作FCS)我们先找出计算部分:A0 46 48 68 FE FF 75 10 05 C1  对应的校验值05 C1,然后通过上述java算法进行比较即可算法是否正确,错误情况服务端不处理该报文。

结语:至此HDLC如何解析大概分享完了,大家有什么疑惑或者其他问题可留言     =。=  

 谢谢大家的点赞,我会努力写的!

引用文献

l IEC 62056-21, Electricity Metering-Data Exchange for Meter Reading, Tariff and Load Control-Part 21: Direct local data exchange.2001

l IEC 62056-61, Electricity Metering-Data Exchange for Meter Reading, Tariff and Load Control-Part 61: Object Identification System(OBIS). 2001

l IEC 62056-62, Electricity Metering-Data Exchange for Meter Reading, Tariffand Load Control-Part 62: Interface Classes. 2001 Data exchange of automatic meter reading system

l IEC62056-46,Electricity Metering-Data Exchange for Meter Reading, Tariff and Load Control-Part 46: Data link layer using HDLC protocol

l IEC 62056-53, Electricity Metering-Data Exchange for Meter Reading, Tariff and Load Control-Part 53: COSEM Application Layer. 2001

l IEC 61334-6, A-XDR encoding rule

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。