IEC61850 技术讲堂 · 知识分享与交流

首页 > 互动中心 > IEC 60870-5-104 报文时序

IEC 60870-5-104 报文时序详解:STARTDT、总召唤、变化上送与对时(附报文示例)

👤 发布:微自恒通技术团队 📅 2026-10-26

调试 104 通道时,文档看不出的问题基本都出在时序上:STARTDT 没确认就发 I 帧、总召唤没有终止、S 帧丢了没人补。本文把一条 104 连接从建立到对时的报文顺序摊开,所有示例按 IEC 60870-5-104:2006(国内对应 GB/T 18657.104)的帧格式给出,可直接和抓包工具对照。文中只描述标准规定,不涉及任何具体产品的性能宣称。

一、三种帧:先认出你在看什么

每个 APDU 都以 0x68 开头,第二字节是长度(控制域 4 字节 + ASDU 的字节数)。三种帧靠控制域第 1 个字节的最低两位区分:

类型控制域首字节含义示例
I 帧bit0=0带 ASDU 的信息传输,含 15 位发送序号 N(S) 与接收序号 N(R)68 0E 00 00 00 00 …
S 帧bit0=1, bit1=0仅确认,不含 ASDU68 04 01 00 02 00
U 帧bit0=1, bit1=1链路控制:STARTDT / STOPDT / TESTFR68 04 07 00 00 00

二、建立连接:TESTFR 与 STARTDT

TCP 连上只代表链路通,数据传送要由 STARTDT 启动。常用的三个 U 帧报文(控制域 4 字节固定为 第1字节+3 个 0):

启动数据传输  68 04 07 00 00 00   (STARTDT act)
               68 04 0B 00 00 00   (STARTDT con)
链路测试      68 04 43 00 00 00   (TESTFR act)
               68 04 83 00 00 00   (TESTFR con)
停止数据传输  68 04 13 00 00 00   (STOPDT act)
               68 04 23 00 00 00   (STOPDT con)

常见坑:① 收到 STARTDT act 后必须先回 STARTDT con,再发 I 帧;② 空闲时按 t3(默认 20 s)发 TESTFR,t1(默认 15 s)内收不到应答应断开重连;③ 一端只做客户端、另一端只做服务端时,"谁先 STARTDT"要按主站要求,别两侧都等对方。

三、总召唤:一条命令换回全站数据

总召唤用 C_IC_NA_1(类型标识 TI=100),限定词 QOI=20 表示站召唤。下面是一条合法请求(16 字节,序号按实际连接编号,示例取 0):

68 0E 00 00 00 00 | 64 01 06 00 | 01 00 | 01 00 00 | 14
   |  APCI(6B)     | TI VSQ COT |  公共地址 | 信息对象地址 | QOI

应答侧的正常顺序:COT=7 激活确认 → 若干 COT=20 的站召唤数据 → COT=10 激活终止。工程上三个检查点:

  • 只看到 COT=7 看不到 COT=10:多半是数据量大 + k/w 窗口卡住,调窗口或分批上送;
  • COT=44/45/46/47 是"未知类型/原因/公共地址/信息对象地址",通常是两端公共地址或 COT 长度(1 字节 vs 2 字节)配错;
  • 总召唤期间收到 COT=3 的突发数据是正常的,不要当成重复。

四、变化上送(COS)与带时标

开关量变化一般用 M_SP_NA_1(TI=1,无时标)或 M_SP_TB_1(TI=30,带 CP56Time2a 时标),传送原因 COT=3(突发)。一条单点变化上送:

68 0E 04 00 02 00 | 01 01 03 00 | 01 00 | 01 00 00 | 01
   N(S)=1  N(R)=0   | TI VSQ COT | 公共地址 |   IOA    | SIQ(SPI=1)

注意 N(S)/N(R) 是 15 位、到 32767 回绕;接收侧必须按收到的 I 帧数量回 S 帧(w 默认 8),否则对端发满 k(默认 12)个未确认 I 帧后会停止发送 —— 现场表现为"数据突然不动了",很容易误判成设备死机。

五、对时:CP56Time2a 的 7 个字节

对时用 C_CS_NA_1(TI=103),COT=6 激活、COT=7 确认。时间信息是 7 字节 CP56Time2a:

字节内容取值
1–2毫秒(低字节在前)0–59999
3分钟bit0–5,0–59
4小时 + 夏令时位bit0–4 小时,bit7 为 IV/夏令时标志
5日 + 星期bit0–4 日,bit5–7 星期
6月bit0–3,1–12
7年0–99(表示 2000–2099)

常见坑:毫秒只到 59999、分钟字节高 2 位必须为 0;跨时区系统里"对时正确但显示差 8 小时"通常是上位机把本地时间当 UTC 存;年字段是两位,跨 2099 年不做处理。

六、现场排查清单

  1. I 帧不再增加 → 查 S 帧是否被回、k/w 是否被对端配得过小;
  2. 总召唤迟迟不结束 → 查是否有 COT=10,还是被大量 COT=3 打断;
  3. 偶发"未知传送原因" → 查 COT 是 1 字节还是 2 字节(104 固定 2 字节,源自 101 的实现常错);
  4. 重启后前几条数据重复 → 检查序号是否复位、以及是否收到并处理了 STARTDT;
  5. 时标跳变 → 校验 CP56Time2a 的毫秒/分钟位域,而不是去改对时周期;
  6. 同一通道既有总召唤又有突发数据时死锁 → 多半是单线程阻塞发送,把发送队列与确认处理分开。

七、怎么证明自己的实现是对的

光看日志不算证明。可行的做法是:① 用抓包工具按本文时序逐帧比对(控制域序号、COT、IOA 长度);② 做异常注入 —— 丢 S 帧、乱序、重复帧、错误 COT,看对端是否符合标准的容错行为;③ 把上述用例固化成回归脚本,每次改协议栈都跑一遍。相关工具与实现见 IEC 60870-5-101/103/104 开发包及测试系统 与 报文分析系统。

参考

  • IEC 60870-5-104:2006(国内 GB/T 18657.104-2002)—— 帧格式、k/w 参数、t1/t2/t3 超时
  • IEC 60870-5-101 —— ASDU 类型与信息对象定义(104 复用其 ASDU 定义)
  • IEC 60870-5-4 / -5 —— 应用信息元素与传输原因的定义

本文为工程笔记,不含任何产品性能承诺;如发现表述与标准文本不一致,以标准原文为准。勘误可经 联系我们 提交。

↑