This commit is contained in:
zhouhuang 2024-11-20 17:28:24 +08:00
parent 3a95e8f50d
commit 8f26466f6e
4 changed files with 123 additions and 15 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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;

View File

@ -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协议