关于104规约理解及实现

7,711 阅读6分钟

一、背景

什么是104规约?

104规约国家电力设备通信的一种标准协议,版本目前分为IEC104 1997和2002两个版本,在流程上没有什么变化,02版只是在97版上扩展了遥测、遥信等信息体地址,区别如下:

类别1997版基地址2002版基地址
遥信1H----400H1H----4000H
遥测701H----900H4001H----5000H
遥控B01H----B80H6001H----6100H
设点B81H----C00H6201H----6400H
电度C01H----C80H6401H----6600H

二、104规约帧格式分析

image.png

104规约帧格式:

image.png

①.控制域格式有三种:

1)U格式:不计数的控制功能类型,用于传输控制命令的报文。

U格式的APDU只包含APCI,帧长6字节。

image.png

2)I格式:信息传输格式类型,用于传输含有信息体的报文和确认对方I格式的信息报文。

I格式的APDU包含APCI和ASDU

image.png

3)S格式:计数的监视功能类型,用于传输对站端的确认的报文。

S格式的APDU只包含APCI,帧长6字节

image.png 可知S格式的APDU的帧内容为如下6个字节:68 04 01 00 98 53 前四个字节固定,后两个字节表示接收序号。 S帧和I帧结合使用,用于信息确认,主站和子站可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收一帧I帧就应答一帧S帧。

②.104规约ASDU:

数据单元标识符:

1)数据单元类型:

类型标识(TYP):1字节

可变结构限定词(VSQ):1字节

2)传送原因(COT):2字节

3)ASDU公共地址(ADR):2字节

4)信息对象地址(InfoAdr):3字节

常用的类型标识(TYP):

image.png

可变结构限定词(VSQ): 占1个字节,最高位为是否连续标志(1:连续,0:不连续),后7位表示信息对象个数。

image.png

当可变结构限定词最高位为1表示连续时,对应n个信息对象中,第一个信息对象中含有信息体地址(3个字节)表示从这个规约地址开始,第二个信息对象中不再包含信息体地址,第二个信息对象地址是在第一信息对象中的信息体地址递增。当可变结构限定词最高位为0表示不连续,每个信息对象中都包含信息体地址。

传送原因(COT):2字节,低字节在前,高字节在后。

image.png

三、报文实例解析

实例一:数据总召应答报文。

发送:68 0E 62 03 DC 53 64 01 06 00 01 00 00 00 00 14

接收:68 0E DC 53 64 03 64 01 07 00 01 00 00 00 00 14 68 10 DE 53 64 03 01 83 14 00 01 00 01 00 00 01 00 01 68 3A E0 53 64 03 0D 89 14 00 01 00 01 40 00 D8 A3 C0 3F 00 55 E3 C5 3F 00 6B BC C4 3F 00 D7 A3 CE 42 00 00 80 CE 42 00 70 BD CE 42 00 F6 08 88 43 00 CC CC 5C C1 00 70 BD C7 42 00 68 0E E2 53 64 03 64 01 0A 00 01 00 00 00 00 14

1.发送报文:召唤全数据激活帧

image.png

2.接收报文

含有:召唤全数据激活确认帧、遥信数据帧、遥测数据帧以及召唤全数据激活结束帧

1)召唤全数据激活确认帧: image.png

2)遥信数据帧:

image.png

3)遥测数据帧:

(1)实例1 image.png

(2)实例2

68 12 02 00 00 00 0D 01 03 00 01 00 01 40 00 00 00 DC 43 00

说明:68:开始地址 12:总字节长度 02:发送序列号+2  00 00:接收序列号  0D:通信标准   01:发送数量  03:请求原因(突变)    DC 43 :属性值

(3)实例3 字节数组传输方式:

                    //将数值转换为字节数组
                    byteArray = ByteUtil.getByteArray((float) Float.valueOf(utfRes));
                    resultBytes[0] = 0x68;//头部
                    resultBytes[1] = 0x12;//字节总长度
                    resultBytes[2] =(byte) (0x00+temp);
                    temp+=2;
                    resultBytes[3] = 0x00;
                    resultBytes[4] = 0x00;
                    resultBytes[5] = 0x00;
                    resultBytes[6] = 0x0D;//通信标准
                    resultBytes[7] = 0x01;//发送数量
                    resultBytes[8] = 0x03;//传输原因
                    resultBytes[9] = 0x00;
                    resultBytes[10] = 0x01;
                    resultBytes[11] = 0x00;
                    //地址编码 4001H开始
                    resultBytes[12] = (byte) (0x01+i);
                    resultBytes[13] = 0x40;
                    resultBytes[14] = 0x00;
                    add=i;
                    //浮点数转16进制 低位在前、高位在后
                    resultBytes[15] = byteArray[3];
                    resultBytes[16] = byteArray[2];
                    resultBytes[17] = byteArray[1];
                    resultBytes[18] = byteArray[0];
                    resultBytes[19] = 0x00;

4)召唤全数据激活结束帧:

image.png

实例二、数据突变上传报文

接收:68 42 AA 53 5E 03 0D 07 03 00 01 00 01 40 00 DC F9 BE 3F 00 02 40 00 94 18 C4 3F 00 03 40 00 6F 12 C3 3F 00 04 40 00 D7 A3 CE 42 00 07 40 00 29 DC 86 43 00 08 40 00 99 99 59 C1 00 09 40 00 8F C2 C7 42 00

1.突变上传的数据帧,遥测类型不连续数据。

image.png

实例三、

发送:68 0E 60 03 BC 53 65 01 06 00 01 00 00 00 00 45

接收:68 0E BC 53 62 03 65 01 07 00 01 00 00 00 00 45 68 21 BE 53 62 03 0F 84 25 00 01 00 01 64 00 B8 04 00 00 00 10 00 00 00 01 47 00 00 00 02 05 00 00 00 03 68 0E C0 53 62 03 65 01 0A 00 01 00 00 00 00 45

1.发送报文:召唤电度激活帧

image.png

2.接收报文:含召唤电度激活确认帧、电度数据帧以及召唤电度激活结束帧

1)召唤电度激活确认帧:

image.png

2)电度数据帧:

image.png

3)召唤电度激活结束帧

image.png

四、最后

感谢其他博客提供思路,我只是站在巨人的肩膀上学习罢了!!!