This commit is contained in:
zhouhuang 2025-01-17 10:53:43 +08:00
parent 02c38651b9
commit 17d490f85d
2 changed files with 227 additions and 86 deletions

View File

@ -89,10 +89,20 @@ bool CRYDevice::configInitializeMemory(void)
config_config.units[i].ftp_softdog = 0;
config_config.units[i].yxs = new struUnitYX[UNIT_YX_MAX];
memset(config_config.units[i].yxs, 0, sizeof(struUnitYX) * UNIT_YX_MAX);
for (int k = 0; k < UNIT_YX_MAX; k++) config_config.units[i].yxs[k].order = -1;
config_config.units[i].ycs = new struUnitYC[UNIT_YC_MAX];
memset(config_config.units[i].ycs, 0, sizeof(struUnitYC) * UNIT_YC_MAX);
for (int k = 0; k < UNIT_YC_MAX; k++) config_config.units[i].ycs[k].order = -1;
config_config.units[i].yms = new struUnitYM[UNIT_YM_MAX];
memset(config_config.units[i].yms, 0, sizeof(struUnitYM) * UNIT_YM_MAX);
for (int k = 0; k < UNIT_YM_MAX; k++) config_config.units[i].yms[k].order = -1;
config_config.units[i].yks = new struUnitYK[UNIT_YK_MAX];
memset(config_config.units[i].yks, 0, sizeof(struUnitYK) * UNIT_YK_MAX);
for (int k = 0; k < UNIT_YK_MAX; k++) config_config.units[i].yks[k].order = -1;
config_config.units[i].yts = new struUnitYT[UNIT_YT_MAX];
memset(config_config.units[i].yts, 0, sizeof(struUnitYT) * UNIT_YT_MAX);
for (int k = 0; k < UNIT_YT_MAX; k++) config_config.units[i].yts[k].order = -1;
}
return true;
@ -2190,6 +2200,7 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
name_param.name = "";
name_param.highSpeed = 0;
name_param.order = -1;
name_param.deviceId = id;
if (attr["name"].isString()) name_param.name = id + attr["name"].asString();
if (attr["order"].isInt()) name_param.order = attr["order"].asInt();
if (attr["params"].isObject()) name_param.params = attr["params"];
@ -2208,6 +2219,7 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
struct_attr name_param;
name_param.name = "";
name_param.order = -1;
name_param.deviceId = id;
if (service["name"].isString()) name_param.name = id + service["name"].asString();
if (service["order"].isInt()) name_param.order = service["order"].asInt();
if (service["params"].isObject()) name_param.params = service["params"];
@ -2241,6 +2253,9 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
snprintf(config_static_units[uid].deviceId, sizeof(config_static_units[uid].deviceId), "iss_%d", uid);
}
if (uid2pid_map.find(id) == uid2pid_map.end()) {
uid2pid_map.insert(string2intmap::value_type(id, i));
}
config_config.processes[i].units[j] = uid;
//根据协议修改地址
if (address != "") {
@ -2322,7 +2337,6 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
if (config_config.units[uid].yccount > 0) {
//config_config.units[uid].ycs = new struUnitYC[config_config.units[uid].yccount];
if (NULL != config_config.units[uid].ycs) {
memset(config_config.units[uid].ycs, 0, sizeof(struUnitYC) * config_config.units[uid].yccount);
for (int k = 0; k < config_config.units[uid].yccount; k++) {
snprintf(config_config.units[uid].ycs[k].name, sizeof(config_config.units[uid].ycs[k].name), "%s", ycs[k].name.c_str());
config_config.units[uid].ycs[k].order = ycorder++;
@ -2382,13 +2396,18 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
}
if (pfdbycname) {
fseek(pfdbycname, sizeof(struYCStatic) * config_config.units[uid].ycs[k].order, SEEK_SET);
fwrite(ycs[k].name.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbycname);
if (!ycs[k].params["measPointName"].isNull())
{
std::string measPointName = std::string(config_config.processes[i].name) + std::string("_");
if (ycs[k].params["measPointName"].isString()) measPointName += ycs[k].params["measPointName"].asString();
else measPointName += std::string("备用");
fwrite(measPointName.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbycname);
}
}
}
}
}
if (config_config.units[uid].ymcount > 0) {
//config_config.units[uid].yms = new struUnitYM[config_config.units[uid].ymcount];
if (NULL != config_config.units[uid].yms) {
memset(config_config.units[uid].yms, 0, sizeof(struUnitYM) * config_config.units[uid].ymcount);
for (int k = 0; k < config_config.units[uid].ymcount; k++) {
@ -2425,13 +2444,18 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
if (pfdbymname) {
fseek(pfdbymname, sizeof(struYMStatic) * config_config.units[uid].yms[k].order, SEEK_SET);
fwrite(yms[k].name.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbymname);
if (!yms[k].params["measPointName"].isNull())
{
std::string measPointName = std::string(config_config.processes[i].name) + std::string("_");
if (yms[k].params["measPointName"].isString()) measPointName += yms[k].params["measPointName"].asString();
else measPointName += std::string("备用");
fwrite(measPointName.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbymname);
}
}
}
}
}
if (config_config.units[uid].ykcount > 0) {
//config_config.units[uid].yks = new struUnitYK[config_config.units[uid].ykcount];
if (NULL != config_config.units[uid].yks) {
memset(config_config.units[uid].yks, 0, sizeof(struUnitYK) * config_config.units[uid].ykcount);
for (int k = 0; k < config_config.units[uid].ykcount; k++) {
@ -2460,13 +2484,18 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
}
if (pfdbykname) {
fseek(pfdbykname, sizeof(struYKStatic) * config_config.units[uid].yks[k].order, SEEK_SET);
fwrite(yks[k].name.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbykname);
if (!yks[k].params["measPointName"].isNull())
{
std::string measPointName = std::string(config_config.processes[i].name) + std::string("_");
if (yks[k].params["measPointName"].isString()) measPointName += yks[k].params["measPointName"].asString();
else measPointName += std::string("备用");
fwrite(measPointName.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbykname);
}
}
}
}
}
if (config_config.units[uid].ytcount > 0) {
//config_config.units[uid].yts = new struUnitYT[config_config.units[uid].ytcount];
if (NULL != config_config.units[uid].yts) {
memset(config_config.units[uid].yts, 0, sizeof(struUnitYT) * config_config.units[uid].ytcount);
for (int k = 0; k < config_config.units[uid].ytcount; k++) {
@ -2495,13 +2524,18 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
}
if (pfdbytname) {
fseek(pfdbytname, sizeof(struYTStatic) * config_config.units[uid].yts[k].order, SEEK_SET);
fwrite(yts[k].name.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbytname);
if (!yts[k].params["measPointName"].isNull())
{
std::string measPointName = std::string(config_config.processes[i].name) + std::string("_");
if (yts[k].params["measPointName"].isString()) measPointName += yts[k].params["measPointName"].asString();
else measPointName += std::string("备用");
fwrite(measPointName.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbytname);
}
}
}
}
}
if (config_config.units[uid].yxcount > 0) {
//config_config.units[uid].yxs = new struUnitYX[config_config.units[uid].yxcount];
if (NULL != config_config.units[uid].yxs) {
memset(config_config.units[uid].yxs, 0, sizeof(struUnitYX) * config_config.units[uid].yxcount);
for (int k = 0; k < config_config.units[uid].yxcount; k++) {
@ -2537,7 +2571,13 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
}
if (pfdbyxname) {
fseek(pfdbyxname, sizeof(struYXStatic) * config_config.units[uid].yxs[k].order, SEEK_SET);
fwrite(yxs[k].name.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbyxname);
if (!yxs[k].params["measPointName"].isNull())
{
std::string measPointName = std::string(config_config.processes[i].name) + std::string("_");
if (yxs[k].params["measPointName"].isString()) measPointName += yxs[k].params["measPointName"].asString();
else measPointName += std::string("备用");
fwrite(measPointName.c_str(), (MAX_NAME_SIZE << 2), 1, pfdbyxname);
}
}
}
}
@ -2554,7 +2594,7 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
{
int pid = it->first;
attrvectorGroup attrs = it->second;
fprintf(stderr, "pid is: %d, link uid is: %d\n", pid, sub_uid);
switch (config_config.processes[pid].proto)
{
case PROTOCOL_SUB_MODBUS_TCP:
@ -2566,43 +2606,35 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
break;
}
int s_yxcount, s_yccount, s_ymcount, s_ykcount, s_ytcount;
config_config.units[sub_uid].value = SPI_ON;
config_config.units[sub_uid].real_softdog = UNIT_WATCHDOG_TIME;
config_config.units[sub_uid].state = TRUE;
config_config.units[sub_uid].type = SLAVER_UNIT;
s_yxcount = attrs.yxs.size();
s_yccount = attrs.ycs.size();
s_ymcount = attrs.yms.size();
s_ykcount = attrs.yks.size();
s_ytcount = attrs.yts.size();
config_config.units[sub_uid].yxcount = s_yxcount;
config_config.units[sub_uid].yccount = s_yccount;
config_config.units[sub_uid].ymcount = s_ymcount;
config_config.units[sub_uid].ykcount = s_ykcount;
config_config.units[sub_uid].ytcount = s_ytcount;
config_config.units[sub_uid].yxcount = attrs.yxs.size();
config_config.units[sub_uid].yccount = attrs.ycs.size();
config_config.units[sub_uid].ymcount = attrs.yms.size();
config_config.units[sub_uid].ykcount = attrs.yks.size();
config_config.units[sub_uid].ytcount = attrs.yts.size();
config_config.processes[pid].units[0] = sub_uid;
if (s_yccount > 0)
if (config_config.units[sub_uid].yccount > 0)
{
//config_config.units[sub_uid].ycs = new struUnitYC[s_yccount];
if (NULL != config_config.units[sub_uid].ycs) {
memset(config_config.units[sub_uid].ycs, 0, sizeof(struUnitYC) * s_yccount);
}
for (int i = 0; i < s_yccount; i++) {
std::string key = attrs.ycs[i].name;
for (int i = 0; i < config_config.units[sub_uid].yccount; i++) {
std::string key;
int order = -1;
int point = i;
if (map_ycorders.find(key) != map_ycorders.end())
{
order = map_ycorders[key];
}
int point = -1;
Json::Value param = attrs.ycs[i].params;
if (!param["order"].isNull())
{
if (param["order"].isInt()) point = param["order"].asInt();
if (param["order"].isString()) point = atoi(param["order"].asCString());
}
if (point < 0 || point >= config_config.units[sub_uid].yccount) continue;
key = attrs.ycs[i].name;
if (map_ycorders.find(key) != map_ycorders.end())
{
order = map_ycorders[key];
}
snprintf(config_config.units[sub_uid].ycs[point].name, sizeof(config_config.units[sub_uid].ycs[point].name), "%s", key.c_str());
config_config.units[sub_uid].ycs[point].order = order;
config_config.units[sub_uid].ycs[point].value = 0;
@ -2627,26 +2659,24 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
config_config.units[sub_uid].ycs[point].highSpeed = FALSE;
}
}
if (s_ymcount > 0)
if (config_config.units[sub_uid].ymcount > 0)
{
//config_config.units[sub_uid].yms = new struUnitYM[s_ymcount];
if (NULL != config_config.units[sub_uid].yms) {
memset(config_config.units[sub_uid].yms, 0, sizeof(struUnitYM) * s_ymcount);
}
for (int i = 0; i < s_ymcount; i++) {
std::string key = attrs.yms[i].name;
for (int i = 0; i < config_config.units[sub_uid].ymcount; i++) {
std::string key;
int order = -1;
int point = i;
if (map_ymorders.find(key) != map_ymorders.end())
{
order = map_ymorders[key];
}
int point = -1;
Json::Value param = attrs.yms[i].params;
if (!param["order"].isNull())
{
if (param["order"].isInt()) point = param["order"].asInt();
if (param["order"].isString()) point = atoi(param["order"].asCString());
}
if (point < 0 || point >= config_config.units[sub_uid].ymcount) continue;
key = attrs.yms[i].name;
if (map_ymorders.find(key) != map_ymorders.end())
{
order = map_ymorders[key];
}
snprintf(config_config.units[sub_uid].yms[point].name, sizeof(config_config.units[sub_uid].yms[point].name), "%s", key.c_str());
config_config.units[sub_uid].yms[point].order = order;
config_config.units[sub_uid].yms[point].value = 0;
@ -2659,83 +2689,192 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
}
}
}
if (s_ykcount > 0)
if (config_config.units[sub_uid].ykcount > 0)
{
//config_config.units[sub_uid].yks = new struUnitYK[s_ykcount];
if (NULL != config_config.units[sub_uid].yks) {
memset(config_config.units[sub_uid].yks, 0, sizeof(struUnitYK) * s_ykcount);
}
for (int i = 0; i < s_ykcount; i++) {
std::string key = attrs.yks[i].name;
for (int i = 0; i < config_config.units[sub_uid].ykcount; i++) {
std::string key;
int order = -1;
int point = i;
if (map_ykorders.find(key) != map_ykorders.end())
{
order = map_ykorders[key];
}
int point = -1;
Json::Value param = attrs.yks[i].params;
if (!param["order"].isNull())
{
if (param["order"].isInt()) point = param["order"].asInt();
if (param["order"].isString()) point = atoi(param["order"].asCString());
}
if (point < 0 || point >= config_config.units[sub_uid].ykcount) continue;
key = attrs.yks[i].name;
if (map_ykorders.find(key) != map_ykorders.end())
{
order = map_ykorders[key];
}
if (map_ykorders.find(key) != map_ykorders.end())
{
order = map_ykorders[key];
}
snprintf(config_config.units[sub_uid].yks[point].name, sizeof(config_config.units[sub_uid].yks[point].name), "%s", key.c_str());
config_config.units[sub_uid].yks[point].order = order;
}
}
if (s_ytcount > 0)
if (config_config.units[sub_uid].ytcount > 0)
{
//config_config.units[sub_uid].yts = new struUnitYT[s_ytcount];
if (NULL != config_config.units[sub_uid].yts) {
memset(config_config.units[sub_uid].yts, 0, sizeof(struUnitYT) * s_ytcount);
}
for (int i = 0; i < s_ytcount; i++) {
std::string key = attrs.yts[i].name;
for (int i = 0; i < config_config.units[sub_uid].ytcount; i++) {
std::string key;
int order = -1;
int point = i;
if (map_ytorders.find(key) != map_ytorders.end())
{
order = map_ytorders[key];
}
int point = -1;
Json::Value param = attrs.yts[i].params;
if (!param["order"].isNull())
{
if (param["order"].isInt()) point = param["order"].asInt();
if (param["order"].isString()) point = atoi(param["order"].asCString());
}
if (point < 0 || point >= config_config.units[sub_uid].ytcount) continue;
key = attrs.yts[i].name;
if (map_ytorders.find(key) != map_ytorders.end())
{
order = map_ytorders[key];
}
snprintf(config_config.units[sub_uid].yts[point].name, sizeof(config_config.units[sub_uid].yts[point].name), "%s", key.c_str());
config_config.units[sub_uid].yts[point].order = order;
}
}
if (s_yxcount > 0)
if (config_config.units[sub_uid].yxcount > 0)
{
//config_config.units[sub_uid].yxs = new struUnitYX[s_yxcount];
if (NULL != config_config.units[sub_uid].yxs) {
memset(config_config.units[sub_uid].yxs, 0, sizeof(struUnitYX) * s_yxcount);
}
for (int i = 0; i < s_yxcount; i++) {
std::string key = attrs.yxs[i].name;
for (int i = 0; i < config_config.units[sub_uid].yxcount; i++) {
std::string key;
int order = -1;
int point = i;
if (map_yxorders.find(key) != map_yxorders.end())
{
order = map_yxorders[key];
}
int point = -1;
Json::Value param = attrs.yxs[i].params;
if (!param["order"].isNull())
{
if (param["order"].isInt()) point = param["order"].asInt();
if (param["order"].isString()) point = atoi(param["order"].asCString());
}
if (point < 0 || point >= config_config.units[sub_uid].yxcount) continue;
key = attrs.yxs[i].name;
if (map_yxorders.find(key) != map_yxorders.end())
{
order = map_yxorders[key];
}
snprintf(config_config.units[sub_uid].yxs[point].name, sizeof(config_config.units[sub_uid].yxs[point].name), "%s", key.c_str());
config_config.units[sub_uid].yxs[point].order = order;
config_config.units[sub_uid].yxs[point].value = 0;
config_config.units[sub_uid].yxs[point].value = 0;
config_config.units[sub_uid].yxs[point].qds = 0x80; //默认为无效
config_config.units[sub_uid].yxs[point].invert = 0;
}
}
//
char csvFileName[260];
snprintf(csvFileName, sizeof(csvFileName), "%s/%s%d.csv", configpath, config_config.processes[pid].name, sub_uid);
FILE* csvFile = fopen(csvFileName, "wb+");
if (csvFile)
{
fprintf(csvFile, "[遥测量]\n");
for (int i = 0; i < config_config.units[sub_uid].yccount; i++)
{
struYCStatic yc;
memset(&yc, '\0', sizeof(yc));
if (pfdbycname && (config_config.units[sub_uid].ycs[i].order >= 0))
{
if (fseek(pfdbycname, sizeof(struYCStatic) * config_config.units[sub_uid].ycs[i].order, SEEK_SET) == 0)
{
fread(&yc, sizeof(yc), 1, pfdbycname);
}
}
if (yc.name[0] == '\0')
{
fprintf(csvFile, "%d=备用,1,0\n", i);
}
else
{
fprintf(csvFile, "%d=%s,%f,%f\n", i, yc.name, config_config.units[sub_uid].ycs[i].coef, config_config.units[sub_uid].ycs[i].base);
}
}
fprintf(csvFile, "[遥脉量]\n");
for (int i = 0; i < config_config.units[sub_uid].ymcount; i++)
{
struYMStatic ym;
memset(&ym, '\0', sizeof(ym));
if (pfdbymname && (config_config.units[sub_uid].yms[i].order >= 0))
{
if (fseek(pfdbymname, sizeof(struYMStatic) * config_config.units[sub_uid].yms[i].order, SEEK_SET) == 0)
{
fread(&ym, sizeof(ym), 1, pfdbymname);
}
}
if (ym.name[0] == '\0')
{
fprintf(csvFile, "%d=备用\n", i);
}
else
{
fprintf(csvFile, "%d=%s\n", i, ym.name);
}
}
fprintf(csvFile, "[遥控量]\n");
for (int i = 0; i < config_config.units[sub_uid].ykcount; i++)
{
struYKStatic yk;
memset(&yk, '\0', sizeof(yk));
if (pfdbykname && (config_config.units[sub_uid].yks[i].order >= 0))
{
if (fseek(pfdbykname, sizeof(struYKStatic) * config_config.units[sub_uid].yks[i].order, SEEK_SET) == 0)
{
fread(&yk, sizeof(yk), 1, pfdbykname);
}
}
if (yk.name[0] == '\0')
{
fprintf(csvFile, "%d=备用\n", i);
}
else
{
fprintf(csvFile, "%d=%s\n", i, yk.name);
}
}
fprintf(csvFile, "[遥调量]\n");
for (int i = 0; i < config_config.units[sub_uid].ytcount; i++)
{
struYTStatic yt;
memset(&yt, '\0', sizeof(yt));
if (pfdbytname && (config_config.units[sub_uid].yts[i].order >= 0))
{
if (fseek(pfdbytname, sizeof(struYTStatic) * config_config.units[sub_uid].yts[i].order, SEEK_SET) == 0)
{
fread(&yt, sizeof(yt), 1, pfdbytname);
}
}
if (yt.name[0] == '\0')
{
fprintf(csvFile, "%d=备用\n", i);
}
else
{
fprintf(csvFile, "%d=%s\n", i, yt.name);
}
}
fprintf(csvFile, "[遥信量]\n");
for (int i = 0; i < config_config.units[sub_uid].yxcount; i++)
{
struYXStatic yx;
if (pfdbyxname && (config_config.units[sub_uid].yxs[i].order >= 0))
{
if (fseek(pfdbyxname, sizeof(struYXStatic) * config_config.units[sub_uid].yxs[i].order, SEEK_SET) == 0)
{
fread(&yx, sizeof(yx), 1, pfdbyxname);
}
}
if (yx.name[0] == '\0')
{
fprintf(csvFile, "%d=备用,1,0\n", i);
}
else
{
fprintf(csvFile, "%d=%s\n", i, yx.name);
}
}
fclose(csvFile);
}
sub_uid++;
}
#endif
@ -2745,6 +2884,7 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
if (pfdbymname) fclose(pfdbymname);
if (pfdbykname) fclose(pfdbykname);
if (pfdbytname) fclose(pfdbytname);
//保存数据
configWriteNodeCFG();
configWriteSystemCFG();

View File

@ -56,6 +56,7 @@ typedef std::unordered_map<std::string, std::string> unitserviceName2cmdIdmap;
typedef struct {
std::string name;
std::string deviceId;
Json::Value params;
int highSpeed;
int order;
@ -89,7 +90,7 @@ public:
void handle_message(const std::string & message);
private:
uid2pidmap uid2pid_map;
string2intmap uid2pid_map;
unitname2servicemap unitname2service_map;
unitserviceName2cmdIdmap unitserviceName2cmdId_map;
std::string m_traceId;