|
|
@ -28,13 +28,18 @@ mutex g_list_dbset_mutex;
|
|
|
|
list<ST_IECPOINT_TABLE> g_list_origin;
|
|
|
|
list<ST_IECPOINT_TABLE> g_list_origin;
|
|
|
|
mutex g_list_origin_mutex;
|
|
|
|
mutex g_list_origin_mutex;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
list<IEC_OBJVAL_NEW> g_list_origin_new;
|
|
|
|
|
|
|
|
mutex g_list_origin_mutex_new;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
list<std::string> g_list_busi_data;
|
|
|
|
|
|
|
|
mutex g_list_busi_data_mutex;
|
|
|
|
|
|
|
|
|
|
|
|
list<ST_IECPOINT_TABLE> g_list_pingce;
|
|
|
|
list<ST_IECPOINT_TABLE> g_list_pingce;
|
|
|
|
mutex g_list_pingce_mutex;
|
|
|
|
mutex g_list_pingce_mutex;
|
|
|
|
|
|
|
|
|
|
|
|
list<ST_IECPOINT_TABLE> g_list_warn;
|
|
|
|
list<ST_IECPOINT_TABLE> g_list_warn;
|
|
|
|
mutex g_list_warn_mutex;
|
|
|
|
mutex g_list_warn_mutex;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex g_sendno_mutex;
|
|
|
|
mutex g_sendno_mutex;
|
|
|
|
|
|
|
|
|
|
|
|
CIEC104::CIEC104()
|
|
|
|
CIEC104::CIEC104()
|
|
|
@ -720,11 +725,15 @@ void IEC104EnvLoad()
|
|
|
|
mutex_create(g_list_dbset_mutex);
|
|
|
|
mutex_create(g_list_dbset_mutex);
|
|
|
|
mutex_create(g_sendno_mutex);
|
|
|
|
mutex_create(g_sendno_mutex);
|
|
|
|
mutex_create(g_list_origin_mutex);
|
|
|
|
mutex_create(g_list_origin_mutex);
|
|
|
|
|
|
|
|
mutex_create(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
mutex_create(g_list_busi_data_mutex);
|
|
|
|
mutex_create(g_list_pingce_mutex);
|
|
|
|
mutex_create(g_list_pingce_mutex);
|
|
|
|
mutex_create(g_list_warn_mutex);
|
|
|
|
mutex_create(g_list_warn_mutex);
|
|
|
|
g_list_pack.clear();
|
|
|
|
g_list_pack.clear();
|
|
|
|
g_list_dbset.clear();
|
|
|
|
g_list_dbset.clear();
|
|
|
|
g_list_origin.clear();
|
|
|
|
g_list_origin.clear();
|
|
|
|
|
|
|
|
g_list_origin_new.clear();
|
|
|
|
|
|
|
|
g_list_busi_data.clear();
|
|
|
|
g_list_pingce.clear();
|
|
|
|
g_list_pingce.clear();
|
|
|
|
g_list_warn.clear();
|
|
|
|
g_list_warn.clear();
|
|
|
|
InitIECENV();
|
|
|
|
InitIECENV();
|
|
|
@ -741,6 +750,8 @@ void IEC104EnvFree()
|
|
|
|
mutex_close(g_list_dbset_mutex);
|
|
|
|
mutex_close(g_list_dbset_mutex);
|
|
|
|
mutex_close(g_sendno_mutex);
|
|
|
|
mutex_close(g_sendno_mutex);
|
|
|
|
mutex_close(g_list_origin_mutex);
|
|
|
|
mutex_close(g_list_origin_mutex);
|
|
|
|
|
|
|
|
mutex_close(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
mutex_close(g_list_busi_data_mutex);
|
|
|
|
mutex_close(g_list_pingce_mutex);
|
|
|
|
mutex_close(g_list_pingce_mutex);
|
|
|
|
mutex_close(g_list_warn_mutex);
|
|
|
|
mutex_close(g_list_warn_mutex);
|
|
|
|
g_list_pack.clear();
|
|
|
|
g_list_pack.clear();
|
|
|
@ -852,6 +863,20 @@ static void addOriginDataList(ST_IECPOINT_TABLE &stData)
|
|
|
|
mutex_unlock(g_list_origin_mutex);
|
|
|
|
mutex_unlock(g_list_origin_mutex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 添加原始数据入库队列
|
|
|
|
|
|
|
|
static void addOriginDataListNew(const IEC_OBJVAL_NEW &stData)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
IEC_OBJVAL_NEW stSetData;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memset(&stSetData, 0x00, sizeof(IEC_OBJVAL_NEW));
|
|
|
|
|
|
|
|
memcpy(&stSetData, &stData, sizeof(IEC_OBJVAL_NEW));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
g_list_origin_new.push_front(stSetData);
|
|
|
|
|
|
|
|
mutex_unlock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取发送序列号
|
|
|
|
// 获取发送序列号
|
|
|
|
void vAutoSendSeqNo(int b)
|
|
|
|
void vAutoSendSeqNo(int b)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1267,6 +1292,14 @@ void vYaoKongUnexe(unsigned char *msgbuf, unsigned int len)
|
|
|
|
// 遥信值入map
|
|
|
|
// 遥信值入map
|
|
|
|
bool bSetPointTableValueYX(unsigned char v, unsigned int adr)
|
|
|
|
bool bSetPointTableValueYX(unsigned char v, unsigned int adr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
IEC_OBJVAL_NEW objVal = { 0 };
|
|
|
|
|
|
|
|
objVal.stype = 1;
|
|
|
|
|
|
|
|
objVal.dtime = time(NULL);
|
|
|
|
|
|
|
|
objVal.ival = v;
|
|
|
|
|
|
|
|
objVal.sadr = adr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addOriginDataListNew(objVal);
|
|
|
|
|
|
|
|
|
|
|
|
bool is_state_opend = false;
|
|
|
|
bool is_state_opend = false;
|
|
|
|
unsigned char ovl = 0;
|
|
|
|
unsigned char ovl = 0;
|
|
|
|
map<unsigned int, ST_IECPOINT_TABLE>::iterator m_pIter;
|
|
|
|
map<unsigned int, ST_IECPOINT_TABLE>::iterator m_pIter;
|
|
|
@ -1313,6 +1346,20 @@ bool bSetPointTableValueYX(unsigned char v, unsigned int adr)
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool bSetPointTableValueYX(const std::vector<IEC_OBJVAL_NEW>& values)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
IEC_OBJVAL_NEW objVal = { 0 };
|
|
|
|
|
|
|
|
objVal.stype = 1;
|
|
|
|
|
|
|
|
objVal.dtime = time(NULL);
|
|
|
|
|
|
|
|
objVal.ival = v;
|
|
|
|
|
|
|
|
objVal.sadr = adr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addOriginDataListNew(objVal);
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//遥测值入map
|
|
|
|
//遥测值入map
|
|
|
|
bool bSetPointTableValueYC(float v, unsigned int adr)
|
|
|
|
bool bSetPointTableValueYC(float v, unsigned int adr)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1369,10 +1416,136 @@ bool bSetPointTableValueYC(float v, unsigned int adr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "bSetPointTableValueYC:adr Not found, size=%d", (int)g_map_iec.size());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
mutex_unlock(g_map_iec_mutex);
|
|
|
|
mutex_unlock(g_map_iec_mutex);
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool bSetPointTableValueYC(const std::vector<IEC_OBJVAL_NEW>& values)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// Save the origin data into database first
|
|
|
|
|
|
|
|
for (std::vector<IEC_OBJVAL_NEW>::const_iterator it = values.begin(); it != values.end(); ++it)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
addOriginDataListNew(*it);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string tableName;
|
|
|
|
|
|
|
|
std::string dtimeFildName;
|
|
|
|
|
|
|
|
std::string devidFildName;
|
|
|
|
|
|
|
|
unsigned int devId = 0;
|
|
|
|
|
|
|
|
bool one_dtime = true;
|
|
|
|
|
|
|
|
time_t ts = 0;
|
|
|
|
|
|
|
|
std::map<unsigned int, IEC_POINT>::const_iterator itPoint;
|
|
|
|
|
|
|
|
std::map<unsigned int, IEC_DEVICE>::const_iterator itDev;
|
|
|
|
|
|
|
|
std::string fields, fieldValues;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char dataBuf[32] = { 0 };
|
|
|
|
|
|
|
|
mutex_lock(g_map_iec_mutex_new);
|
|
|
|
|
|
|
|
for (std::vector<IEC_OBJVAL_NEW>::const_iterator it = values.begin(); it != values.end(); ++it)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
itPoint = g_map_iec_new.find(it->sadr);
|
|
|
|
|
|
|
|
if (itPoint != g_map_iec_new.end())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
itDev = g_map_devices.find(itPoint->second.sensor_id);
|
|
|
|
|
|
|
|
if (itDev != g_map_devices.end())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (tableName.empty())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
tableName = (const char *)itDev->second.tableName;
|
|
|
|
|
|
|
|
dtimeFildName = (const char *)itDev->second.dtimeFieldName;
|
|
|
|
|
|
|
|
devidFildName = (const char *)itDev->second.devidFieldName;
|
|
|
|
|
|
|
|
devId = itDev->second.sensor_id;
|
|
|
|
|
|
|
|
one_dtime = (itDev->second.one_dtime != 0);
|
|
|
|
|
|
|
|
ts = it->dtime;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "Table: %s oneTime=%u", tableName.c_str(), (unsigned int)itDev->second.one_dtime);
|
|
|
|
|
|
|
|
if (tableName.empty())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (tableName.compare((const char *)itDev->second.tableName) != 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fields.append((const char *)itPoint->second.fieldName);
|
|
|
|
|
|
|
|
fields.append(",");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fieldValues.append("'");
|
|
|
|
|
|
|
|
snprintf(dataBuf, sizeof(dataBuf), "%0.4f", it->fval);
|
|
|
|
|
|
|
|
fieldValues.append(dataBuf);
|
|
|
|
|
|
|
|
fieldValues.append("',");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!one_dtime)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
fields.append((const char *)itPoint->second.fieldName);
|
|
|
|
|
|
|
|
fields.append("_time,");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fieldValues.append("FROM_UNIXTIME(");
|
|
|
|
|
|
|
|
snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)it->dtime);
|
|
|
|
|
|
|
|
fieldValues.append(dataBuf);
|
|
|
|
|
|
|
|
fieldValues.append("),");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
mutex_unlock(g_map_iec_mutex_new);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Assume they belongs the same object
|
|
|
|
|
|
|
|
std::string sql = "INSERT INTO ";
|
|
|
|
|
|
|
|
sql.append(tableName);
|
|
|
|
|
|
|
|
sql.append("(");
|
|
|
|
|
|
|
|
sql.append(devidFildName);
|
|
|
|
|
|
|
|
sql.append(",");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sql.append(fields, 0, fields.size() - 1);
|
|
|
|
|
|
|
|
sql.append(" VALUES(");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
snprintf(dataBuf, sizeof(dataBuf), "%u", devId);
|
|
|
|
|
|
|
|
sql.append(dataBuf);
|
|
|
|
|
|
|
|
sql.append(",");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (one_dtime)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
sql.append("FROM_UNIXTIME(");
|
|
|
|
|
|
|
|
snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)ts);
|
|
|
|
|
|
|
|
sql.append(dataBuf);
|
|
|
|
|
|
|
|
sql.append("),");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sql.append(fieldValues, 0, fieldValues.size() - 1);
|
|
|
|
|
|
|
|
sql.append(")");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::list<std::string>::iterator it;
|
|
|
|
|
|
|
|
mutex_lock(g_list_busi_data_mutex);
|
|
|
|
|
|
|
|
it = g_list_busi_data.insert(g_list_busi_data.end(), std::string());
|
|
|
|
|
|
|
|
it->swap(sql);
|
|
|
|
|
|
|
|
mutex_unlock(g_list_busi_data_mutex);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
IEC_OBJVAL_NEW objVal = { 0 };
|
|
|
|
|
|
|
|
objVal.stype = 2;
|
|
|
|
|
|
|
|
objVal.dtime = time(NULL);
|
|
|
|
|
|
|
|
objVal.fval = v;
|
|
|
|
|
|
|
|
objVal.sadr = adr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addOriginDataListNew(objVal);
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// I-Formar message decodification I格式帧解码
|
|
|
|
// I-Formar message decodification I格式帧解码
|
|
|
|
// msgbuf : asdu_header + asdu_body
|
|
|
|
// msgbuf : asdu_header + asdu_body
|
|
|
|
// len : asdu length
|
|
|
|
// len : asdu length
|
|
|
@ -1454,6 +1627,10 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
// 类型标识值<0>未用,在本配套标准中定义了 1 至 127 的值,128 至 255 未定义。136
|
|
|
|
// 类型标识值<0>未用,在本配套标准中定义了 1 至 127 的值,128 至 255 未定义。136
|
|
|
|
// 至 255 可以由此标准的使用者彼此独立的进行定义,仅当使用具有类型标识号为 1 至 127
|
|
|
|
// 至 255 可以由此标准的使用者彼此独立的进行定义,仅当使用具有类型标识号为 1 至 127
|
|
|
|
// 的范围的应用服务数据单元才能达到全部互操作。
|
|
|
|
// 的范围的应用服务数据单元才能达到全部互操作。
|
|
|
|
|
|
|
|
std::vector<IEC_OBJVAL_NEW> ycItems;
|
|
|
|
|
|
|
|
IEC_OBJVAL_NEW ycItem = { 2, 0 };
|
|
|
|
|
|
|
|
time_t ts = time(NULL);
|
|
|
|
|
|
|
|
|
|
|
|
switch (header->type & 0xff)
|
|
|
|
switch (header->type & 0xff)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case 1: // Single-point information
|
|
|
|
case 1: // Single-point information
|
|
|
@ -1469,6 +1646,7 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
{
|
|
|
|
{
|
|
|
|
adr++;
|
|
|
|
adr++;
|
|
|
|
pi = (SIQ104*)&msgbuf[pos];
|
|
|
|
pi = (SIQ104*)&msgbuf[pos];
|
|
|
|
|
|
|
|
//
|
|
|
|
bSetPointTableValueYX(pi->spi, adr);
|
|
|
|
bSetPointTableValueYX(pi->spi, adr);
|
|
|
|
if (pi->spi)
|
|
|
|
if (pi->spi)
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SP_%d: val:%d Valid: %d Blocked: %d", header->type, adr, pi->spi, pi->iv, pi->bl);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SP_%d: val:%d Valid: %d Blocked: %d", header->type, adr, pi->spi, pi->iv, pi->bl);
|
|
|
@ -1496,6 +1674,12 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
short *val = (short*)&pf->val[0];
|
|
|
|
short *val = (short*)&pf->val[0];
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ycItem.dtime = ts;
|
|
|
|
|
|
|
|
ycItem.sadr = adr;
|
|
|
|
|
|
|
|
ycItem.fval = *val;
|
|
|
|
|
|
|
|
ycItems.push_back(ycItem);
|
|
|
|
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%d OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%d OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
pos += sizeof(SH104);
|
|
|
|
pos += sizeof(SH104);
|
|
|
|
adr++;
|
|
|
|
adr++;
|
|
|
@ -1504,6 +1688,12 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
SHP104 *pfv = (SHP104*)&msgbuf[pos];
|
|
|
|
SHP104 *pfv = (SHP104*)&msgbuf[pos];
|
|
|
|
short *val = (short*)&pfv->val[0];
|
|
|
|
short *val = (short*)&pfv->val[0];
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ycItem.dtime = ts;
|
|
|
|
|
|
|
|
ycItem.sadr = adr;
|
|
|
|
|
|
|
|
ycItem.fval = *val;
|
|
|
|
|
|
|
|
ycItems.push_back(ycItem);
|
|
|
|
|
|
|
|
|
|
|
|
if (*val)
|
|
|
|
if (*val)
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%d OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pfv->qds.ov, pfv->qds.iv, pfv->qds.bl);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%d OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pfv->qds.ov, pfv->qds.iv, pfv->qds.bl);
|
|
|
|
pos += sizeof(SHP104);
|
|
|
|
pos += sizeof(SHP104);
|
|
|
@ -1517,6 +1707,12 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
short *val = (short*)&pf->val[0];
|
|
|
|
short *val = (short*)&pf->val[0];
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ycItem.dtime = ts;
|
|
|
|
|
|
|
|
ycItem.sadr = adr;
|
|
|
|
|
|
|
|
ycItem.fval = *val;
|
|
|
|
|
|
|
|
ycItems.push_back(ycItem);
|
|
|
|
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%d OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%d OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
pos += sizeof(SH104);
|
|
|
|
pos += sizeof(SH104);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1530,7 +1726,13 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
float *val = (float*)&pf->val[0];
|
|
|
|
float *val = (float*)&pf->val[0];
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%-.4f OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
|
|
|
|
|
|
|
|
ycItem.dtime = ts;
|
|
|
|
|
|
|
|
ycItem.sadr = adr;
|
|
|
|
|
|
|
|
ycItem.fval = *val;
|
|
|
|
|
|
|
|
ycItems.push_back(ycItem);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%-.4f OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
pos += sizeof(SFP104);
|
|
|
|
pos += sizeof(SFP104);
|
|
|
|
adr++;
|
|
|
|
adr++;
|
|
|
|
while (pos < len)
|
|
|
|
while (pos < len)
|
|
|
@ -1538,6 +1740,12 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
SFP104V *pfv = (SFP104V*)&msgbuf[pos];
|
|
|
|
SFP104V *pfv = (SFP104V*)&msgbuf[pos];
|
|
|
|
float *val = (float*)&pfv->val[0];
|
|
|
|
float *val = (float*)&pfv->val[0];
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ycItem.dtime = ts;
|
|
|
|
|
|
|
|
ycItem.sadr = adr;
|
|
|
|
|
|
|
|
ycItem.fval = *val;
|
|
|
|
|
|
|
|
ycItems.push_back(ycItem);
|
|
|
|
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%-.4f OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pfv->qds.ov, pfv->qds.iv, pfv->qds.bl);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%-.4f OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pfv->qds.ov, pfv->qds.iv, pfv->qds.bl);
|
|
|
|
pos += sizeof(SFP104V);
|
|
|
|
pos += sizeof(SFP104V);
|
|
|
|
adr++;
|
|
|
|
adr++;
|
|
|
@ -1550,7 +1758,13 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
float *val = (float*)&pf->val[0];
|
|
|
|
float *val = (float*)&pf->val[0];
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%-.4f OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
|
|
|
|
|
|
|
|
ycItem.dtime = ts;
|
|
|
|
|
|
|
|
ycItem.sadr = adr;
|
|
|
|
|
|
|
|
ycItem.fval = *val;
|
|
|
|
|
|
|
|
ycItems.push_back(ycItem);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d(0x%04x): val:%-.4f OFlow: %d Valid: %d Blocked: %d", header->type, adr, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl);
|
|
|
|
pos += sizeof(SFP104);
|
|
|
|
pos += sizeof(SFP104);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1561,9 +1775,9 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SP104_T *ps = (SP104_T*)&msgbuf[pos];
|
|
|
|
SP104_T *ps = (SP104_T*)&msgbuf[pos];
|
|
|
|
adr = ps->addr2 << 16 | ps->addr1 << 8 | ps->addr0;
|
|
|
|
adr = ps->addr2 << 16 | ps->addr1 << 8 | ps->addr0;
|
|
|
|
CP56Time *t = new CP56Time(ps->time);
|
|
|
|
CP56Time t56(ps->time);
|
|
|
|
char buf[32];
|
|
|
|
char buf[32];
|
|
|
|
t->GetTimeString(buf, sizeof(buf));
|
|
|
|
t56.GetTimeString(buf, sizeof(buf));
|
|
|
|
bSetPointTableValueYX(ps->siq.spi, adr);
|
|
|
|
bSetPointTableValueYX(ps->siq.spi, adr);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SP_%d: val:%d Valid: %d Blocked: %d time:%s", header->type, adr, ps->siq.spi, ps->siq.iv, ps->siq.bl, buf);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SP_%d: val:%d Valid: %d Blocked: %d time:%s", header->type, adr, ps->siq.spi, ps->siq.iv, ps->siq.bl, buf);
|
|
|
|
pos += sizeof(SP104_T);
|
|
|
|
pos += sizeof(SP104_T);
|
|
|
@ -1578,9 +1792,16 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
adr = pf->addr2 << 16 | pf->addr1 << 8 | pf->addr0;
|
|
|
|
float *val = (float*)&pf->val[0];
|
|
|
|
float *val = (float*)&pf->val[0];
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
bSetPointTableValueYC(*val, adr);
|
|
|
|
CP56Time *t = new CP56Time(pf->time);
|
|
|
|
|
|
|
|
|
|
|
|
CP56Time t56(pf->time);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ycItem.dtime = t56.GetTime();
|
|
|
|
|
|
|
|
ycItem.sadr = adr;
|
|
|
|
|
|
|
|
ycItem.fval = *val;
|
|
|
|
|
|
|
|
ycItems.push_back(ycItem);
|
|
|
|
|
|
|
|
|
|
|
|
char buf[32];
|
|
|
|
char buf[32];
|
|
|
|
t->GetTimeString(buf, sizeof(buf));
|
|
|
|
t56.GetTimeString(buf, sizeof(buf));
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d: val:%-.4f OFlow: %d Valid: %d Blocked: %d time:%s", header->type, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl, buf);
|
|
|
|
vPrtLogMsg(LOG_DEBUG, RET_OK, "type=%d SFP_%d: val:%-.4f OFlow: %d Valid: %d Blocked: %d time:%s", header->type, adr, *val, pf->qds.ov, pf->qds.iv, pf->qds.bl, buf);
|
|
|
|
pos += sizeof(SFP104_T);
|
|
|
|
pos += sizeof(SFP104_T);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1627,6 +1848,11 @@ int DecodeMsgFormatI(unsigned char *msgbuf, unsigned int len, unsigned short sen
|
|
|
|
vPrtLogMsg(LOG_WARNG, RET_OK, "Not Implemented!,type=%d", header->type);
|
|
|
|
vPrtLogMsg(LOG_WARNG, RET_OK, "Not Implemented!,type=%d", header->type);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ycItems.empty())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
bSetPointTableValueYC(ycItems);
|
|
|
|
|
|
|
|
}
|
|
|
|
return RET_OK;
|
|
|
|
return RET_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 发送召唤激活
|
|
|
|
// 发送召唤激活
|
|
|
@ -1866,6 +2092,152 @@ void * thread_origin_proc(void * arg)
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
|
|
|
|
** function name : thread_origin_proc_new
|
|
|
|
|
|
|
|
** deacription : 104 origin data save database thread
|
|
|
|
|
|
|
|
** parameter : none
|
|
|
|
|
|
|
|
** return code : NULL
|
|
|
|
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
void * thread_origin_proc_new(void * arg)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int count = 0, n = 0;
|
|
|
|
|
|
|
|
IEC_OBJVAL_NEW pData;
|
|
|
|
|
|
|
|
char szSql[512] = { 0 }, szWaringTime[32] = { 0 };
|
|
|
|
|
|
|
|
MYSQL *pMySql = NULL;
|
|
|
|
|
|
|
|
g_IecCtrl.last_origin_time = time(NULL);
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, 0, "thread_origin_proc_new = %d startup...", GETTID());
|
|
|
|
|
|
|
|
while (g_Running)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pthread_testcancels();
|
|
|
|
|
|
|
|
memset(&pData, 0x00, sizeof(ST_IECPOINT_TABLE));
|
|
|
|
|
|
|
|
mutex_lock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
count = g_list_origin_new.size();
|
|
|
|
|
|
|
|
n = 0;
|
|
|
|
|
|
|
|
if (g_list_origin_new.empty() || g_list_origin_new.size() <= 0) {
|
|
|
|
|
|
|
|
mutex_unlock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY * 10);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//if (time(NULL) - g_IecCtrl.last_yc_time <= g_iec_conf.save_internal) // 超过设定保存时间间隔时
|
|
|
|
|
|
|
|
//{
|
|
|
|
|
|
|
|
// g_list_origin_new.clear();
|
|
|
|
|
|
|
|
// mutex_unlock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
// _SLEEP(MAX_SLEEP_EMPTY * 10);
|
|
|
|
|
|
|
|
// continue;
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
//g_IecCtrl.last_yc_time = time(NULL);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDBMySQL *pdbHandle = CDBMySQL::Instance();
|
|
|
|
|
|
|
|
if (!pdbHandle) {
|
|
|
|
|
|
|
|
mutex_unlock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY * 5);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pMySql = pdbHandle->GetIdleMySql();
|
|
|
|
|
|
|
|
if (pMySql == NULL) {
|
|
|
|
|
|
|
|
mutex_unlock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_WARNG, RET_FAIL, "GetIdleMySql handle failed.");
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pdbHandle->dbAutoCommit(pMySql, false);
|
|
|
|
|
|
|
|
for (int n = 0; n < (count > 500 ? 500 : count); n++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
memcpy(&pData, &(g_list_origin_new.back()), sizeof(IEC_OBJVAL_NEW)); // 由尾取出
|
|
|
|
|
|
|
|
g_list_origin_new.pop_back(); // 由尾删除
|
|
|
|
|
|
|
|
memset(szSql, 0x00, sizeof(szSql));
|
|
|
|
|
|
|
|
vTranHostTimeFmt(pData.dtime, szWaringTime);
|
|
|
|
|
|
|
|
if (pData.stype == 1) // 遥信
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
snprintf(szSql, sizeof(szSql), "INSERT INTO niec_origin_data(d_time,stype,sadr,ival) "
|
|
|
|
|
|
|
|
"VALUES('%s', '%d', '%d', '%u')",
|
|
|
|
|
|
|
|
szWaringTime, pData.stype, pData.sadr, pData.ival);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else { // 遥测
|
|
|
|
|
|
|
|
snprintf(szSql, sizeof(szSql), "INSERT INTO niec_origin_data(d_time,stype,sadr,fval) "
|
|
|
|
|
|
|
|
"VALUES('%s', '%d', '%d', '%.4f')",
|
|
|
|
|
|
|
|
szWaringTime, pData.stype, pData.sadr, pData.fval);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pdbHandle->AddInsertRecord(pMySql, szSql);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pdbHandle->dbCommit(pMySql);
|
|
|
|
|
|
|
|
pdbHandle->dbAutoCommit(pMySql, true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
time_t now = time(NULL);
|
|
|
|
|
|
|
|
if (now - g_IecCtrl.last_origin_time >= g_iec_conf.save_internal) // 超过设定保存时间间隔时
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
g_IecCtrl.last_origin_time = now;
|
|
|
|
|
|
|
|
memset(szSql, 0x00, sizeof(szSql));
|
|
|
|
|
|
|
|
vTranHostTimeFmt(now, szWaringTime);
|
|
|
|
|
|
|
|
snprintf(szSql, sizeof(szSql), "DELETE FROM iec_origin_data_new WHERE d_time<'%s' ",
|
|
|
|
|
|
|
|
szWaringTime);
|
|
|
|
|
|
|
|
pdbHandle->AddInsertRecord(pMySql, szSql);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pdbHandle->SetIdleMysql(pMySql);
|
|
|
|
|
|
|
|
mutex_unlock(g_list_origin_mutex_new);
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY * 10);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
|
|
|
|
** function name : thread_busi_data_proc
|
|
|
|
|
|
|
|
** deacription : 104 business data save database thread
|
|
|
|
|
|
|
|
** parameter : none
|
|
|
|
|
|
|
|
** return code : NULL
|
|
|
|
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
void * thread_busi_data_proc(void * arg)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int count = 0, n = 0;
|
|
|
|
|
|
|
|
ST_IECPOINT_TABLE pData;
|
|
|
|
|
|
|
|
char szSql[512] = { 0 }, szWaringTime[32] = { 0 };
|
|
|
|
|
|
|
|
std::string sql;
|
|
|
|
|
|
|
|
MYSQL *pMySql = NULL;
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_DEBUG, 0, "thread_busi_data_proc = %d startup...", GETTID());
|
|
|
|
|
|
|
|
while (g_Running)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pthread_testcancels();
|
|
|
|
|
|
|
|
memset(&pData, 0x00, sizeof(ST_IECPOINT_TABLE));
|
|
|
|
|
|
|
|
mutex_lock(g_list_busi_data_mutex);
|
|
|
|
|
|
|
|
count = g_list_busi_data.size();
|
|
|
|
|
|
|
|
n = 0;
|
|
|
|
|
|
|
|
if (g_list_busi_data.empty() || g_list_busi_data.size() <= 0) {
|
|
|
|
|
|
|
|
mutex_unlock(g_list_busi_data_mutex);
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY * 10);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDBMySQL *pdbHandle = CDBMySQL::Instance();
|
|
|
|
|
|
|
|
if (!pdbHandle) {
|
|
|
|
|
|
|
|
mutex_unlock(g_list_busi_data_mutex);
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY * 5);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pMySql = pdbHandle->GetIdleMySql();
|
|
|
|
|
|
|
|
if (pMySql == NULL) {
|
|
|
|
|
|
|
|
mutex_unlock(g_list_busi_data_mutex);
|
|
|
|
|
|
|
|
vPrtLogMsg(LOG_WARNG, RET_FAIL, "GetIdleMySql handle failed.");
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pdbHandle->dbAutoCommit(pMySql, false);
|
|
|
|
|
|
|
|
for (int n = 0; n < (count > 500 ? 500 : count); n++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
sql.swap(g_list_busi_data.back());
|
|
|
|
|
|
|
|
g_list_busi_data.pop_back(); // Remove the tail
|
|
|
|
|
|
|
|
// memset(szSql, 0x00, sizeof(szSql));
|
|
|
|
|
|
|
|
pdbHandle->AddInsertRecord(pMySql, sql.c_str());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pdbHandle->dbCommit(pMySql);
|
|
|
|
|
|
|
|
pdbHandle->dbAutoCommit(pMySql, true);
|
|
|
|
|
|
|
|
pdbHandle->SetIdleMysql(pMySql);
|
|
|
|
|
|
|
|
mutex_unlock(g_list_busi_data_mutex);
|
|
|
|
|
|
|
|
_SLEEP(MAX_SLEEP_EMPTY * 10);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
/***************************************************************************
|
|
|
|
** function name : iGetSadrMatchRecord
|
|
|
|
** function name : iGetSadrMatchRecord
|
|
|
|
** deacription : 104 addr point match list
|
|
|
|
** deacription : 104 addr point match list
|
|
|
|