电力通信从零跑通:五步 + 三个常见报错,按顺序查十分钟定位
技术知识库
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;查对时 |
一段能直接跑的诊断脚本
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、公共地址、点表三样填进一张纸。到现场照着上面的顺序自查,先跑脚本再动设备;脚本都跑不通,就别拆柜子。