<修改> 1、给数据中心的接口加上module_id,避免控制类型命令自锁;2、iec61850s中增加接口注册绑定参数与定值区,设置定值区时,参数能相应修改。

This commit is contained in:
ypc 2026-06-11 16:40:07 +08:00
parent dbfcf92552
commit 3806a32af9
22 changed files with 306 additions and 112 deletions

24
.vscode/tasks.json vendored
View File

@ -5,11 +5,33 @@
"label": "run-build-script",
"type": "shell",
"command": "${workspaceFolder}/release/build.sh",
"problemMatcher": ["$gcc"],
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "cppbuild",
"label": "C/C++: aarch64-linux-gnu-g++ 生成活动文件",
"command": "/usr/bin/aarch64-linux-gnu-g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: /usr/bin/aarch64-linux-gnu-g++"
}
]
}

View File

@ -57,42 +57,42 @@ void datacenter_run_1000ms();
// 数据中心out信号注册接口
int dc_signal_out(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data);
int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb);
int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb, const std::string &module_id);
int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb);
int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id);
// 数据中心in信号注册并链接out信号接口
int dc_signal_in(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data);
int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb);
int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id);
int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb);
int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb, const std::string &module_id);
int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb);
int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id);
int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data);
int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id);
int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data);
int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data, const std::string &module_id);
// 数据中心参数信号注册接口
int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int num, signal_change_cb cb);
int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int num, signal_change_cb cb, const std::string &module_id);
// 数据中心参数链接信号接口
int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int num, signal_change_cb cb);
int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int num, signal_change_cb cb, const std::string &module_id);
// 数据中心参数设置接口
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data);
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data, const std::string &module_id);
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data);
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data, const std::string &module_id);
// 数据中心遥控信号注册接口
int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb);
int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb, const std::string &module_id);
// 数据中心遥控信号链接接口
int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb);
int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id);
// 数据中心遥控控制接口(校验前置,调用前需先调 dc_yk_ctrl_valid
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data);
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id);
// 数据中心获取out信号信息接口
int dc_get_out_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, void **p_data);
@ -112,7 +112,7 @@ int dc_get_yk_signal_info(const std::string &saddr, std::string &desc, uint8_t &
std::string dc_get_signal_val(void *p_data, uint8_t data_type);
// 数据中心设置信号值字符串接口
int dc_set_out_signal_val(const std::string &saddr, void *set_data);
int dc_set_out_signal_val(const std::string &saddr, void *set_data, const std::string &module_id);
// 数据中心根据数据类型创建数据指针接口
void *dc_create_data_ptr_by_type(uint8_t data_type);

View File

@ -76,7 +76,7 @@ typedef struct
int app_fd;
int reason;
int type;
int quality;
uint32_t quality;
MMS_STR name;
MMS_STR desc;
MMS_REF reference;

View File

@ -200,6 +200,23 @@ int mms_s_param_register(stru_mms_s_param *p_param, uint16_t num, mms_s_param_cb
*/
int mms_s_file_path_set(const char* file_path);
/**
*
* @param zone_saddr
* @param new_act_sg 1-based
*/
typedef void (*mms_s_sg_change_cb)(const char *zone_saddr, int new_act_sg);
/**
*
* IEDScout Activate selected SG
* cb datacenter
* @param zone_saddr "ao.0"
* @param cb
* @return 0 -1
*/
int mms_s_bind_param_zone_signal(const char *zone_saddr, mms_s_sg_change_cb cb);
#ifdef __cplusplus
}

View File

@ -1070,8 +1070,8 @@ static int mms_m_get_MmsValue(stru_point_value &point_value, stru_mms_m_out_valu
tm_flag = 1;
break;
case MMS_BIT_STRING:
out_val.type = MMS_BIT_STRING;
*(uint32_t *)p_val = MmsValue_getBitStringAsIntegerBigEndian(p_mms_values);
// out_val.type = MMS_BIT_STRING;
out_val.quality = MmsValue_getBitStringAsIntegerBigEndian(p_mms_values);
break;
default:
break;

View File

@ -30,6 +30,9 @@ LOCAL std::vector<stru_mms_s_param> g_vec_params;
LOCAL mms_s_param_cb g_param_cb = NULL;
LOCAL char g_zone_saddr[MMS_S_STR_LEN] = {0};
LOCAL mms_s_sg_change_cb g_sg_change_cb = NULL;
/** 更新 BOOLEAN 类型属性值 */
void param_update_BOOLEAN(IedServer server, DataAttribute* dataAttribute, std::string val)
{
@ -202,7 +205,6 @@ LOCAL void param_load_edit_sg_values(stru_LDevice &ld, int editSG)
return;
}
for(std::vector<stru_mms_s_param>::iterator it_param = g_vec_params.begin(); it_param != g_vec_params.end(); it_param++)
{
std::string saddr = std::string(it_param->base.saddr) + "_SE";
@ -271,6 +273,11 @@ LOCAL bool param_active_sg_changed_handler(void* parameter, SettingGroupControlB
param_load_active_sg_values(*p_ld, newActSg);
if(strlen(g_zone_saddr) > 0 && g_sg_change_cb != NULL)
{
g_sg_change_cb(g_zone_saddr, newActSg);
}
return true;
}
@ -547,9 +554,10 @@ LOCAL void param_get_FLOAT(DataAttribute *node_SE, DataAttribute *node_SG, std::
float gap = floatVal - min;
if(fabs(step) > EPSILON)
{
float gap_mod = fmod(gap, step);
if(fabs(gap_mod) > EPSILON && fabs(gap_mod - step) > EPSILON)
float steps = roundf(gap / step);
float expected = min + steps * step;
float stepEpsilon = fmax(1e-5f, step * 1e-4f);
if(fabs(floatVal - expected) > stepEpsilon)
{
LOG_E("Value %f does not conform to step size %f", floatVal, step);
return;
@ -670,7 +678,7 @@ LOCAL void edit_sg_confirmation_handler(void* parameter, SettingGroupControlBloc
{
g_param_get_funcs[i].get_value((DataAttribute *)node_se, (DataAttribute *)node_sg, val);
if(g_param_cb != NULL)
if(!val.empty() && g_param_cb != NULL)
{
g_param_cb(&*it_param, val.c_str(), editSg - 1);
}
@ -796,5 +804,28 @@ int param_init(IedServer server, stru_icd &icd)
}
return 0;
}
/**
*
* cb datacenter
* @param zone_saddr "ao.0"
* @param cb
* @return 0 -1
*/
int mms_s_bind_param_zone_signal(const char *zone_saddr, mms_s_sg_change_cb cb)
{
if(NULL == zone_saddr || strlen(zone_saddr) == 0)
{
LOG_E("zone_saddr is NULL or empty");
return -1;
}
strncpy(g_zone_saddr, zone_saddr, MMS_S_STR_LEN - 1);
g_zone_saddr[MMS_S_STR_LEN - 1] = '\0';
g_sg_change_cb = cb;
LOG_I("bind zone signal %s", zone_saddr);
return 0;
}

View File

@ -82,7 +82,7 @@ LOCAL void cmd_recv()
int app_cmd_init1(void *arg)
{
lineniseSetCompletionCallback(cmd_complete);
// lineniseSetCompletionCallback(cmd_complete);
return 0;
}
@ -114,7 +114,7 @@ void *app_cmd(void *arg)
if(event & EV_TIMER1)
{
cmd_recv();
// cmd_recv();
}
if(event & EV_TIMER2)

View File

@ -4,6 +4,8 @@
#include "dc_signal.h"
#include "myDatacenter.h"
#define MODULE_DATACENTER "datacenter"
#include <unordered_map>

View File

@ -27,8 +27,9 @@ typedef struct stru_signal
std::unordered_set<std::string> link_set; // O(1) 查重
uint8_t ctrl_type; // 信号控制类型
stru_signal_param param; // 信号参数信息
std::vector<out_signal_change_cb> out_change_cb_list; // 输出类型信号变化回调函数列表
std::vector<signal_change_cb> change_cb_list; // 参数类型信号变化回调函数列表
std::vector<std::pair<std::string, out_signal_change_cb>> out_change_cb_list; // <module_id, cb>
std::vector<std::pair<std::string, signal_change_cb>> change_cb_list; // <module_id, cb>
std::string last_caller_module; // 上次修改本信号的模块ID用于out信号回调回路阻断
}stru_signal;

View File

@ -223,7 +223,7 @@ static int dc_param_register_signals(const std::string &param_path,
{
dc_signal_ao(saddr, desc, data_type,
SIGNAL_CTRL_TYPE::SBO_NORMAL,
p_data, p_default_data, nullptr);
p_data, p_default_data, nullptr, MODULE_DATACENTER);
}
}
}
@ -296,7 +296,7 @@ static int dc_param_register_signals(const std::string &param_path,
{
dc_signal_param(saddr, desc, data_type,
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, MODULE_DATACENTER);
}
}
}

View File

@ -302,8 +302,10 @@ void dc_signal_out_change_check()
if (0 != dc_data_compare(p_signal->data_type,
p_signal->vec_p_data[0], p_signal->p_last_data))
{
for (auto cb : p_signal->out_change_cb_list) {
cb(p_signal->saddr, p_signal->data_type,
for (auto &entry : p_signal->out_change_cb_list) {
// 回路阻断:修改本信号的模块不回调自身
if (entry.first == p_signal->last_caller_module) continue;
entry.second(p_signal->saddr, p_signal->data_type,
p_signal->vec_p_data[0], p_signal->p_last_data);
}
dc_set_signal_val(p_signal->p_last_data,
@ -454,7 +456,7 @@ LOCAL bool dc_signal_param_add_check(stru_signal *p_signal, const std::string &d
{
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]);
// 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;
}
}
@ -927,7 +929,7 @@ int dc_signal_out(const std::string &saddr, const std::string &desc, uint8_t dat
return dc_signal_add_to_map(signal, g_datacenter.signal_out);
}
int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb)
int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb, const std::string &module_id)
{
if(nullptr == p_data)
{
@ -957,13 +959,13 @@ int dc_signal_out_with_callback(const std::string &saddr, const std::string &des
signal.p_last_data = p_last_data;
if(nullptr != cb)
{
signal.out_change_cb_list.push_back(cb);
signal.out_change_cb_list.push_back({module_id, cb});
}
return dc_signal_add_to_map(signal, g_datacenter.signal_out);
}
int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb)
int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id)
{
stru_signal *p_signal = dc_find_out_signal(saddr);
if(nullptr == p_signal)
@ -985,7 +987,7 @@ int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, ou
if(nullptr != cb)
{
p_signal->out_change_cb_list.push_back(cb);
p_signal->out_change_cb_list.push_back({module_id, cb});
}
return 0;
@ -1040,7 +1042,7 @@ int dc_signal_in(const std::string &saddr, const std::string &desc, const std::s
return dc_signal_add_to_map(signal, g_datacenter.signal_in);
}
int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb)
int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1079,7 +1081,7 @@ int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc
if(nullptr != cb)
{
p_signal_out->out_change_cb_list.push_back(cb);
p_signal_out->out_change_cb_list.push_back({module_id, cb});
}
if(p_signal_out->link_set.find(saddr) == p_signal_out->link_set.end())
@ -1093,7 +1095,7 @@ int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc
return dc_signal_add_to_map(signal, g_datacenter.signal_in);
}
int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb)
int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb, const std::string &module_id)
{
if(p_data == nullptr || p_default_data == nullptr)
{
@ -1120,10 +1122,10 @@ int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data
dc_delete_signal_data(p_signal->vec_p_data[0], data_type);
p_signal->vec_p_data[0] = p_data;
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
return 0;
}
dc_set_param_cfg_change(true);
stru_signal signal;
@ -1144,16 +1146,16 @@ int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data
if(cb)
{
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
}
return 0;
}
return -1;
}
int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb)
int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1167,7 +1169,7 @@ int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, sig
{
if(cb)
{
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
}
(*p_data) = p_signal->vec_p_data.empty() ? nullptr : p_signal->vec_p_data[0];
@ -1177,7 +1179,7 @@ int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, sig
return -1;
}
int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data)
int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1218,11 +1220,13 @@ int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_s
return -1;
}
for(auto cb : p_signal->change_cb_list)
for(auto &entry : p_signal->change_cb_list)
{
if(cb)
if(entry.second)
{
cb(saddr, step, ctrl.data_type, 0, p_data);
// 回路阻断:修改本信号的模块不回调自身
if (entry.first == module_id) continue;
entry.second(saddr, step, ctrl.data_type, 0, p_data);
}
}
@ -1243,7 +1247,7 @@ int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_s
return -1;
}
int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data)
int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1280,7 +1284,7 @@ int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_ty
return -1;
}
int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int data_num, signal_change_cb cb)
int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int data_num, signal_change_cb cb, const std::string &module_id)
{
// 先从参数表里解析,调用参数注册
// 程序注册时,从参数表里去查找,同一个信息,使用参数表中的保存的数据值,在线程初始化时,通知所有链接此信号的信号
@ -1343,7 +1347,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
p_signal->vec_p_default_data.push_back(p_default_data[i]);
}
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
return 0;
}
@ -1370,7 +1374,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
if(cb)
{
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
}
return 0;
}
@ -1378,7 +1382,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
return -1;
}
int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int data_num, signal_change_cb cb)
int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int data_num, signal_change_cb cb, const std::string &module_id)
{
XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length());
stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param);
@ -1386,7 +1390,7 @@ int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data,
{
if(cb)
{
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
}
for(size_t i = 0; i < p_signal->vec_p_data.size() && i < data_num; i++)
@ -1400,7 +1404,7 @@ int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data,
}
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data)
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1440,11 +1444,13 @@ int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, str
return -1;
}
for(auto cb : p_signal->change_cb_list)
for(auto &entry : p_signal->change_cb_list)
{
if(cb != nullptr)
if(entry.second != nullptr)
{
cb(saddr, step, ctrl.data_type, setting_zone, p_data);
// 回路阻断:修改本信号的模块不回调自身
if (entry.first == module_id) continue;
entry.second(saddr, step, ctrl.data_type, setting_zone, p_data);
}
}
@ -1465,7 +1471,7 @@ int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, str
return -1;
}
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data)
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1498,7 +1504,7 @@ int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data
return -1;
}
int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb)
int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1521,7 +1527,7 @@ int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data
{
if(cb)
{
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
}
p_signal->ctrl_type = ctrl_type;
@ -1532,7 +1538,7 @@ int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data
return -1;
}
int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb)
int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1546,7 +1552,7 @@ int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, sig
{
if(cb)
{
p_signal->change_cb_list.push_back(cb);
p_signal->change_cb_list.push_back({module_id, cb});
}
(*p_data) = p_signal->vec_p_data.empty() ? nullptr : p_signal->vec_p_data[0];
return (*p_data) != nullptr ? 0 : -1;
@ -1555,7 +1561,7 @@ int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, sig
return -1;
}
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data)
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id)
{
if(p_data == nullptr)
{
@ -1589,11 +1595,13 @@ int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, str
return -1;
}
for(auto cb : p_signal->change_cb_list)
for(auto &entry : p_signal->change_cb_list)
{
if(cb != nullptr)
if(entry.second != nullptr)
{
cb(saddr, step, ctrl.data_type, 0, p_data);
// 回路阻断:修改本信号的模块不回调自身
if (entry.first == module_id) continue;
entry.second(saddr, step, ctrl.data_type, 0, p_data);
}
}
@ -1947,11 +1955,12 @@ void dc_set_signal_val_from_str(void *p_data, uint8_t data_type, const std::stri
}
}
int dc_set_out_signal_val(const std::string &saddr, void *set_data)
int dc_set_out_signal_val(const std::string &saddr, void *set_data, const std::string &module_id)
{
stru_signal *p_signal = dc_find_out_signal(saddr);
if(p_signal != nullptr)
{
p_signal->last_caller_module = module_id;
dc_mark_signal_dirty(p_signal);
return dc_set_signal_val(p_signal->vec_p_data[0], p_signal->data_type, set_data);
}

View File

@ -6,4 +6,6 @@
#include "iec_cfg_parse.h"
#include "iec.h"
#define MODULE_IEC104 "iec104"
int iec_point_init();

View File

@ -213,7 +213,7 @@ int iec_point_init()
p_vec = vec_st_mx_dd[i];
for(uint32_t j = 0; j < p_vec->size(); j++)
{
if(0 != dc_signal_out_link_with_callback(p_vec->at(j).link, &p_vec->at(j).p_data, vec_out_change_cb_list[i]))
if(0 != dc_signal_out_link_with_callback(p_vec->at(j).link, &p_vec->at(j).p_data, vec_out_change_cb_list[i], MODULE_IEC104))
{
MY_LOG_E("dc_signal_out_link_with_callback failed, link %s", p_vec->at(j).link.c_str());
return -1;
@ -223,7 +223,7 @@ int iec_point_init()
for(uint32_t i = 0; i < p_iec_cfg->vec_co.size(); i++)
{
if(0 != dc_signal_yk_link_with_callback(p_iec_cfg->vec_co[i].link, &p_iec_cfg->vec_co[i].p_data, iec_signal_yk_change))
if(0 != dc_signal_yk_link_with_callback(p_iec_cfg->vec_co[i].link, &p_iec_cfg->vec_co[i].p_data, iec_signal_yk_change, MODULE_IEC104))
{
MY_LOG_E("dc_signal_yk_link failed, link %s", p_iec_cfg->vec_co[i].link.c_str());
return -1;
@ -232,7 +232,7 @@ int iec_point_init()
for(uint32_t i = 0; i < p_iec_cfg->vec_ao.size(); i++)
{
if(0 != dc_signal_ao_link_with_callback(p_iec_cfg->vec_ao[i].link, &p_iec_cfg->vec_ao[i].p_data, iec_signal_ao_change))
if(0 != dc_signal_ao_link_with_callback(p_iec_cfg->vec_ao[i].link, &p_iec_cfg->vec_ao[i].p_data, iec_signal_ao_change, MODULE_IEC104))
{
MY_LOG_E("dc_signal_ao_link failed, link %s, type %d", p_iec_cfg->vec_ao[i].link.c_str(), p_iec_cfg->vec_ao[i].type);
return -1;

View File

@ -4,3 +4,5 @@
#include "mySystem.h"
#include "myMms_m.h"
#define MODULE_IEC61850M "iec61850m"

View File

@ -50,6 +50,7 @@ LOCAL 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_BIT_STRING, DATA_TYPE_U32},
{MMS_INTEGER, DATA_TYPE_S32},
{MMS_UNSIGNED, DATA_TYPE_U32},
{MMS_FLOAT, DATA_TYPE_F32},
@ -140,6 +141,9 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
case MMS_BOOLEAN:
printf("value %d, ", MY_GET_DATA_WITH_TYPE(p->p_value, uint8_t));
break;
case MMS_BIT_STRING:
printf("value %d, ", MY_GET_DATA_WITH_TYPE(p->p_value, uint32_t));
break;
case MMS_INTEGER:
printf("value %d, ", MY_GET_DATA_WITH_TYPE(p->p_value, int32_t));
break;
@ -150,6 +154,7 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
printf("value %s, ", (char *)p->p_value);
break;
default:
printf("unknown type %d, ", p->type);
break;
}
stru_mms_m_time *t = &p->time;
@ -164,7 +169,7 @@ 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])
{
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, MODULE_IEC61850M);
}
}
@ -172,7 +177,7 @@ 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])
{
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, MODULE_IEC61850M);
}
}
@ -191,7 +196,20 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
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, MODULE_IEC61850M);
auto ao = p_cfg->point.p_ao[j];
uint8_t temp[128] = {0};
stru_signal_ctrl ctrl = {};
ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL;
ctrl.p_data = temp;
ctrl.step = SIGNAL_CTRL_STEP::READY;
ctrl.data_type = local_type;
if(0 != dc_signal_ao_set_val(ao.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, p->p_value, MODULE_IEC61850M))
{
LOG_E("iec61850m_ext_demo, set ao %s value failed", ao.saddr);
}
}
}
}
@ -212,7 +230,20 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p)
}
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, MODULE_IEC61850M);
auto param = p_cfg->point.p_param[j];
uint8_t temp[128] = {0};
stru_signal_ctrl ctrl = {};
ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL;
ctrl.p_data = temp;
ctrl.step = SIGNAL_CTRL_STEP::READY;
ctrl.data_type = local_type;
if(0 != dc_signal_param_set_val(param.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, p->set_zone - 1, p->p_value, MODULE_IEC61850M))
{
LOG_E("iec61850m_ext_demo, set param %s value failed", param.saddr);
}
}
}
}
@ -449,7 +480,7 @@ LOCAL int iec61850m_co_signal_init(int num, stru_point_item *p_item)
}
uint8_t local_type = g_mms_m_type_to_local_type[p->type];
uint8_t local_ctrl_type = g_mms_m_ctrl_type_to_local_ctrl_type[p->ctrl_model];
if(0 != dc_signal_yk(p->saddr, p->desc, local_type, local_ctrl_type, p->value.p_val[0], iec61850m_signal_co_change_callback))
if(0 != dc_signal_yk(p->saddr, p->desc, local_type, local_ctrl_type, p->value.p_val[0], iec61850m_signal_co_change_callback, MODULE_IEC61850M))
{
MY_LOG_E("dc_signal_yk failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type);
return -1;
@ -482,7 +513,7 @@ LOCAL int iec61850m_ao_signal_init(int num, stru_point_item *p_item)
uint8_t local_type = g_mms_m_type_to_local_type[p->type];
uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL;
if(0 != dc_signal_ao(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val[0], p->value.p_default[0], iec61850m_signal_ao_change_callback))
if(0 != dc_signal_ao(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val[0], p->value.p_default[0], iec61850m_signal_ao_change_callback, MODULE_IEC61850M))
{
MY_LOG_E("dc_signal_ao failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type);
return -1;
@ -509,7 +540,7 @@ LOCAL int iec61850m_param_signal_init(int num, stru_point_item *p_item)
uint8_t local_type = g_mms_m_type_to_local_type[p->type];
uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL;
if(0 != dc_signal_param(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val, p->value.p_default, MMS_M_MAX_VAL_NUM, iec61850m_signal_param_change_callback))
if(0 != dc_signal_param(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val, p->value.p_default, MMS_M_MAX_VAL_NUM, iec61850m_signal_param_change_callback, MODULE_IEC61850M))
{
MY_LOG_E("dc_signal_param failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type);
return -1;
@ -844,4 +875,4 @@ LOCAL void cmd_iec61850m(int argc, char *argv[])
}
}
CMD_REGISTER("iec61850m", cmd_iec61850m, "iec61850客户端线程的控制命令");
CMD_REGISTER(MODULE_IEC61850M, cmd_iec61850m, "iec61850客户端线程的控制命令");

View File

@ -2,4 +2,6 @@
#include "myBase.h"
#include "mySystem.h"
#include "myMms_s.h"
#include "myMms_s.h"
#define MODULE_IEC61850S "iec61850s"

View File

@ -31,6 +31,50 @@ LOCAL std::vector<stru_mms_s_param> g_vec_param = {};
LOCAL mms_s_value_update_cb g_mms_s_value_update_cb = NULL;
LOCAL void iec61850s_sg_change_callback(const char *zone_saddr, int new_act_sg)
{
printf("[THREAD_TRACE] iec61850s_sg_change_callback ENTER zone_saddr=%s new_act_sg=%d tid=%lu\n", zone_saddr, new_act_sg, pthread_self());
LOG_I("SG changed to %d, zone_saddr %s", new_act_sg, zone_saddr);
for(auto &setting : g_vec_setting)
{
if(strcmp(setting.base.saddr, zone_saddr) == 0)
{
uint8_t temp[128] = {0};
stru_signal_ctrl ctrl = {};
ctrl.step = SIGNAL_CTRL_STEP::READY;
ctrl.type = setting.base.ctrl_model;
ctrl.data_type = setting.base.type;
ctrl.p_data = temp;
if(setting.base.ctrl_model == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
if(0 != dc_signal_ao_set_val(setting.base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, (void *)&new_act_sg, MODULE_IEC61850S))
{
LOG_E("dc_signal_ao_set_val SELECT failed, saddr: %s", setting.base.saddr);
return;
}
}
if(0 != dc_signal_ao_set_val(setting.base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, (void *)&new_act_sg, MODULE_IEC61850S))
{
LOG_E("dc_signal_ao_set_val DIRECT failed, saddr: %s", setting.base.saddr);
return;
}
// /* 同步更新 MMS 服务端模型,使 IEDScout 等客户端能读到最新值 */
// std::string val_str = dc_get_signal_val(p_val, setting.base.type);
// if(g_mms_s_value_update_cb != NULL)
// {
// g_mms_s_value_update_cb(zone_saddr, val_str.c_str());
// }
break;
}
}
}
LOCAL void iec61850s_st_mx_change_callback(std::string saddr, uint8_t data_type, void *p_data, void *p_last_data)
{
if(NULL == p_data || NULL == p_last_data)
@ -66,7 +110,7 @@ LOCAL int iec61850s_st_signals_init(std::vector<stru_mms_s_signal_base> &vec_st)
st.base = it;
std::string desc = "";
if(0 != dc_signal_out_link_with_callback(st.base.saddr, &st.p_data, iec61850s_st_mx_change_callback))
if(0 != dc_signal_out_link_with_callback(st.base.saddr, &st.p_data, iec61850s_st_mx_change_callback, MODULE_IEC61850S))
{
LOG_E("dc_signal_out_link_with_callback failed");
return -1;
@ -91,7 +135,7 @@ LOCAL int iec61850s_mx_signals_init(std::vector<stru_mms_s_signal_base> &vec_mx)
mx.base = it;
std::string desc = "";
if(0 != dc_signal_out_link_with_callback(mx.base.saddr, &mx.p_data, iec61850s_st_mx_change_callback))
if(0 != dc_signal_out_link_with_callback(mx.base.saddr, &mx.p_data, iec61850s_st_mx_change_callback, MODULE_IEC61850S))
{
LOG_E("dc_signal_out_link_with_callback failed");
return -1;
@ -127,7 +171,7 @@ LOCAL void iec61850s_control_callback(stru_mms_s_control *p_control, uint8_t sta
if(base.ctrl_model == CONTROL_MODEL_DIRECT_NORMAL || base.ctrl_model == CONTROL_MODEL_DIRECT_ENHANCED)
{
ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL;
if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state))
if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_yk_set_status failed");
return;
@ -136,13 +180,13 @@ LOCAL void iec61850s_control_callback(stru_mms_s_control *p_control, uint8_t sta
else if(base.ctrl_model == CONTROL_MODEL_SBO_NORMAL || base.ctrl_model == CONTROL_MODEL_SBO_ENHANCED)
{
ctrl.type = SIGNAL_CTRL_TYPE::SBO_NORMAL;
if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, &state))
if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, &state, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_yk_set_status failed");
return;
}
if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state))
if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_yk_set_status failed");
return;
@ -184,6 +228,22 @@ LOCAL int iec61850s_control_signals_init(std::vector<stru_mms_s_signal_base> &ve
return 0;
}
LOCAL void iec61850s_ao_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data)
{
if(NULL == p_data)
{
LOG_E("p_data is NULL");
return;
}
LOG_I("ao change callback called saddr: %s, step: %i, data_type: %i, setting_zone: %i", saddr.c_str(), step, data_type, setting_zone);
std::string val = dc_get_signal_val(p_data, data_type);
if(g_mms_s_value_update_cb != NULL && !val.empty())
{
g_mms_s_value_update_cb(saddr.c_str(), val.c_str());
}
}
LOCAL void iec61850s_setting_callback(stru_mms_s_setting *p_setting, const char *p_data)
{
if(NULL == p_setting || NULL == p_data)
@ -208,7 +268,7 @@ LOCAL void iec61850s_setting_callback(stru_mms_s_setting *p_setting, const char
if(p_setting->base.ctrl_model == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL;
if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val))
if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_ao_set_val failed");
return;
@ -217,13 +277,13 @@ LOCAL void iec61850s_setting_callback(stru_mms_s_setting *p_setting, const char
else if(p_setting->base.ctrl_model == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
ctrl.type = SIGNAL_CTRL_TYPE::SBO_NORMAL;
if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, temp_val))
if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, temp_val, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_ao_set_val select failed");
return;
}
if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val))
if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_ao_set_val direct failed");
return;
@ -243,7 +303,13 @@ LOCAL int iec61850s_setting_signals_init(std::vector<stru_mms_s_signal_base> &ve
std::string desc = "";
if(0 != dc_get_ao_signal_info(setting.base.saddr, desc, setting.base.type, nullptr, setting.base.ctrl_model, &setting.p_data, nullptr))
if(0 != dc_signal_ao_link_with_callback(setting.base.saddr, &setting.p_data, iec61850s_ao_change_callback, MODULE_IEC61850S))
{
LOG_E("dc_signal_ao_link_with_callback failed");
return -1;
}
if(0 != dc_get_ao_signal_info(setting.base.saddr, desc, setting.base.type, nullptr, setting.base.ctrl_model, NULL, NULL))
{
MY_LOG_E("dc_get_ao_signal_info failed, saddr: %s, desc: %s", setting.base.saddr, desc.c_str());
return -1;
@ -284,7 +350,7 @@ LOCAL void iec61850s_param_callback(stru_mms_s_param *p_param, const char *p_dat
if(p_param->base.ctrl_model == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL;
if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val))
if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_param_set_val failed");
return;
@ -293,13 +359,13 @@ LOCAL void iec61850s_param_callback(stru_mms_s_param *p_param, const char *p_dat
else if(p_param->base.ctrl_model == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
ctrl.type = SIGNAL_CTRL_TYPE::SBO_NORMAL;
if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, setting_zone, temp_val))
if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, setting_zone, temp_val, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_param_set_val select failed");
return;
}
if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val))
if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val, MODULE_IEC61850S))
{
MY_LOG_E("dc_signal_param_set_val direct failed");
return;
@ -439,6 +505,11 @@ int app_iec61850s_init2(void *arg)
return -1;
}
if(!g_vec_setting.empty() && strlen(g_vec_setting[0].base.saddr) > 0)
{
mms_s_bind_param_zone_signal(g_vec_setting[0].base.saddr, iec61850s_sg_change_callback);
}
return 0;
}

View File

@ -4,6 +4,8 @@
#include "mySystem.h"
#include "myDatacenter.h"
#define MODULE_SELF_PTL "self_ptl"
#define IEC_START 0x68
#define IEC_TAIL 0x16

View File

@ -135,7 +135,7 @@ void ao_pop_out(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, u
// dc_signal_param_set_val(p_ao_data->p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, type, p_data);
// dc_signal_param_set_val(p_ao_data->p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, type, p_data);
if(0 != dc_signal_ao_set_val_without_check(p_ao_data->p_param->base.saddr, type, (void *)p_data))
if(0 != dc_signal_ao_set_val_without_check(p_ao_data->p_param->base.saddr, type, (void *)p_data, MODULE_SELF_PTL))
{
LOG_E("dc_signal_ao_set_val_without_check failed,saddr %s, desc %s, inf %d, type %d",
p_ao_data->p_param->base.saddr.c_str(), p_ao_data->p_param->base.desc.c_str(), p_ao_data->p_param->base.inf, type);
@ -472,7 +472,7 @@ void mx_trans(stru_icp67 *p_icp67, uint16_t info_addr, float p_data)
{
// *(float *)(p_app_cfg_data->mx_vec[info_addr].p_data) = p_data;
dc_set_out_signal_val(p_app_cfg_data->mx_vec[info_addr].p_base->saddr, &p_data);
dc_set_out_signal_val(p_app_cfg_data->mx_vec[info_addr].p_base->saddr, &p_data, MODULE_SELF_PTL);
}
}
@ -493,7 +493,7 @@ void st_trans(stru_icp67 *p_icp67, uint16_t info_addr, uint8_t p_data)
// *(uint8_t *)(p_app_cfg_data->st_vec[info_addr].p_data) = p_data;
dc_set_out_signal_val(p_app_cfg_data->st_vec[info_addr].p_base->saddr, &p_data);
dc_set_out_signal_val(p_app_cfg_data->st_vec[info_addr].p_base->saddr, &p_data, MODULE_SELF_PTL);
// if(*(uint8_t *)(p_app_cfg_data->st_vec[info_addr].p_last_data) != p_data)
// {
@ -517,7 +517,7 @@ void dd_trans(stru_icp67 *p_icp67, uint16_t info_addr, float p_data)
if(info_addr < p_app_cfg_data->dd_vec.size())
{
dc_set_out_signal_val(p_app_cfg_data->dd_vec[info_addr].p_base->saddr, &p_data);
dc_set_out_signal_val(p_app_cfg_data->dd_vec[info_addr].p_base->saddr, &p_data, MODULE_SELF_PTL);
}
LOG_I("dd_trans: info_addr %d, p_data %f", info_addr, p_data);
}
@ -644,7 +644,7 @@ void mx_change(stru_icp67 *p_icp67, stru_mx_info *p_data)
uint16_t addr = p_data->addr - YC_START_PORT;
if(addr < p_app_cfg_data->mx_vec.size())
{
dc_set_out_signal_val(p_app_cfg_data->mx_vec[addr].p_base->saddr, &p_data->data);
dc_set_out_signal_val(p_app_cfg_data->mx_vec[addr].p_base->saddr, &p_data->data, MODULE_SELF_PTL);
}
}

View File

@ -864,7 +864,7 @@ int self_ptl_do_signal_out(stru_app *p_app)
p = &p_app_cfg_data->co_vec.at(i);
if(p && p->p_base)
{
ret |= dc_signal_yk(p->p_base->saddr, p->p_base->desc, DATA_TYPE_U8, SIGNAL_CTRL_TYPE::SBO_NORMAL, p->p_data, self_ptl_signal_change_callback);
ret |= dc_signal_yk(p->p_base->saddr, p->p_base->desc, DATA_TYPE_U8, SIGNAL_CTRL_TYPE::SBO_NORMAL, p->p_data, self_ptl_signal_change_callback, MODULE_SELF_PTL);
}
}
@ -892,7 +892,7 @@ int self_ptl_do_signal_out(stru_app *p_app)
stru_self_ptl_cfg_param_data *p_ao = &p_app_cfg_data->ao_vec.at(i);
if(p_ao && p_ao->p_param)
{
ret |= dc_signal_ao(p_ao->p_param->base.saddr, p_ao->p_param->base.desc, p_ao->p_param->type, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_ao->vec_p_data[0], p_ao->vec_p_default_data[0], self_ptl_signal_change_callback);
ret |= dc_signal_ao(p_ao->p_param->base.saddr, p_ao->p_param->base.desc, p_ao->p_param->type, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_ao->vec_p_data[0], p_ao->vec_p_default_data[0], self_ptl_signal_change_callback, MODULE_SELF_PTL);
}
}
@ -907,7 +907,7 @@ int self_ptl_do_signal_out(stru_app *p_app)
if(p_param && p_param->p_param)
{
ret |= dc_signal_param(p_param->p_param->base.saddr, p_param->p_param->base.desc, p_param->p_param->type,
SIGNAL_CTRL_TYPE::SBO_NORMAL, p_param->vec_p_data.data(), p_param->vec_p_default_data.data(), p_param->p_param->num, self_ptl_signal_change_callback);
SIGNAL_CTRL_TYPE::SBO_NORMAL, p_param->vec_p_data.data(), p_param->vec_p_default_data.data(), p_param->p_param->num, self_ptl_signal_change_callback, MODULE_SELF_PTL);
}
}

View File

@ -2,6 +2,8 @@
#include "myBase.h"
#define MODULE_WEB_SERVER "web_server"
struct mg_connection;
void ws_recv(struct mg_connection *c, const char *p_rx, uint16_t rx_len);

View File

@ -345,7 +345,7 @@ LOCAL void set_out_signal_data(stru_ws_session &s, const std::string& saddr, con
{
dc_set_signal_val_from_str(data, p_signal->data_type, val);
if(0 != dc_set_out_signal_val(saddr, (void *)data))
if(0 != dc_set_out_signal_val(saddr, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_set_signal_val failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -372,7 +372,7 @@ LOCAL void set_yk_signal_data(stru_ws_session &s, const std::string& saddr, cons
if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data))
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_yk_set_status direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -383,7 +383,7 @@ LOCAL void set_yk_signal_data(stru_ws_session &s, const std::string& saddr, cons
}
else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)data))
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_yk_set_status select failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -391,7 +391,7 @@ LOCAL void set_yk_signal_data(stru_ws_session &s, const std::string& saddr, cons
LOG_I("saddr %s, select value %s success !!!", saddr.c_str(), val.c_str());
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data))
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_yk_set_status direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -423,7 +423,7 @@ LOCAL void set_ao_signal_data(stru_ws_session &s, const std::string& saddr, cons
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 *)data))
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -435,7 +435,7 @@ LOCAL void set_ao_signal_data(stru_ws_session &s, const std::string& saddr, cons
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 *)data))
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_ao_set_val select failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -443,7 +443,7 @@ LOCAL void set_ao_signal_data(stru_ws_session &s, const std::string& saddr, cons
LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), val.c_str());
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data))
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -474,7 +474,7 @@ LOCAL void set_param_signal_data(stru_ws_session &s, const std::string& saddr, c
if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_param_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -485,7 +485,7 @@ LOCAL void set_param_signal_data(stru_ws_session &s, const std::string& saddr, c
}
else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, setting_zone, (void *)data))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, setting_zone, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_param_set_val select failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;
@ -493,7 +493,7 @@ LOCAL void set_param_signal_data(stru_ws_session &s, const std::string& saddr, c
LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), val.c_str());
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data, MODULE_WEB_SERVER))
{
LOG_E("set_signal_data: dc_signal_param_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str());
return;