<修改> 1、调整mms的调试打印;2、调整当前数据中心的参数及定值修改,校验数据改变后才提示更新文件;3、在调用写数据接口前,也先校验数据是否发生改变

This commit is contained in:
ypc 2026-06-10 16:58:12 +08:00
parent 46f9f4fe76
commit dbfcf92552
11 changed files with 60 additions and 42 deletions

5
.gitignore vendored
View File

@ -27,4 +27,7 @@ release/arm/
src/system/uart_trans/ src/system/uart_trans/
src/system/FTU_cfg_parse/ src/system/FTU_cfg_parse/
libiec61850-1.5.3/ libiec61850-1.5.3/
doc/ doc/
# claude
CLAUDE.md
mongoose/

View File

@ -191,5 +191,5 @@ typedef struct
bool mms_m_dbg_get(stru_mms_m_obj &obj);
void *mms_m_get_obj(int app_fd); void *mms_m_get_obj(int app_fd);

View File

@ -443,8 +443,11 @@ static void mms_m_send_read_param(stru_mms_m_obj &obj, stru_mms_m_event &event)
int act_sg = obj.current_zone; int act_sg = obj.current_zone;
LOG_I("%s: read params with zone=%d (bound=%s)", obj.cfg_path.c_str(), act_sg, if(mms_m_dbg_get(obj))
strlen(obj.zone_saddr) > 0 ? obj.zone_saddr : "unbound"); {
LOG_I("%s: read params with zone=%d (bound=%s)", obj.cfg_path.c_str(), act_sg,
strlen(obj.zone_saddr) > 0 ? obj.zone_saddr : "unbound");
}
for(int i = 0; i < obj.p_cfg->point.param_num; i++) for(int i = 0; i < obj.p_cfg->point.param_num; i++)
{ {
@ -1937,6 +1940,10 @@ static int mms_m_ied_init(stru_mms_m_obj &obj)
return 0; return 0;
} }
bool mms_m_dbg_get(stru_mms_m_obj &obj)
{
return obj.debug_print_flag == MMS_M_DEBUG_PRINT_ON ? true : false;
}
void *mms_m_get_obj(int app_fd){ void *mms_m_get_obj(int app_fd){
@ -2380,8 +2387,9 @@ static struct _mms_m_resaon_str
{IEC61850_REASON_INTEGRITY, "IEC61850_REASON_INTEGRITY"}, {IEC61850_REASON_INTEGRITY, "IEC61850_REASON_INTEGRITY"},
{IEC61850_REASON_GI, "IEC61850_REASON_GI"}, {IEC61850_REASON_GI, "IEC61850_REASON_GI"},
{IEC61850_REASON_UNKNOWN, "IEC61850_REASON_UNKNOWN"}, {IEC61850_REASON_UNKNOWN, "IEC61850_REASON_UNKNOWN"},
{MMS_M_REASON_ALL_CALL, "MMS_M_REASON_ALL_CALL"}, {MMS_M_REASON_ALL_CALL, "MMS_M_REASON_ALL_CALL"},
{MMS_M_REASON_READ_PARAM, "MMS_M_REASON_READ_PARAM"} {MMS_M_REASON_READ_AO, "MMS_M_REASON_READ_AO"},
{MMS_M_REASON_READ_PARAM, "MMS_M_REASON_READ_PARAM"}
}; };
char *mms_m_out_reason_str(int reason) char *mms_m_out_reason_str(int reason)

View File

@ -663,8 +663,8 @@ LOCAL int model_ReportControlBlock_init(LogicalNode *LLN0, stru_icd &icd, std::m
int Options = model_get_rpt_options(rcb.optFields); // 将 OptFields 结构转为位掩码 int Options = model_get_rpt_options(rcb.optFields); // 将 OptFields 结构转为位掩码
int trgOps = model_get_rpt_trgOps(rcb.trgOps); // 将 TrgOps 结构转为位掩码 int trgOps = model_get_rpt_trgOps(rcb.trgOps); // 将 TrgOps 结构转为位掩码
LOG_I("RCB CREATE: name=%s dchg=%d qchg=%d dupd=%d period=%d -> trgOps=0x%x", // LOG_I("RCB CREATE: name=%s dchg=%d qchg=%d dupd=%d period=%d -> trgOps=0x%x",
it_rcb->c_str(), rcb.trgOps.dchg, rcb.trgOps.qchg, rcb.trgOps.dupd, rcb.trgOps.period, trgOps); // it_rcb->c_str(), rcb.trgOps.dchg, rcb.trgOps.qchg, rcb.trgOps.dupd, rcb.trgOps.period, trgOps);
rcb.Rcb = ReportControlBlock_create(it_rcb->c_str(), LLN0, rcb.rptID.c_str(), rcb.buffered, rcb.datSet.c_str(), rcb.confRev, trgOps, Options, rcb.bufTime, rcb.intgPd); rcb.Rcb = ReportControlBlock_create(it_rcb->c_str(), LLN0, rcb.rptID.c_str(), rcb.buffered, rcb.datSet.c_str(), rcb.confRev, trgOps, Options, rcb.bufTime, rcb.intgPd);
} }

View File

@ -182,7 +182,7 @@ LOCAL void param_load_active_sg_values(stru_LDevice &ld, int actSG)
} }
} }
LOG_I("Load active setting group %d values done", actSG); // LOG_I("Load active setting group %d values done", actSG);
} }
/** /**
@ -769,7 +769,7 @@ int param_init(IedServer server, stru_icd &icd)
return 0; return 0;
} }
param_values_show(); // param_values_show();
for(std::map<std::string, stru_LDevice>::iterator it_ld = icd.ied.map_ldevice.begin(); it_ld!= icd.ied.map_ldevice.end(); it_ld++) for(std::map<std::string, stru_LDevice>::iterator it_ld = icd.ied.map_ldevice.begin(); it_ld!= icd.ied.map_ldevice.end(); it_ld++)
{ {
@ -782,9 +782,9 @@ int param_init(IedServer server, stru_icd &icd)
} }
LogicalNode *ln0 = p_ld->sgcb->parent; LogicalNode *ln0 = p_ld->sgcb->parent;
LOG_I("ld %s sgcb ln0 %s, actSG %d, numofSGs %d, editSG %d, cnfEdit %d, timestamp %ld, resvTms %d, sibling %p", // LOG_I("ld %s sgcb ln0 %s, actSG %d, numofSGs %d, editSG %d, cnfEdit %d, timestamp %ld, resvTms %d, sibling %p",
it_ld->first.c_str(), ln0 ? ln0->name : "NULL", p_ld->sgcb->actSG, p_ld->sgcb->numOfSGs, p_ld->sgcb->editSG, // it_ld->first.c_str(), ln0 ? ln0->name : "NULL", p_ld->sgcb->actSG, p_ld->sgcb->numOfSGs, p_ld->sgcb->editSG,
p_ld->sgcb->cnfEdit, p_ld->sgcb->timestamp, p_ld->sgcb->resvTms, p_ld->sgcb->sibling); // p_ld->sgcb->cnfEdit, p_ld->sgcb->timestamp, p_ld->sgcb->resvTms, p_ld->sgcb->sibling);
param_load_active_sg_values(*p_ld, p_ld->sgcb->actSG); param_load_active_sg_values(*p_ld, p_ld->sgcb->actSG);

View File

@ -523,8 +523,11 @@ LOCAL void setting_handle_init(IedServer server, stru_icd &icd)
IedServer_handleWriteAccess(server, (DataAttribute *)node, writeAccessHandler, NULL); IedServer_handleWriteAccess(server, (DataAttribute *)node, writeAccessHandler, NULL);
DataAttribute *da = (DataAttribute *)node; if(mms_s_dbg_get())
LOG_I("Write access handler set for sAddr %s, data attribute name: %s, da %p", sAddr.c_str(), da->name, da); {
DataAttribute *da = (DataAttribute *)node;
LOG_I("Write access handler set for sAddr %s, data attribute name: %s, da %p", sAddr.c_str(), da->name, da);
}
} }
} }
@ -589,7 +592,7 @@ int setting_init(IedServer server, stru_icd &icd)
return 0; return 0;
} }
setting_values_show(); // setting_values_show();
setting_value_init(server, icd); setting_value_init(server, icd);

View File

@ -429,7 +429,7 @@ LOCAL void mms_s_da_value_init_Dbpos(DataAttribute *da, std::string val)
da->mmsValue = Dbpos_toMmsValue(NULL, pos); da->mmsValue = Dbpos_toMmsValue(NULL, pos);
} }
// if(mms_s_dbg_get()) if(mms_s_dbg_get())
{ {
MmsType val_type = MmsValue_getType(da->mmsValue); MmsType val_type = MmsValue_getType(da->mmsValue);
LOG_I("da %s-%s, value %s, pos %d, type %d, path %s", da->parent->name, da->name, val.c_str(), pos, val_type, get_DA_path((ModelNode *)da).c_str()); LOG_I("da %s-%s, value %s, pos %d, type %d, path %s", da->parent->name, da->name, val.c_str(), pos, val_type, get_DA_path((ModelNode *)da).c_str());

View File

@ -294,10 +294,6 @@ static int dc_param_register_signals(const std::string &param_path,
if (!vec_p_data.empty() && vec_p_data.size() == vec_p_default_data.size()) if (!vec_p_data.empty() && vec_p_data.size() == vec_p_default_data.size())
{ {
printf("[REG_PARAM] saddr=%s num=%d\n", saddr, num);
for (size_t _i = 0; _i < vec_p_data.size(); _i++) {
printf(" zone %zu: val=%s def=%s\n", _i, dc_get_signal_val(vec_p_data[_i], data_type).c_str(), dc_get_signal_val(vec_p_default_data[_i], data_type).c_str());
}
dc_signal_param(saddr, desc, data_type, dc_signal_param(saddr, desc, data_type,
SIGNAL_CTRL_TYPE::SBO_NORMAL, SIGNAL_CTRL_TYPE::SBO_NORMAL,
vec_p_data.data(), vec_p_default_data.data(), num, nullptr); vec_p_data.data(), vec_p_default_data.data(), num, nullptr);

View File

@ -1262,6 +1262,11 @@ int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_ty
return -1; return -1;
} }
if(0 != dc_check_val_valid(p_signal, 0, p_data))
{
return -1;
}
dc_set_signal_val(p_signal->vec_p_data[0], data_type, p_data); dc_set_signal_val(p_signal->vec_p_data[0], data_type, p_data);
dc_set_param_cfg_change(true); dc_set_param_cfg_change(true);
return 0; return 0;
@ -1287,13 +1292,11 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
return -1; return -1;
} }
printf("[SIGNAL_PARAM] saddr=%s data_num=%d\n", saddr.c_str(), data_num);
for(int i = 0; i < data_num; i++) for(int i = 0; i < data_num; i++)
{ {
if(p_data[i] == nullptr || p_default_data[i] == nullptr) if(p_data[i] == nullptr || p_default_data[i] == nullptr)
{ {
printf("[SIGNAL_PARAM_ERR] saddr=%s i=%d p_data=%p p_def=%p\n", saddr.c_str(), i, (void*)p_data[i], (void*)p_default_data[i]); LOG_E("p_data[%d] or p_default_data[%d] is nullptr", i, i);
MY_LOG_E("p_data[%d] or p_default_data[%d] is nullptr", i, i);
return -1; return -1;
} }
} }
@ -1314,11 +1317,8 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
// dc_set_signal_val(p_data, data_type, p_signal->p_data); // dc_set_signal_val(p_data, data_type, p_signal->p_data);
bool check_result = dc_signal_param_add_check(p_signal, desc, data_type, ctrl_type, p_default_data, data_num); bool check_result = dc_signal_param_add_check(p_signal, desc, data_type, ctrl_type, p_default_data, data_num);
printf("[SIGNAL_PARAM_REPLACE] saddr=%s add_check=%d old_size=%d new_size=%d\n",
saddr.c_str(), (int)check_result, (int)p_signal->vec_p_data.size(), data_num);
if (check_result) if (check_result)
{ {
printf("[SIGNAL_PARAM_REPLACE] add_check=true -> metadata changed, cfg_change set!\n");
dc_set_param_cfg_change(true); dc_set_param_cfg_change(true);
} }
else else
@ -1475,7 +1475,7 @@ int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data
XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length()); XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length());
stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param); stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param);
printf("[SET_PARAM] saddr=%s zone=%d data=%.6f\n", saddr.c_str(), (int)setting_zone, *(float*)p_data);
if(p_signal != nullptr && setting_zone < p_signal->vec_p_data.size()) if(p_signal != nullptr && setting_zone < p_signal->vec_p_data.size())
{ {
if(p_signal->data_type != data_type) if(p_signal->data_type != data_type)
@ -1485,12 +1485,14 @@ int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data
return -1; return -1;
} }
if(0 != dc_check_val_valid(p_signal, setting_zone, p_data))
{
return -1;
}
dc_set_signal_val(p_signal->vec_p_data[setting_zone], data_type, p_data); dc_set_signal_val(p_signal->vec_p_data[setting_zone], data_type, p_data);
printf("[SET_PARAM_OK] saddr=%s zone=%d -> vec[%d]=%.6f, %p\n", saddr.c_str(), (int)setting_zone, (int)setting_zone, *(float*)p_signal->vec_p_data[setting_zone], p_signal->vec_p_data[setting_zone]);
dc_set_param_cfg_change(true); dc_set_param_cfg_change(true);
return 0; return 0;
} }
printf("[SET_PARAM_FAIL] saddr=%s zone=%d signal=%p size=%d\n", saddr.c_str(), (int)setting_zone, (void*)p_signal, p_signal ? (int)p_signal->vec_p_data.size() : -1);
LOG_E("saddr %s not found in param table", saddr.c_str()); LOG_E("saddr %s not found in param table", saddr.c_str());
return -1; return -1;
@ -2182,13 +2184,12 @@ void dc_param_cfg_check(const std::string &path)
sig_elem->SetAttribute("unit", p_param->param.unit.c_str()); sig_elem->SetAttribute("unit", p_param->param.unit.c_str());
sig_elem->SetAttribute("num", p_param->vec_p_data.size()); sig_elem->SetAttribute("num", p_param->vec_p_data.size());
printf("[SAVE_PARAM] saddr=%s num=%d\n", p_param->saddr.c_str(), (int)p_param->vec_p_data.size());
for(int i = 0; i < p_param->vec_p_data.size(); i++) for(int i = 0; i < p_param->vec_p_data.size(); i++)
{ {
std::string val = dc_get_signal_val(p_param->vec_p_data[i], p_param->data_type); std::string val = dc_get_signal_val(p_param->vec_p_data[i], p_param->data_type);
std::string def = dc_get_signal_val(p_param->vec_p_default_data[i], p_param->data_type); std::string def = dc_get_signal_val(p_param->vec_p_default_data[i], p_param->data_type);
printf(" zone %d: val=%s def=%s, %p, %p\n", i+1, val.c_str(), def.c_str(), p_param->vec_p_data[i], p_param->vec_p_default_data[i]);
XMLElement *item_elem = doc.NewElement("Item"); XMLElement *item_elem = doc.NewElement("Item");
item_elem->SetAttribute("index", i+1); item_elem->SetAttribute("index", i+1);
item_elem->SetAttribute("value", val.c_str()); item_elem->SetAttribute("value", val.c_str());

View File

@ -164,8 +164,6 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
{ {
if(strcmp(p_cfg->point.p_st[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_st[j].value.p_val[0]) if(strcmp(p_cfg->point.p_st[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_st[j].value.p_val[0])
{ {
// *(uint8_t *)p_cfg->point.p_st[j].value.p_val[0] = MY_GET_DATA_WITH_TYPE(p->p_value, uint8_t);
dc_set_out_signal_val(p_cfg->point.p_st[j].saddr, p->p_value); dc_set_out_signal_val(p_cfg->point.p_st[j].saddr, p->p_value);
} }
} }
@ -174,11 +172,6 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
{ {
if(strcmp(p_cfg->point.p_mx[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_mx[j].value.p_val[0]) if(strcmp(p_cfg->point.p_mx[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_mx[j].value.p_val[0])
{ {
// if(p->type == MMS_FLOAT)
// *(float *)p_cfg->point.p_mx[j].value.p_val[0] = MY_GET_DATA_WITH_TYPE(p->p_value, float);
// else if(p->type == MMS_INTEGER)
// *(int32_t *)p_cfg->point.p_mx[j].value.p_val[0] = MY_GET_DATA_WITH_TYPE(p->p_value, int32_t);
dc_set_out_signal_val(p_cfg->point.p_mx[j].saddr, p->p_value); dc_set_out_signal_val(p_cfg->point.p_mx[j].saddr, p->p_value);
} }
} }
@ -191,6 +184,13 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
uint8_t local_type = (it_ao != g_mms_m_type_to_local_type.end()) ? it_ao->second : 0; uint8_t local_type = (it_ao != g_mms_m_type_to_local_type.end()) ? it_ao->second : 0;
if(local_type != 0) if(local_type != 0)
{ {
std::string set_val = dc_get_signal_val(p->p_value, local_type);
std::string param_val = dc_get_signal_val(p_cfg->point.p_ao[j].value.p_val[0], local_type);
if(set_val == param_val)
{
continue;
}
dc_signal_ao_set_val_without_check(p_cfg->point.p_ao[j].saddr, local_type, p->p_value); dc_signal_ao_set_val_without_check(p_cfg->point.p_ao[j].saddr, local_type, p->p_value);
} }
} }
@ -204,6 +204,13 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
uint8_t local_type = (it_param != g_mms_m_type_to_local_type.end()) ? it_param->second : 0; uint8_t local_type = (it_param != g_mms_m_type_to_local_type.end()) ? it_param->second : 0;
if(local_type != 0) if(local_type != 0)
{ {
std::string set_val = dc_get_signal_val(p->p_value, local_type);
std::string param_val = dc_get_signal_val(p_cfg->point.p_param[j].value.p_val[p->set_zone - 1], local_type);
if(set_val == param_val)
{
continue;
}
printf("mms_data_back: set param %s zone=%d\n", p_cfg->point.p_param[j].saddr, p->set_zone); printf("mms_data_back: set param %s zone=%d\n", p_cfg->point.p_param[j].saddr, p->set_zone);
dc_signal_param_set_val_without_check(p_cfg->point.p_param[j].saddr, local_type, p->set_zone - 1, p->p_value); dc_signal_param_set_val_without_check(p_cfg->point.p_param[j].saddr, local_type, p->set_zone - 1, p->p_value);
} }
@ -586,7 +593,7 @@ int iec61850m_init()
return -1; return -1;
} }
show_cfg(*p_info->p_cfg); // show_cfg(*p_info->p_cfg);
if(0 != iec61850m_signal_init(*p_info->p_cfg)) if(0 != iec61850m_signal_init(*p_info->p_cfg))
{ {

View File

@ -353,7 +353,7 @@ int iec61850s_signals_init()
return -1; return -1;
} }
show_mms_xml(*p_cfg); // show_mms_xml(*p_cfg);
if(0 != iec61850s_st_signals_init(p_cfg->vec_st)) if(0 != iec61850s_st_signals_init(p_cfg->vec_st))
{ {