# 电力通信从零跑通：五步 + 三个常见报错，按顺序查十分钟定位

> 

TL;DR：104 数据送不上主站，按通道、TCP、链路、点表、总召五步走，十分钟能定位卡在哪一层。链路起不来先看 STARTDT 有没有回 0x0B；总召有帧但遥测全 0，去查点表三样地址和时标，别一上来就换设备。按层排除，比逐个换件省时间。

笔记本 ping 通、telnet 2404 也通，主站一个数没有，人先怀疑终端坏了。IP 通、端口通、数据有是三件事，通一层不代表下一层通。

## 五步，顺序不能反

五步各有可判定的结果：2404 通不通、STARTDT 回不回 0x0B、总召回来多少帧。跳过哪一步都白对。

### 第一步：先确认你连的是哪个网段（通道层）

现场就三种网络：光纤专网、无线专网、APN 专网卡。先 ipconfig 看终端拿到的是私网还是公网地址，记下源 IP 再 ping。

这套流程针对 10kV 及以上并网点接调度主站的场景。380V 户用项目走用电信息采集系统，不接 104，别拿这套去套。

APN 专网卡要开到指定 APN，白名单加在主站侧接入表里，不在卡上。卡不拦你，拦你的是主站前置那张表。

按《电力监控系统安全防护规定》（发改委 2014 年第 14 号令，2014-09-01 起施行），生产控制大区走网络专用，跨区过横向隔离，拨号和无线接入要过纵向加密认证装置。这装置不放行，ping 通也白搭。

### 第二步：端口和监听（TCP 层）

2404 是 104 默认端口。主站侧有没有对你这个源 IP 开放，问一句比猜半天快：

```
nc -vz 主站IP 2404
```

Windows 上用 PowerShell：

```
Test-NetConnection 主站IP -Port 2404
```


### 第三步：链路建立（应用层 U 帧）

TCP 建起来只是有了条管子，链路还没起来。子站先发 STARTDT act（0x07），主站回 con（0x0B），链路才算起来。

记住这句话：104 是子站主动连主站，不是主站来找你。所以“公网卡不能上调度”是错的——NAT 后的公网卡一样能跑 104，只要终端能访问到主站地址；真正卡人的是主站侧白名单、APN 策略和点表归属，不是 NAT。

104 那四个时间参数在 DL/T 634.5104（等同 IEC 60870-5-104）里给了默认值：建链等 t0=30 秒，发出去等确认 t1=15 秒，无数据回 S 帧 t2=10 秒，空闲心跳 t3=20 秒；k=12、w=8 管的是未确认帧数。这些参数主站配，改之前先问一句，别自己把 t1 拉长——拉长了断链发现得更晚。

空闲心跳靠 TESTFR act(0x43)/con(0x83)，很多掉链断在这里。“白天好夜里掉”先查 t3 和 APN 卡休眠。

### 第四步：点表对点（ASDU 三个地址）

公共地址（ASDU 地址）、信息体地址（IOA）、类型标识（TI）三样必须和主站点表逐条一致。错一样就是一个坏点，主站不报错，只显示异常。

点表逐行对太慢，先对公共地址和总条目数，再抽几个关键遥测核 IOA 和 TypeID。

TypeID 错得最闷：主站要 13（短浮点遥测）、终端给 11（标度化遥测），值照样显示，量纲和小数点全错。常记：遥信 1/3、遥测 9/11/13、遥控 45/46、总召 100、对时 103，电度累计量 15。

对时也要做：主站发 103，终端回镜像报文。时标差 8 小时，曲线整条错位，值对时间不对，一样算没通。

### 第五步：总召 + 回滚（验证与收尾）

发总召唤 100，看回来多少帧、遥测对不对得上现场表计。帧数比点表条目少，少的那几条就是没配或配错的，按 IOA 补回。误差按表计等级判，0.5S 级表别拿 1.0 级的标准套（示例，以现场实测为准）。

遥控要走两步：先选择（S/E 位置 1）等主站确认，再执行（S/E 位回 0），类型 45 或 46。只做返校不算完——返校只证明报文到了，不证明开关动了。

回滚也要留痕：改过的参数、下发过的定值留一份前后对照表。改完不记录，下次故障没人能复现。

## 三个常见报错，对照着查

按现象对，别按顺序猜。

| 现象 | 卡在哪 | 动作 |
| --- | --- | --- |
| connect timeout 或连接被拒 | 通道、端口 | ping 主站；nc -vz 主站IP 2404；问主站侧白名单加没加你这个源 IP |
| TCP 通了，主站一直“链路未建立” | 应用层 | 抓包看 0x07 出去没有、0x0B 回来没有；查主站前置给这个公共地址开通了没 |
| 总召有帧，遥测全 0 或带 IV/OV | 点表、时标 | 对公共地址、IOA、类型标识三样；看终端本地显示值是不是本来就 0；查对时 |

## 一段能直接跑的诊断脚本

```python
import socket, sys
HOST, PORT, CA = "10.1.1.1", 2404, 1   # 主站IP示例以现场实测为准 104端口 公共地址须与点表一致
s = socket.socket(); s.settimeout(10); s.connect((HOST, PORT))     # 通道层 TCP
s.sendall(bytes([0x68, 0x04, 0x07, 0, 0, 0]))                      # STARTDT act U帧
r = s.recv(64)
print("STARTDT", len(r), r[:8].hex(" "))
if len(r) < 6 or r[2] != 0x0B:            # 0x0B = STARTDT con
    print("链路未建立 查主站前置给本公共地址开通没"); sys.exit(1)
asdu = bytes([0x64, 0x01, 0x06, 0x00, CA & 0xFF, CA >> 8, 0, 0, 0, 0x14])  # 总召TI=100 激活 站总召
s.sendall(bytes([0x68, 4 + len(asdu), 0, 0, 0, 0]) + asdu)
d = b""
try:
    while len(d) <= 60:
        d += s.recv(4096)
except socket.timeout:
    pass
print("总召回帧", len(d), d[:32].hex(" "))
```

它只验链路和总召通不通，不替代点表核对。

## 下一步

去现场前先在办公室跑一遍这段脚本，把 2404、公共地址、点表三样填进一张纸。到现场照着上面的顺序自查，先跑脚本再动设备；脚本都跑不通，就别拆柜子。