RTU/claude/mid/RCB订阅编号可配置化.md

89 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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<std::string> 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 <sstream>` 头文件
- 新增 `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<std::string> rcb_numbers` |
| `mms_m.cpp` | 7 | 新增 `#include <sstream>` |
| `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")` |