IEC104 规约详细解读(二)交互流程以及协议解析

本文详细介绍了电力自动化系统中IEC104协议的通信流程,包括首次握手、总召唤、对时报文、电度总召唤、遥控操作等步骤。涉及的数据帧类型包括I帧、S帧、U帧,以及各种类型的遥信、遥测和遥控报文,揭示了电力系统设备间数据交换的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流程

第一步:首次握手(U帧)

发送―>激活传输启动 :
68(启动符)04(长度)07(控制域)
00 00 00

接收―>确认激活传输启动:
68(启动符)04(长度)0B(控制域)
00 00 00

第二步:总召唤,召唤YC,YX(可变长I帧)初始化后定时发送总召唤

发送―>总召唤 :

68(启动符)0E(长度)
00 00(发送序号,2个字节)00 00(接收序号,2个字节)64(类型标识)01(可变结构限定词)06
00(传送原因,2个字节)01 00(公共地址,即RTU站址,2个字节)0000
00(信息体地址,3个字节)14(QOI,区分是总召唤还是分组召唤,如果是2002版基地址的没有分组召唤)

接收―>S帧:(记录接收到的长帧,双方都可以按频率发送,文本规定最多接收8帧I帧回答一S帧,但我们要求接收一帧I帧就应答一S帧)

68 04 01 00 02 00:

接收―>总召唤确认(发送帧的镜像,除传送原因不同):

68(启动符)0E(长度)00
00(发送序号,2个字节)
00 00(接收序号,2个字节)
64 (类型标识)01(可变结构限定词)
07 00(传送原因,2个字节)
01 00(公共地址,即RTU站址,2个字节)00
00 00(信息体地址,3个字节)
14 (QOI)

发送―>S帧 记录接收到的长帧,双方都可以按频率发送,文本规定最多接收8帧I帧回答一S帧,但我们要求接收一帧I帧就应答一S帧)

68 04 01 00 02 00

接收―>YX帧:(以类型标识1为例)

68(启动符)
1A(长度)
02 00 (发送序号,2个字节)02 00(接收序号,2个字节)
01(类型标识,单点遥信)
04(可变结构限定词,有4个遥信上送)
14 00 (传送原因,2个字节,响应总召唤)01 00
(公共地址,即RTU站址,2个字节)03
00 00(信息体地址,3个字节,第3号遥信)
00(遥信分)
05 00 00 (信息体地址,3个字节,第5号遥信)00(遥信分)
08 00 00(信息体地址,3个字节,第8号遥信)01
(遥信合)09 00 00
(信息体地址,3个字节,9号遥信)00(遥信分)

发送―>S帧:

68 04 01 00 04 00

接收―>YX帧:(以类型标识3为例)

68(启动符)
1E(长度)
04 00(发送序号,2个字节)
02 00(接收序号,2个字节)03(类型标识,双点遥信)
05 (可变结构限定词,有5个遥信上送)14 00(传送原因,2个字节,响应总召唤)
01 00 (公共地址,即RTU站址,2个字节)01
00 00 (信息体地址,3个字节,第1号遥信)02(遥信合)
06 00 00 (信息体地址,3个字节,第6号遥信)02(遥信合)
0A 00 00 (信息体地址,3个字节,第10号遥信)01(遥信分)
0B 00 00(信息体地址,3个字节,第11号遥信)02 (遥信合)
0C 00 00(信息体地址,3个字节,第12号遥信)01(遥信分)

发送―>S帧:

68 04 01 00 06 00

接收―>YC帧:(以类型标识9为例)

68(启动符)
13(长度)
06 00 (发送序号,2个字节)02 00
(接收序号,2个字节)09
(类型标识,带品质描述的遥测)82(可变结构限定词,有2个连续的遥测)
14 00 (传送原因,2个字节,响应总召唤)01 00(公共地址,即RTU站址,2个字节)
01 07 00(信息体地址,3个字节,从第0x701即0号遥测开始)A1
10(遥测值0x10A1)
00(品质描述)
89 15(遥测值0x1589)
00(品质描述)

发送―>S帧:

68 04 01 00 08 00

接收―>结束总召唤帧:

68(启动符)
0E(长度)08 00
(发送序号,2个字节)02 00(接收序号,2个字节)
64 (类型标识)01(可变结构限定词)0A 00
(传送原因,2个字节)01 00
(公共地址,即RTU站址,2个字节)00
00 00(信息体地址,3个字节)
14(QOI)

发送―>S帧:

68 04 01 00 0A 00

第二步:发送对时报文**(通过设置RTU参数表中的”对时间隔”单位是分钟,默认是20分钟左右.)**

发送―>对时命令:

68(启动符)14(长度)
02 00(发送序号,2个字节)0A 00(接收序号,2个字节)67(类型标识)01(可变结构限定词)06
00(传送原因,2个字节)01 00(公共地址,即RTU站址,2个字节)0000
00(信息体地址,3个字节)01 (毫秒低位)
02(毫秒高位) 03(分钟)
04(时) 81 (日与星期)
09(月) 05(年)

接收―>对时确认:

68(启动符)14(长度)
0C 00(发送序号,2个字节)04 00(接收序号,2个字节)67(类型标识)01(可变结构限定词)07
00(传送原因,2个字节)01 00(公共地址,即RTU站址,2个字节)0000
00(信息体地址,3个字节)**
(毫秒低位) (毫秒高位)

(分钟) 04(时)
81 (日与星期) 09(月)
05(年)

发送―>S帧:

68 04 01 00 0E 00

第三步:电度总召唤(如果没有电度此步骤可以省略且该步骤可以在对时之前发送,DF8900系统通过设置RTU参数表中的”全数据扫描间隔”单位是分钟.DF1800/DF8002系统在程序中写定,一般15分钟召唤一次,如果不需要召唤电度一定在RTU参数表中电度个数设置为0**)**

发送―>召唤电度 :

68(启动符)0E(长度)
04 00(发送序号,2个字节)0E 00(接收序号,2个字节)65(类型标识)01(可变结构限定词)06
00(传送原因,2个字节)01 00(公共地址,2个字节)0000
00(信息体地址,3个字节)45(QCC)

接收―>召唤确认(发送帧的镜像,除传送原因不同):

68(启动符)0E(长度)10
00(发送序号,2个字节)
06 00(接收序号,2个字节)
65 (类型标识)01(可变结构限定词)
07 00(传送原因,2个字节)
01 00(公共地址,2个字节)00 00 00(信息体地址,3个字节)
45 (QCC)

发送―>S帧:

68 04 01 00 12 00

接收―>电度数据:68(启动符)
1A(长度)
12 00(发送序号,2个字节)
06 00(接收序号,2个字节)
0F (类型标识)02(可变结构限定词,2个电度值)
05 00 (传送原因,2个字节)01 00(公共地址,2个字节)01
0C 00 (信息体地址,3个字节,0xc01,0号电度)00
00 00 00(电度值)00(描述信息)02 0C 00(信息体地址,3个字节,0xc01,1号电度)00
00 00 00 (电度值)01(描述信息)

发送―>S帧:

68 04 01 00 14 00

接收―>结束总召唤帧:

68(启动符)
0E(长度)14 00
(发送序号,2个字节)06 00(接收序号,2个字节)
65 (类型标识)01(可变结构限定词)0A 00
(传送原因,2个字节)01 00
(公共地址,2个字节)00 00 00(信息体地址,3个字节)
45(QCC)

发送―>S帧:

  1. 04 01 00 16 00

第四步**:如果RTU****有变化数据主动上送**

主动上送变位遥信,类型标识为1或3

接收―>变位遥信:

68(启动符)
0E(长度)
16 00 (发送序号,2个字节)06
00 (接收序号,2个字节)01(类型标识,单点遥信)
01(可变结构限定词,1个变位发生)
03 00 (传送原因,2个字节,表突发事件)01 00(公共地址,2个字节)
03 00 00(信息体地址,3个字节,3号遥信)00(分)

发送―>S帧:

04 01 00 18 00

接收―>变位遥信:

68(启动符)0E(长度)
18 00 (发送序号,2个字节)06
00(接收序号,2个字节)
03(类型标识,双点遥信)01(可变结构限定词,1个变位发生)
03 00(传送原因,2个字节,表突发事件)
01 00 (公共地址,2个字节)06
00 00(信息体地址,3个字节,6号遥信)
01(分)

发送―>S帧:

04 01 00 1a 00

SOE****主动上送,类型标识为0x1e或0x1f

接收―>SOE:

68(启动符)
15(长度)
1a 00(发送序号,2个字节)
06 00(接收序号,2个字节)
1E(类型标识,单点)01(可变结构限定词,1个SOE)
03 00 (传送原因,2个字节,表突发事件)01
00 (公共地址,2个字节)08 00 00(信息体地址,3个字节,8号遥信)
00(分)AD 39
(毫秒,2个字节)1C(分)
10(时)7A(日与星期)
0B(月)
05(年)

发送―>S帧:

04 01 00 1c 00

接收―>SOE:

68(启动符)
15(长度)1c 00(发送序号,2个字节)
06 00(接收序号,2个字节)1F(类型标识,双点)01(可变结构限定词,1个SOE)
03 00(传送原因,2个字节,表突发事件)01
00 (公共地址,即RTU站址,2个字节)0A
00 00 (信息体地址,3个字节,10号遥信)01(信息体元素)
2F 40 (毫秒,2个字节)1C(分)
10 (时)7A(日与星期)
0B(月)
05(年)

第五步如果主站超过一定时间没有下发报文或RTU也没有上送任何报文则双方都可以按频率发送U帧,测试帧

发送―>U帧:
68 04 43 00 00 00

接收―>应答:
68 04 83 00 00 00

第六步**😗*遥控

发送―>遥控预置:68(启动符)
0E(长度)** **(发送序号,2个字节)
** **(接收序号,2个字节)
2E (类型标识)01(可变结构限定词)
06 00(传送原因,2个字节)
01 00(公共地址,2个字节)
05 0B 00(信息体地址,3个字节,遥控号=0xb05-0xb01=
4)
82(控合)

接收―>遥控反校:68(启动符)
0E(长度)
0E 00(发送序号,2个字节)
06 00(接收序号,2个字节)2E(类型标识)01(可变结构限定词)
07 00 (传送原因,2个字节)01 00(公共地址,2个字节)
05 0B 00(信息体地址,3个字节,遥控号=0xb05-0xb01=
4)
82(控合)

发送―>遥控执行:68(启动符)
0E(长度)
04 00(发送序号,2个字节)
18 00(接收序号,2个字节)2E(类型标识)01(可变结构限定词)06
00(传送原因,2个字节)01 00(公共地址,即RTU站址,2个字节)
05 0B 00(信息体地址,3个字节,遥控号=0xb05-0xb01=
4)
02(控合)

接收―>执行确认:68(启动符)
0E(长度)
12 00(发送序号,2个字节)08
00(接收序号,2个字节)2E(类型标识)01(可变结构限定词)
07 00(传送原因,2个字节)01
00(公共地址,即RTU站址,2个字节)05
0B 00(信息体地址,3个字节,遥控号=0xb05-0xb01= 4)02(控合)

发送―>遥控撤销:68(启动符)
0E(长度)
04 00(发送序号,2个字节)
18 00(接收序号,2个字节)2E(类型标识)01(可变结构限定词)08(传送原因,2个字节)01
00(公共地址,即RTU站址,2个字节)
05 0B 00(信息体地址,3个字节,遥控号=0xb05-0xb01=
4)02(控合)

接收―>撤销确认:68(启动符)
0E(长度)
12 00 (发送序号,2个字节)08
00(接收序号,2个字节)2E(类型标识)01(可变结构限定词)
09 00(传送原因,2个字节,,停止激活确认)01
00(公共地址,即RTU站址,2个字节)05
0B 00(信息体地址,3个字节,遥控号=0xb05-0xb01= 4)02(控合)

参考:

https://www.jianshu.com/p/772582a9db11?utm_campaign=hugo

https://blog.csdn.net/chenyitao736866376/article/details/99120024

http://blog.sina.com.cn/s/blog_725e03190102z5sa.html

https://github.com/renduy/IEC104_microgrid

http://www.openmuc.org

报文详解

https://wenku.baidu.com/view/ba0654cea5e9856a57126027.html

https://wenku.baidu.com/view/dd0ee3e5bb0d4a7302768e9951e79b89680268a2.html?rec_flag=default&fr=pc_newview_relate-1001_1-2-wk_rec_doc2-1001_1-6-dd0ee3e5bb0d4a7302768e9951e79b89680268a2&sxts=1610432062201

https://wenku.baidu.com/view/cacaf1196c175f0e7cd1374a.html?fr=search-1-wk_sea_es-income3&fixfr=3yzT%2FnBfo2UWHiS%2BxO0Zxw%3D%3D

https://wenku.baidu.com/view/5d66e8ffc281e53a5902ff1f.html?rec_flag=default

https://wenku.baidu.com/view/f68823c048649b6648d7c1c708a1284ac850054c.html?rec_flag=default&fr=pc_newview_relate-1001_1-2&sxts=1610432353297

https://wenku.baidu.com/view/b495f21b03020740be1e650e52ea551810a6c983.html?fr=search-1-wk_sea_es-income4&fixfr=hDEPwyT9KnKfHnOsLiV34w%3D%3D

# IEC104 Protocol of IEC104 and IEC101 ## by chendajie 2014-2015 ## 电网IEC104/IEC101通信协议 ============================== 隔离协议内容与平台或者硬件相关性,已经在stm32平台和linux平台移植测试通过,可轻松移植到其他平台。 ============================================================================ 队列实现的隔离,目前实现简单的先入先出队列,可根据需求用其他队列算法替换。 移植调用实现: 1.在不同平台下,实现_iec10x结构体的函数指针(利用函数指针实现的接口)。 2.调用RegisterIEC10XMoudle,注册实现的_iec10x接口。 3.创建线程一调用Iex104_Receive管理收包解析。 4.创建线程调用Iec10x_Scheduled实现出队调度。 5.创建线程三实现状态机Iec104_StateMachine,实现协议状态管理,协议包组包入队。 代码内容 IEC0x目录 iec101.c iec101协议包内容 iec104.c iec104协议包内容 iec10x.c 队列初始化,入队出对实现,队列优先级等相关实现,队列调度实现 PRIO_QUEUE_Iec10x.c 队列具体算法实现 test目录 linux上简单测试代码,仅供参考,作者具体协议应用在stm32上,利用状态机控制数据包入队与出队调度 重要函数: Iec10x_Scheduled:出队调度 IEC10X_Enqueue:入队函数 IEC10X_Dequeue:出队函数 IEC10X_FindQHead:查找最高优先级数据包 IEC10X_XXX:前缀为IEC10X_的函数为各个协议包的组包函数 Iec104_StateMachine: 104协议状态机 Iex104_Receive:收包解析 RegisterIEC10XMoudle:协议模块注册,初始化 重要结构体: 用函数指针实现的移植接口,根据不同平台与硬件特性,选择性实现以下接口 typedef struct _iec10x { char * name; int (* Init)(void); void (* Delay_ms)(uint16_t); void (* CloseLink)(void); void *(* Malloc)(uint8_t NumByte); void (* Free)(void *buffer); uint8_t (* enqueue)(Iec10x_PrioQueue_T *QueueHdr, Iec10x_PrioNode_T *NewNode); Iec10x_PrioNode_T *(* dequeue)(Iec10x_PrioQueue_T * QueueHdr); Iec10x_PrioNode_T *(* FindQHead)(Iec10x_PrioQueue_T * QueueHdr); char (* GetPrio)(void); void (* InitQueue)(Iec10x_PrioQueue_T *PrioQueue); void (* ClearQueue)(Iec10x_PrioQueue_T * QueueHdr); uint8_t (* Send)(int socketfd,char *data,int len); uint32_t (* SetTime)(PCP56Time2a_T time); uint32_t (* GetTime)(PCP56Time2a_T time); int8_t (* GetStationState)(uint16_t Addr, uint8_t DevType); float (* GetStaValue)(uint16_t Addr, uint8_t DevType); uint16_t (* GetLinkAddr)(void); int8_t (* GetInfoNum)(uint8_t *InfoNum, uint8_t DevType); int8_t (* SetConfig)(long Value, uint32_t addr); int8_t (* SaveFirmware)(uint8_t FirmLen, uint8_t *buf,uint32_t FirmwareType, uint32_t Iec10x_Update_SeekAddr); int8_t (* CheckFirmware)(uint32_t FirmwareType, uint32_t TotalLen); int8_t (* UpdateFirmware)(uint32_t FirmwareType); int8_t (* BackoffFirmware)(uint32_t FirmwareType); #ifdef IEC10XLOCK void (* LOCK)(void); void (* UNLOCK)(void); #endif } *PIEC10X_T, IEC10X_T;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林木森^~^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值