资讯动态

Serial Studio 的 IEC 60870-5-104 从站模拟器与监控实践:从点表发现到项目生成

发布时间:2026/9/18 23:50:01 来源:尧图企业网站定制
Serial Studio 的 IEC 60870-5-104 从站模拟器与监控实践从点表发现到项目生成【免费下载链接】Serial-StudioOpen-source telemetry dashboard. Supports UART, BLE, MQTT, Modbus, CAN Bus and more.项目地址: https://gitcode.com/GitHub_Trending/se/Serial-Studio本文以examples/IEC 104 Example示例为中心完整讲解如何在 Serial Studio 中使用 IEC 60870-5-104 协议规范 0073连接模拟变电站包括零配置运行从站模拟器、理解 APCI/ASDU 协议细节与 k/w/t1/t2/t3 窗口参数、体验点表自动发现Point Discovery与一键生成项目Create Project from Points的完整工作流。读完本文你将掌握 Serial Studio 作为 104 客户端连接任意严格 104 从站所需的全部配置知识并能独立用命令行参数完成无头headless采集。注意IEC 60870-5-104 支持属于 Serial Studio Pro 功能需持有 Pro 许可方可使用详见项目的 License-Agreement.md 与 Pro-vs-Free.md。一、示例概览一个真实协议行为的迷你 104 从站examples/IEC 104 Example目录包含三个文件iec104_server.py用 Python 标准库实现的受控站substation/RTU模拟器IEC 104 Station.ssproj预先生成的 Serial Studio 工程连接后自动启动模拟器README.md本文所依据的原始说明。这个模拟器不是打桩它接受一个控制站连接用STARTDT con应答STARTDT act以激活确认 全部点集 激活终止完整应答站总召唤station interrogation并持续发送自发spontaneous更新同时严格维护协议要求的 k/w 发送与确认序号账目。在客户端一侧没有任何桩代码——Serial Studio 的 APCI 状态机、序号检查、确认窗口与 ASDU 解码器全部以与对接真实变电站 RTU 完全一致的方式运行。从源码结构看Serial Studio 的 104 协议栈被拆成两个 Qt-Core-only、无 QObject、不持有任何定时器的纯字节编解码模块core/Protocols/Iec104/Apci.hAPCI 传输层负责 I/S/U 三种帧格式、15 位序号计数器、k/w 窗口与 t1/t2/t3 截止时间core/Protocols/Iec104/Asdu.hASDU 应用层负责 6 字节 ASDU 头与信息对象解码。由于两个模块都消费和产生字节、对外部时钟查询截止时间app/tests/tst_iec104_apci.cpp得以用假时钟在无 socket、无事件循环的情况下把整个时序契约跑完例如startDtHandshakeCompletes、sendWindowClosesAtK、acknowledgementIsDueAtWindowW、unconfirmedActivationExpiresAtT1、sequenceCountersWrapAtFifteenBits等测试用例。二、运行模拟器零手工依赖模拟器只依赖 Python 3 标准库无需任何第三方包。最省事的方式是直接打开捆绑工程IEC 104 Station.ssproj的控制脚本controlScript在你按下Connect的瞬间自动在127.0.0.1:2404启动iec104_server.py当你断开连接、切换工程或退出应用时Serial Studio 会自动停止该辅助进程。从 IEC 104 Station.ssproj 的controlScriptCode可以看到脚本先尝试python3失败后回退到pythonWindows 常见并以-u无缓冲模式、--host 127.0.0.1 --port 2404启动模拟器。因此打开工程、按下 Connect即可完成无需手工启动任何东西。如果你想手工启动模拟器或让其他 104 客户端连接它python3 iec104_server.py端口 2404 是规范为 IEC 60870-5-104 分配的端口对应源码中的kDefaultPort 2404见 Apci.h且大于 1024因此不需要管理员权限。模拟器命令行参数模拟器通过 argparse 解析参数见 iec104_server.pyFlag作用默认值--host ADDR监听地址--bind是等价别名127.0.0.1--port N监听端口2404--ca NASDU 公共地址common address1--k N发送窗口N 个未确认 I 帧后从站停止发送12--w N确认窗口收到 N 个 I 帧后从站发送 S 帧8--t2 MS确认超时毫秒10000--t3 MS空闲测试超时此后无流量即发送TESTFR act20000--interval S自发更新周期秒1.0此外模拟器在启动时会校验w k否则报错退出见main()中的检查--k、--w、--t2、--t3与 Serial Studio 客户端侧的windowK、windowW、timeoutT2、timeoutT3一一对应。三、模拟器服务的点表模拟器维护 5 个信息对象地址IOA分为 3 个模拟量M_ME_NC_1类型 13IEEE-754 短浮点 质量描述符和 2 个单点状态量M_SP_NA_1类型 1SIQ 低比特位承载状态IOA类型名称行为1001M_ME_NC_1 (13)Bus voltage在 11 kV 附近缓慢波动1002M_ME_NC_1 (13)Line current断路器闭合时约 145 A断开时为 01003M_ME_NC_1 (13)Frequency50 Hz 加少量抖动2001M_SP_NA_1 (1)Breaker closed发生故障时打开2002M_SP_NA_1 (1)Fault active偶发触发下个事件时清除其数值模型在 iec104_server.py 的Station类中电压为11000 180·sin(t/23) ± 8的正弦游走电流在断路器闭合时为145 25·sin(t/11) ± 1.5频率为50 0.04·sin(t/7) ± 0.01step()以 3% 概率翻转故障/断路器状态。行为要点模拟量在每个--interval秒以传输原因 3自发重发状态量只在变化时重发——这是真实变电站的行为事件上报稳态不上报。对应源码中send_updates()只在step()返回 True状态变化时才发送单点 ASDU。四、连接参数与窗口语义在 Serial Studio 中选择IEC 60870-5-104作为 I/O 接口后连接面板参数如下即 IEC 104 Station.ssproj 中sources[0].connection的实际取值设置值含义Host127.0.0.1从站地址Port2404规范为 IEC 60870-5-104 分配的端口Common Address1在 ASDU 内选择从站其他公共地址的帧一律丢弃Send Window (k)12本侧允许在途的未确认 I 帧数Ack Window (w)8收到多少个 I 帧强制发送一次确认Timeout t1 (ms)15000一个 I 帧或一次激活长时间未确认视为链路失效Timeout t2 (ms)10000确认截止时间必须短于 t1Timeout t3 (ms)20000静默这么长时间触发TESTFR act保活Serial Studio 会把这些参数钳制到规范允许的范围内w受k约束、t2受t1约束所有超时限制在 1–255 秒之间。在 Apci.h 中可以看到这些边界常量kMinWindow1、kMaxWindow32767、kMinTimeMs1000、kMaxTimeMs255000而configurationIsClampedToLegalRanges测试用例专门验证钳制逻辑。上述默认值正是规范自身的默认值。最容易踩坑的参数是 Common AddressASDU 公共地址不匹配的帧会被静默忽略。如果从站配成 CA 2、客户端配成 CA 1连接、召唤都会成功但界面什么都显示不出来——这最容易被误判为链路坏了。模拟器侧同样会打印ignoring ASDU for common address ...并丢弃不匹配的 ASDU见 iec104_server.py。五、单连接约束与断线行为104 驱动用自己的 socket、只拨一次号并直接以该次拨号结果报告成功或失败没有探测 socket、没有拨号定时器、没有重试栈。原因很实在——严格 104 从站只允许一个控制站探测 socket 会被算作第二个控制站。模拟器同样强制此规则listener.listen(1)见 iec104_server.py所以第二个 Serial Studio 实例会排队等待直到第一个断开。如果链路断开它保持断开断线后的恢复是操作者的决定而非驱动的责任按Connect重新连接即可。六、点表发现Point Discovery无需配置任何点除端点endpoint外无需配置任何东西点表是发现而非声明的。整个流程客户端打开连接并发送STARTDT act收到STARTDT con后发送 QOI 20 的C_IC_NA_1站总召唤从站依次应答激活确认、全部点集、激活终止对应 iec104_server.py 的run_interrogation()CAUSE_ACT_CONFIRM→ 模拟量 COT 20 → 单点 COT 20 →CAUSE_ACT_TERMINATE应答中携带的每个信息对象地址按到达顺序分配一个 wire slot。槽位只追加、从不重编号——从站后续上报新点不会重新指向已生成工程的 dataset发现表会被持久化这正是已保存工程的 dataset 索引在多次重启后依然有效的原因。从 core/Devices/IO/Drivers/Iec104.h 的Iec104Point与Iec104驱动注释可以看到同样的设计position in the table IS the wire slot点表按首次出现的顺序排列驱动头文件也明确写着The point list is DISCOVERED rather than configured: the station interrogation answers with its database。此外 Asdu.h 的slotKey(ioa, typeId)揭示了一个细节104 协议中信息对象地址要配合类型标识才唯一因此槽位键是(typeId 32) | ioa——同一地址同时用作单点输入和模拟量时不会被互相顶替错编。七、从点表生成工程Create Project from Points启动模拟器选择IEC 60870-5-104作为 I/O 接口设置 Host、Port 与 Common Address按Connect等待面板上报发现的点本地一次总召唤不到一秒钟按Create Project from PointsProject Editor 打开自动生成Measurements组每个模拟量一个曲线图和Status Points组每个单点一个 LED保存并关闭编辑器。也可以直接打开捆绑的IEC 104 Station.ssproj——它就是上述生成结果并补充了单位。从 IEC 104 Station.ssproj 可以看到Measurements 组内 dataset 标题为IOA 1001单位 V、IOA 1002单位 A、IOA 1003单位 Hzgraph: trueStatus Points 组内IOA 2001、IOA 2002为led: true的 LED 数据集sources[0].frameParserTemplate为iec104frameParserParams.schema记录了 5 个槽位的名字。dataset 以地址命名IOA 1001等因为信息对象地址是 104 从站发布的唯一身份——协议里没有名字。八、命令行模式无头采集Serial Studio 提供了完整的 104 命令行入口CLI 选项定义见 app/src/Misc/CLI.hSerialStudio --iec104 127.0.0.1 --iec104-port 2404 --iec104-ca 1首次无头运行没有可供生成工程的点表因为点还未被发现。可以运行一次完成发现或传--project指定一个已携带点表的工程文件。完整的 CLI 参数族除--iec104/--iec104-port/--iec104-ca外还有窗口与时序参数参数含义默认值--iec104 HOST连接到的 104 从站地址如192.168.0.20—--iec104-port N端口2404--iec104-ca NASDU 公共地址0–655351--iec104-k N发送窗口 k12--iec104-w N确认窗口 w8--iec104-t1 MS发送/确认超时毫秒15000--iec104-t2 MS确认超时毫秒10000--iec104-t3 MS空闲测试超时毫秒20000在 app/src/Misc/CLI/CliIndustrialConfig.cpp 的applyIec104Timing与setupIec104Connection中可以看到这些参数如何落盘窗口 k/w 被钳制在 1–32767、超时被钳制在 1000–255000 毫秒随后依次调用setWindowK/setWindowW/setTimeoutT1/2/3、setCommonAddress并在未指定--project时尝试loadGeneratedProject()。九、协议行为与边界Notes只做监视monitor only客户端不实现控制方向——命令、设定值、文件传输均不在范围内总召唤interrogation是驱动写出的唯一帧。模拟器同样如此见 iec104_server.py 的 docstring。无效质量位质量描述符带 invalid 位的点会被计数但不上锁not latched——从站是在说自己的读数不可信因此屏幕保留最后一个好值而不是被故障值覆盖。对应 Asdu.h 中的归一化质量枚举QualityGood0x00、QualityInvalid0x10等以及 Iec104 驱动delta publishing仅发布变化值的设计注释。时间戳当类型携带 CP56Time2a 时间戳时时间来自从站并通过首个带戳点到达时采样的偏移映射到本地时钟。本模拟器服务的类型M_ME_NC_1、M_SP_NA_1均为无时间戳类型因此使用接收时间。畸形或乱序帧即断会话规范没有重同步规则猜测下一个帧边界就是让解码器把噪声当遥测发布。ParseResult::OutOfOrder/ParseResult::Malformed正是为此设计见 Apci.houtOfOrderSendSequenceIsRefused、malformedFramesAreCountedAndRefused等测试用例也对这一行为做了回归保护。十、快速排障清单现象排查方向连接成功但无数据显示检查 Common Address 是否与从站一致最常见原因确认从站已应答总召唤数据断断续续或停更核对 k/w 窗口与 t1/t2/t3 是否在规范范围内且满足 t2 t1第二个实例连不上严格 104 从站只允许一个控制站等待第一个断开后再连无头运行首次无数据先运行一次完成点发现或--project指定已带点表的工程需要核对协议行为阅读 app/tests/tst_iec104_apci.cpp 中的 18 组用例它们是协议语义的精确说明相关资源示例本体examples/IEC 104 Example/协议栈 APCI 层core/Protocols/Iec104/Apci.h、core/Protocols/Iec104/Apci.cpp协议栈 ASDU 层core/Protocols/Iec104/Asdu.h、core/Protocols/Iec104/Asdu.cpp104 驱动core/Devices/IO/Drivers/Iec104.h协议测试app/tests/tst_iec104_apci.cpp、app/tests/tst_iec104_asdu.cpp、app/tests/tst_iec104_slots.cppCLI 实现app/src/Misc/CLI.h、app/src/Misc/CLI/CliIndustrialConfig.cpp相关帮助文档Communication-Protocols.md、Drivers-Network.md、Command-Line-Interface.md【免费下载链接】Serial-StudioOpen-source telemetry dashboard. Supports UART, BLE, MQTT, Modbus, CAN Bus and more.项目地址: https://gitcode.com/GitHub_Trending/se/Serial-Studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价