IEC 104 驱动
dc3-driver-iec104把 IEC 60870-5-104 远动设备接入 IoT DC3——以变电站/调度自动化设备为目标,作为 104 客户端连接并按信息对象地址(IOA)采集遥测/遥信,支持下发遥控命令。
IEC 60870-5-104(简称 IEC 104)是电力系统调度自动化领域的国际标准远动协议,把 IEC 60870-5-101 的应用层架在 TCP/IP 之上,广泛用于变电站、配电终端(DTU/FTU)、RTU 与主站之间的"四遥"(遥测、遥信、遥控、遥调)通信。协议里每个数据点用信息对象地址 IOA(Information Object Address)唯一定位,每条报文用 ASDU 类型(如 M_ME_NC_1 短浮点遥测、M_SP_NA_1 单点遥信)描述数据语义。本驱动用 j60870(OpenMUC)库作为客户端(client),通过 TCP 连到一个 104 服务端,按位号上配置的 IOA 与 ASDU 类型采数、下发控制命令。
适用场景:主站/平台对接变电站综合自动化系统、配电自动化终端、远动机(RTU),采集遥测遥信并下发遥控。
- 驱动名 / code:
IEC 104 Driver/Iec104Driver - 类型:
DRIVER_CLIENT(主动连服务端)
当前为骨架实现
该驱动目前是模板骨架:协议层 I/O(IOA 读取与遥控下发)尚未实现——read() / write() 会直接抛"未实现"异常快速失败(让 SDK 记录失败并退避,而非回显缓存值或伪造成功)。请把它当作接入 104 设备的起点,而非生产可用的成品。下文的属性表与采集周期均逐字取自真实 application.yml,可照填,但实际取数/下发行为仍待补全。
驱动配置(设备级 driver-attribute)
| 属性 | code | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| Host | host | STRING | localhost | 104 服务端 IP |
| Port | port | INT | 2404 | 104 TCP 端口(标准 2404) |
| ASDU Address | asduAddress | INT | 1 | 公共地址(站地址) |
| COT Length | cotLength | INT | 2 | 传送原因字节数 |
| CA Length | caLength | INT | 2 | 公共地址字节数 |
| IOA Length | ioaLength | INT | 3 | 信息对象地址字节数 |
| Connect Timeout | connectTimeout | INT | 10000 | 连接超时(毫秒) |
COT/CA/IOA 长度是站内约定,须与对端一致
cotLength / caLength / ioaLength 是 104 报文中各字段的字节宽度,由主站与远动设备在工程组态时约定(典型 2/2/3)。这三项必须与对端配置完全一致,否则报文解析会错位。asduAddress(公共地址)用于区分同一连接下的多个逻辑站。
位号配置(point-attribute)
每个采集位号上填,用 IOA 定位要读的信息对象:
| 属性 | code | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| IOA | ioa | INT | 0 | 信息对象地址 |
| ASDU Type | asduType | STRING | M_ME_NC_1 | ASDU 类型标识 |
IOA 定位"读哪个点",ASDU 类型决定数据语义
ioa 是信息对象地址,唯一标识远动设备里的一个数据点。asduType 标明该点的数据类型,默认 M_ME_NC_1(短浮点遥测);遥信常用 M_SP_NA_1(单点)。位号的数据类型(Point 的 pointTypeFlag)要和 ASDU 类型携带的实际数据对得上。
写命令配置(command-attribute)
下发遥控的位号还需在写命令上填:
| 属性 | code | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| Send Command | sendCommand | STRING | ${value} | 下发命令模板,用命令参数渲染 |
sendCommand 是模板,用命令参数占位
sendCommand 用 ${参数名} 占位,驱动 execute 时把命令参数(如 ${value})替换进去再下发。默认 ${value} 即直接把命令值作为遥控值。注意:遥控的实际协议下发尚在骨架阶段(见上文 warning)。
采集与健康
- 采集周期:默认 read cron
0/30 * * * * ?(每 30 秒读一轮);另有 custom 周期任务 cron0/5 * * * * ?(每 5 秒,供驱动自定义逻辑用)。 - 健康/在线:设备健康检查默认 cron
0/15 * * * * ?,租约超时45 秒——在线状态机制见设备。
最小接入示例
把 IP 192.168.1.30:2404 的一台远动设备接进来,读一个短浮点遥测:
- 选
IEC 104 Driver创建设备,driver 属性填host=192.168.1.30、port=2404、asduAddress=1(cotLength/caLength/ioaLength用默认2/2/3,与对端约定一致即可)。 - 给设备绑定的物模型加一个遥测位号(
pointTypeFlag=FLOAT、READ_ONLY),point 属性填ioa=16385、asduType=M_ME_NC_1。 - 启动驱动,30 秒内会触发一轮读——协议层补全后即可在位号值里看到采集值。
易错点
COT/CA/IOA 长度对不上 = 整条报文解析错位
104 报文里没有字段分隔符,全靠约定的字节宽度切分。若 cotLength / caLength / ioaLength 与对端不一致,地址会被读到错误的字节上,导致采到的不是目标点甚至解析失败。接入前务必向运维确认对端的 2/2/3(或其他)组态,三项一字不差地照填。
标准端口是 2404,公共地址区分逻辑站
104 标准 TCP 端口是 2404,与 101/Modbus 都不同,别沿用 502。一台远动机下可能挂多个逻辑站,用 asduAddress(公共地址)区分;host / port 相同时,由位号所属设备的 asduAddress 决定连哪个站。
延伸阅读
- 驱动 Driver — 驱动的通用模型与注册机制
- 属性与配置 —
host/ioa这些属性的三层来历 - 设备接入 — 一次完整的接入流程
- Modbus TCP 驱动 — 另一种 TCP 工业协议驱动