From 8f26466f6efa4f298f4a1a1b4c166cd9fa1cac3c Mon Sep 17 00:00:00 2001 From: zhouhuang Date: Wed, 20 Nov 2024 17:28:24 +0800 Subject: [PATCH] update --- das-dn/cmg/ry.cpp | 120 ++++++++++++++++-- das-dn/cmg/ry.h | 6 +- das-dn/hostmodbustcpbf/host_modbus_tcp_bf.cpp | 6 +- das-dn/hostmodbustcpbf/host_modbus_tcp_bf.h | 6 +- 4 files changed, 123 insertions(+), 15 deletions(-) diff --git a/das-dn/cmg/ry.cpp b/das-dn/cmg/ry.cpp index 2e00a6c3..73c51db7 100644 --- a/das-dn/cmg/ry.cpp +++ b/das-dn/cmg/ry.cpp @@ -1075,6 +1075,35 @@ BOOLEAN CRYDevice::processUartParam(const Json::Value jsonRoot, int ord) return TRUE; } +BOOLEAN CRYDevice::processModbustcpParam(const Json::Value jsonRoot, int pid) +{ + if (pid < 0 || pid >= PROCESSES_NUM) return FALSE; + + config_config.processes[pid].option.network.ignored_source = TRUE; + config_config.processes[pid].option.network.socket_type = SOCK_STREAM; + config_config.processes[pid].option.network.bind_addr = INADDR_ANY; + config_config.processes[pid].option.network.bind_port = 0; + config_config.processes[pid].option.network.target_addr = INADDR_ANY; + config_config.processes[pid].option.network.target_port = 502; + + if (jsonRoot["targetAddr"].isInt()) { + config_config.processes[pid].option.network.target_addr = jsonRoot["targetAddr"].asInt(); + } else if (jsonRoot["targetAddr"].isString()) { + if (inet_pton(AF_INET, jsonRoot["targetAddr"].asCString(), &config_config.processes[pid].option.network.target_addr) == 1) { + vLog(LOG_DEBUG, "IPv4 地址转换成功,网络字节序为: %u.\n", config_config.processes[pid].option.network.target_addr); + } else { + vLog(LOG_ERROR, "inet_pton error(%d,%s).\n", errno, strerror(errno)); + } + } + if (jsonRoot["targetPort"].isInt()) { + config_config.processes[pid].option.network.target_port = jsonRoot["targetPort"].asInt(); + } else if (jsonRoot["targetPort"].isString()) { + config_config.processes[pid].option.network.target_port = atoi(jsonRoot["targetPort"].asCString()); + } + + return TRUE; +} + BOOLEAN CRYDevice::processRymodbustcpParam(const Json::Value jsonRoot, int pid) { if (pid < 0 || pid >= PROCESSES_NUM) return FALSE; @@ -1220,6 +1249,8 @@ BOOLEAN CRYDevice::processHostIEC104ProcessParam(const Json::Value jsonRoot, int config_config.processes[pid].option.iec104.net.socket_type = SOCK_STREAM; config_config.processes[pid].option.iec104.net.target_addr = INADDR_ANY; config_config.processes[pid].option.iec104.net.target_port = 2404; + config_config.processes[pid].option.iec104.net.bind_addr = INADDR_ANY; + config_config.processes[pid].option.iec104.net.bind_port = 0; config_config.processes[pid].option.iec104.asdu_addr_size = 2; config_config.processes[pid].option.iec104.cot_size = 2; config_config.processes[pid].option.iec104.info_addr_size = 3; @@ -1268,6 +1299,61 @@ BOOLEAN CRYDevice::processHostIEC104ProcessParam(const Json::Value jsonRoot, int return TRUE; } +BOOLEAN CRYDevice::processSubIEC104ProcessParam(const Json::Value jsonRoot, int pid) +{ + if (pid < 0 || pid >= PROCESSES_NUM) return FALSE; + + config_config.processes[pid].option.iec104.net.ignored_source = TRUE; + config_config.processes[pid].option.iec104.net.socket_type = SOCK_STREAM; + config_config.processes[pid].option.iec104.net.target_addr = INADDR_ANY; + config_config.processes[pid].option.iec104.net.target_port = 0; + config_config.processes[pid].option.iec104.net.bind_addr = INADDR_ANY; + config_config.processes[pid].option.iec104.net.bind_port = 0; + config_config.processes[pid].option.iec104.asdu_addr_size = 2; + config_config.processes[pid].option.iec104.cot_size = 2; + config_config.processes[pid].option.iec104.info_addr_size = 3; + config_config.processes[pid].option.iec104.t0 = 30; + config_config.processes[pid].option.iec104.t1 = 15; + config_config.processes[pid].option.iec104.t2 = 10; + config_config.processes[pid].option.iec104.t3 = 20; + config_config.processes[pid].option.iec104.k = 12; + config_config.processes[pid].option.iec104.w = 8; + +#if 0 + if (jsonRoot["host"].isInt()) { + config_config.processes[pid].option.iec104.net.bind_addr = jsonRoot["host"].asInt(); + } else if (jsonRoot["host"].isString()) { + if (inet_pton(AF_INET, jsonRoot["host"].asCString(), &config_config.processes[pid].option.iec104.net.bind_addr) == 1) { + vLog(LOG_DEBUG, "IPv4 地址转换成功,网络字节序为: %u.\n", config_config.processes[pid].option.iec104.net.bind_addr); + } else { + vLog(LOG_ERROR, "inet_pton error(%d,%s).\n", errno, strerror(errno)); + } + } +#endif + if (jsonRoot["port"].isInt()) { + config_config.processes[pid].option.iec104.net.bind_port = jsonRoot["port"].asInt(); + } else if (jsonRoot["port"].isString()) { + config_config.processes[pid].option.iec104.net.bind_port = atoi(jsonRoot["port"].asCString()); + } + if (jsonRoot["t1"].isInt()) { + config_config.processes[pid].option.iec104.t0 = jsonRoot["t1"].asInt(); + } else if (jsonRoot["t1"].isString()) { + config_config.processes[pid].option.iec104.t0 = atoi(jsonRoot["t1"].asCString()); + } + if (jsonRoot["t2"].isInt()) { + config_config.processes[pid].option.iec104.t0 = jsonRoot["t2"].asInt(); + } else if (jsonRoot["t2"].isString()) { + config_config.processes[pid].option.iec104.t0 = atoi(jsonRoot["t2"].asCString()); + } + if (jsonRoot["t3"].isInt()) { + config_config.processes[pid].option.iec104.t0 = jsonRoot["t3"].asInt(); + } else if (jsonRoot["t3"].isString()) { + config_config.processes[pid].option.iec104.t0 = atoi(jsonRoot["t3"].asCString()); + } + + return TRUE; +} + #define POINT_TYPE_YX 0 #define POINT_TYPE_YC 1 @@ -1816,7 +1902,9 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) config_config.processes[i].order = uartId++; break; case PROTOCOL_HOST_MODBUS_TCP: - case PROTOCOL_HOST_MODBUS_RTU_TCP: + processModbustcpParam(params, i); + break; + case PROTOCOL_HOST_BF_MODBUSTCP: processRymodbustcpParam(params, i); break; case PROTOCOL_FTP2MINIO: @@ -1825,6 +1913,11 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) case PROTOCOL_HOST_IEC104: processHostIEC104ProcessParam(params, i); break; + case PROTOCOL_SUB_IEC104: + processSubIEC104ProcessParam(params, i); + break; + default: + break; } } //处理链接设备 @@ -1894,13 +1987,13 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) if (address != "") { BYTE addrType = ADDR_TYPE_NORMAL; //根据协议设定单元地址类型 switch (config_config.processes[pid].proto) { - case PROTOCOL_HOST_MODBUS_RTU: - break; case PROTOCOL_HOST_MODBUS_TCP: - case PROTOCOL_HOST_MODBUS_RTU_TCP: + case PROTOCOL_HOST_BF_MODBUSTCP: + case PROTOCOL_HOST_BF_ADS: addrType = ADDR_TYPE_IPV4; break; case PROTOCOL_HOST_IEC104: + case PROTOCOL_SUB_IEC104: addrType = ADDR_TYPE_IPV4_FACNO; break; } @@ -2019,7 +2112,8 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) case PROTOCOL_HOST_MODBUS_RTU: case PROTOCOL_HOST_MODBUS_TCP: case PROTOCOL_HOST_MODBUS_RTU_TCP: - processModbusPointParam(param, uid, k, POINT_TYPE_YC); + case PROTOCOL_HOST_BF_MODBUSTCP: + processModbusPointParam(param, uid, k, POINT_TYPE_YC); break; case PROTOCOL_HOST_IEC104: break; @@ -2053,7 +2147,8 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) case PROTOCOL_HOST_MODBUS_RTU: case PROTOCOL_HOST_MODBUS_TCP: case PROTOCOL_HOST_MODBUS_RTU_TCP: - processModbusPointParam(param, uid, k, POINT_TYPE_YM); + case PROTOCOL_HOST_BF_MODBUSTCP: + processModbusPointParam(param, uid, k, POINT_TYPE_YM); break; case PROTOCOL_HOST_IEC104: break; @@ -2085,7 +2180,8 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) case PROTOCOL_HOST_MODBUS_RTU: case PROTOCOL_HOST_MODBUS_TCP: case PROTOCOL_HOST_MODBUS_RTU_TCP: - processModbusPointParam(param, uid, k, POINT_TYPE_YK); + case PROTOCOL_HOST_BF_MODBUSTCP: + processModbusPointParam(param, uid, k, POINT_TYPE_YK); break; case PROTOCOL_HOST_IEC104: break; @@ -2112,7 +2208,8 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) case PROTOCOL_HOST_MODBUS_RTU: case PROTOCOL_HOST_MODBUS_TCP: case PROTOCOL_HOST_MODBUS_RTU_TCP: - processModbusPointParam(param, uid, k, POINT_TYPE_YT); + case PROTOCOL_HOST_BF_MODBUSTCP: + processModbusPointParam(param, uid, k, POINT_TYPE_YT); break; case PROTOCOL_HOST_IEC104: break; @@ -2144,7 +2241,8 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot) case PROTOCOL_HOST_MODBUS_RTU: case PROTOCOL_HOST_MODBUS_TCP: case PROTOCOL_HOST_MODBUS_RTU_TCP: - processModbusPointParam(param, uid, k, POINT_TYPE_YX); + case PROTOCOL_HOST_BF_MODBUSTCP: + processModbusPointParam(param, uid, k, POINT_TYPE_YX); break; case PROTOCOL_HOST_IEC104: break; @@ -2331,6 +2429,7 @@ bool CRYDevice::publishAnalogData(int uid) datatime *= 1000; root["dataTime"] = datatime; root["deviceId"] = static_units[uid].deviceId; + root["isStore"] = config.units[uid].state & 0x20 ? false : true; root["values"] = values; return publish_sensor_data("", "analogData", root); } @@ -2353,6 +2452,7 @@ bool CRYDevice::publishStateData(int uid) datatime *= 1000; root["dataTime"] = datatime; root["deviceId"] = static_units[uid].deviceId; + root["isStore"] = config.units[uid].state & 0x20 ? false : true; root["values"] = values; return publish_sensor_data("", "stateData", root); } @@ -2498,6 +2598,7 @@ bool CRYDevice::ry_run(void) last_connect_sec = system32.timers; while ((msg[msg_count] = nopoll_conn_get_msg(conn)) != NULL) { +#if 0 vLog(LOG_DEBUG, "recv %d length = %d, %d\n", msg_count, nopoll_msg_get_payload_size(msg[msg_count]), nopoll_msg_is_final(msg[msg_count])); char pathN[256]; snprintf(pathN, sizeof(pathN), "0/_%d.txt", msg_count); @@ -2506,6 +2607,7 @@ bool CRYDevice::ry_run(void) fwrite(nopoll_msg_get_payload(msg[msg_count]), nopoll_msg_get_payload_size(msg[msg_count]), 1, pf); fclose(pf); } +#endif if (nopoll_msg_is_final(msg[msg_count])) { msg_count++; if (msg_count > 0) { diff --git a/das-dn/cmg/ry.h b/das-dn/cmg/ry.h index bc7f2cd8..0a71508e 100644 --- a/das-dn/cmg/ry.h +++ b/das-dn/cmg/ry.h @@ -83,7 +83,7 @@ private: int status; int msg_count = 0; - noPollMsg *msg[2048]; + noPollMsg *msg[4096]; bool m_dataAcquisitionReload = false; @@ -126,9 +126,11 @@ private: int MakeYTFrame(int); bool OnReceivedDeviceCommand(const Json::Value); BOOLEAN processUartParam(const Json::Value, int); + BOOLEAN processModbustcpParam(const Json::Value, int); BOOLEAN processRymodbustcpParam(const Json::Value, int); BOOLEAN processRyFTP2MinioParam(const Json::Value, int); - BOOLEAN processHostIEC104ProcessParam(const Json::Value, int pid); + BOOLEAN processHostIEC104ProcessParam(const Json::Value, int); + BOOLEAN processSubIEC104ProcessParam(const Json::Value, int); BOOLEAN processModbusPointParam(const Json::Value, int, int, int); bool dealConfigFile(const Json::Value); bool OnReceivedSystemAction(const std::string, const std::string, const Json::Value); diff --git a/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.cpp b/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.cpp index bddcfac7..b28c21eb 100644 --- a/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.cpp +++ b/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.cpp @@ -1431,6 +1431,9 @@ void CHostModbusTcpBFProcess::calc2(void) { //获取单元地址成功,则该段原地址采用配置地址,否则该单元为无效地址。 pItem->m_addr = addr; } + //需要给单元添加一个是否有ftp数据的标识 + if (m_bHaveFTP) config.units[uid].state |= 0x20; //存在ftp标识 + struModbusExtFrame ycframes[MODBUS_RTU_AUTOMATIC_FRAME]; struModbusExtFrame ymframes[MODBUS_RTU_AUTOMATIC_FRAME]; struModbusExtFrame yxframes[MODBUS_RTU_AUTOMATIC_FRAME]; @@ -1745,9 +1748,6 @@ BOOLEAN CHostModbusTcpBFProcess::Run(void) usleep(20000); return TRUE; } - - pItem = (CHostModbusTcpBFProcessItem *)GetCurItem(); - if (NULL == pItem) return TRUE; buffer[0] = HIBYTE(pItem->m_nNum); buffer[1] = LOBYTE(pItem->m_nNum); buffer[2] = 0; buffer[3] = MB_TCP_PROTOCOL_ID; diff --git a/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.h b/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.h index 8e4f2918..38bfd335 100644 --- a/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.h +++ b/das-dn/hostmodbustcpbf/host_modbus_tcp_bf.h @@ -221,7 +221,11 @@ private: struRYModbusOption m_nOptions; //增加websocket连接 pthread_t m_pid; - short m_uid; + //short m_uid; + time_t last_sec; + + BOOLEAN publishStateData(void); + BOOLEAN publishAnalogData(void); public: BOOLEAN m_bHaveFTP; //存在FTP协议