Skip to content

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),采集遥测遥信并下发遥控。

  • 驱动名 / codeIEC 104 Driver / Iec104Driver
  • 类型DRIVER_CLIENT(主动连服务端)

当前为骨架实现

该驱动目前是模板骨架:协议层 I/O(IOA 读取与遥控下发)尚未实现——read() / write() 会直接抛"未实现"异常快速失败(让 SDK 记录失败并退避,而非回显缓存值或伪造成功)。请把它当作接入 104 设备的起点,而非生产可用的成品。下文的属性表与采集周期均逐字取自真实 application.yml,可照填,但实际取数/下发行为仍待补全。

驱动配置(设备级 driver-attribute

接入一台 IEC 104 设备时,在设备上填这些属性

属性code类型默认值说明
HosthostSTRINGlocalhost104 服务端 IP
PortportINT2404104 TCP 端口(标准 2404)
ASDU AddressasduAddressINT1公共地址(站地址)
COT LengthcotLengthINT2传送原因字节数
CA LengthcaLengthINT2公共地址字节数
IOA LengthioaLengthINT3信息对象地址字节数
Connect TimeoutconnectTimeoutINT10000连接超时(毫秒)

COT/CA/IOA 长度是站内约定,须与对端一致

cotLength / caLength / ioaLength 是 104 报文中各字段的字节宽度,由主站与远动设备在工程组态时约定(典型 2/2/3)。这三项必须与对端配置完全一致,否则报文解析会错位。asduAddress(公共地址)用于区分同一连接下的多个逻辑站。

位号配置(point-attribute

每个采集位号上填,用 IOA 定位要读的信息对象:

属性code类型默认值说明
IOAioaINT0信息对象地址
ASDU TypeasduTypeSTRINGM_ME_NC_1ASDU 类型标识

IOA 定位"读哪个点",ASDU 类型决定数据语义

ioa 是信息对象地址,唯一标识远动设备里的一个数据点。asduType 标明该点的数据类型,默认 M_ME_NC_1(短浮点遥测);遥信常用 M_SP_NA_1(单点)。位号的数据类型(PointpointTypeFlag)要和 ASDU 类型携带的实际数据对得上。

写命令配置(command-attribute

下发遥控的位号还需在写命令上填:

属性code类型默认值说明
Send CommandsendCommandSTRING${value}下发命令模板,用命令参数渲染

sendCommand 是模板,用命令参数占位

sendCommand${参数名} 占位,驱动 execute 时把命令参数(如 ${value})替换进去再下发。默认 ${value} 即直接把命令值作为遥控值。注意:遥控的实际协议下发尚在骨架阶段(见上文 warning)。

采集与健康

  • 采集周期:默认 read cron 0/30 * * * * ?(每 30 秒读一轮);另有 custom 周期任务 cron 0/5 * * * * ?(每 5 秒,供驱动自定义逻辑用)。
  • 健康/在线:设备健康检查默认 cron 0/15 * * * * ?,租约超时 45 秒——在线状态机制见设备

最小接入示例

把 IP 192.168.1.30:2404 的一台远动设备接进来,读一个短浮点遥测:

  1. IEC 104 Driver 创建设备,driver 属性填 host=192.168.1.30port=2404asduAddress=1cotLength / caLength / ioaLength 用默认 2/2/3,与对端约定一致即可)。
  2. 给设备绑定的物模型加一个遥测位号pointTypeFlag=FLOATREAD_ONLY),point 属性填 ioa=16385asduType=M_ME_NC_1
  3. 启动驱动,30 秒内会触发一轮读——协议层补全后即可在位号值里看到采集值。

易错点

COT/CA/IOA 长度对不上 = 整条报文解析错位

104 报文里没有字段分隔符,全靠约定的字节宽度切分。若 cotLength / caLength / ioaLength 与对端不一致,地址会被读到错误的字节上,导致采到的不是目标点甚至解析失败。接入前务必向运维确认对端的 2/2/3(或其他)组态,三项一字不差地照填。

标准端口是 2404,公共地址区分逻辑站

104 标准 TCP 端口是 2404,与 101/Modbus 都不同,别沿用 502。一台远动机下可能挂多个逻辑站,用 asduAddress(公共地址)区分;host / port 相同时,由位号所属设备的 asduAddress 决定连哪个站。

延伸阅读

Released under the AGPL-3.0 License · 基于 AGPL-3.0 协议发布