# iec101codes **Repository Path**: rufeng-2008/iec101codes ## Basic Information - **Project Name**: iec101codes - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-11 - **Last Updated**: 2026-05-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IEC 60870-5-101 主站模拟器 [![Rust](https://img.shields.io/badge/Rust-1.75+-orange.svg)](https://www.rust-lang.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Version](https://img.shields.io/badge/version-1.1.0-green.svg)](CHANGELOG.md) 基于 Rust 实现的 IEC 60870-5-101 远动通信协议主站模拟器,支持非平衡/平衡模式通信、数据采集、遥控操作和实时监控。 ## 功能特性 ### 协议栈 (`iec101-protocol`) - 完整的 IEC 60870-5-101 帧格式解析/构造(固定帧、可变帧、单字节帧) - ASDU 类型支持:遥信、遥测、遥脉、遥控、遥调、总召唤、时钟同步等 - 链路层状态机(非平衡模式) - CP56Time2a 时标编解码 - 零拷贝、无 async 依赖的纯协议库 ### 主站核心 (`iec101-master`) - 设备连接管理(指数退避重连) - 非平衡模式完整轮询流程(链路复位 → 总召唤 → Class1/Class2 轮询) - 超时与重传机制(T1/T2/T3) - 1类/2类数据缓冲 - 数据点存储与事件通知 - Actor Supervisor 模式,支持优雅关闭 ### GUI (`iec101-gui`) - 基于 egui 的跨平台图形界面 - 设备列表与状态监控 - 数据点表格(虚拟滚动,支持大量数据点) - 报文监控窗口(十六进制显示、分类筛选) - 暗色/亮色主题切换 ### CLI (`iec101-cli`) - 命令行设备连接与数据轮询 - 串口扫描 - 配置文件管理(验证/生成/查看) - 总召唤、时钟同步、遥控操作 ### IEC 104 TCP 支持 (`iec101-protocol`) - APDU 帧格式(I/S/U 三种格式) - 控制域编解码(序列号管理、STARTDT/STOPDT/TESTFR) - TCP 传输层实现 ### Modbus 网关 (`iec101-master`) - Modbus RTU 帧格式编解码 - CRC-16/MODBUS 校验 - 8 个标准功能码 (0x01-0x10) - IEC 101 ↔ Modbus 协议网关(数据点映射) ### REST API (`iec101-master`) - 基于 axum 的 HTTP 服务器,6 个端点 - `GET /api/health` — 健康检查 - `GET /api/points` — 获取所有数据点 - `GET /api/devices` — 获取设备状态列表 - `GET /api/stats` — 获取统计信息 ### Web 监控面板 - 嵌入式暗色主题 HTML 前端 - 设备状态/数据点/统计信息实时展示 - 自动刷新(3 秒间隔) ### 数据持久化 - JSONL 文件存储,按日期分文件 - 支持设备/地址查询、过期清理、统计 ## 快速开始 ### 安装 ```bash # 克隆仓库 git clone https://gitee.com/rufeng-2008/iec101codes.git cd iec101codes # 编译 cargo build --release # 运行测试 cargo test --workspace ``` ### 配置 创建 `iec101.toml` 配置文件: ```toml [global] link_addr_len = 1 # 链路地址长度 (1 或 2 字节) ca_len = 1 # 公共地址长度 (1 或 2 字节) ioa_len = 2 # 信息对象地址长度 (1, 2 或 3 字节) [[devices]] id = "rtu-01" name = "RTU 设备 1" enabled = true port = "/dev/ttyUSB0" baudrate = 9600 link_address = 1 common_address = 1 ``` ### 使用 ```bash # 扫描可用串口 cargo run -p iec101-cli -- scan # 连接设备并开始轮询 cargo run -p iec101-cli -- connect # 启动 GUI cargo run -p iec101-gui # 指定设备连接 cargo run -p iec101-cli -- connect --device rtu-01 # 时长限制(运行 60 秒) cargo run -p iec101-cli -- connect -t 60 ``` ## 项目结构 ``` iec101codes/ ├── Cargo.toml # Workspace 配置 ├── crates/ │ ├── iec101-protocol/ # 协议栈(纯库,无 IO 依赖) │ │ ├── src/ │ │ │ ├── constants.rs # 协议常量 │ │ │ ├── types.rs # 类型枚举 (COT, ASDU ID) │ │ │ ├── time.rs # CP56Time2a 时标 │ │ │ ├── codec.rs # 统一编解码入口 │ │ │ ├── frame/ # 帧解析/构造 │ │ │ ├── link/ # 链路层(控制域、状态机、功能码) │ │ │ └── asdu/ # ASDU 类型实现 │ │ └── tests/ │ │ └── test_conformance.rs # 协议一致性测试 │ ├── iec101-master/ # 主站核心(设备管理、数据采集、REST API) │ ├── iec101-gui/ # GUI 前端 │ └── iec101-cli/ # CLI 工具 ├── docs/ │ ├── NEXT_STEPS.md # 后续发展计划 │ ├── architecture.md # 架构文档 │ ├── user_guide.md # 用户手册 │ └── deployment.md # 部署指南 ├── examples/ # 使用示例 └── CHANGELOG.md # 变更日志 ``` ## 支持的 ASDU 类型 | 类型 ID | 名称 | 方向 | 说明 | |:---:|------|:---:|------| | 1 | M_SP_NA_1 | ← | 单点遥信 | | 2 | M_DP_NA_1 | ← | 双点遥信 | | 3 | M_ST_NA_1 | ← | 步位置信息 | | 5 | M_BO_NA_1 | ← | 32 比特串 | | 9 | M_ME_NA_1 | ← | 测量值(规一化) | | 11 | M_ME_NB_1 | ← | 测量值(标度化) | | 13 | M_ME_NC_1 | ← | 测量值(浮点) | | 14 | M_IT_NA_1 | ← | 累计量 | | 21 | C_SC_NA_1 | → | 单命令 | | 22 | C_DC_NA_1 | → | 双命令 | | 24 | C_SE_NA_1 | → | 设定命令(规一化) | | 30 | M_SP_TB_1 | ← | 带时标单点遥信 | | 31 | M_DP_TB_1 | ← | 带时标双点遥信 | | 34 | M_ME_TD_1 | ← | 带时标测量值 | | 70 | M_EI_NA_1 | ← | 初始化结束 | | 100 | C_IC_NA_1 | → | 总召唤命令 | | 103 | C_CS_NA_1 | → | 时钟同步命令 | | 58 | C_SC_TA_1 | → | 带时标单命令 | | 201 | M_IT_TB_1 | ← | 带时标累积量 | | 120-127 | F_xx_NA_1 | ↔ | 文件传输(8 种 ASDU) | ## 依赖 - Rust 1.75+ - tokio (异步运行时) - serialport (串口通信) - egui (GUI 框架) - serde + toml (配置管理) - tracing (日志) ## 许可证 MIT License