IEC 60870-5-104
Zeus 的 IEC104 模块面向电力远动、能源网关和站端数据采集场景。当前内置覆盖主站常用路径:STARTDT 启动、总召唤、单点命令,以及归一化、标度化、短浮点测量值和设点。链路层实现 IEC 60870-5-104 的 t1/t2/t3 与 k/w 窗口:t1 等待 I/U 确认,t2 最迟发送 S 格式,t3 空闲发送 TESTFR act。
安装
dotnet add package Zeus.Communications
dotnet add package Zeus.Protocols.Iec104
IEC104 通常跑在 TCP 通道上。无硬件时可以先挂虚拟站:
var options = new Iec104Options { CommonAddress = 7 };
var memory = new Iec104StationMemory();
memory.SetSinglePoint(1, true);
memory.SetScaled(100, 253);
memory.SetShortFloat(200, 25.3);
await using var app = ZeusHost.Create(builder =>
{
builder.AddVirtualChannel("iec-link", new Iec104SlaveResponder(options, memory));
builder.AddIec104("station", "iec-link", options);
});
await app.StartAsync();
var station = app.Devices.Get<Iec104Device>("station");
var values = await station.InterrogateAsync();
换真实网关时,把通道换成 TCP:
builder.AddTcpClient("iec-link", "192.168.1.20", 2404);
builder.AddIec104("station", "iec-link", new Iec104Options { CommonAddress = 7 });
点表采集
builder.AddAcquisition(TimeSpan.FromMilliseconds(1000));
builder.AddIec104(
"station",
"iec-link",
new Iec104Options { CommonAddress = 7 },
points: map => map
.SinglePoint("running", 1)
.Scaled("temperature", 100, scale: 0.1)
.ShortFloat("pressure", 200));
采集循环会周期执行总召唤,并把匹配到的 IOA 发布到点表。Scaled 配置 scale: 0.1 时,线值 253 会发布为工程值 25.3。
写回
builder.AddIec104(
"station",
"iec-link",
new Iec104Options { CommonAddress = 7 },
points: map => map
.SinglePoint("remoteSwitch", 1).Writable("remoteSwitch")
.Scaled("setpoint", 100, scale: 0.1).Writable("setpoint"));
await app.Points.WriteAsync("remoteSwitch", true);
await app.Points.WriteAsync("setpoint", 18.6);
SinglePoint 使用单点命令。Normalized、Scaled、ShortFloat 分别使用对应设点命令;配置了 scale 的点会在写回前反向换算为线值。
JSON 配置
{
"channels": [
{
"name": "iec-link",
"type": "tcp",
"options": {
"host": "192.168.1.20",
"port": 2404
}
}
],
"devices": [
{
"name": "station",
"channel": "iec-link",
"type": "iec104",
"options": {
"commonAddress": 7,
"t1Milliseconds": 15000,
"t2Milliseconds": 10000,
"t3Milliseconds": 20000,
"maxUnacknowledgedIFrames": 12,
"acknowledgeWindow": 8
},
"points": [
{
"name": "running",
"options": {
"address": 1,
"dataType": "single-point"
}
},
{
"name": "temperature",
"options": {
"address": 100,
"dataType": "scaled",
"scale": 0.1
}
},
{
"name": "pressure",
"options": {
"address": 200,
"dataType": "short-float"
}
}
]
}
]
}
虚拟站配置可写成:
{
"name": "iec-link",
"type": "virtual",
"options": {
"responder": "iec104",
"commonAddress": 7
}
}
支持范围
| 类型 | 方向 | Zeus 类型 |
|---|---|---|
M_SP_NA_1 / C_SC_NA_1 | 采集 / 写回 | SinglePoint |
M_ME_NA_1 / C_SE_NA_1 | 采集 / 写回 | Normalized |
M_ME_NB_1 / C_SE_NB_1 | 采集 / 写回 | Scaled |
M_ME_NC_1 / C_SE_NC_1 | 采集 / 写回 | ShortFloat |
链路层定时器默认对齐附录:t1=15s、t2=10s、t3=20s、k=12、w=8。联调虚拟站时可把 t3Milliseconds 设为 0 关闭 TESTFR。t1 超时会复位序号并要求重新 STARTDT。
如果现场需要时标 ASDU、双点命令、文件传输或平衡传输扩展,建议先用通道追踪确认对端实际帧,再扩展 Zeus.Protocols.Iec104。