# RCB 订阅编号可配置化 **日期**:2026-06-10 **状态**:已完成 --- ## 问题描述 `libmms_m` 模块中 `mms_m_icd_report_init()` 硬编码了 `if(0 == rpt_no.compare("01"))`,只订阅编号末尾为 `"01"` 的 RCB 实例,其他编号直接丢弃。当 IED 提供多个 RCB 实例(如 EventsRCB01、EventsRCB02)时,无法灵活订阅。 ## 需求 1. 灵活的可配置订阅的控制块编号 2. `libmms_m` 提供接口,由 `libiec61850m` 调用接口传入 3. 可以传入一个或多个,如果不调用,默认订阅 `"01"` 4. 如果传入无效数据,打印提示信息,返回失败,初始化流程返回失败 ## 设计方案 ### 涉及文件 | 文件 | 修改内容 | |------|---------| | `release/inc/myMms_m.h` | 新增 API 声明 | | `src/protocol/libmms_m/inc/mms_m.h` | `stru_mms_m_obj` 新增存储字段 | | `src/protocol/libmms_m/src/mms_m.cpp` | 新增 API 实现 + 修改过滤逻辑 | | `src/system/libiec61850m/src/iec61850m.cpp` | 调用新 API 传入配置 | ### API 设计 ```c int mms_m_out_set_rcb_numbers(int app_fd, const char *rcb_numbers); ``` 参数格式:逗号分隔的两位数字编号,如 `"01,02,03"`,特殊值 `"*"` 表示全部。 ### 输入格式定义 | 输入 | 行为 | |------|------| | 不调用此 API | 默认订阅 `"01"` | | `"01"` | 订阅编号 `"01"` | | `"01,02,03"` | 订阅 `"01"` `"02"` `"03"` | | `"*"` | 订阅全部 RCB | | `"abc"` / `"1"` / `"012"` | 非法,返回 -1 | ### 存储设计 ```cpp // stru_mms_m_obj 新增字段 std::vector rcb_numbers; // 空=默认"01" ``` ### 匹配函数 ```cpp static bool mms_m_rcb_number_match(stru_mms_m_obj &obj, const std::string &rpt_no) { if (obj.rcb_numbers.empty()) return (rpt_no == "01"); // 默认 for (auto &n : obj.rcb_numbers) if (rpt_no == n) return true; return false; } ``` ## 实现流程 1. **myMms_m.h**:在 `mms_m_out_bind_param_zone_signal` 声明后新增 `mms_m_out_set_rcb_numbers` API 声明 2. **mms_m.h**:在 `stru_mms_m_obj.current_zone` 后新增 `rcb_numbers` 字段 3. **mms_m.cpp**: - 新增 `#include ` 头文件 - 新增 `mms_m_rcb_number_match()` 静态匹配函数 - 新增 `mms_m_out_set_rcb_numbers()` API 实现(按逗号分割、去空格、校验恰好2位数字) - 修改 `mms_m_icd_report_init()` 中 `rpt_no.compare("01")` → `mms_m_rcb_number_match(obj, rpt_no)` 4. **iec61850m.cpp**:在 `iec61850m_init()` 中 `mms_m_out_init()` 之后调用新 API,当前传入 `"01"` ## 变更记录 | 文件 | 行号(修改后) | 变更 | |------|--------------|------| | `myMms_m.h` | 170 | 新增 `int mms_m_out_set_rcb_numbers(...)` | | `mms_m.h` | 183 | 新增 `std::vector rcb_numbers` | | `mms_m.cpp` | 7 | 新增 `#include ` | | `mms_m.cpp` | 1342-1355 | 新增 `mms_m_rcb_number_match()` | | `mms_m.cpp` | 1398 | `rpt_no.compare("01")` → `mms_m_rcb_number_match(obj, rpt_no)` | | `mms_m.cpp` | 2097-2162 | 新增 `mms_m_out_set_rcb_numbers()` | | `iec61850m.cpp` | 605-610 | 新增调用 `mms_m_out_set_rcb_numbers(fd, "01")` |