1、删除mms中无效的数据类型枚举;
2、开放数据中心接口对外,从字符串设置数据指针值;
3、解析mms_m的配置文件程序修改,避免解析异常导致后续错误;
4、mms_m库调整调试了定值修改的功能;
5、调整了数据中心设置参数时的数据检查;
6、调整了61850客户端调用程序的定值部分与控制部分;
7、对应数据中心修改,调整了webserver中对非字符串类型参数的修改
This commit is contained in:
ypc 2026-05-20 16:10:41 +08:00
parent ba85f52ae3
commit 719bf36004
9 changed files with 299 additions and 222 deletions

View File

@ -25,23 +25,7 @@ enum
_MMS_M_EVENT_END _MMS_M_EVENT_END
}; };
enum #define MMS_M_DATA_STRING_LEN 128
{
_MMS_M_data_type_unknown = 0,
_MMS_M_data_type_bool,
_MMS_M_data_type_int8,
_MMS_M_data_type_int16,
_MMS_M_data_type_int32,
_MMS_M_data_type_int64,
_MMS_M_data_type_uint8,
_MMS_M_data_type_uint16,
_MMS_M_data_type_uint32,
_MMS_M_data_type_uint64,
_MMS_M_data_type_float,
_MMS_M_data_type_double,
_MMS_M_data_type_string,
_MMS_M_data_type_end
};
#define MMS_M_STR_LEN 64 #define MMS_M_STR_LEN 64
#define MMS_M_REF_LEN 128 #define MMS_M_REF_LEN 128
@ -113,11 +97,11 @@ typedef struct
int app_fd; // 61850客户端句柄 int app_fd; // 61850客户端句柄
char ied[MMS_M_STR_LEN]; // ied名称 char ied[MMS_M_STR_LEN]; // ied名称
char saddr[MMS_M_STR_LEN]; // 信号短地址 char saddr[MMS_M_STR_LEN]; // 信号短地址
int value_type; // 数据类型 uint8_t value_type; // 数据类型
// void *p_val; // 设置值 // void *p_val; // 设置值
char val[128]; char val[128];
// char val_str[MMS_M_STR_LEN]; // 字符串类型的值 // char val_str[MMS_M_STR_LEN]; // 字符串类型的值
int ctrl_type; // 遥控类型 uint8_t ctrl_type; // 遥控类型
int set_zone; // 定值区 int set_zone; // 定值区
void (*p_func)(void *arg, int ret); // 设置回调函数 void (*p_func)(void *arg, int ret); // 设置回调函数
// void *arg; // 回调函数参数 // void *arg; // 回调函数参数

View File

@ -408,3 +408,4 @@ uint8_t dc_get_data_type_id_by_str(const std::string &data_type_str);
uint8_t dc_get_data_type_len(uint8_t data_type); uint8_t dc_get_data_type_len(uint8_t data_type);
void dc_set_signal_val_from_str(void *p_data, uint8_t data_type, const std::string &str);

View File

@ -54,7 +54,7 @@ static void sleep_ms(uint32_t ms)
static int mms_m_push_event(stru_mms_m_obj &obj, stru_mms_m_event &event) static int mms_m_push_event(stru_mms_m_obj &obj, stru_mms_m_event &event)
{ {
if(event.ctrl_type >= _MMS_M_EVENT_AO_WRITE) if(event.ctrl_type >= _MMS_M_EVENT_END)
{ {
LOG_E("push event ctrl_type(%d) is not support", event.ctrl_type); LOG_E("push event ctrl_type(%d) is not support", event.ctrl_type);
return -1; return -1;
@ -125,23 +125,27 @@ static void mms_m_show_MmsValue(MmsValue* mms_value)
break; break;
case MMS_BOOLEAN: case MMS_BOOLEAN:
bVal = MmsValue_getBoolean(mms_value); bVal = MmsValue_getBoolean(mms_value);
// LOG_I("show_mms_value bVal %d\r\n", bVal); LOG_I("show_mms_value bVal %d\r\n", bVal);
break; break;
case MMS_BIT_STRING: case MMS_BIT_STRING:
strVal= (char *)MmsValue_toString(mms_value); strVal= (char *)MmsValue_toString(mms_value);
// LOG_I("show_mms_value strVal %s\r\n", strVal); LOG_I("show_mms_value strVal %s\r\n", strVal);
break; break;
case MMS_INTEGER: case MMS_INTEGER:
iVal = MmsValue_toInt32(mms_value); iVal = MmsValue_toInt32(mms_value);
// LOG_I("show_mms_value iVal: %d\n", iVal); LOG_I("show_mms_value iVal: %d\n", iVal);
break; break;
case MMS_UNSIGNED: case MMS_UNSIGNED:
uVal = MmsValue_toUint32(mms_value); uVal = MmsValue_toUint32(mms_value);
// LOG_I("show_mms_value uVal: %u\n", uVal); LOG_I("show_mms_value uVal: %u\n", uVal);
break; break;
case MMS_FLOAT: case MMS_FLOAT:
fVal = MmsValue_toFloat(mms_value); fVal = MmsValue_toFloat(mms_value);
// LOG_I("show_mms_value fVal: %f\n", fVal); LOG_I("show_mms_value fVal: %f\n", fVal);
break;
case MMS_STRING:
strVal= (char *)MmsValue_toString(mms_value);
LOG_I("show_mms_value strVal %s\r\n", strVal);
break; break;
default: default:
LOG_E("show_mms_value Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(mms_value)); LOG_E("show_mms_value Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(mms_value));
@ -152,9 +156,9 @@ static void mms_m_show_MmsValue(MmsValue* mms_value)
static int mms_m_get_mmsValue(MmsValue *mms_value, uint8_t &type, void *p_val) static int mms_m_get_mmsValue(MmsValue *mms_value, uint8_t &type, void *p_val)
{ {
if(NULL == mms_value) if(NULL == mms_value || NULL == p_val)
{ {
LOG_E("mms_value is NULL\r\n"); LOG_E("mms_value or p_val is NULL, mms_value = %p, p_val = %p\r\n", mms_value, p_val);
return -1; return -1;
} }
@ -187,6 +191,16 @@ static int mms_m_get_mmsValue(MmsValue *mms_value, uint8_t &type, void *p_val)
// item.value.val.f = MmsValue_toFloat(mms_value); // item.value.val.f = MmsValue_toFloat(mms_value);
*(float *)p_val = MmsValue_toFloat(mms_value); *(float *)p_val = MmsValue_toFloat(mms_value);
break; break;
case MMS_VISIBLE_STRING:
type = MMS_VISIBLE_STRING;
// item.value.val.s = MmsValue_toString(mms_value);
strcpy((char *)p_val, MmsValue_toString(mms_value));
break;
case MMS_STRING:
type = MMS_STRING;
// item.value.val.s = MmsValue_toString(mms_value);
strcpy((char *)p_val, MmsValue_toString(mms_value));
break;
default: default:
LOG_E("mms_m_get_mmsValue Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(mms_value)); LOG_E("mms_m_get_mmsValue Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(mms_value));
return -1; return -1;
@ -285,6 +299,62 @@ static int mms_m_send_ao_write(stru_mms_m_obj &obj, stru_mms_m_event &event)
return -1; return -1;
} }
MmsValue *p_value = IedConnection_readObject(obj.run.con, &err, p_item->reference.c_str(), (FunctionalConstraint)p_item->fc);
if(NULL != p_value)
{
// if(MMS_M_DEBUG_PRINT_ON == obj.debug_print_flag)
{
mms_m_show_MmsValue(p_value);
}
}
else
{
LOG_E("%s: %s read err:%s(%d)\n", obj.cfg_path.c_str(), p_item->reference.c_str(), mms_m_err_str(err), err);
}
MmsValue_delete(p_value);
// write
if(0 != mms_m_param_value_sync((*p_item), event))
{
LOG_E("set value failed");
return -1;
}
IedConnection_writeObject(obj.run.con, &err, p_item->reference.c_str(), (FunctionalConstraint)p_item->fc, p_item->set_value);
if(err != IED_ERROR_OK)
{
LOG_E("%s: %s write err:%s(%d)\n", obj.cfg_path.c_str(), p_item->reference.c_str(), mms_m_err_str(err), err);
return -1;
}
return 0;
}
static int mms_m_send_param_write(stru_mms_m_obj &obj, stru_mms_m_event &event)
{
std::vector<stru_point_item>::iterator it;
stru_point_item *p_item = NULL;
IedClientError err;
for(it = obj.p_cfg->point.param.begin(); it!= obj.p_cfg->point.param.end(); it++)
{
if(it->saddr.compare(event.saddr) == 0)
{
p_item = &(*it);
break;
}
}
if(NULL == p_item)
{
LOG_E("%s: %s not found in cfg\n", obj.cfg_path.c_str(), event.saddr);
return -1;
}
size_t pos = p_item->reference.find("/");
if(pos == std::string::npos)
{
LOG_E("%s: %s reference is not correct\n", obj.cfg_path.c_str(), p_item->reference.c_str());
return -1;
}
std::string str_head = p_item->reference.substr(0, pos); std::string str_head = p_item->reference.substr(0, pos);
std::string str_EditSG = str_head + "/" + g_sgcb_edit_sg; std::string str_EditSG = str_head + "/" + g_sgcb_edit_sg;
std::string str_CnfEdit = str_head + "/" + g_sgcb_cnf_edit; std::string str_CnfEdit = str_head + "/" + g_sgcb_cnf_edit;
@ -668,7 +738,7 @@ static void mms_m_send_set_gi(stru_mms_m_obj &obj)
static void mms_m_send_call_all(stru_mms_m_obj &obj) static void mms_m_send_call_all(stru_mms_m_obj &obj)
{ {
std::vector<stru_point_item> temp_list[2] = {obj.p_cfg->point.st, obj.p_cfg->point.mx}; std::vector<stru_point_item> temp_list[3] = {obj.p_cfg->point.st, obj.p_cfg->point.mx, obj.p_cfg->point.ao};
std::vector<stru_point_item>::iterator it; std::vector<stru_point_item>::iterator it;
IedClientError err; IedClientError err;
@ -676,7 +746,7 @@ static void mms_m_send_call_all(stru_mms_m_obj &obj)
stru_mms_m_out_value out_val; stru_mms_m_out_value out_val;
for(int i = 0; i < 2; i++) for(int i = 0; i < 3; i++)
{ {
for(it = temp_list[i].begin(); it!= temp_list[i].end(); it++) for(it = temp_list[i].begin(); it!= temp_list[i].end(); it++)
{ {
@ -2084,53 +2154,25 @@ void *mms_m_create_data_ptr(uint8_t type)
switch(type) switch(type)
{ {
case _MMS_M_data_type_bool: case MMS_BOOLEAN:
p_u8 = new uint8_t; p_u8 = new uint8_t;
(*p_u8) = 0; (*p_u8) = 0;
return (void *)p_u8; return (void *)p_u8;
case _MMS_M_data_type_int8: case MMS_INTEGER:
p_i8 = new int8_t;
(*p_i8) = 0;
return (void *)p_i8;
case _MMS_M_data_type_int16:
p_i16 = new int16_t;
(*p_i16) = 0;
return (void *)p_i16;
case _MMS_M_data_type_int32:
p_i32 = new int32_t; p_i32 = new int32_t;
(*p_i32) = 0; (*p_i32) = 0;
return (void *)p_i32; return (void *)p_i32;
case _MMS_M_data_type_int64: case MMS_UNSIGNED:
p_i64 = new int64_t;
(*p_i64) = 0;
return (void *)p_i64;
case _MMS_M_data_type_uint8:
p_u8 = new uint8_t;
(*p_u8) = 0;
return (void *)p_u8;
case _MMS_M_data_type_uint16:
p_u16 = new uint16_t;
(*p_u16) = 0;
return (void *)p_u16;
case _MMS_M_data_type_uint32:
p_u32 = new uint32_t; p_u32 = new uint32_t;
(*p_u32) = 0; (*p_u32) = 0;
return (void *)p_u32; return (void *)p_u32;
case _MMS_M_data_type_uint64: case MMS_FLOAT:
p_u64 = new uint64_t;
(*p_u64) = 0;
return (void *)p_u64;
case _MMS_M_data_type_float:
p_f = new float;
(*p_f) = 0.0f;
return (void *)p_f;
case _MMS_M_data_type_double:
p_d = new double; p_d = new double;
(*p_d) = 0.0; (*p_d) = 0.0;
return (void *)p_d; return (void *)p_d;
case _MMS_M_data_type_string: case MMS_STRING:
p_str = new char[MMS_M_STR_LEN]; p_str = new char[MMS_M_DATA_STRING_LEN];
memset(p_str, 0, MMS_M_STR_LEN); memset(p_str, 0, MMS_M_DATA_STRING_LEN);
return (void *)p_str; return (void *)p_str;
default: default:
return NULL; return NULL;
@ -2147,41 +2189,20 @@ int mms_m_set_data_value(void *srt, void *dst, uint8_t type)
switch(type) switch(type)
{ {
case _MMS_M_data_type_bool: case MMS_BOOLEAN:
*(uint8_t *)dst = *(uint8_t *)srt; *(uint8_t *)dst = *(uint8_t *)srt;
break; break;
case _MMS_M_data_type_int8: case MMS_INTEGER:
*(int8_t *)dst = *(int8_t *)srt;
break;
case _MMS_M_data_type_int16:
*(int16_t *)dst = *(int16_t *)srt;
break;
case _MMS_M_data_type_int32:
*(int32_t *)dst = *(int32_t *)srt; *(int32_t *)dst = *(int32_t *)srt;
break; break;
case _MMS_M_data_type_int64: case MMS_UNSIGNED:
*(int64_t *)dst = *(int64_t *)srt;
break;
case _MMS_M_data_type_uint8:
*(uint8_t *)dst = *(uint8_t *)srt;
break;
case _MMS_M_data_type_uint16:
*(uint16_t *)dst = *(uint16_t *)srt;
break;
case _MMS_M_data_type_uint32:
*(uint32_t *)dst = *(uint32_t *)srt; *(uint32_t *)dst = *(uint32_t *)srt;
break; break;
case _MMS_M_data_type_uint64: case MMS_FLOAT:
*(uint64_t *)dst = *(uint64_t *)srt;
break;
case _MMS_M_data_type_float:
*(float *)dst = *(float *)srt;
break;
case _MMS_M_data_type_double:
*(double *)dst = *(double *)srt; *(double *)dst = *(double *)srt;
break; break;
case _MMS_M_data_type_string: case MMS_STRING:
strncpy((char *)dst, (char *)srt, MMS_M_STR_LEN); strncpy((char *)dst, (char *)srt, MMS_M_DATA_STRING_LEN);
break; break;
default: default:
return -1; return -1;
@ -2201,42 +2222,21 @@ int mms_m_get_data_value_str(void *data, uint8_t type, char *str)
switch(type) switch(type)
{ {
case _MMS_M_data_type_bool: case MMS_BOOLEAN:
b = *(uint8_t *)data > 0 ? true : false; b = *(uint8_t *)data > 0 ? true : false;
strncpy(str, b ? "true" : "false", MMS_M_STR_LEN); strncpy(str, b ? "true" : "false", MMS_M_STR_LEN);
break; break;
case _MMS_M_data_type_int8: case MMS_INTEGER:
snprintf(str, MMS_M_STR_LEN, "%d", *(int8_t *)data);
break;
case _MMS_M_data_type_int16:
snprintf(str, MMS_M_STR_LEN, "%d", *(int16_t *)data);
break;
case _MMS_M_data_type_int32:
snprintf(str, MMS_M_STR_LEN, "%d", *(int32_t *)data); snprintf(str, MMS_M_STR_LEN, "%d", *(int32_t *)data);
break; break;
case _MMS_M_data_type_int64: case MMS_UNSIGNED:
snprintf(str, MMS_M_STR_LEN, "%ld", *(int64_t *)data);
break;
case _MMS_M_data_type_uint8:
snprintf(str, MMS_M_STR_LEN, "%u", *(uint8_t *)data);
break;
case _MMS_M_data_type_uint16:
snprintf(str, MMS_M_STR_LEN, "%u", *(uint16_t *)data);
break;
case _MMS_M_data_type_uint32:
snprintf(str, MMS_M_STR_LEN, "%u", *(uint32_t *)data); snprintf(str, MMS_M_STR_LEN, "%u", *(uint32_t *)data);
break; break;
case _MMS_M_data_type_uint64: case MMS_FLOAT:
snprintf(str, MMS_M_STR_LEN, "%lu", *(uint64_t *)data);
break;
case _MMS_M_data_type_float:
snprintf(str, MMS_M_STR_LEN, "%f", *(float *)data);
break;
case _MMS_M_data_type_double:
snprintf(str, MMS_M_STR_LEN, "%f", *(double *)data); snprintf(str, MMS_M_STR_LEN, "%f", *(double *)data);
break; break;
case _MMS_M_data_type_string: case MMS_STRING:
strncpy(str, (char *)data, MMS_M_STR_LEN); strncpy(str, (char *)data, MMS_M_DATA_STRING_LEN);
break; break;
default: default:
return -1; return -1;
@ -2255,7 +2255,7 @@ int mms_m_set_data_by_str(void *data, uint8_t type, const char *str)
switch(type) switch(type)
{ {
case _MMS_M_data_type_bool: case MMS_BOOLEAN:
if(0 == strcasecmp(str, "true") || 0 == strcmp(str, "1")) if(0 == strcasecmp(str, "true") || 0 == strcmp(str, "1"))
{ {
*(uint8_t *)data = 1; *(uint8_t *)data = 1;
@ -2270,38 +2270,17 @@ int mms_m_set_data_by_str(void *data, uint8_t type, const char *str)
return -1; return -1;
} }
break; break;
case _MMS_M_data_type_int8: case MMS_INTEGER:
*(int8_t *)data = (int8_t)atoi(str);
break;
case _MMS_M_data_type_int16:
*(int16_t *)data = (int16_t)atoi(str);
break;
case _MMS_M_data_type_int32:
*(int32_t *)data = (int32_t)atoi(str); *(int32_t *)data = (int32_t)atoi(str);
break; break;
case _MMS_M_data_type_int64: case MMS_UNSIGNED:
*(int64_t *)data = (int64_t)atol(str);
break;
case _MMS_M_data_type_uint8:
*(uint8_t *)data = (uint8_t)atoi(str);
break;
case _MMS_M_data_type_uint16:
*(uint16_t *)data = (uint16_t)atoi(str);
break;
case _MMS_M_data_type_uint32:
*(uint32_t *)data = (uint32_t)atoi(str); *(uint32_t *)data = (uint32_t)atoi(str);
break; break;
case _MMS_M_data_type_uint64: case MMS_FLOAT:
*(uint64_t *)data = (uint64_t)atol(str);
break;
case _MMS_M_data_type_float:
*(float *)data = (float)atof(str);
break;
case _MMS_M_data_type_double:
*(double *)data = atof(str); *(double *)data = atof(str);
break; break;
case _MMS_M_data_type_string: case MMS_STRING:
strncpy((char *)data, str, MMS_M_STR_LEN); strncpy((char *)data, str, MMS_M_DATA_STRING_LEN);
break; break;
default: default:
return -1; return -1;

View File

@ -44,12 +44,12 @@ static const char *KEY_DEFAULT_VAL = "default";
void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &item_list, const std::string &ied) int parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &item_list, const std::string &ied)
{ {
if(NULL == item) if(NULL == item)
{ {
LOG_E("item is NULL"); LOG_E("item is NULL");
return; return -1;
} }
const char *str = NULL; const char *str = NULL;
@ -60,7 +60,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
else else
{ {
LOG_E("no attribute %s in item", KEY_NO); LOG_E("no attribute %s in item", KEY_NO);
return; return -1;
} }
for(std::vector<stru_point_item>::iterator it = item_list.begin(); it!= item_list.end(); ++it) for(std::vector<stru_point_item>::iterator it = item_list.begin(); it!= item_list.end(); ++it)
@ -68,7 +68,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
if(it->no == atoi(str)) if(it->no == atoi(str))
{ {
LOG_E("item no %s already exists", str); LOG_E("item no %s already exists", str);
return; return -1;
} }
} }
@ -82,7 +82,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
else else
{ {
LOG_E("no attribute %s in item", KEY_SADDR); LOG_E("no attribute %s in item", KEY_SADDR);
return; return -1;
} }
if(NULL != (str = item->Attribute(KEY_DESC))) if(NULL != (str = item->Attribute(KEY_DESC)))
@ -97,7 +97,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
else else
{ {
LOG_E("no attribute %s in item", KEY_LDEV); LOG_E("no attribute %s in item", KEY_LDEV);
return; return -1;
} }
if(NULL != (str = item->Attribute(KEY_LNODE))) if(NULL != (str = item->Attribute(KEY_LNODE)))
@ -107,7 +107,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
else else
{ {
LOG_E("no attribute %s in item", KEY_LNODE); LOG_E("no attribute %s in item", KEY_LNODE);
return; return -1;
} }
if(NULL != (str = item->Attribute(KEY_DONAME))) if(NULL != (str = item->Attribute(KEY_DONAME)))
@ -117,7 +117,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
else else
{ {
LOG_E("no attribute %s in item", KEY_DONAME); LOG_E("no attribute %s in item", KEY_DONAME);
return; return -1;
} }
if(NULL != (str = item->Attribute(KEY_FC))) if(NULL != (str = item->Attribute(KEY_FC)))
@ -127,7 +127,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
else else
{ {
LOG_E("no attribute %s in item", KEY_FC); LOG_E("no attribute %s in item", KEY_FC);
return; return -1;
} }
if(NULL != (str = item->Attribute(KEY_TYPE))) if(NULL != (str = item->Attribute(KEY_TYPE)))
@ -137,7 +137,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
else else
{ {
LOG_E("no attribute %s in item", KEY_TYPE); LOG_E("no attribute %s in item", KEY_TYPE);
return; return -1;
} }
if(NULL != (str = item->Attribute(KEY_CTRL_MODEL))) if(NULL != (str = item->Attribute(KEY_CTRL_MODEL)))
@ -177,6 +177,8 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
// stru_point_item *p_item = &item_list.back(); // stru_point_item *p_item = &item_list.back();
// p_item->value.p_val = mms_m_create_data_ptr(p_item->type); // p_item->value.p_val = mms_m_create_data_ptr(p_item->type);
return 0;
} }
@ -246,7 +248,10 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
{ {
for(item = st->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item)) for(item = st->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{ {
parse_cfg_item(item, point_page.st, ied); if(parse_cfg_item(item, point_page.st, ied) != 0)
{
return -1;
}
point_page.st.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.st.back().type)); point_page.st.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.st.back().type));
} }
@ -256,7 +261,10 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
{ {
for(item = mx->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item)) for(item = mx->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{ {
parse_cfg_item(item, point_page.mx, ied); if(parse_cfg_item(item, point_page.mx, ied) != 0)
{
return -1;
}
point_page.mx.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.mx.back().type)); point_page.mx.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.mx.back().type));
} }
@ -266,7 +274,10 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
{ {
for(item = co->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item)) for(item = co->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{ {
parse_cfg_item(item, point_page.co, ied); if(parse_cfg_item(item, point_page.co, ied) != 0)
{
return -1;
}
point_page.co.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.co.back().type)); point_page.co.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.co.back().type));
} }
@ -276,7 +287,10 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
{ {
for(item = ao->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item)) for(item = ao->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{ {
parse_cfg_item(item, point_page.ao, ied); if(parse_cfg_item(item, point_page.ao, ied) != 0)
{
return -1;
}
point_page.ao.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.ao.back().type)); point_page.ao.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.ao.back().type));
point_page.ao.back().value.vec_p_default.push_back(mms_m_create_data_ptr(point_page.ao.back().type)); point_page.ao.back().value.vec_p_default.push_back(mms_m_create_data_ptr(point_page.ao.back().type));
@ -287,7 +301,10 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
{ {
for(item = param->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item)) for(item = param->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{ {
parse_cfg_item(item, point_page.param, ied); if(parse_cfg_item(item, point_page.param, ied) != 0)
{
return -1;
}
for(sub_item = item->FirstChildElement(ELE_SubItem); sub_item; sub_item = sub_item->NextSiblingElement(ELE_SubItem)) for(sub_item = item->FirstChildElement(ELE_SubItem); sub_item; sub_item = sub_item->NextSiblingElement(ELE_SubItem))
{ {

View File

@ -30,7 +30,7 @@ typedef struct stru_signal
void dc_set_signal_val_from_str(void *p_data, uint8_t data_type, const std::string &str);
bool dc_get_param_cfg_change(); bool dc_get_param_cfg_change();
void dc_set_param_cfg_change(bool change); void dc_set_param_cfg_change(bool change);

View File

@ -725,7 +725,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone,
int8_t s8 = *(int8_t*)p_data; int8_t s8 = *(int8_t*)p_data;
if(s8 < (int8_t)param.min || s8 > (int8_t)param.max) if(s8 < (int8_t)param.min || s8 > (int8_t)param.max)
{ {
LOG_E("invalid int8_t value %d, range [%d, %d]", s8, param.min, param.max); LOG_E("invalid int8_t value %d, range [%f, %f]", s8, param.min, param.max);
return -1; return -1;
} }
} }
@ -740,7 +740,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone,
uint8_t u8 = *(uint8_t*)p_data; uint8_t u8 = *(uint8_t*)p_data;
if(u8 < param.min || u8 > param.max) if(u8 < param.min || u8 > param.max)
{ {
LOG_E("invalid uint8_t value %d, range [%d, %d]", u8, param.min, param.max); LOG_E("invalid uint8_t value %d, range [%f, %f]", u8, param.min, param.max);
return -1; return -1;
} }
} }
@ -770,7 +770,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone,
uint16_t u16 = *(uint16_t*)p_data; uint16_t u16 = *(uint16_t*)p_data;
if(u16 < param.min || u16 > param.max) if(u16 < param.min || u16 > param.max)
{ {
LOG_E("invalid uint16_t value %d, range [%d, %d]", u16, param.min, param.max); LOG_E("invalid uint16_t value %d, range [%f, %f]", u16, param.min, param.max);
return -1; return -1;
} }
} }
@ -785,7 +785,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone,
int32_t s32 = *(int32_t*)p_data; int32_t s32 = *(int32_t*)p_data;
if(s32 < (int32_t)param.min || s32 > (int32_t)param.max) if(s32 < (int32_t)param.min || s32 > (int32_t)param.max)
{ {
LOG_E("invalid int32_t value %d, range [%d, %d]", s32, param.min, param.max); LOG_E("invalid int32_t value %d, range [%f, %f]", s32, param.min, param.max);
return -1; return -1;
} }
} }
@ -800,7 +800,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone,
uint32_t u32 = *(uint32_t*)p_data; uint32_t u32 = *(uint32_t*)p_data;
if(u32 < param.min || u32 > param.max) if(u32 < param.min || u32 > param.max)
{ {
LOG_E("invalid uint32_t value %d, range [%d, %d]", u32, param.min, param.max); LOG_E("invalid uint32_t value %d, range [%f, %f]", u32, param.min, param.max);
return -1; return -1;
} }
} }
@ -815,7 +815,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone,
int64_t l64 = *(int64_t*)p_data; int64_t l64 = *(int64_t*)p_data;
if(l64 < (int64_t)param.min || l64 > (int64_t)param.max) if(l64 < (int64_t)param.min || l64 > (int64_t)param.max)
{ {
LOG_E("invalid int64_t value %lld, range [%lld, %lld]", l64, param.min, param.max); LOG_E("invalid int64_t value %lld, range [%f, %f]", l64, param.min, param.max);
return -1; return -1;
} }
} }
@ -830,7 +830,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone,
uint64_t ul64 = *(uint64_t*)p_data; uint64_t ul64 = *(uint64_t*)p_data;
if(ul64 < param.min || ul64 > param.max) if(ul64 < param.min || ul64 > param.max)
{ {
LOG_E("invalid uint64_t value %llu, range [%llu, %llu]", ul64, param.min, param.max); LOG_E("invalid uint64_t value %llu, range [%f, %f]", ul64, param.min, param.max);
return -1; return -1;
} }
} }

View File

@ -19,7 +19,7 @@ typedef struct
}stru_iec61850m_info;; }stru_iec61850m_info;;
std::vector<stru_iec61850m_info> g_vec_iec61850m_info = LOCAL std::vector<stru_iec61850m_info> g_vec_iec61850m_info =
{ {
{ {
.fd = -1, .fd = -1,
@ -32,8 +32,26 @@ std::vector<stru_iec61850m_info> g_vec_iec61850m_info =
} }
}; };
LOCAL std::map<uint8_t, uint8_t> g_mms_m_type_to_local_type = {
{MMS_BOOLEAN, DATA_TYPE_U8},
{MMS_INTEGER, DATA_TYPE_S32},
{MMS_UNSIGNED, DATA_TYPE_U32},
{MMS_FLOAT, DATA_TYPE_F32},
{MMS_STRING, DATA_TYPE_STR},
{MMS_VISIBLE_STRING, DATA_TYPE_STR},
};
LOCAL void mms_send_control(int fd, const char *saddr, int val, int type) LOCAL std::map<uint8_t, uint8_t> g_mms_m_ctrl_type_to_local_ctrl_type = {
{CONTROL_MODEL_STATUS_ONLY, SIGNAL_CTRL_TYPE::NONE},
{CONTROL_MODEL_DIRECT_NORMAL, SIGNAL_CTRL_TYPE::DIRECT_NORMAL},
{CONTROL_MODEL_SBO_NORMAL, SIGNAL_CTRL_TYPE::SBO_NORMAL},
{CONTROL_MODEL_DIRECT_ENHANCED, SIGNAL_CTRL_TYPE::DIRECT_NORMAL},
{CONTROL_MODEL_SBO_ENHANCED, SIGNAL_CTRL_TYPE::SBO_NORMAL}
};
LOCAL void mms_send_control(int fd, const char *saddr, const char *val, uint8_t mms_type, uint8_t ctrl_type)
{ {
stru_mms_m_event *p_event = NULL; stru_mms_m_event *p_event = NULL;
@ -55,14 +73,11 @@ LOCAL void mms_send_control(int fd, const char *saddr, int val, int type)
p_event->app_fd = fd; p_event->app_fd = fd;
memset(p_event->ied, 0, MMS_M_STR_LEN); memset(p_event->ied, 0, MMS_M_STR_LEN);
snprintf(p_event->saddr, MMS_M_STR_LEN, "%s", saddr); snprintf(p_event->saddr, MMS_M_STR_LEN, "%s", saddr);
p_event->ctrl_type = type; p_event->ctrl_type = ctrl_type;
// p_event->val.b = val == 0 ? false : true; p_event->value_type = mms_type;
uint8_t val_b = (val == 0 ? 0 : 1); // p_event->val.b = val == 0 ? false : true;
MY_LOG_I("mms_send_control val_b %d, ctrl_type %d", val_b, p_event->ctrl_type);
// p_event->p_val = (void *)&val_b; // p_event->p_val = (void *)&val_b;
std::string val_str = std::to_string(val_b); strncpy(p_event->val, val, 128);
strncpy(p_event->val, val_str.c_str(), 128);
// mms_m_set_data_value((void *)p_event->val, (void *)&val_b, _MMS_M_data_type_bool); // mms_m_set_data_value((void *)p_event->val, (void *)&val_b, _MMS_M_data_type_bool);
MY_LOG_I("p_event->val %s", p_event->val); MY_LOG_I("p_event->val %s", p_event->val);
@ -183,7 +198,8 @@ void iec61850m_init()
} }
} }
void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data)
LOCAL int iec61850m_signal_change_decode(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data, uint8_t &ctrl_type, uint8_t &mms_type)
{ {
std::string value = ""; std::string value = "";
if(p_data) if(p_data)
@ -191,7 +207,20 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step,
value = dc_get_signal_val(p_data, data_type); value = dc_get_signal_val(p_data, data_type);
} }
uint8_t ctrl_type = 0; for(auto it = g_mms_m_type_to_local_type.begin(); it != g_mms_m_type_to_local_type.end(); it++)
{
if(it->second == data_type)
{
mms_type = it->first;
break;
}
}
if(mms_type == 0)
{
LOG_E("iec61850m_signal_change_decode, data_type %d not found", data_type);
return -1;
}
std::string step_str = ""; std::string step_str = "";
switch(step) switch(step)
@ -205,7 +234,7 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step,
break; break;
case SIGNAL_CTRL_STEP::DIRECT: case SIGNAL_CTRL_STEP::DIRECT:
step_str = "DIRECT"; step_str = "DIRECT";
ctrl_type = _MMS_M_EVENT_CO_DIRECT; ctrl_type = _MMS_M_EVENT_AO_WRITE;
break; break;
case SIGNAL_CTRL_STEP::CANCEL: case SIGNAL_CTRL_STEP::CANCEL:
step_str = "CANCEL"; step_str = "CANCEL";
@ -218,6 +247,19 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step,
MY_LOG_I("iec61850m_signal_change_callback saddr %s, step %s, data_type %s, value %s", saddr.c_str(), step_str.c_str(), data_type_str.c_str(), value.c_str()); MY_LOG_I("iec61850m_signal_change_callback saddr %s, step %s, data_type %s, value %s", saddr.c_str(), step_str.c_str(), data_type_str.c_str(), value.c_str());
return 0;
}
LOCAL void iec61850m_signal_co_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data)
{
uint8_t mms_type = 0;
uint8_t ctrl_type = 0;
if(0 != iec61850m_signal_change_decode(saddr, step, data_type, p_data, ctrl_type, mms_type))
{
return;
}
for(int i = 0; i < g_vec_iec61850m_info.size(); i++) for(int i = 0; i < g_vec_iec61850m_info.size(); i++)
{ {
stru_iec61850m_info *p_info = &g_vec_iec61850m_info[i]; stru_iec61850m_info *p_info = &g_vec_iec61850m_info[i];
@ -227,29 +269,74 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step,
{ {
if(p_config->p_co_sig[j].sig.saddr == saddr) if(p_config->p_co_sig[j].sig.saddr == saddr)
{ {
int val = (int)(*(uint8_t *)p_data); std::string val = dc_get_signal_val(p_data, data_type);
MY_LOG_I("iec61850m_signal_change_callback val %d, ctrl_type %d", val, ctrl_type); MY_LOG_I("iec61850m_signal_change_callback val %s, ctrl_type %d", val.c_str(), ctrl_type);
mms_send_control(p_info->fd, saddr.c_str(), val, ctrl_type); mms_send_control(p_info->fd, saddr.c_str(), val.c_str(), mms_type, ctrl_type);
}
}
}
}
LOCAL void iec61850m_signal_ao_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data)
{
uint8_t mms_type = 0;
uint8_t ctrl_type = 0;
if(0 != iec61850m_signal_change_decode(saddr, step, data_type, p_data, ctrl_type, mms_type))
{
return;
}
if(ctrl_type != _MMS_M_EVENT_AO_WRITE)
{
return;
}
for(int i = 0; i < g_vec_iec61850m_info.size(); i++)
{
stru_iec61850m_info *p_info = &g_vec_iec61850m_info[i];
stru_mms_m_config *p_config = &p_info->mms_config;
for(uint16_t j = 0; j < p_config->ao_num; j++)
{
if(p_config->p_ao_sig[j].sig.saddr == saddr)
{
std::string val = dc_get_signal_val(p_data, data_type);
MY_LOG_I("iec61850m_signal_change_callback val %s, ctrl_type %d", val.c_str(), ctrl_type);
mms_send_control(p_info->fd, saddr.c_str(), val.c_str(), mms_type, ctrl_type);
}
}
}
}
LOCAL void iec61850m_signal_param_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data)
{
uint8_t mms_type = 0;
uint8_t ctrl_type = 0;
if(0 != iec61850m_signal_change_decode(saddr, step, data_type, p_data, ctrl_type, mms_type))
{
return;
}
for(int i = 0; i < g_vec_iec61850m_info.size(); i++)
{
stru_iec61850m_info *p_info = &g_vec_iec61850m_info[i];
stru_mms_m_config *p_config = &p_info->mms_config;
for(uint16_t j = 0; j < p_config->param_num; j++)
{
if(p_config->p_param_sig[j].sig.saddr == saddr)
{
std::string val = dc_get_signal_val(p_data, data_type);
MY_LOG_I("iec61850m_signal_change_callback val %s, ctrl_type %d", val.c_str(), ctrl_type);
mms_send_control(p_info->fd, saddr.c_str(), val.c_str(), mms_type, ctrl_type);
} }
} }
} }
} }
std::map<uint8_t, uint8_t> g_mms_m_type_to_local_type = {
{MMS_BOOLEAN, DATA_TYPE_U8},
{MMS_INTEGER, DATA_TYPE_S32},
{MMS_UNSIGNED, DATA_TYPE_U32},
{MMS_FLOAT, DATA_TYPE_F32},
{MMS_STRING, DATA_TYPE_C64},
};
std::map<uint8_t, uint8_t> g_mms_m_ctrl_type_to_local_ctrl_type = {
{CONTROL_MODEL_STATUS_ONLY, SIGNAL_CTRL_TYPE::NONE},
{CONTROL_MODEL_DIRECT_NORMAL, SIGNAL_CTRL_TYPE::DIRECT_NORMAL},
{CONTROL_MODEL_SBO_NORMAL, SIGNAL_CTRL_TYPE::SBO_NORMAL},
{CONTROL_MODEL_DIRECT_ENHANCED, SIGNAL_CTRL_TYPE::DIRECT_NORMAL},
{CONTROL_MODEL_SBO_ENHANCED, SIGNAL_CTRL_TYPE::SBO_NORMAL}
};
int iec61850m_signal_init(stru_mms_m_config &cfg) int iec61850m_signal_init(stru_mms_m_config &cfg)
{ {
@ -309,7 +396,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
return -1; return -1;
} }
ret |= dc_signal_yk(cfg.p_co_sig[i].sig.saddr, cfg.p_co_sig[i].sig.desc, type_local, ctrl_type_local, p_data, iec61850m_signal_change_callback); ret |= dc_signal_yk(cfg.p_co_sig[i].sig.saddr, cfg.p_co_sig[i].sig.desc, type_local, ctrl_type_local, p_data, iec61850m_signal_co_change_callback);
} }
if(ret != 0) if(ret != 0)
@ -328,6 +415,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
// param.default_value = cfg.p_ao_sig[i].p_default ? dc_get_signal_val(cfg.p_ao_sig[i].p_default, cfg.p_ao_sig[i].sig.data_type) : ""; // param.default_value = cfg.p_ao_sig[i].p_default ? dc_get_signal_val(cfg.p_ao_sig[i].p_default, cfg.p_ao_sig[i].sig.data_type) : "";
uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_ao_sig[i].sig.data_type]; uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_ao_sig[i].sig.data_type];
uint8_t ctrl_type_local = g_mms_m_ctrl_type_to_local_ctrl_type[cfg.p_ao_sig[i].ctrl_type];
void *p_data = cfg.p_ao_sig[i].sig.vec_p_data.empty() ? nullptr : cfg.p_ao_sig[i].sig.vec_p_data[0]; void *p_data = cfg.p_ao_sig[i].sig.vec_p_data.empty() ? nullptr : cfg.p_ao_sig[i].sig.vec_p_data[0];
void *p_def_data = cfg.p_ao_sig[i].vec_p_default.empty() ? nullptr : cfg.p_ao_sig[i].vec_p_default[0]; void *p_def_data = cfg.p_ao_sig[i].vec_p_default.empty() ? nullptr : cfg.p_ao_sig[i].vec_p_default[0];
@ -338,7 +426,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
return -1; return -1;
} }
ret |= dc_signal_ao(cfg.p_ao_sig[i].sig.saddr, cfg.p_ao_sig[i].sig.desc, type_local, param, cfg.p_ao_sig[i].ctrl_type, p_data, p_def_data, iec61850m_signal_change_callback); ret |= dc_signal_ao(cfg.p_ao_sig[i].sig.saddr, cfg.p_ao_sig[i].sig.desc, type_local, param, ctrl_type_local, p_data, p_def_data, iec61850m_signal_ao_change_callback);
} }
if(ret != 0) if(ret != 0)
@ -356,7 +444,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
param.unit = cfg.p_param_sig[i].unit; param.unit = cfg.p_param_sig[i].unit;
uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_param_sig[i].sig.data_type]; uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_param_sig[i].sig.data_type];
ret |= dc_signal_param(cfg.p_param_sig[i].sig.saddr, cfg.p_param_sig[i].sig.desc, type_local, param, cfg.p_param_sig[i].ctrl_type, cfg.p_param_sig[i].sig.vec_p_data, cfg.p_param_sig[i].vec_p_default, iec61850m_signal_change_callback); ret |= dc_signal_param(cfg.p_param_sig[i].sig.saddr, cfg.p_param_sig[i].sig.desc, type_local, param, cfg.p_param_sig[i].ctrl_type, cfg.p_param_sig[i].sig.vec_p_data, cfg.p_param_sig[i].vec_p_default, iec61850m_signal_param_change_callback);
} }
if(ret != 0) if(ret != 0)
@ -501,7 +589,7 @@ LOCAL void cmd_iec61850m(int argc, char *argv[])
int val = atoi(argv[4]); int val = atoi(argv[4]);
int ctrl_type = atoi(argv[5]); int ctrl_type = atoi(argv[5]);
mms_send_control(fd, saddr.c_str(), val, ctrl_type); // mms_send_control(fd, saddr.c_str(), val, ctrl_type);
} }
} }

View File

@ -361,6 +361,8 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
{ {
p_signals = &g_ws_ao_signals; p_signals = &g_ws_ao_signals;
char temp_data[128] = {0};
for(uint32_t i = 0; i < p_signals->size(); i++) for(uint32_t i = 0; i < p_signals->size(); i++)
{ {
stru_ws_signal *p_signal = &p_signals->at(i); stru_ws_signal *p_signal = &p_signals->at(i);
@ -368,7 +370,10 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
{ {
if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL) if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{ {
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str())) memset(temp_data, 0, sizeof(temp_data));
dc_set_signal_val_from_str(temp_data, p_signal->data_type, signal_data);
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)temp_data))
{ {
LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str()); LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return; return;
@ -379,7 +384,10 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
} }
else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL) else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{ {
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)signal_data.c_str())) memset(temp_data, 0, sizeof(temp_data));
dc_set_signal_val_from_str(temp_data, p_signal->data_type, signal_data);
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)temp_data))
{ {
LOG_E("set_signal_data: dc_signal_ao_set_val select failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str()); LOG_E("set_signal_data: dc_signal_ao_set_val select failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return; return;
@ -387,7 +395,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), signal_data.c_str()); LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), signal_data.c_str());
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str())) if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)temp_data))
{ {
LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str()); LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return; return;
@ -398,7 +406,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
} }
else else
{ {
LOG_E("p_signal->ctrl_type is invalid, p_signal->ctrl_type = %d"); LOG_E("p_signal->ctrl_type is invalid, p_signal->ctrl_type = %d", p_signal->ctrl_type);
return; return;
} }
} }

View File

@ -5,31 +5,31 @@
<Para desc="参数" host_ip="198.121.0.30" host_port="102" ied="TEMPLATE" /> <Para desc="参数" host_ip="198.121.0.30" host_port="102" ied="TEMPLATE" />
<Point desc="点表" > <Point desc="点表" >
<St desc="遥信"> <St desc="遥信">
<Item no="0" type="2" name="iec61850m.prj.st.0" desc="遥信01" LDev="PROT" LNode="GGIO7" DoName="Ind5" fc="0"/> <Item no="0" type="2" saddr="iec61850m.prj.st.0" desc="遥信01" LDev="PROT" LNode="GGIO7" DoName="Ind5" fc="0"/>
<Item no="1" type="2" name="iec61850m.prj.st.1" desc="遥信02" LDev="PROT" LNode="GGIO7" DoName="Ind2" fc="0"/> <Item no="1" type="2" saddr="iec61850m.prj.st.1" desc="遥信02" LDev="PROT" LNode="GGIO7" DoName="Ind2" fc="0"/>
<Item no="2" type="2" name="iec61850m.prj.st.2" desc="遥信03" LDev="PROT" LNode="GGIO7" DoName="Ind3" fc="0"/> <Item no="2" type="2" saddr="iec61850m.prj.st.2" desc="遥信03" LDev="PROT" LNode="GGIO7" DoName="Ind3" fc="0"/>
<Item no="3" type="2" name="iec61850m.prj.st.3" desc="遥信04" LDev="CTRL" LNode="TC1CSWI1" DoName="Pos" fc="0"/> <Item no="3" type="2" saddr="iec61850m.prj.st.3" desc="遥信04" LDev="CTRL" LNode="TC1CSWI1" DoName="Pos" fc="0"/>
<Item no="4" type="2" name="iec61850m.prj.st.4" desc="低频保护软压板" LDev="PROT" LNode="GGIO1" DoName="SPCSO1" fc="0"/> <Item no="4" type="2" saddr="iec61850m.prj.st.4" desc="低频保护软压板" LDev="PROT" LNode="GGIO1" DoName="SPCSO1" fc="0"/>
</St> </St>
<Mx desc="遥测"> <Mx desc="遥测">
<Item no="0" type="6" name="iec61850m.prj.mx.0" desc="遥测01" LDev="PROT" LNode="PMMXU1" DoName="Hz.mag.f" fc="1"/> <Item no="0" type="6" saddr="iec61850m.prj.mx.0" desc="遥测01" LDev="PROT" LNode="PMMXU1" DoName="Hz.mag.f" fc="1"/>
<Item no="1" type="6" name="iec61850m.prj.mx.1" desc="遥测02" LDev="PROT" LNode="PMMXU1" DoName="PhV.phsA.cVal.mag.f" fc="1"/> <Item no="1" type="6" saddr="iec61850m.prj.mx.1" desc="遥测02" LDev="PROT" LNode="PMMXU1" DoName="PhV.phsA.cVal.mag.f" fc="1"/>
<Item no="2" type="6" name="iec61850m.prj.mx.2" desc="遥测03" LDev="PROT" LNode="PMMXU1" DoName="PhV.phsB.cVal.mag.f" fc="1"/> <Item no="2" type="6" saddr="iec61850m.prj.mx.2" desc="遥测03" LDev="PROT" LNode="PMMXU1" DoName="PhV.phsB.cVal.mag.f" fc="1"/>
<Item no="3" type="6" name="iec61850m.prj.mx.3" desc="遥测04" LDev="PROT" LNode="PMMXU1" DoName="PhV.phsC.cVal.mag.f" fc="1"/> <Item no="3" type="6" saddr="iec61850m.prj.mx.3" desc="遥测04" LDev="PROT" LNode="PMMXU1" DoName="PhV.phsC.cVal.mag.f" fc="1"/>
</Mx> </Mx>
<Co desc="遥控"> <Co desc="遥控">
<Item no="0" type="2" ctlModel="4" name="iec61850m.prj.co.0" desc="遥控01" LDev="CTRL" LNode="TC1CSWI1" DoName="Pos" fc="0"/> <Item no="0" type="2" ctlModel="4" saddr="iec61850m.prj.co.0" desc="遥控01" LDev="CTRL" LNode="TC1CSWI1" DoName="Pos" fc="0"/>
<Item no="1" type="2" ctlModel="4" name="iec61850m.prj.co.1" desc="遥控02" LDev="CTRL" LNode="TC2CSWI1" DoName="Pos" fc="0"/> <Item no="1" type="2" ctlModel="4" saddr="iec61850m.prj.co.1" desc="遥控02" LDev="CTRL" LNode="TC2CSWI1" DoName="Pos" fc="0"/>
<Item no="2" type="2" ctlModel="4" name="iec61850m.prj.co.2" desc="遥控03" LDev="CTRL" LNode="TC3CSWI1" DoName="Pos" fc="0"/> <Item no="2" type="2" ctlModel="4" saddr="iec61850m.prj.co.2" desc="遥控03" LDev="CTRL" LNode="TC3CSWI1" DoName="Pos" fc="0"/>
<Item no="3" type="2" ctlModel="4" name="iec61850m.prj.co.3" desc="遥控04" LDev="CTRL" LNode="TC4CSWI1" DoName="Pos" fc="0"/> <Item no="3" type="2" ctlModel="4" saddr="iec61850m.prj.co.3" desc="遥控04" LDev="CTRL" LNode="TC4CSWI1" DoName="Pos" fc="0"/>
<Item no="4" type="2" ctlModel="4" name="iec61850m.prj.co.4" desc="低频保护软压板" LDev="PROT" LNode="GGIO1" DoName="SPCSO1" fc="0"/> <Item no="4" type="2" ctlModel="4" saddr="iec61850m.prj.co.4" desc="低频保护软压板" LDev="PROT" LNode="GGIO1" DoName="SPCSO1" fc="0"/>
</Co> </Co>
<Ao desc="参数"> <Ao desc="参数">
<Item no="0" type="5" ctlModel="4" name="iec61850m.prj.ao.0" desc="参数01" LDev="PROT" LNode="LPHD1" DoName="SettingGrp" fc="2" min="1" max="30" step="1" unit="" value="1" default="1"/> <Item no="0" type="4" ctlModel="4" saddr="iec61850m.prj.ao.0" desc="参数01" LDev="PROT" LNode="LPHD1" DoName="SettingGrp.setVal" fc="2" min="1" max="30" step="1" unit="" value="1" default="1"/>
<Item no="1" type="5" ctlModel="4" name="iec61850m.prj.ao.1" desc="参数02" LDev="PROT" LNode="LPHD1" DoName="DeviceName" fc="2" min="" max="" step="" unit="" value="1" default="1"/> <Item no="1" type="13" ctlModel="4" saddr="iec61850m.prj.ao.1" desc="参数02" LDev="PROT" LNode="LPHD1" DoName="DeviceName" fc="2" min="" max="" step="" unit="" value="1" default="1"/>
</Ao> </Ao>
<Param desc="定值"> <Param desc="定值">
<Item no="0" type="5" ctlModel="4" name="iec61850m.prj.param.0" desc="定值01" LDev="PROT" LNode="LPHD1" DoName="SettingGrp" fc="2" min="0.05" max="150" step="0.001" unit="A" num="2"> <Item no="0" type="5" ctlModel="4" saddr="iec61850m.prj.param.0" desc="定值01" LDev="PROT" LNode="LPHD1" DoName="SettingGrp" fc="2" min="0.05" max="150" step="0.001" unit="A" num="2">
<SubItem value="15" default="15"/> <SubItem value="15" default="15"/>
<SubItem value="27" default="27"/> <SubItem value="27" default="27"/>
</Item> </Item>