很多人以为 101 换到 104 只是"把串口改成网口"。实际上两者共用同一套 ASDU,链路层却完全不同——把这两层分开看,迁移时该改什么、不该改什么就一目了然。
| IEC 60870-5-101 | IEC 60870-5-104 | |
|---|---|---|
| 物理层 | 串行(RS-232/485、光纤),异步字节传输 | TCP/IP(默认端口 2404) |
| 链路层帧 | FT1.2:可变帧长以 68 L L 68 开头,固定帧长以 10 开头;末尾有校验和与结束符 16 | APCI:68 + 1 字节长度 + 4 字节控制域,没有校验和 |
| 链路地址 | 每个帧都带 1~2 字节链路地址 | 没有链路地址,改由公共地址(ASDU 内)区分站点 |
| 建立数据传输 | 无此环节,帧来了就处理 | 必须先 STARTDT 启用,之后 I 帧才有效 |
注意一个容易踩的坑:两边都用 68 开头,但 101 的第二个字节是长度、第三个字节又是同一个长度,第四个字节还是 68;104 是长度后直接跟控制域。拿 104 的解析器去切 101 的帧,一定会错位。
68 + L + L(重复一次,用于校验)+ 68 + 控制域 + 链路地址 + ASDU + 校验和 + 16。业务数据(带 ASDU)都走这个格式。10 + 控制域 + 链路地址 + 校验和 + 16。不带 ASDU,只做链路层的请求/确认、链路状态、请求链路层数据。可变帧长里 L 的第一个字节算的是"L 自己+第二个 L+启动字符+后续内容",也就是从第一个 L 到校验和之前的字节数——这个定义和 104 的长度字段(控制域 4 字节 + ASDU)完全不是一回事。
不管 101 还是 104,ASDU 的结构都是:类型标识(1 字节)+ 可变结构限定词(1 字节)+ 传送原因(1~2 字节,含 P/N 位与源发地址)+ 公共地址(1~2 字节)+ 信息体地址(1~3 字节)+ 信息元素。所以:
| 项目 | 101 有、104 没有 | 处理方式 |
|---|---|---|
| 帧计数位 FCB / FCV | 靠它防重复帧 | 104 用 TCP 保证顺序,逻辑直接去掉,不要硬塞进 ASDU |
| 链路地址 | 帧级寻址 | 映射成公共地址,别把两个地址混成一个 |
| 固定帧长的链路请求 | 请求链路状态、请求一级数据 | 104 用 STARTDT/STOPDT/TESTFR 替代 |
| 链路超时与重发 | 按帧计数的重发机制 | 换成 t1/t2/t3 与 k/w(见我们另一篇 104 定时器的文章) |
做协议转换或迁移,先定 ASDU 层(点表、类型、传送原因、时标),再定 链路层(帧格式、超时、重发、启停)。反过来先调链路层,会出现"链路通了但点全是错的",两边都白忙。