# cm100通信管理平台 **Repository Path**: sqtech_2018/cm100 ## Basic Information - **Project Name**: cm100通信管理平台 - **Description**: cm100通信管理平台,基于linux系统 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-02-26 - **Last Updated**: 2026-03-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CM100通信管理平台 ## ### 1.1. 背景与目标 随着智能电网的发展,变电站、发电厂及调度中心存在多种电力通信协议(如IEC 60870-5-101/104、IEC 61850 MMS/GOOSE、Modbus、DL/T 645、CDT等)。本平台旨在构建一个统一的高性能协议转换网关,将各种异构的电力协议转换为标准化的内部格式或目标协议(如MQTT、IEC 61850或自定义实时库格式)。 ### 1.2. 设计目标 - **高性能与低延迟**:满足电力系统实时性要求(毫秒级响应)。 - **高可靠性**:7x24小时不间断运行,支持故障自恢复。 - **协议扩展性**:通过插件机制,无缝接入新协议。 - **资源隔离与稳定性**:利用多进程模型,避免单个协议解析故障导致整个系统崩溃。 - **数据共享高效**:使用共享内存作为实时库,实现零拷贝数据交换。 ## 2. 总体架构 本平台采用经典的 **Master-Worker 多进程架构**。Master进程负责管理、监控和配置下发;Worker进程负责具体的协议解析与转换。数据存储于基于共享内存的实时数据库中。 ### 2.1. WEB监控图 ![输入图片说明](image3.png) ![输入图片说明](image2.png) ### 2.2. 核心组件说明 - **Master进程**:系统的控制中心。负责解析配置文件、创建共享内存、启动/停止/监控Worker进程、接收信号并进行优雅重启/停止。 - **Worker进程**:实际的工作进程。每个Worker实例加载一种特定的**协议插件**,处理一路或多路物理/网络链接。 - **共享内存实时库**:系统的数据中心。所有实时数据(遥测、遥信、电度)均存储于此,支持Master和所有Worker的快速读写。 - **插件管理器**:内置于Worker进程中,负责动态加载`.so`共享库文件。 ## 3. 详细设计 ### 3.1. 多进程模型 (Master-Worker) #### 3.1.1. 进程生命周期管理 - **启动流程**: 1. Master进程启动,读取配置文件 `config.toml`。 2. Master根据配置计算所需共享内存大小,调用 `shm_open` 创建共享内存对象。 3. Master初始化共享内存头部信息(签名、版本、进程表、信号量等)。 4. Master遍历配置中的协议实例,针对每个实例 `fork()` 出对应的Worker进程。 5. Worker进程启动后,执行 `execve` 加载通用的Worker程序主体,并传入实例ID和共享内存句柄作为参数。 6. Worker进程根据实例ID,从共享内存的配置区读取具体配置,并动态加载指定的协议插件。 - **监控与保活**: - Master维护一个Worker进程信息表(位于共享内存中,或Master私有内存)。 - Master通过 `waitpid` 非阻塞轮询或接收 `SIGCHLD` 信号来感知Worker退出。 - 若Worker异常退出,Master记录日志,并根据配置的重启策略(如最大重启次数、间隔)决定是否重新拉起该Worker。 - **心跳机制**: - Worker进程定期(如每秒)更新共享内存中对应进程表项的时间戳。 - Master进程扫描进程表,检查是否超时。超时的Worker将被Master强制杀死(`SIGKILL`)并重新启动。 #### 3.1.2. 进程间通信 (IPC) - **控制指令**: 通过 **信号 (Signal)** 和 **共享内存标志位**。 - `SIGTERM`: Master通知所有Worker优雅退出。 - `SIGUSR1`: Master通知Worker重新加载插件或配置(实现热加载)。 - Worker通过在共享内存中写入状态码,向Master报告状态(如“配置加载失败”、“通信中断”)。 - **数据流**: 通过 **共享内存**。Worker将采集到的数据直接写入实时库区域,无需经过Master转发。 ### 3.2. 共享内存实时库设计 实时库的本质是一块组织良好的共享内存。必须保证其访问效率和并发安全。 #### 3.2.1. 内存布局 text ``` +-------------------------------+ <--- 基地址 (shm_base) | 头部 (Header) | | - 魔数/签名 | | - 版本号 | | - 实时库大小 | | - 点表偏移量 | | - 信号量集句柄 | +-------------------------------+ | 进程表 (ProcTable) | | - Worker 1 状态/pid/心跳时间戳 | | - Worker 2 ... | +-------------------------------+ | 配置索引区 (Config Index) | | - 各Worker配置块的指针/偏移量 | +-------------------------------+ | 点表索引区 (Point Index) | | - 点ID到实时数据指针的哈希表/跳表| +-------------------------------+ | 实时数据区 (Data Area) | | - 点 1 的值 (含质量戳、时标) | | - 点 2 的值 | | - ... | +-------------------------------+ | 配置存储区 (Config Storage) | | - Worker实例的运行时配置字符串 | +-------------------------------+ ``` #### 3.2.2. 并发访问控制 - **读写锁策略**: 由于电力系统“读多写少”的特点,使用 **读写锁** 来保护数据块。 - Worker在写入某个点的值时,获取该点的写锁(或该点所在分片的写锁)。 - 上层应用/接口读取时,获取读锁,允许多个读操作并发。 - **无锁设计优化**: 对于高性能要求的点,可采用 **双缓冲 (Double Buffer)** 或 **序列锁 (Seqlock)**。Writer更新一个副本,更新完成后原子地切换全局指针。Reader读取时无锁,通过检查序列号判断是否在读的过程中发生了写操作。 ### 3.3. 插件机制 插件机制使得平台可以解耦协议实现,方便扩展。 #### 3.3.1. 插件接口定义 Worker进程主程序定义了一套纯C的接口(推荐C,以保证ABI稳定)。 #### 3.3.2. 插件加载与管理 - **存放位置**: 插件编译为 `.so` 文件,存放在指定目录 `/cm100/libplugin/`。 - **加载流程**: 1. Worker根据配置中的 `plugin_name` (如 `iec104.so`),使用 `dlopen()` 打开动态库。 2. 使用 `dlsym()` 获取 `plugin_ops` 结构体符号。 3. 调用 `plugin_ops.init`,传入从共享内存读取到的JSON或文本配置,以及共享内存基址。 4. 调用 `plugin_ops.start` 启动协议处理。 - **事件循环**: Worker进入 `while(running)` 循环,调用 `plugin_ops.poll`。`poll` 函数内部实现非阻塞的协议报文收发、解析,并将解析后的数据写入共享内存。 ### 3.4. 协议转换流程 以 **IEC 104 Slave 转 内部实时库** 为例: 1. **接入**: Worker加载 `libplugin_iec104.so` 插件,插件启动TCP Server监听 `2404` 端口。 2. **接收**: 主站建立连接,发送总召唤命令。插件解析APCI/ASDU。 3. **映射**: 插件根据配置,将报文的 `IOA` (信息对象地址) 映射为内部的 `point_id` (例如: `0x01010001`)。 4. **存储**: 插件获取共享内存中 `point_id` 对应数据结构的写锁,更新值、质量位和时标,然后释放锁。 5. **反向转换**: 当Master进程或外部接口需要遥控时,通过某种IPC(如消息队列)通知特定Worker。Worker插件将 `point_id` 和值封装成 `IEC 104` 的遥控报文,下发至链路。 ## 4. 接口设计 ### 4.1. 配置接口 - **输入**: 配置文件 - **格式**: TOML/YAML/JSON,易于人类阅读和程序解析。 - **内容**: - 全局配置:共享内存大小、日志级别。 - 协议实例列表:每个实例包含 `instance_id`, `plugin`,以及该协议的专有参数。 ### 4.2. 数据访问接口 - **本地接口**: - 提供一组C/C++/Python的SDK,封装对共享内存的操作。其他本地进程可以通过链接SDK直接访问实时库。 - **远程接口**: - **WEB CGI**: Master进程可嵌入一个轻量级HTTP服务器,提供点表查询、实时值查询、遥控操作等接口。 ## 5. 可靠性设计 1. **进程隔离**: 单个Worker因协议解析bug而崩溃,不会影响Master和其他Worker。Master监控机制保证Worker被重新拉起。 2. **共享内存保护**: - 使用信号量防止数据竞争。 - 引入“看门狗”线程,检查数据结构的完整性。 3. **配置校验**: Master在启动和下发配置前,对配置进行严格的语法和逻辑校验,防止错误配置导致运行故障。 4. **日志系统**: 统一使用 `syslog` 或本地日志文件,区分 `ERROR`, `WARN`, `INFO`, `DEBUG` 级别,便于问题追踪。 5. **资源限制**: 使用 `setrlimit` 对Worker进程设置CPU时间、内存、打开文件数等限制,防止资源耗尽。 ## 6. 总结 本设计定义了一个健壮、高性能且可扩展的电力协议转换平台。通过 **Master-Worker多进程** 确保容错性,通过 **共享内存实时库** 实现数据的高效流转,并通过 **插件机制** 解决了电力行业协议繁多、变化频繁的痛点。该方案适用于变电站数据集中器、物联网边缘网关等多种电力物联网场景。 email:sqtech_2018@163.com QQ : 3521967540