<修改> 1、修复了mms部分的bug

This commit is contained in:
ypc 2026-06-09 18:52:56 +08:00
parent 1a16180a9c
commit 2a3113f935
10 changed files with 367 additions and 156 deletions

View File

@ -11,7 +11,9 @@ extern "C" {
#define MY_GET_DATA_WITH_TYPE(p, type) (*(type *)(p))
#endif
#define MMS_M_REASON_ALL_CALL 64 // 总召遥信遥测参数
#define MMS_M_REASON_READ_AO 65 // 读取参数
#define MMS_M_REASON_READ_PARAM 66 // 读取定值
enum
{
@ -79,6 +81,7 @@ typedef struct
MMS_STR desc;
MMS_REF reference;
void *p_value;
int set_zone; // 定值区
stru_mms_m_time time;
}stru_mms_m_out_value;
@ -157,10 +160,13 @@ int mms_m_out_get_connect_status(int fd, mms_m_out_status_cb p_func);
int mms_m_out_debug_print_swicth(int id, int debug_print_flag);
int mms_m_out_do_set_yk_or_param(stru_mms_m_event *p_event);
int mms_m_out_do_set_yk(stru_mms_m_event *p_event);
int mms_m_out_read_params(int app_fd);
int mms_m_out_read_param(int app_fd, const char *param_name);
int mms_m_out_read_ao_or_params(int app_fd, uint8_t type, const char *saddr);
int mms_m_out_bind_param_zone_signal(int app_fd, const char *zone_saddr);
int mms_m_out_get_value(int app_fd, mms_m_out_value_cb p_func);
char *mms_m_out_reason_str(int reason);

View File

@ -50,10 +50,10 @@
#define LOG_E(fmt, ...) LOG(COLOR_RED, "ERROR", fmt, ##__VA_ARGS__)
#define MMS_M_THREAD_RUN_TM 100 //线程运行间隔时间 100ms
#define MMS_M_THREAD_RUN_TM 100*3 //线程运行间隔时间 100ms
#define MMS_M_TIMER_T0 (120 * (MMS_M_THREAD_RUN_TM * 10 / 1000)) // 定时器T0 120秒
#define MMS_M_TIMER_T1 (60 * (MMS_M_THREAD_RUN_TM * 10 / 1000)) // 定时器T1 60秒
#define MMS_M_TIMER_T2 (15 * (MMS_M_THREAD_RUN_TM * 10 / 1000)) // 定时器T2 15
#define MMS_M_TIMER_T2 (30 * (MMS_M_THREAD_RUN_TM * 10 / 1000)) // 定时器T2 30
#define MMS_M_TIMER_T3 (20 * (MMS_M_THREAD_RUN_TM * 10 / 1000)) // 定时器T3 20秒
@ -178,6 +178,9 @@ typedef struct
MmsValue *param_zone; // 参数定值区
MmsValue *set_confirm; // 设置确认
MMS_STR zone_saddr; // 关联的定值区信号saddr如ao.0
int current_zone; // 当前定值区号
stru_mms_m_run run; // 运行时数据结构
std::vector<stru_ldev> ldevs; // 逻辑设备集合

View File

@ -13,8 +13,7 @@
// #include "conversions.h"
#define MMS_M_REASON_ALL_CALL 64
#define MMS_M_REASON_READ_PARAM 65
#define MMS_M_RECONNECT_INTERVAL 60 // seconds
static const std::string g_sgcb_edit_sg = "LLN0.SGCB.EditSG";
@ -37,6 +36,7 @@ void Conversions_msTimeToGeneralizedTime(unsigned long msTime, unsigned char* bu
}
#endif
//
static void sleep_ms(uint32_t ms)
{
struct timespec rqtp;
@ -209,7 +209,7 @@ static int mms_m_get_mmsValue(MmsValue *mms_value, uint8_t &type, void *p_val)
strcpy((char *)p_val, MmsValue_toString(mms_value));
break;
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 %d\n", mms_type);
return -1;
}
@ -286,6 +286,101 @@ static int mms_m_param_value_sync(stru_point_item &item, stru_mms_m_event &event
return 0;
}
static void mms_m_send_read_ao(stru_mms_m_obj &obj, stru_mms_m_event &event)
{
IedClientError err;
MmsValue *p_value = NULL;
stru_mms_m_out_value out_val;
stru_point_item *p_item = NULL;
// When saddr is empty, read ALL AO values; otherwise match specific saddr
bool match_all = (strlen(event.saddr) == 0);
for(int i = 0; i < obj.p_cfg->point.ao_num; i++)
{
if(match_all)
{
p_item = &obj.p_cfg->point.p_ao[i];
}
else if(obj.p_cfg->point.p_ao && 0 == strcmp(event.saddr, obj.p_cfg->point.p_ao[i].saddr))
{
p_item = &obj.p_cfg->point.p_ao[i];
}
else
{
continue;
}
if(NULL == (p_value = IedConnection_readObject(obj.run.con, &err, p_item->reference, (FunctionalConstraint)p_item->fc)))
{
LOG_E("%s: saddr %s, ref %s read err:%s(%d)\n",
obj.cfg_path.c_str(), p_item->saddr, p_item->reference, mms_m_err_str(err), err);
continue;
}
if(MMS_M_DEBUG_PRINT_ON == obj.debug_print_flag)
{
mms_m_show_MmsValue(p_value, &p_item->type);
}
if(0 != mms_m_get_mmsValue(p_value, p_item->type, p_item->value.p_val[0]))
{
LOG_E("get mms value failed");
MmsValue_delete(p_value);
continue;
}
mms_m_get_local_time(out_val.time);
out_val.p_value = p_item->value.p_val[0];
out_val.type = p_item->type;
out_val.quality = 0;
snprintf(out_val.name, sizeof(out_val.name), "%s", p_item->saddr);
snprintf(out_val.desc, sizeof(out_val.desc), "%s", p_item->desc);
snprintf(out_val.reference, sizeof(out_val.reference), "%s", p_item->reference);
out_val.reason = MMS_M_REASON_READ_AO; // call ao
out_val.app_fd = obj.obj_fd;
mms_m_put_value(obj, out_val);
// Check if this is the zone signal and detect zone change
if (strlen(obj.zone_saddr) > 0 && 0 == strcmp(obj.zone_saddr, p_item->saddr))
{
int new_zone = 0;
switch (p_item->type)
{
case MMS_INTEGER:
new_zone = MY_GET_DATA_WITH_TYPE(p_item->value.p_val[0], int32_t);
break;
case MMS_UNSIGNED:
new_zone = (int)MY_GET_DATA_WITH_TYPE(p_item->value.p_val[0], uint32_t);
break;
default:
break;
}
if (new_zone > 0 && (new_zone) != obj.current_zone)
{
LOG_I("%s: zone changed %d -> %d, trigger param re-read", obj.cfg_path.c_str(), obj.current_zone, new_zone);
obj.current_zone = new_zone;
stru_mms_m_event param_event;
memset(&param_event, 0, sizeof(stru_mms_m_event));
param_event.ctrl_type = _MMS_M_EVENT_PARAM_READ;
mms_m_push_event(obj, param_event);
}
else if (obj.current_zone == 0 && new_zone > 0 && (new_zone) != obj.current_zone)
{
obj.current_zone = new_zone;
LOG_I("%s: init zone=%d from %s", obj.cfg_path.c_str(), obj.current_zone, p_item->saddr);
}
}
MmsValue_delete(p_value);
}
}
static int mms_m_send_ao_write(stru_mms_m_obj &obj, stru_mms_m_event &event)
{
stru_point_item *p_item = NULL;
@ -336,17 +431,73 @@ static int mms_m_send_ao_write(stru_mms_m_obj &obj, stru_mms_m_event &event)
return 0;
}
static void demo_sg_cb(int fd, const char *ld_name,
int act_sg, int num_sg, int err)
static void mms_m_send_read_param(stru_mms_m_obj &obj, stru_mms_m_event &event)
{
if (IED_ERROR_OK != err)
{
LOG_E("read SG info failed: %s, err=%d", ld_name, err);
/** 定值组信息读取回调 */
return;
}
MmsValue *p_value = NULL;
stru_mms_m_out_value out_val;
stru_point_item *p_item = NULL;
IedClientError err;
LOG_I("%s: active SG=%d, total SG=%d", ld_name, act_sg, num_sg);
bool match_all = (strlen(event.saddr) == 0);
int act_sg = obj.current_zone;
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++)
{
if(match_all)
{
p_item = &obj.p_cfg->point.p_param[i];
}
else if(obj.p_cfg->point.p_param && 0 == strcmp(event.saddr, obj.p_cfg->point.p_param[i].saddr))
{
p_item = &obj.p_cfg->point.p_param[i];
}
else
{
continue;
}
if(NULL == (p_value = IedConnection_readObject(obj.run.con, &err, p_item->reference, (FunctionalConstraint)p_item->fc)))
{
LOG_E("%s: saddr %s, ref %s read err:%s(%d)\n",
obj.cfg_path.c_str(), p_item->saddr, p_item->reference, mms_m_err_str(err), err);
continue;
}
if(MMS_M_DEBUG_PRINT_ON == obj.debug_print_flag)
{
mms_m_show_MmsValue(p_value, &p_item->type);
}
// temp buffer to avoid polluting p_val[0] (== vec[0] after signal replace)
uint8_t tmp_val[MMS_M_DATA_STRING_LEN] = {0};
if(0 != mms_m_get_mmsValue(p_value, p_item->type, tmp_val))
{
LOG_E("get mms value failed, ref %s", p_item->reference);
MmsValue_delete(p_value);
continue;
}
mms_m_get_local_time(out_val.time);
out_val.p_value = tmp_val;
out_val.type = p_item->type;
out_val.quality = 0;
snprintf(out_val.name, sizeof(out_val.name), "%s", p_item->saddr);
snprintf(out_val.desc, sizeof(out_val.desc), "%s", p_item->desc);
snprintf(out_val.reference, sizeof(out_val.reference), "%s", p_item->reference);
out_val.reason = MMS_M_REASON_READ_PARAM; // call param
out_val.app_fd = obj.obj_fd;
out_val.set_zone = act_sg;
mms_m_put_value(obj, out_val);
MmsValue_delete(p_value);
}
}
static int mms_m_send_param_write(stru_mms_m_obj &obj, stru_mms_m_event &event)
@ -369,7 +520,6 @@ static int mms_m_send_param_write(stru_mms_m_obj &obj, stru_mms_m_event &event)
return -1;
}
mms_m_read_sg_info(obj.obj_fd, p_item->ldev, demo_sg_cb);
std::string ref = p_item->reference;
size_t pos = ref.find("/");
@ -446,60 +596,6 @@ static int mms_m_send_param_write(stru_mms_m_obj &obj, stru_mms_m_event &event)
return 0;
}
static void mms_m_send_read_ao(stru_mms_m_obj &obj, stru_mms_m_event &event)
{
IedClientError err;
MmsValue *p_value = NULL;
stru_mms_m_out_value out_val;
stru_point_item *p_item = NULL;
for(int i = 0; i < obj.p_cfg->point.ao_num; i++)
{
if(obj.p_cfg->point.p_ao && 0 == strcmp(event.saddr, obj.p_cfg->point.p_ao[i].saddr))
{
p_item = &obj.p_cfg->point.p_ao[i];
}
else
{
continue;
}
if(NULL == (p_value = IedConnection_readObject(obj.run.con, &err, p_item->reference, (FunctionalConstraint)p_item->fc)))
{
LOG_E("%s: saddr %s, ref %s read err:%s(%d)\n",
obj.cfg_path.c_str(), p_item->saddr, p_item->reference, mms_m_err_str(err), err);
continue;
}
if(MMS_M_DEBUG_PRINT_ON == obj.debug_print_flag)
{
mms_m_show_MmsValue(p_value, &p_item->type);
}
if(0 != mms_m_get_mmsValue(p_value, p_item->type, p_item->value.p_val[0]))
{
LOG_E("get mms value failed");
MmsValue_delete(p_value);
continue;
}
mms_m_get_local_time(out_val.time);
out_val.p_value = p_item->value.p_val[0];
out_val.type = p_item->type;
out_val.quality = 0;
snprintf(out_val.name, sizeof(out_val.name), "%s", p_item->saddr);
snprintf(out_val.desc, sizeof(out_val.desc), "%s", p_item->desc);
snprintf(out_val.reference, sizeof(out_val.reference), "%s", p_item->reference);
out_val.reason = MMS_M_REASON_READ_PARAM; // call param
out_val.app_fd = obj.obj_fd;
mms_m_put_value(obj, out_val);
MmsValue_delete(p_value);
}
}
static void mms_m_command_termination_handler(void *parameter, ControlObjectClient connection)
{
@ -767,7 +863,6 @@ static void mms_m_send_call_all(stru_mms_m_obj &obj)
{
{&obj.p_cfg->point.st_num, obj.p_cfg->point.p_st},
{&obj.p_cfg->point.mx_num, obj.p_cfg->point.p_mx},
{&obj.p_cfg->point.ao_num, obj.p_cfg->point.p_ao},
};
IedClientError err;
@ -845,6 +940,7 @@ static void mms_m_do_send(stru_mms_m_obj &obj)
mms_m_send_set_callback(event, mms_m_send_ao_write(obj, event));
break;
case _MMS_M_EVENT_PARAM_READ:
mms_m_send_read_param(obj, event);
break;
case _MMS_M_EVENT_PARAM_WRITE:
mms_m_send_set_callback(event, mms_m_send_param_write(obj, event));
@ -1553,6 +1649,21 @@ static void mms_m_do_call_GI(void *arg)
mms_m_timer_start(p_obj->run.timer[_MMS_M_TIMER_T1]);
}
static void mms_m_do_call_all_ao_param(void *arg)
{
stru_mms_m_obj *p_obj = (stru_mms_m_obj *)arg;
if(NULL == p_obj)
{
LOG_E("mms_m_do_call_all_ao_param p_obj is NULL");
return;
}
mms_m_out_read_ao_or_params(p_obj->obj_fd, _MMS_M_EVENT_AO_READ, nullptr);
mms_m_out_read_ao_or_params(p_obj->obj_fd, _MMS_M_EVENT_PARAM_READ, nullptr);
mms_m_timer_start(p_obj->run.timer[_MMS_M_TIMER_T2]);
}
static void mms_m_timer_init(stru_mms_m_obj &obj)
{
stru_mms_m_timer *p_timer = obj.run.timer;
@ -1574,8 +1685,8 @@ static void mms_m_timer_init(stru_mms_m_obj &obj)
p_timer[_MMS_M_TIMER_T2].tmout = MMS_M_TIMER_T2;
p_timer[_MMS_M_TIMER_T2].arg = NULL;
p_timer[_MMS_M_TIMER_T2].p_func = NULL;
p_timer[_MMS_M_TIMER_T2].arg = &obj;
p_timer[_MMS_M_TIMER_T2].p_func = mms_m_do_call_all_ao_param;
p_timer[_MMS_M_TIMER_T3].tmout = MMS_M_TIMER_T3;
p_timer[_MMS_M_TIMER_T3].arg = NULL;
@ -1908,7 +2019,7 @@ int mms_m_out_debug_print_swicth(int app_fd, int debug_print_flag)
return 0;
}
int mms_m_out_do_set_yk_or_param(stru_mms_m_event *p_event)
int mms_m_out_do_set_yk(stru_mms_m_event *p_event)
{
if(NULL == p_event)
{
@ -1942,7 +2053,7 @@ int mms_m_out_do_set_yk_or_param(stru_mms_m_event *p_event)
return -1;
}
int mms_m_out_read_params(int app_fd)
int mms_m_out_bind_param_zone_signal(int app_fd, const char *zone_saddr)
{
if(g_mms_m_obj_map.find(app_fd) == g_mms_m_obj_map.end())
{
@ -1952,16 +2063,21 @@ int mms_m_out_read_params(int app_fd)
stru_mms_m_obj &obj = *g_mms_m_obj_map[app_fd];
stru_mms_m_event event;
memset(&event, 0, sizeof(stru_mms_m_event));
if(nullptr == zone_saddr || strlen(zone_saddr) == 0)
{
LOG_E("zone_saddr is NULL or empty\n");
return -1;
}
event.ctrl_type = _MMS_M_EVENT_AO_READ;
mms_m_push_event(obj, event);
strncpy(obj.zone_saddr, zone_saddr, sizeof(obj.zone_saddr));
obj.current_zone = 0;
LOG_I("%s: bind zone signal %s", obj.cfg_path.c_str(), zone_saddr);
return 0;
}
int mms_m_out_read_param(int app_fd, const char *param_name)
int mms_m_out_read_ao_or_params(int app_fd, uint8_t type, const char *saddr)
{
if(g_mms_m_obj_map.find(app_fd) == g_mms_m_obj_map.end())
{
@ -1969,13 +2085,22 @@ int mms_m_out_read_param(int app_fd, const char *param_name)
return -1;
}
if(type != _MMS_M_EVENT_AO_READ && type != _MMS_M_EVENT_PARAM_READ)
{
LOG_E("type %d is not supported", type);
return -1;
}
stru_mms_m_obj &obj = *g_mms_m_obj_map[app_fd];
stru_mms_m_event event;
memset(&event, 0, sizeof(stru_mms_m_event));
event.ctrl_type = _MMS_M_EVENT_AO_READ;
strncpy(event.saddr, param_name, sizeof(param_name));
event.ctrl_type = type;
if(nullptr != saddr)
{
strncpy(event.saddr, saddr, sizeof(event.saddr));
}
mms_m_push_event(obj, event);
return 0;
@ -1983,6 +2108,8 @@ int mms_m_out_read_param(int app_fd, const char *param_name)
int mms_m_out_get_value(int fd, mms_m_out_value_cb p_func)
{
if(g_mms_m_obj_map.find(fd) == g_mms_m_obj_map.end())

View File

@ -294,6 +294,10 @@ 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())
{
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,
SIGNAL_CTRL_TYPE::SBO_NORMAL,
vec_p_data.data(), vec_p_default_data.data(), num, nullptr);

View File

@ -432,25 +432,29 @@ LOCAL bool dc_signal_param_add_check(stru_signal *p_signal, const std::string &d
if(p_signal->desc != desc)
{
p_signal->desc = desc;
printf("desc=%s\n", p_signal->desc.c_str());
change = true;
}
if(p_signal->data_type != data_type)
{
p_signal->data_type = data_type;
printf("data_type=%d\n", p_signal->data_type);
change = true;
}
if(p_signal->ctrl_type != ctrl_type)
{
p_signal->ctrl_type = ctrl_type;
change = true;
}
// if(p_signal->ctrl_type != ctrl_type)
// {
// p_signal->ctrl_type = ctrl_type;
// printf("ctrl_type=%d\n", p_signal->ctrl_type);
// change = true;
// }
for(size_t i = 0; i < num; i++)
{
if(0 != dc_data_compare(p_signal->data_type, p_default_data[i], p_signal->vec_p_default_data[i]))
{
printf(" zone %d: val=%s def=%s, %p, %p\n", i+1, dc_get_signal_val(p_signal->vec_p_data[i], p_signal->data_type).c_str(), dc_get_signal_val(p_signal->vec_p_default_data[i], p_signal->data_type).c_str(), p_signal->vec_p_data[i], p_signal->vec_p_default_data[i]);
change = true;
}
}
@ -1101,14 +1105,16 @@ int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data
stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_ao);
if(p_signal != nullptr && !p_signal->vec_p_data.empty() && !p_signal->vec_p_default_data.empty() && nullptr != p_signal->vec_p_data[0] && nullptr != p_signal->vec_p_default_data[0])
{
// Always copy old value to new pointer when data type matches
if(p_signal->data_type == data_type)
{
dc_set_signal_val(p_data, data_type, p_signal->vec_p_data[0]);
}
if(true == dc_signal_ao_add_check(p_signal, desc, data_type, ctrl_type, p_default_data))
{
dc_set_param_cfg_change(true);
}
else
{
dc_set_signal_val(p_data, data_type, p_signal->vec_p_data[0]);
}
// delete p_signal->vec_p_data[0];
dc_delete_signal_data(p_signal->vec_p_data[0], data_type);
@ -1281,10 +1287,12 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
return -1;
}
printf("[SIGNAL_PARAM] saddr=%s data_num=%d\n", saddr.c_str(), data_num);
for(int i = 0; i < data_num; i++)
{
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]);
MY_LOG_E("p_data[%d] or p_default_data[%d] is nullptr", i, i);
return -1;
}
@ -1294,17 +1302,28 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param);
if(p_signal != nullptr)
{
// dc_set_signal_val(p_data, data_type, p_signal->p_data);
if(true == dc_signal_param_add_check(p_signal, desc, data_type, ctrl_type, p_default_data, data_num))
// Always copy old values to new pointers when data type matches
if(p_signal->data_type == data_type)
{
size_t copy_num = (data_num < p_signal->vec_p_data.size()) ? data_num : p_signal->vec_p_data.size();
for(size_t i = 0; i < copy_num; i++)
{
dc_set_signal_val(p_data[i], data_type, p_signal->vec_p_data[i]);
}
}
// 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);
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)
{
printf("[SIGNAL_PARAM_REPLACE] add_check=true -> metadata changed, cfg_change set!\n");
dc_set_param_cfg_change(true);
}
else
{
for(size_t i = 0; i < data_num; i++)
{
dc_set_signal_val(p_data[i], data_type, p_signal->vec_p_data[i]);
}
printf("[SIGNAL_PARAM_REPLACE] add_check=false -> metadata unchanged\n");
}
for(size_t i = 0; i < data_num; i++)
@ -1456,6 +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());
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->data_type != data_type)
@ -1466,9 +1486,11 @@ int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t 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);
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());
return -1;
@ -2161,12 +2183,16 @@ void dc_param_cfg_check(const std::string &path)
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++)
{
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);
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");
item_elem->SetAttribute("index", i+1);
item_elem->SetAttribute("value", dc_get_signal_val(p_param->vec_p_data[i], p_param->data_type).c_str());
item_elem->SetAttribute("default", dc_get_signal_val(p_param->vec_p_default_data[i], p_param->data_type).c_str());
item_elem->SetAttribute("value", val.c_str());
item_elem->SetAttribute("default", def.c_str());
sig_elem->InsertEndChild(item_elem);
}

View File

@ -99,7 +99,7 @@ LOCAL void mms_send_control(int fd, const char *saddr, const char *val, uint8_t
MY_LOG_I("p_event->val %s", p_event->val);
mms_m_out_do_set_yk_or_param(p_event);
mms_m_out_do_set_yk(p_event);
}
LOCAL void mms_event_back(void *arg, int ret)
@ -123,7 +123,12 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
return;
}
if(p->reason != IEC61850_REASON_DATA_CHANGE)
if(p->reason != IEC61850_REASON_DATA_CHANGE &&
// p->reason != IEC61850_REASON_GI &&
// p->reason != IEC61850_REASON_INTEGRITY &&
// p->reason != 64 && // MMS_M_REASON_ALL_CALL
p->reason != MMS_M_REASON_READ_AO && // MMS_M_REASON_READ_PARAM
p->reason != MMS_M_REASON_READ_PARAM)
{
return;
}
@ -141,6 +146,9 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
case MMS_FLOAT:
printf("value %f, ", MY_GET_DATA_WITH_TYPE(p->p_value, float));
break;
case MMS_STRING:
printf("value %s, ", (char *)p->p_value);
break;
default:
break;
}
@ -174,6 +182,33 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
dc_set_out_signal_val(p_cfg->point.p_mx[j].saddr, p->p_value);
}
}
for(uint32_t j = 0; j < p_cfg->point.ao_num; j++)
{
if(strcmp(p_cfg->point.p_ao[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_ao[j].value.p_val[0])
{
auto it_ao = g_mms_m_type_to_local_type.find(p_cfg->point.p_ao[j].type);
uint8_t local_type = (it_ao != g_mms_m_type_to_local_type.end()) ? it_ao->second : 0;
if(local_type != 0)
{
dc_signal_ao_set_val_without_check(p_cfg->point.p_ao[j].saddr, local_type, p->p_value);
}
}
}
for(uint32_t j = 0; j < p_cfg->point.param_num; j++)
{
if(strcmp(p_cfg->point.p_param[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_param[j].value.p_val[0])
{
auto it_param = g_mms_m_type_to_local_type.find(p_cfg->point.p_param[j].type);
uint8_t local_type = (it_param != g_mms_m_type_to_local_type.end()) ? it_param->second : 0;
if(local_type != 0)
{
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);
}
}
}
}
}
}
@ -203,6 +238,8 @@ LOCAL void iec61850m_connect_status(int fd, int status)
if (MMS_M_ON_LINE == status)
{
iec61850m_ext_demo(fd);
mms_m_out_read_ao_or_params(fd, _MMS_M_EVENT_AO_READ, NULL);
mms_m_out_read_ao_or_params(fd, _MMS_M_EVENT_PARAM_READ, NULL);
}
}
@ -565,6 +602,14 @@ int iec61850m_init()
}
MY_LOG_I("mms_m_out_init success, fd %d, no %d, prj_name %s", p_info->fd, i, p_info->prj_name);
// Bind the first AO signal as the param zone indicator
stru_cfg *p_cfg = p_info->p_cfg;
if (p_cfg && p_cfg->point.ao_num > 0 && strlen(p_cfg->point.p_ao[0].saddr) > 0)
{
mms_m_out_bind_param_zone_signal(p_info->fd, p_cfg->point.p_ao[0].saddr);
}
mms_m_out_get_value(p_info->fd, mms_data_back);
mms_m_out_get_connect_status(p_info->fd, iec61850m_connect_status);
}

View File

@ -326,13 +326,13 @@ LOCAL int iec61850s_param_signals_init(std::vector<stru_mms_s_signal_base> &vec_
return -1;
}
param.param_num = p_data_vec.size();
for(uint8_t i = 0; i < param.param_num; ++i)
{
param.p_data[i] = p_data_vec[i];
}
g_vec_param.push_back(param);
g_vec_param.back().param_num = p_data_vec.size();
for(uint8_t i = 0; i < p_data_vec.size(); ++i)
{
g_vec_param.back().p_data[i] = p_data_vec[i];
}
}
if(0 != mms_s_param_register(g_vec_param.data(), g_vec_param.size(), iec61850s_param_callback))

View File

@ -5441,25 +5441,25 @@
</LDevice>
<LDevice inst="CTRL">
<LN0 lnType="NRR_LLN0_P9600" lnClass="LLN0" inst="">
<!-- <DataSet name="dsRelayAin" desc="模拟量">
<DataSet name="dsRelayAin" desc="模拟量">
<FCDA ldInst="CTRL" lnClass="GAPC" lnInst="1" doName="DirHar1I0" daName="mag.f" fc="MX" />
<FCDA ldInst="CTRL" lnClass="GAPC" lnInst="1" doName="DirHar5I0" daName="mag.f" fc="MX" />
<FCDA ldInst="CTRL" lnClass="GAPC" lnInst="1" doName="MagHar1I0" daName="mag.f" fc="MX" />
<FCDA ldInst="CTRL" lnClass="GAPC" lnInst="1" doName="MagHar5I0" daName="mag.f" fc="MX" />
<FCDA ldInst="CTRL" lnClass="GAPC" lnInst="1" doName="VolHar1I0" daName="mag.f" fc="MX" />
<FCDA ldInst="CTRL" lnClass="GAPC" lnInst="1" doName="VolHar5I0" daName="mag.f" fc="MX" />
</DataSet> -->
</DataSet>
<DataSet name="dsCommState" desc="通信工况信号数据集">
<FCDA ldInst="CTRL" prefix="TC1" lnClass="CSWI" lnInst="1" doName="Pos" fc="ST" />
<FCDA ldInst="CTRL" prefix="TC2" lnClass="CSWI" lnInst="1" doName="Pos" fc="ST" />
<FCDA ldInst="CTRL" prefix="TC3" lnClass="CSWI" lnInst="1" doName="Pos" fc="ST" />
<FCDA ldInst="CTRL" prefix="TC4" lnClass="CSWI" lnInst="1" doName="Pos" fc="ST" />
</DataSet>
<!-- <ReportControl name="urcbRelayAin" datSet="dsRelayAin" intgPd="30000" rptID="CTRL/LLN0$RP$urcbRelayAin" confRev="1" buffered="false" bufTime="0">
<ReportControl name="urcbRelayAin" datSet="dsRelayAin" intgPd="30000" rptID="CTRL/LLN0$RP$urcbRelayAin" confRev="1" buffered="false" bufTime="0">
<TrgOps dchg="true" period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" dataRef="false" entryID="false" configRef="false" />
<RptEnabled max="16" />
</ReportControl> -->
</ReportControl>
<ReportControl name="brcbCommState" datSet="dsCommState" intgPd="0" rptID="CTRL/LLN0$BR$brcbCommState" confRev="1" buffered="true" bufTime="0">
<TrgOps dchg="true" qchg="false" dupd="false" period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" dataRef="true" entryID="true" configRef="true" />
@ -5739,7 +5739,7 @@
</DAI>
</DOI>
</LN>
<!-- <LN lnType="NRR_GAPC_V1.01" lnClass="GAPC" inst="1">
<LN lnType="NRR_GAPC_V1.01" lnClass="GAPC" inst="1">
<DOI name="Mod" desc="Mode">
<DAI name="ctlModel">
<Val>0</Val>
@ -5848,9 +5848,9 @@
<Val>SGCC MODEL:2009</Val>
</DAI>
</DOI>
</LN> -->
</LN>
</LDevice>
<!-- <LDevice inst="MEAS">
<LDevice inst="MEAS">
<LN0 lnType="NRR_LLN0_P9600" lnClass="LLN0" inst="">
<DataSet name="dsAin" desc="遥测数据集">
<FCDA ldInst="MEAS" prefix="M" lnClass="MMXU" lnInst="1" doName="Hz" daName="mag.f" fc="MX" />
@ -6598,7 +6598,7 @@
</DAI>
</DOI>
</LN>
</LDevice> -->
</LDevice>
</Server>
</AccessPoint>
</IED>

View File

@ -29,7 +29,7 @@
<Item no="1" type="13" ctlModel="4" saddr="iec61850m.prj.ao.1" desc="参数02" LDev="PROT" LNode="LPHD1" DoName="DeviceName.setVal" fc="2" />
</Ao>
<Param desc="定值">
<Item no="0" type="6" ctlModel="4" saddr="iec61850m.prj.param.0" desc="定值01" LDev="PROT" LNode="PTOC1" DoName="StrVal.setMag.f" fc="2" />
<Item no="0" type="6" ctlModel="4" saddr="iec61850m.prj.param.0" desc="定值01" LDev="PROT" LNode="PTOC1" DoName="StrVal.setMag.f" fc="6" />
</Param>
</Point>
</Root>

View File

@ -1499,7 +1499,7 @@
<Signal id="1495" saddr="self_ptl.ao.LocalMAC_W" desc="内置网口-MAC" type="mac" min="0" max="0" step="0" unit="" value="30:36:34:34:81:FC" default="00:00:00:00:00:00"/>
<Signal id="1496" saddr="self_ptl.ao.EthName_E" desc="维护网口-网口名" type="char8" min="0" max="0" step="0" unit="" value="eth0" default=""/>
<Signal id="1497" saddr="self_ptl.ao.LocalMAC_E" desc="维护网口-MAC" type="mac" min="0" max="0" step="0" unit="" value="30:36:34:35:81:FC" default="00:00:00:00:00:00"/>
<Signal id="1498" saddr="self_ptl.ao.CollePassWord_HY" desc="华云规约-采é†ĺ™¨ĺ݆ç <C3A7>" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1498" saddr="self_ptl.ao.CollePassWord_HY" desc="华云规约-采集器密码" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1499" saddr="self_ptl.ao.ColleText_HY" desc="华云规约-采集器密文" type="char8" min="0" max="0" step="0" unit="" value="" default=""/>
<Signal id="1500" saddr="self_ptl.ao.Province" desc="华云规约-省份" type="char8" min="0" max="0" step="0" unit="" value="654321" default=""/>
<Signal id="1501" saddr="self_ptl.ao.Region_HY" desc="华云规约-地区" type="char8" min="0" max="0" step="0" unit="" value=" " default=""/>
@ -1509,16 +1509,16 @@
<Signal id="1504" saddr="self_ptl.ao.MAC_BLT" desc="蓝牙-MAC" type="mac" min="0" max="0" step="0" unit="" value="00:00:00:00:00:00" default="00:00:00:00:00:00"/>
<Signal id="1505" saddr="self_ptl.ao.PASSWORD1ST_BLE" desc="蓝牙-配电我来保一级认证密码" type="char8" min="0" max="0" step="0" unit="" value="123456" default=""/>
<Signal id="1506" saddr="self_ptl.ao.PASSWORD2ST_BLE" desc="蓝牙-配电我来保二级认证密码" type="char8" min="0" max="0" step="0" unit="" value="654321" default=""/>
<Signal id="1507" saddr="self_ptl.ao.c8_Placeholder1" desc="占位61" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1508" saddr="self_ptl.ao.c8_Placeholder2" desc="占位62" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1509" saddr="self_ptl.ao.c8_Placeholder3" desc="占位63" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1510" saddr="self_ptl.ao.c8_Placeholder4" desc="占位64" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1511" saddr="self_ptl.ao.c8_Placeholder5" desc="占位65" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1512" saddr="self_ptl.ao.c8_Placeholder6" desc="占位66" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1513" saddr="self_ptl.ao.c8_Placeholder7" desc="占位67" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1514" saddr="self_ptl.ao.c8_Placeholder8" desc="占位68" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1515" saddr="self_ptl.ao.c8_Placeholder9" desc="占位69" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1516" saddr="self_ptl.ao.c8_Placeholder10" desc="占位70" type="char8" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙" default=""/>
<Signal id="1507" saddr="self_ptl.ao.c8_Placeholder1" desc="占位61" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1508" saddr="self_ptl.ao.c8_Placeholder2" desc="占位62" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1509" saddr="self_ptl.ao.c8_Placeholder3" desc="占位63" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1510" saddr="self_ptl.ao.c8_Placeholder4" desc="占位64" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1511" saddr="self_ptl.ao.c8_Placeholder5" desc="占位65" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1512" saddr="self_ptl.ao.c8_Placeholder6" desc="占位66" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1513" saddr="self_ptl.ao.c8_Placeholder7" desc="占位67" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1514" saddr="self_ptl.ao.c8_Placeholder8" desc="占位68" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1515" saddr="self_ptl.ao.c8_Placeholder9" desc="占位69" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1516" saddr="self_ptl.ao.c8_Placeholder10" desc="占位70" type="char8" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1517" saddr="self_ptl.ao.RES-FACTOR_WAVE" desc="录波-文件厂家名称" type="char32" min="0" max="0" step="0" unit="" value="CSG" default=""/>
<Signal id="1518" saddr="self_ptl.ao.EarthModuleName" desc="保护-外部接地模块厂商名称" type="char32" min="0" max="0" step="0" unit="" value="0" default=""/>
<Signal id="1519" saddr="self_ptl.ao.USR_SF_VER" desc="生产-配置软件号" type="char32" min="0" max="0" step="0" unit="" value="SV02.105" default=""/>
@ -1528,32 +1528,32 @@
<Signal id="1523" saddr="self_ptl.ao.INFO_PROTOCOL" desc="规约类型" type="char32" min="0" max="0" step="0" unit="" value="101104" default=""/>
<Signal id="1524" saddr="self_ptl.ao.INFO_FACTORYMODEL" desc="出厂型号" type="char32" min="0" max="0" step="0" unit="" value="CSC-271F" default=""/>
<Signal id="1525" saddr="self_ptl.ao.CodeDate" desc="生产-软件版本日期" type="char32" min="0" max="0" step="0" unit="" value="" default=""/>
<Signal id="1526" saddr="self_ptl.ao.RES_C24_SYS1" desc="软件ç‰<EFBFBD>本校验ç <EFBFBD>-字符型" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1527" saddr="self_ptl.ao.RES_C24_SYS2" desc="生产-预留1" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1528" saddr="self_ptl.ao.RES_C24_SYS3" desc="生产-预留2" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1526" saddr="self_ptl.ao.RES_C24_SYS1" desc="软件版本校验码-字符型" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1527" saddr="self_ptl.ao.RES_C24_SYS2" desc="生产-预留1" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1528" saddr="self_ptl.ao.RES_C24_SYS3" desc="生产-预留2" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1529" saddr="self_ptl.ao.TerminalId_HY" desc="华云规约-终端ID号" type="char32" min="0" max="0" step="0" unit="" value=" " default=""/>
<Signal id="1530" saddr="self_ptl.ao.SimCard_HY" desc="华云规约-sim卡号" type="char32" min="0" max="0" step="0" unit="" value=" " default=""/>
<Signal id="1531" saddr="self_ptl.ao.ENER_BLT" desc="蓝牙-密ç <C3A7>" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1532" saddr="self_ptl.ao.RES_USERNAME_GPRS" desc="ć— çşż-用ć<C2A8>·ĺ<C2B7>Ť" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1533" saddr="self_ptl.ao.APN_GPRS" desc="ć— çşż-密ç <C3A7>" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1534" saddr="self_ptl.ao.PASS_GPRS" desc="ć— çşż-APN" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1535" saddr="self_ptl.ao.punLockFre" desc="ć— çşż-é”<C3A9>定é˘ć®µ" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1536" saddr="self_ptl.ao.punLockBand" desc="ć— çşż-é”<C3A9>定小区" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1531" saddr="self_ptl.ao.ENER_BLT" desc="蓝牙-密码" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1532" saddr="self_ptl.ao.RES_USERNAME_GPRS" desc="无线-用户名" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1533" saddr="self_ptl.ao.APN_GPRS" desc="无线-密码" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1534" saddr="self_ptl.ao.PASS_GPRS" desc="无线-APN" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1535" saddr="self_ptl.ao.punLockFre" desc="无线-锁定频段" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1536" saddr="self_ptl.ao.punLockBand" desc="无线-锁定小区" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1537" saddr="self_ptl.ao.LCD_PassWord" desc="液晶密码" type="char32" min="0" max="0" step="0" unit="" value="0000" default=""/>
<Signal id="1538" saddr="self_ptl.ao.c32_Placeholder1" desc="占位71" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1539" saddr="self_ptl.ao.c32_Placeholder2" desc="占位72" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1540" saddr="self_ptl.ao.c32_Placeholder3" desc="占位73" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1541" saddr="self_ptl.ao.c32_Placeholder4" desc="占位74" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1542" saddr="self_ptl.ao.c32_Placeholder5" desc="占位75" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1543" saddr="self_ptl.ao.c32_Placeholder6" desc="占位76" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1544" saddr="self_ptl.ao.c32_Placeholder7" desc="占位77" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1545" saddr="self_ptl.ao.c32_Placeholder8" desc="占位78" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1546" saddr="self_ptl.ao.c32_Placeholder9" desc="占位79" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1547" saddr="self_ptl.ao.c32_Placeholder10" desc="占位80" type="char32" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1538" saddr="self_ptl.ao.c32_Placeholder1" desc="占位71" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1539" saddr="self_ptl.ao.c32_Placeholder2" desc="占位72" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1540" saddr="self_ptl.ao.c32_Placeholder3" desc="占位73" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1541" saddr="self_ptl.ao.c32_Placeholder4" desc="占位74" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1542" saddr="self_ptl.ao.c32_Placeholder5" desc="占位75" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1543" saddr="self_ptl.ao.c32_Placeholder6" desc="占位76" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1544" saddr="self_ptl.ao.c32_Placeholder7" desc="占位77" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1545" saddr="self_ptl.ao.c32_Placeholder8" desc="占位78" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1546" saddr="self_ptl.ao.c32_Placeholder9" desc="占位79" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1547" saddr="self_ptl.ao.c32_Placeholder10" desc="占位80" type="char32" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1548" saddr="self_ptl.ao.DoubleMac" desc="生产-双MAC地址" type="char64" min="0" max="0" step="0" unit="" value="30-36-34-34-81-FC,30-36-34-35-81-FC" default=""/>
<Signal id="1549" saddr="self_ptl.ao.PRODUCTION_SN" desc="生产-生产序列号" type="char64" min="0" max="0" step="0" unit="" value="" default=""/>
<Signal id="1550" saddr="self_ptl.ao.HD_SERIAL" desc="生产-生产厂商(utf-8)" type="char64" min="0" max="0" step="0" unit="" value=" ķ ̱ ̼ ޹ ˾" default=""/>
<Signal id="1551" saddr="self_ptl.ao.ManuFacturers" desc="生产-生产厂商(gbk)" type="char64" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1551" saddr="self_ptl.ao.ManuFacturers" desc="生产-生产厂商(gbk)" type="char64" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1552" saddr="self_ptl.ao.CN_RES1_U" desc="生产-设备批次(utf-8)" type="char64" min="0" max="0" step="0" unit="" value=" " default=""/>
<Signal id="1553" saddr="self_ptl.ao.CN_RES1_G" desc="生产-设备批次(gbk)" type="char64" min="0" max="0" step="0" unit="" value=" " default=""/>
<Signal id="1554" saddr="self_ptl.ao.CN_RES2_U" desc="生产-开关制造商(utf-8)" type="char64" min="0" max="0" step="0" unit="" value=" " default=""/>
@ -1562,15 +1562,15 @@
<Signal id="1557" saddr="self_ptl.ao.CN_RES4_G" desc="生产-设备类型(gbk)" type="char64" min="0" max="0" step="0" unit="" value=" " default=""/>
<Signal id="1558" saddr="self_ptl.ao.CN_RES3_U" desc="生产-参数版本(utf-8)" type="char64" min="0" max="0" step="0" unit="" value=" " default=""/>
<Signal id="1559" saddr="self_ptl.ao.CN_RES5_U" desc="生产-参数版本(gbk)" type="char64" min="0" max="0" step="0" unit="" value=" " default=""/>
<Signal id="1560" saddr="self_ptl.ao.CN_RES3_G" desc="生产-预留3(utf-8)" type="char64" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1561" saddr="self_ptl.ao.CN_RES5_G" desc="生产-预留4(gbk)" type="char64" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1560" saddr="self_ptl.ao.CN_RES3_G" desc="生产-预留3(utf-8)" type="char64" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1561" saddr="self_ptl.ao.CN_RES5_G" desc="生产-预留4(gbk)" type="char64" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1562" saddr="self_ptl.ao.NAMENUM_BLT" desc="蓝牙-名称序列号" type="char64" min="0" max="0" step="0" unit="" value="ble" default=""/>
<Signal id="1563" saddr="self_ptl.ao.punCustomLogin" desc="ć— çşż-自定义登录帧" type="char64" min="0" max="0" step="0" unit="" value="˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" default=""/>
<Signal id="1564" saddr="iec61850m.prj.ao.0" desc="ĺŹć•°01" type="int32_t" min="0" max="0" step="0" unit="" value="1" default="0"/>
<Signal id="1565" saddr="iec61850m.prj.ao.1" desc="参数02" type="str" min="0" max="0" step="0" unit="" value="prj0" default=""/>
<Signal id="1563" saddr="self_ptl.ao.punCustomLogin" desc="无线-自定义登录帧" type="char64" min="0" max="0" step="0" unit="" value="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" default=""/>
<Signal id="1564" saddr="iec61850m.prj.ao.0" desc="参数01" type="int32_t" min="1" max="16" step="1" unit="" value="" default="1"/>
<Signal id="1565" saddr="iec61850m.prj.ao.1" desc="参数02" type="str" min="0" max="0" step="0" unit="" value="" default=""/>
</Ao>
<Param>
<Signal saddr="iec61850m.prj.param.0" desc="定值01" type="float" min="0" max="0" step="0" unit="" num="16">
<Signal saddr="iec61850m.prj.param.0" desc="定值01" type="float" min="0.5" max="150" step="0.001" unit="A" num="16">
<Item index="1" value="0.000000" default="0.000000"/>
<Item index="2" value="0.000000" default="0.000000"/>
<Item index="3" value="0.000000" default="0.000000"/>