# dlt860_suite **Repository Path**: kangsong/dlt860_suite ## Basic Information - **Project Name**: dlt860_suite - **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-08-07 - **Last Updated**: 2026-10-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dlt860_suite DL/T 860(CMS)协议栈与客户端工具集 —— 包含通信库、报文编解码库、装置模型库与一个 Qt5 客户端工具。 > 术语约定:本项目所说的 **DLT860** 与 **CMS** 指同一协议;它是 IEC 61850 所用的 **MMS** 之外的另一套协议。涉及编解码、关联协商时请沿用 DLT860/CMS 语义,不要套用 MMS / IEC 61850 的概念。 --- ## 1. 项目组成 | 子项目 | 语言 / 类型 | 说明 | 文档 | | --- | --- | --- | --- | | [`uv_net`](src/uv_net/README.md) | C++11 动态库 | 基于 libuv 的异步网络库:TCP / UDP 客户端与服务端,内置标准 TLS 与国密 GMTLS。**与协议无关**,只管字节流收发 | [README](src/uv_net/README.md)、[设计文档](src/uv_net/docs/design/api/README.md) | | [`dlt860_codec`](src/dlt860_codec/README.md) | 纯 C99 动态库 | DLT860/CMS 报文编解码:BASIC-PER 非对齐位流、56 个服务、帧层粘包与分帧重组、上下文层 `dlt860_ctx`。**不含任何网络 IO** | [README](src/dlt860_codec/README.md)、[设计文档](src/dlt860_codec/docs/design/README.md) | | [`dlt860_model`](src/dlt860_model/README.md) | C++11 动态库 | IED 内存模型:LD / LN / DO / DA 拓扑与运行态数据,支持 SCL(CID/ICD/SCD)导入与编程式建模 | [README](src/dlt860_model/README.md)、[设计文档](src/dlt860_model/docs/DESIGN.md) | | [`gui_dlt860_client`](src/gui_dlt860_client/docs/设计方案.md) | Qt5 可执行程序 | DLT860 客户端工具:多装置 A/B 双网通信、模型生成、参数配置、数据浏览与各类业务界面 | [需求](src/gui_dlt860_client/docs/需求.txt)、[设计方案](src/gui_dlt860_client/docs/设计方案.md) | ### 依赖关系 ``` gui_dlt860_client ──▶ dlt860_model ──▶ dlt860_codec (仅公共头类型) └──────────────────▶ uv_net ``` - `dlt860_codec` 与 `uv_net` **完全解耦**:编解码不碰 socket,通信库不认识协议。二者由应用层(GUI 的 `connector/` 或 example)通过 `dlt860_ctx_feed()` 收、`on_output` 发来串联。 - `dlt860_model` 只复用 `dlt860_codec` 的公共头类型,不依赖其实现。 --- ## 2. 目录结构 ``` dlt860_suite/ ├── build_env.bat # 一键环境配置:设置环境变量 + 启动 CLion 打开 src/ ├── src/ # 全部源码(CMake 根工程 dlt860_suite) │ ├── CMakeLists.txt │ ├── uv_net/ # 网络库 + 3rd(libuv/gmssl/fmt/catch2) │ ├── dlt860_codec/ # 编解码库 + test + example │ ├── dlt860_model/ # 模型库 + 3rd(pugixml) + test + example │ └── gui_dlt860_client/ # Qt5 客户端 └── run/ # 构建输出目录(Debug/Release 下的 dll、exe、pdb 与运行时配置) ``` --- ## 3. 环境要求 | 项 | 要求 | 备注 | | --- | --- | --- | | 操作系统 | Windows(主)/ Linux(codec 与 model 已预留,uv_net 的 TLS 暂仅 Windows) | | | 编译器 | MSVC(Qt 侧为 msvc2017_64)/ MinGW-w64、GCC、Clang | 生成器需与 Qt 的 MSVC 版本匹配 | | CMake | ≥ 3.12 | 顶层 `src/CMakeLists.txt` 要求 | | Qt | Qt 5.12.4(`D:\env\Qt5.12.4\5.12.4\msvc2017_64`,见 `build_env.bat`) | **仅 Qt5,不允许使用 Qt6 特性** | | C++ 标准 | C++11 | `general.cmake` 统一设置;codec 为 C99 | | 第三方依赖 | libuv 1.52.1、pugixml、GmSSL(仅 Windows)、fmt、Catch2 | **均已随仓库提交**,无需额外安装 | ### 环境变量 顶层 `src/CMakeLists.txt` 强制校验 `DLT860_SUITE_RUN_DIR`,未设置会直接报错退出。三个变量由 `build_env.bat` 统一设置: | 变量 | 含义 | | --- | --- | | `DLT860_SUITE_ROOT_DIR` | 仓库根目录 | | `DLT860_SUITE_SRC_DIR` | `src/` 绝对路径,各子项目用它互相 include | | `DLT860_SUITE_RUN_DIR` | `run/` 绝对路径,库与可执行文件的统一输出根目录 | --- ## 4. 构建 ### 方式一:一键脚本(推荐) 双击仓库根目录的 `build_env.bat`:它会设置上述环境变量、配置 Qt 的 `QTDIR`/`PATH`、清理旧的 IDE 缓存目录,然后启动 CLion 并打开 `src/`。在 CLion 中选择 Debug / Release 直接构建即可。 ### 方式二:命令行 ```bat rem 1) 设置环境变量(路径按实际修改) set DLT860_SUITE_ROOT_DIR=D:\Gitee\dlt860_suite set DLT860_SUITE_SRC_DIR=%DLT860_SUITE_ROOT_DIR%\src set DLT860_SUITE_RUN_DIR=%DLT860_SUITE_ROOT_DIR%\run rem 2) 配置 Qt(构建 GUI 子项目必需) set QTDIR=D:\env\Qt5.12.4\5.12.4\msvc2017_64 set PATH=%QTDIR%\bin;%QTDIR%\lib;%PATH% rem 3) 配置并构建(-A x64 指定 64 位,生成器与 Qt 的 MSVC 版本保持一致) cmake -S src -B build -A x64 cmake --build build --config Release ``` 说明: - 未指定 `CMAKE_BUILD_TYPE` 时 `general.cmake` 默认取 **Debug**。 - 产物统一输出到 `run\\`(动态库与可执行文件同目录,故 `build_env.bat` 把 `run\Debug`、`run\Release` 加入了 `PATH`,运行时可直接找到依赖的 dll)。 - 若暂不需要 GUI,可在 `src/CMakeLists.txt` 中注释掉 `add_subdirectory(gui_dlt860_client)`,只构建三个库。 --- ## 5. 开发约定 以下约定跨子项目生效,改动时务必遵守,否则容易产生**静默错误**: 1. **BASIC-PER 非对齐(unaligned)编码**:长度决定量从不字节对齐;SEQUENCE 的 OPTIONAL presence bitmap(preamble)必须写在该 SEQUENCE 所有字段的最前面。详见 [`dlt860_codec` README](src/dlt860_codec/README.md)。 2. **服务分发表必须按 SC 升序**:`dlt860_codec/src/service/dlt860_dispatch.c` 中的 `dlt860_dispatch_table` 采用**二分查找**,新增服务必须插到正确的升序位置,追加到表尾会导致大量服务被错误路由。 3. **编解码与通信解耦**:`dlt860_codec` 不得引入任何 socket / IO;网络一律走 `uv_net`,二者由应用层用 `dlt860_ctx` 串联。 4. **每个 TCP 连接重建后需复位 `dlt860_ctx`**:服务端要求新连接上的 ReqID 从 1 起。`dlt860_ctx_clear()` 是 `memset` 全零(会清掉回调指针),必须与 `dlt860_ctx_init()` 配对调用。 5. **Qt 只用 Qt5 特性,C++ 标准为 C++11**(`gui_dlt860_client`)。 6. **术语统一用 DLT860 / CMS**,不要用 MMS / IEC 61850 的语义描述本项目的服务与字段。 --- ## 6. 当前进度 - `uv_net`、`dlt860_codec`、`dlt860_model`:功能已完整,各自带单元测试与示例程序。 - `gui_dlt860_client`: - `connector/`(多 IED、A/B 双网、自动关联、Test 心跳、收发指示灯)、`config/`(参数配置与持久化)、`model/`(SCL 导入与建模)已可用; - `ied_view/` 下的数据对象、数据集、控制块、遥控、保护定值、日志查询、文件操作等页面目前为界面骨架,业务功能逐步接入中。