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

3.1 KiB
Raw Blame History

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 设计

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

存储设计

// stru_mms_m_obj 新增字段
std::vector<std::string> rcb_numbers;  // 空=默认"01"

匹配函数

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")