一、背景
什么是104规约?
104规约国家电力设备通信的一种标准协议,版本目前分为IEC104 1997和2002两个版本,在流程上没有什么变化,02版只是在97版上扩展了遥测、遥信等信息体地址,区别如下:
| 类别 | 1997版基地址 | 2002版基地址 |
|---|---|---|
| 遥信 | 1H----400H | 1H----4000H |
| 遥测 | 701H----900H | 4001H----5000H |
| 遥控 | B01H----B80H | 6001H----6100H |
| 设点 | B81H----C00H | 6201H----6400H |
| 电度 | C01H----C80H | 6401H----6600H |
二、104规约帧格式分析
104规约帧格式:
①.控制域格式有三种:
1)U格式:不计数的控制功能类型,用于传输控制命令的报文。
U格式的APDU只包含APCI,帧长6字节。
2)I格式:信息传输格式类型,用于传输含有信息体的报文和确认对方I格式的信息报文。
I格式的APDU包含APCI和ASDU
3)S格式:计数的监视功能类型,用于传输对站端的确认的报文。
S格式的APDU只包含APCI,帧长6字节。
可知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):
可变结构限定词(VSQ): 占1个字节,最高位为是否连续标志(1:连续,0:不连续),后7位表示信息对象个数。
当可变结构限定词最高位为1表示连续时,对应n个信息对象中,第一个信息对象中含有信息体地址(3个字节)表示从这个规约地址开始,第二个信息对象中不再包含信息体地址,第二个信息对象地址是在第一信息对象中的信息体地址递增。当可变结构限定词最高位为0表示不连续,每个信息对象中都包含信息体地址。
传送原因(COT):2字节,低字节在前,高字节在后。
三、报文实例解析
实例一:数据总召应答报文。
发送: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.发送报文:召唤全数据激活帧
2.接收报文
含有:召唤全数据激活确认帧、遥信数据帧、遥测数据帧以及召唤全数据激活结束帧
1)召唤全数据激活确认帧:
2)遥信数据帧:
3)遥测数据帧:
(1)实例1
(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)召唤全数据激活结束帧:
实例二、数据突变上传报文
接收: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.突变上传的数据帧,遥测类型不连续数据。
实例三、
发送: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.发送报文:召唤电度激活帧
2.接收报文:含召唤电度激活确认帧、电度数据帧以及召唤电度激活结束帧
1)召唤电度激活确认帧:
2)电度数据帧:
3)召唤电度激活结束帧
四、最后
感谢其他博客提供思路,我只是站在巨人的肩膀上学习罢了!!!