89 lines
3.1 KiB
Markdown
89 lines
3.1 KiB
Markdown
# 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")` |
|