map/das-dn/hostadsbf/hostadsbf.cpp

1424 lines
54 KiB
C++
Raw Normal View History

2024-12-03 10:36:06 +08:00
#include "hostadsbf.h"
#include <array>
#include <math.h>
#include <ry.h>
2024-12-04 08:48:18 +08:00
#define MAX_BLOCKF_SIZE 512
2024-12-04 19:53:53 +08:00
#define DATA_BLOCK_BOUNDARY 400
2024-12-03 10:36:06 +08:00
#define REGISTER_DATA_TYPE_YC 1
#define REGISTER_DATA_TYPE_YM 2
#define REGISTER_DATA_TYPE_YX_BYTE 3
#define REGISTER_DATA_TYPE_YX_WORD 4
#define REGISTER_DATA_TYPE_YX_DWORD 5
2024-12-04 08:48:18 +08:00
#define ADSP_READ_ID 100 //读取文件及文件夹ID
#define ADSP_READ_ID_FUNCCODE 0x03 //读取文件及文件夹ID功能码。
2024-12-04 13:48:25 +08:00
#define ADSP_READ_ID_REGISTER_ADDRESS 300 //读取文件及文件夹ID寄存器地址。
#define ADSP_READ_ID_REGISTER_LENGTH 32 //读取文件及文件夹ID寄存器长度。
2024-12-04 08:48:18 +08:00
2024-12-31 10:45:00 +08:00
//#define vLog(...)
2024-12-09 09:41:04 +08:00
static datalen2mbaddrmap m_datalen2mbaddr_map;
2024-12-13 16:16:19 +08:00
static struDataLengthADSAddr m_datalen_adsaddr[] = {
2024-12-17 13:38:57 +08:00
{ 2, 421, 0.1 },
{ 2, 409, 0.1 },
{ 2, 445, 0.01 },
{ 2, 659, 0.001 },
{ 2, 663, 0.001 },
{ 2, 400, 1 },
{ 2, 402, 1 },
{ 2, 404, 1 },
{ 2, 449, 0.01 },
{ 2, 425, 0.1 },
{ 2, 413, 0.1 },
{ 2, -600, 0.1 },
{ 2, 655, 0.1 },
{ 2, 715, 0.1 },
{ 2, 461, 0.1 },
{ 2, 493, 0.1 },
{ 2, -600, 0.1 },
{ 2, 497, 0.1 },
{ 2, 501, 0.01 },
{ 2, 433, 0.01 },
{ 2, 437, 0.01 },
{ 2, 441, 0.01 },
{ 2, 687, 0.01 },
{ 2, 691, 0.01 },
{ 2, 695, 0.01 },
{ 2, 517, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 2, 465, 0.01 },
{ 2, 469, 0.1 },
{ 2, 473, 0.1 },
{ 2, 477, 0.1 },
{ 2, 481, 0.1 },
{ 2, 485, 0.1 },
{ 2, 489, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.01 },
{ 2, -600, 0.01 },
{ 2, -600, 0.01 },
{ 2, 457, 0.001 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, 675, 0.1 },
{ 2, 505, 0.1 },
{ 2, 509, 0.1 },
{ 2, 513, 0.1 },
{ 2, 2, 0.1 },
{ 2, 14, 0.1 },
{ 2, 26, 0.1 },
{ 2, 38, 0.1 },
{ 2, 50, 0.1 },
{ 2, 62, 0.1 },
{ 2, 74, 0.1 },
{ 2, -600, 0.1 },
{ 2, 98, 0.1 },
{ 2, 110, 0.1 },
{ 2, 122, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, -600, 0.1 },
{ 2, 134, 0.1 },
{ 2, 146, 0.1 },
{ 2, 158, 0.1 },
{ 2, 170, 0.1 },
{ 2, 182, 0.1 },
{ 2, 206, 0.1 },
{ 2, 218, 0.1 },
{ 2, 230, 0.1 },
{ 2, 242, 0.1 },
{ 2, 254, 0.1 },
{ 2, 266, 0.1 },
{ 2, 521, 0.001 },
{ 2, 525, 0.001 },
{ 4, 537, 1 },
{ 4, 533, 1 },
{ 4, 545, 1 },
{ 4, 541, 1 },
{ 4, -600, 1 },
{ 4, -600, 1 },
{ 2, 549, 1 },
{ 2, 551, 1 },
{ 2, 553, 1 },
{ 2, 555, 1 },
{ 2, 557, 1 },
{ 2, 559, 1 },
{ 2, 561, 1 },
{ 2, 563, 1 },
{ 2, 565, 1 },
{ 2, 567, 1 },
{ 2, 569, 1 },
{ 2, 571, 1 },
{ 2, 573, 1 },
{ 2, 575, 1 },
{ 2, 577, 1 },
{ 2, 579, 1 },
{ 2, 581, 1 },
{ 2, 583, 1 },
{ 2, 585, 1 },
{ 2, 587, 1 },
{ 2, 589, 1 },
{ 2, 591, 1 },
{ 2, 593, 1 },
{ 2, 595, 1 },
{ 2, 597, 1 },
{ 2, 599, 1 },
{ 2, 601, 1 },
{ 2, 603, 1 },
{ 2, 605, 1 },
{ 2, 607, 1 },
{ 2, 609, 1 },
{ 2, 611, 1 },
{ 2, 613, 1 },
{ 2, 615, 1 },
{ 2, 617, 1 },
{ 2, 619, 1 },
{ 2, 621, 1 },
{ 2, 623, 1 },
{ 2, 625, 1 },
{ 2, 627, 1 },
{ 2, 629, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 1 },
{ 2, -600, 0.1 },
{ 2, 429, 0.1 },
{ 2, -600, 0.1 },
{ 2, 417, 0.1 },
{ 2, -600, 0.01 },
{ 2, 453, 0.01 },
{ 2, 683, 0.01 },
{ 2, -600, 0.1 },
{ 4, 639, 1 },
{ 4, 631, 1 },
{ 4, 635, 1 },
{ 2, 643, 0.01 },
{ 2, 647, 0.01 },
{ 2, 651, 0.01 },
{ 2, 679, 0.1 },
{ 2, 703, 0.001 },
{ 2, 707, 0.001 },
{ 2, 667, 0.001 },
{ 2, 671, 0.001 },
{ 2, 194, 0.1 },
{ 2, 699, 1 },
{ 2, 10, 0.1 }
2024-12-03 10:36:06 +08:00
};
2024-12-13 16:16:19 +08:00
float adsGetUnitYCRealFromValue(int uid, int order, LONG value)
{
if (uid < 0 || uid >= UNIT_NUM) return 0;
if (order < 1 || order > (int)(sizeof(m_datalen_adsaddr) / sizeof(m_datalen_adsaddr[0]))) return FALSE;
float coef = m_datalen_adsaddr[order - 1].coef;
return (float)(value * coef);
}
BOOLEAN adsGetUnitYCIsFloat(int uid, int order)
{
float coef = 1.0f;
if (uid < 0 || uid >= UNIT_NUM) return FALSE;
if (order < 1 || order > (int)(sizeof(m_datalen_adsaddr) / sizeof(m_datalen_adsaddr[0]))) return FALSE;
coef = m_datalen_adsaddr[order - 1].coef;
if (fabsf(coef) <= 1E-8) coef = 1.0f;
if (fabsf(coef - 1.0f) <= 1E-8) return FALSE;
return TRUE;
}
2024-12-03 20:27:52 +08:00
2024-12-03 10:36:06 +08:00
static bool publish_sensor_data(const char* command, const Json::Value payload)
{
Json::StreamWriterBuilder builder;
builder["indentation"] = "";
builder["emitUTF8"] = true;
Json::Value jsonRoot;
jsonRoot["cmd"] = command;
char str[128];
#ifdef NOPOLL_64BIT_PLATFORM
snprintf(str, sizeof(str), "%ld", snowflake_next_id());
#else
snprintf(str, sizeof(str), "%lld", snowflake_next_id());
#endif
jsonRoot["cmdId"] = str;
Json::Int64 mtime = (Json::Int64)time(NULL);
mtime *= 1000;
jsonRoot["time"] = mtime;
jsonRoot["data"] = payload;
std::string outputConfig = Json::writeString(builder, jsonRoot);
g_conn->sendMsg(outputConfig);
return true;
}
static WORD GetUnitYCRegisterAddr(int uid, int point)
{
struUnit* pUnit;
struUnitYC* pYC;
if (uid < 0 || uid >= UNIT_NUM) return (WORD)65535;
pUnit = &config.units[uid];
if (pUnit->yccount <= 0) return (WORD)65535;
if (point < 0 || point >= pUnit->yccount) return (WORD)65535;
pYC = &pUnit->ycs[point];
2024-12-04 08:48:18 +08:00
return (MAKEWORD(pYC->m_param[0], pYC->m_param[1]));
2024-12-03 10:36:06 +08:00
}
static WORD GetUnitYXRegisterAddr(int uid, int point)
{
struUnit* pUnit;
struUnitYX* pYX;
if (uid < 0 || uid >= UNIT_NUM) return (WORD)65535;
pUnit = &config.units[uid];
if (pUnit->yxcount <= 0) return (WORD)65535;
if (point < 0 || point >= pUnit->yxcount) return (WORD)65535;
pYX = &pUnit->yxs[point];
2024-12-04 08:48:18 +08:00
return (MAKEWORD(pYX->m_param[0], pYX->m_param[1]));
2024-12-03 10:36:06 +08:00
}
static BYTE GetUnitYXDataPos(int uid, int point)
{
struUnit* pUnit;
struUnitYX* pYX;
if (uid < 0 || uid >= UNIT_NUM) return (BYTE)0;
pUnit = &config.units[uid];
if (pUnit->yxcount <= 0) return (BYTE)0;
if (point < 0 || point >= pUnit->yxcount) return (BYTE)0;
pYX = &pUnit->yxs[point];
return (pYX->m_param[3]);
}
static BOOLEAN GetYCValue(const int order, const FIELDDES* fields, const char* pData, LONG& value)
{
if (pData == NULL) return FALSE;
if (fields == NULL) return FALSE;
2024-12-13 16:16:19 +08:00
if (order < 0 || order >= (int)(sizeof(m_datalen_adsaddr) / sizeof(m_datalen_adsaddr[0]))) return FALSE;
2024-12-03 10:36:06 +08:00
int start = fields[order].start;
if (fields[order].length == sizeof(DWORD))
{ //4字节
value = *(LONG *)(pData + start);
return TRUE;
}
else if (fields[order].length == sizeof(WORD))
{
short tmp = *(short *)(pData + start);
value = (LONG)tmp;
return TRUE;
}
return FALSE;
}
static BOOLEAN GetYXValue(const int order, const FIELDDES* fields, const char* pData, const int pos, BOOLEAN& value)
{
if (pData == NULL) return FALSE;
if (fields == NULL) return FALSE;
if (pos < 0 || pos >= 16) return FALSE;
2024-12-13 16:16:19 +08:00
if (order < 0 || order >= (int)(sizeof(m_datalen_adsaddr) / sizeof(m_datalen_adsaddr[0]))) return FALSE;
2024-12-03 10:36:06 +08:00
int start = fields[order].start;
if (fields[order].length == sizeof(WORD))
{
WORD tmp = *(WORD *)(pData + start);
WORD nTemp = 0x0001;
nTemp <<= pos;
if (tmp & nTemp) value = TRUE;
else value = FALSE;
return TRUE;
}
return FALSE;
}
static bool publishhistoryHighSpeedData(const int uid, const QWORD dt, const Json::Value values)
{
if (uid < 0 || uid >= UNIT_NUM) return false;
Json::Value root;
if (values.size()) {
root["dataTime"] = (Json::Int64)dt;
root["deviceId"] = static_units[uid].deviceId;
root["values"] = values;
return publish_sensor_data("historyHighSpeedData", root);
}
return false;
}
#ifndef USE_NOPOLL_WEBSOCKET
static bool publishhistoryLowSpeedData(const int uid, const QWORD dt, const Json::Value values)
#else
static bool publishhistoryLowSpeedData(const noPollConn* conn, const int uid, const QWORD dt, const Json::Value values)
#endif
{
if (uid < 0 || uid >= UNIT_NUM) return false;
Json::Value root;
if (values.size()) {
root["dataTime"] = (Json::Int64)(dt / 1000 * 1000); //取整
root["deviceId"] = static_units[uid].deviceId;
root["values"] = values;
#ifndef USE_NOPOLL_WEBSOCKET
return publish_sensor_data("historyLowSpeedData", root);
#else
return publish_sensor_data(conn, "historyLowSpeedData", root);
#endif
}
return false;
}
2024-12-05 11:04:47 +08:00
#if 0
2024-12-03 10:36:06 +08:00
static int ftpget(const char* remote, const char* local, const char* user, const char* pwd, const long timeout = 3, struct memory* chunk = NULL)
{
2024-12-05 11:04:47 +08:00
//vLog(LOG_DEBUG, "start to get %s to local %s, with name: %s, and password: %s.\n", remote, local, user, pwd);
2024-12-03 10:36:06 +08:00
curl_global_init(CURL_GLOBAL_ALL);
CURL* curl = curl_easy_init();
char user_key[1024] = {0};
snprintf(user_key, sizeof(user_key), "%s:%s", user, pwd);
CURLcode ret = CURLE_GOT_NOTHING;
curl_easy_setopt(curl, CURLOPT_URL, remote);
curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)chunk);
curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 0L); // Optional: depending on your FTP server
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_global_cleanup();
return ret;
}
2024-12-05 11:04:47 +08:00
#endif
2024-12-03 10:36:06 +08:00
static void* ryftp_process(void* param)
{
if (param == NULL) return ((void*)0);
CHostADSBFProcess* mbt = (CHostADSBFProcess *)param;
//获取此协议配置里面的ftp信息
char remote[512];
2024-12-05 13:20:55 +08:00
//char name[512];
2024-12-03 10:36:06 +08:00
//默认参数,或是通过协议配置获取
char user[128] = "administrator";
char password[128] = "123456";
char ipaddress[128] = "127.0.0.1";
char remotePath[128] = "Hard Disk2/data/rtdatalog";
2024-12-05 13:20:55 +08:00
//char pathName[128] = "./";
2024-12-03 10:36:06 +08:00
2024-12-04 13:48:25 +08:00
char processName[128];
2024-12-10 10:14:40 +08:00
snprintf(processName, sizeof(processName), "%s", mbt->m_pidName.c_str());
2024-12-03 10:36:06 +08:00
//配置远方路径
char* escaped_string = escape_char_in_string(mbt->m_remotePath, ' ');
if (escaped_string == NULL)
{
2024-12-10 14:25:46 +08:00
vLog(LOG_DEBUG, "%s 路径转义错误!\n", processName);
2024-12-03 10:36:06 +08:00
return ((void*)0);
}
snprintf(remotePath, sizeof(remotePath), "%s", escaped_string);
free(escaped_string);
#if 0
//根据协议创s建一个本地协议目录
int pid = mbt->GetCurID();
if (pid < 0 || pid >= PROCESSES_NUM) return ((void*)0);
char pathName[128];
snprintf(pathName, sizeof(pathName), "%d", pid);
if (mbt->_mkdir(pathName) < 0) return ((void*)0);
#endif
//配置的用户名和密码
snprintf(user, sizeof(user), "%s", mbt->m_user);
snprintf(password, sizeof(password), "%s", mbt->m_password);
//配置ip地址
memset(ipaddress, '\0', sizeof(ipaddress));
snprintf(ipaddress, sizeof(ipaddress), "%s", mbt->getRemoteIp());
2024-12-13 16:16:19 +08:00
for (int i = 0; i < (int)(sizeof(m_datalen_adsaddr) / sizeof(m_datalen_adsaddr[0])); i++) {
m_datalen2mbaddr_map.insert(datalen2mbaddrmap::value_type(m_datalen_adsaddr[i].address, i + 1));
2024-12-03 10:36:06 +08:00
}
2024-12-03 20:27:52 +08:00
//struRYDeviceData t_data;
2024-12-03 10:36:06 +08:00
FIELDDES fields[1024];
2024-12-11 13:33:15 +08:00
calcFields(fields);
2024-12-03 20:27:52 +08:00
2024-12-03 10:36:06 +08:00
//判断是否链接单元
int uid = mbt->GetUnitID(0); //默认只接一个设备
if (uid < 0 || uid >= UNIT_NUM) return ((void*)0);
datatypemap highspeedmap;
datatypemap lowspeedmap;
datatypeposmap yxdatamap;
int yccount = GetUnitYCCount(uid);
for (int i = 0; i < yccount; i++) {
//根据遥测参数配置寄存器,获取高频数据寄存器
WORD register_addr = GetUnitYCRegisterAddr(uid, i);
if (GetUnitYCType(uid, i)) {
if (m_datalen2mbaddr_map.find(register_addr) != m_datalen2mbaddr_map.end()) {
highspeedmap.insert(datatypemap::value_type(i, m_datalen2mbaddr_map[register_addr])); //point-配置的序号order-数据文件序号
2024-12-13 16:16:19 +08:00
//fprintf(stderr, "%s register_addr is: %d, point is: %d, and order is: %d\n", config.units[uid].ycs[i].name, register_addr, i, m_datalen2mbaddr_map[register_addr]);
2024-12-03 10:36:06 +08:00
}
} else {
if (m_datalen2mbaddr_map.find(register_addr) != m_datalen2mbaddr_map.end()) {
lowspeedmap.insert(datatypemap::value_type(i, m_datalen2mbaddr_map[register_addr])); //point-配置的序号order-数据文件序号
2024-12-13 16:16:19 +08:00
//fprintf(stderr, "%s register_addr is: %d, point is: %d, and order is: %d\n", config.units[uid].ycs[i].name, register_addr, i, m_datalen2mbaddr_map[register_addr]);
2024-12-03 10:36:06 +08:00
}
}
}
int yxcount = GetUnitYXCount(uid);
for (int i = 0; i < yxcount; i++) {
//根据遥测参数配置寄存器,获取高频数据寄存器
WORD register_addr = GetUnitYXRegisterAddr(uid, i);
BYTE data_pos = GetUnitYXDataPos(uid, i);
2024-12-09 09:41:04 +08:00
//vLog(LOG_DEBUG, "register_addr is: %d, pos is: %d.\n", register_addr, data_pos);
2024-12-03 10:36:06 +08:00
struDataPos pos;
if (m_datalen2mbaddr_map.find(register_addr) != m_datalen2mbaddr_map.end()) {
pos.point = m_datalen2mbaddr_map[register_addr];
pos.pos = data_pos;
yxdatamap.insert(datatypeposmap::value_type(i, pos)); //point-配置的序号order-数据文件序号
2024-12-10 10:14:40 +08:00
//vLog(LOG_DEBUG, "register_addr is: %d, point is: %d, and order is: %d\n", register_addr, i, m_datalen2mbaddr_map[register_addr]);
2024-12-03 10:36:06 +08:00
}
}
//根据实际配置表将
WORD ftpget_retry_count = 0;
BOOLEAN bReadCurrentFile = TRUE; //读取当前文件标识
while (TRUE) {
sleep(1); //每秒执行一次
if (!mbt->m_bFtpRun) break;
2024-12-30 17:20:28 +08:00
mbt->FeedFTPDog();
2024-12-03 10:36:06 +08:00
//ftp获取文件
if (mbt->m_iv == 1) {
//文件目录无效
continue;
}
if (bReadCurrentFile)
{ //读取当前文件
//vLog(LOG_DEBUG, "读取当前文件.\n");
2024-12-05 11:04:47 +08:00
//snprintf(name, sizeof(name), "%s/%d", pathName, mbt->m_currentFileNo);
2024-12-03 10:36:06 +08:00
snprintf(remote, sizeof(remote), "ftp://%s/%s/%d/%d", ipaddress, remotePath, mbt->m_currentDirNo, mbt->m_currentFileNo);
}
else
{ //读取未读的文件
//vLog(LOG_DEBUG, "读取未读的文件.\n");
2024-12-05 11:04:47 +08:00
//snprintf(name, sizeof(name), "%s/%d", pathName, mbt->m_lastReadFileNo);
2024-12-03 10:36:06 +08:00
snprintf(remote, sizeof(remote), "ftp://%s/%s/%d/%d", ipaddress, remotePath, mbt->m_lastReadDirNo, mbt->m_lastReadFileNo);
}
struct memory chunk = {0}; // For storing the downloaded data
//vLog(LOG_DEBUG, "start to read %s\n", remote);
2024-12-05 11:04:47 +08:00
CURLcode result = ftpget(remote, user, password, 3, &chunk);
//vLog(LOG_DEBUG, "%s ftpget result is: %d,%s\n", processName, result, curl_easy_strerror(result));
2024-12-03 10:36:06 +08:00
if (result == CURLE_OK) {
//成功,处理文件
2024-12-04 13:48:25 +08:00
vLog(LOG_DEBUG, "%s get %s to local memory, with name: %s, and password: %s okay, and file length is: %d.\n", processName, remote, user, password, chunk.size);
2024-12-11 13:33:15 +08:00
config.units[uid].value &= ~0x02;
2024-12-03 10:36:06 +08:00
ftpget_retry_count = 0;
2024-12-31 13:45:12 +08:00
if (chunk.size <= (int)(sizeof(struRYDeviceData) * 248)) {
2024-12-10 14:25:46 +08:00
vLog(LOG_DEBUG, "%s PLC文件生成未完成\n", processName);
2024-12-03 10:36:06 +08:00
continue;
}
struRYDeviceData *data = (struRYDeviceData *)chunk.response;
int uid = mbt->GetCurUnitID();
2024-12-30 17:20:28 +08:00
mbt->UnitFeedFTPDog(uid);
2024-12-31 14:10:20 +08:00
int data_count = (chunk.size / sizeof(struRYDeviceData));
for (int i = 0; i < data_count; i++, data++) { //每个文件有250个数据块
2024-12-03 10:36:06 +08:00
QLONG unix_time = filetime_to_unix(data->localtime);
DWORD localtime = ((unix_time / 1000) - 28800L);
DWORD millisec = unix_time % 1000;
unix_time = localtime; unix_time *= 1000;
unix_time += millisec;
2024-12-31 13:45:12 +08:00
#if 0
if (unix_time < 1735488000000 || unix_time >= 1735660800000)
2024-12-31 10:34:45 +08:00
{
unionCP56Time st;
st = Time_ttounionCP56Time(localtime);
vLog(LOG_DEBUG, "unix_time is: %ld, localtime is: %d, and data<%d> time is: %04d/%02d/%02d %02d:%02d:%02d.%03d\n", \
unix_time, localtime,
i, \
st.year + 2000, st.month, st.dayofmonth, \
st.hour, st.minute, st.millisecond/1000, millisec);
}
2024-12-03 10:36:06 +08:00
#endif
//如何将结构化数据传入,且快速获取
Json::Value highspeedvalues;
for (datatypemap::iterator it = highspeedmap.begin(); it != highspeedmap.end(); it++) {
//获取数据
LONG dvalue;
int order = it->first;
int point = it->second;
if (GetYCValue(point, fields, (const char *)data, dvalue)) {
2024-12-13 16:16:19 +08:00
if (adsGetUnitYCIsFloat(uid, point)) {
highspeedvalues[(const char *)config.units[uid].ycs[order].name] = adsGetUnitYCRealFromValue(uid, point, dvalue);
2024-12-03 10:36:06 +08:00
} else {
highspeedvalues[(const char *)config.units[uid].ycs[order].name] = dvalue;
}
} else {
highspeedvalues[(const char *)config.units[uid].ycs[order].name] = 0.0f;
}
}
#ifndef USE_NOPOLL_WEBSOCKET
publishhistoryHighSpeedData(uid, unix_time, highspeedvalues);
#else
publishhistoryHighSpeedData(g_conn, uid, unix_time, highspeedvalues);
#endif
if (i % 25 == 0) { //40ms一个值每25次位1s
Json::Value lowspeedvalues;
for (datatypemap::iterator it = lowspeedmap.begin(); it != lowspeedmap.end(); it++) {
//获取数据
LONG dvalue;
int order = it->first;
int point = it->second;
if (GetYCValue(point, fields, (const char *)data, dvalue)) {
2024-12-13 16:16:19 +08:00
if (adsGetUnitYCIsFloat(uid, point)) {
lowspeedvalues[(const char *)config.units[uid].ycs[order].name] = adsGetUnitYCRealFromValue(uid, point, dvalue);
2024-12-03 10:36:06 +08:00
} else {
lowspeedvalues[(const char *)config.units[uid].ycs[order].name] = dvalue;
}
} else {
lowspeedvalues[(const char *)config.units[uid].ycs[order].name] = 0.0f;
}
}
for (datatypeposmap::iterator it = yxdatamap.begin(); it != yxdatamap.end(); it++) {
BOOLEAN bvalue;
int order = it->first;
int point = it->second.point;
int pos = it->second.pos;
if (GetYXValue(point, fields, (const char *)data, pos, bvalue)) {
lowspeedvalues[(const char *)config.units[uid].yxs[order].name] = (int)bvalue;
} else {
lowspeedvalues[(const char *)config.units[uid].yxs[order].name] = 0;
}
}
#ifndef USE_NOPOLL_WEBSOCKET
publishhistoryLowSpeedData(uid, unix_time, lowspeedvalues);
#else
publishhistoryLowSpeedData(g_conn, uid, unix_time, lowspeedvalues);
#endif
}
}
if (chunk.response) free(chunk.response);
if (bReadCurrentFile) { //读取的是当前文件
mbt->m_lastFileNo = mbt->m_currentFileNo;
mbt->m_currentFileNo++;
if ((mbt->m_currentFileNo - mbt->m_currentDirStartFileNo) % 1000 == 0) {
//一个文件夹最多存放1000个文件, mbt->m_currentFileNo = 0;
mbt->m_currentDirNo++;
mbt->m_currentDirStartFileNo = mbt->m_currentFileNo;
}
} else { //读取的是未读历史文件
mbt->m_lastReadFileNo++;
if ((mbt->m_lastReadFileNo - mbt->m_lastReadDirStartFileNo) % 1000 == 0) {
//一个文件夹最多存放1000个文件, mbt->m_currentFileNo = 0;
mbt->m_lastReadDirNo++;
}
if (mbt->m_curStartDirNo <= mbt->m_lastReadDirNo && mbt->m_curStartFileNo <= mbt->m_lastReadFileNo) {
2024-12-04 13:48:25 +08:00
vLog(LOG_DEBUG, "%s a已读取完成所有未读的文件。\n", processName);
2024-12-03 10:36:06 +08:00
mbt->m_bHaveUnReadFile = FALSE;
}
}
bReadCurrentFile = TRUE;
} else if (result == CURLE_REMOTE_FILE_NOT_FOUND) {
//文件不存在尝试60次1分钟正常情况下PLC10s生成一个文件
//vLog(LOG_DEBUG, "文件不存在, ftpget_retry_count is: %d\n", ftpget_retry_count);
ftpget_retry_count++;
if (ftpget_retry_count >= 60) {
//重新通过modbus程序获取文件夹和最新文件信息
mbt->m_iv = 0;
mbt->m_currentDirNo = -1;
mbt->m_currentFileNo = -1;
2024-12-11 13:33:15 +08:00
config.units[uid].value |= 0x02; //
2024-12-03 10:36:06 +08:00
}
//此处空闲读取未读的文件
if (mbt->m_bHaveUnReadFile) {
bReadCurrentFile = FALSE;
}
} else if (result == CURLE_REMOTE_ACCESS_DENIED) {
2024-12-04 13:48:25 +08:00
vLog(LOG_DEBUG, "%s b已读取完成所有未读的文件。\n", processName);
2024-12-03 10:36:06 +08:00
mbt->m_bHaveUnReadFile = FALSE;
bReadCurrentFile = TRUE;
}
}
pthread_exit(0);
return ((void*)0);
}
CHostADSBFProcess::CHostADSBFProcess()
{
2024-12-04 08:48:18 +08:00
m_adsDatas[0].inuse = FALSE;
m_adsDatas[1].inuse = FALSE;
m_adsDatas[2].inuse = FALSE;
m_adsDatas[3].inuse = FALSE;
2024-12-04 13:48:25 +08:00
m_adsDatas[0].adsDataMemAddr = 65535;
m_adsDatas[1].adsDataMemAddr = 65535;
m_adsDatas[2].adsDataMemAddr = 65535;
m_adsDatas[3].adsDataMemAddr = 65535;
2024-12-04 08:48:18 +08:00
2024-12-03 10:36:06 +08:00
m_localIp = "192.168.0.1"; //本机IP地址
m_localNetId = "192.168.0.1.1.1"; //本机IP地址
m_remoteIp = "192.168.0.2"; //PLC设备ip地址
m_remoteNetId = "192.168.0.2.1.1";
//websocket接口
2024-12-11 16:30:53 +08:00
m_cpid = 0;
2024-12-03 10:36:06 +08:00
//目录无效
m_iv = 1;
m_currentDirNo = -1; //当前目录编号
m_currentFileNo = -1; //当前文件编号
m_lastDirNo = -1; //上一目录编号
m_lastFileNo = -1; //上一文件编号
m_bFtpRun = FALSE;
}
CHostADSBFProcess::~CHostADSBFProcess()
{
if (m_bHaveFTP)
{
m_bFtpRun = FALSE;
vLog(LOG_DEBUG, "保存本协议读取到的那个目录和文件\n");
char fileName[260];
snprintf(fileName, sizeof(fileName), "hostads_%d.mem", GetCurID());
FILE *pf = fopen(fileName, "w+");
if (pf)
{
fwrite(&m_currentDirNo, sizeof(LONG), 1, pf);
fwrite(&m_currentFileNo, sizeof(LONG), 1, pf);
fwrite(&m_currentDirStartFileNo, sizeof(LONG), 1, pf);
fclose(pf);
}
2025-01-10 09:12:01 +08:00
2025-01-16 13:23:42 +08:00
if (m_cpid > 0)
{
vLog(LOG_DEBUG, "waiting for child thread [%s] destroy.\n", (m_cpidName[0] != '\0') ? m_cpidName : "unknow");
pthread_join(m_cpid, NULL);
vLog(LOG_DEBUG, "child protocol thread [%s] is destroyed.\n", (m_cpidName[0] != '\0') ? m_cpidName : "unknow");
}
}
if (m_turbine)
{
delete m_turbine;
m_turbine = NULL;
2024-12-03 10:36:06 +08:00
}
}
BOOLEAN CHostADSBFProcess::calc(void)
{
int n, uid;
uid = GetCurUnitID();
if (uid < 0 || uid >= UNIT_NUM) return FALSE;
2024-12-04 08:48:18 +08:00
m_adsDatas[0].inuse = FALSE;
m_adsDatas[1].inuse = FALSE;
m_adsDatas[2].inuse = FALSE;
m_adsDatas[3].inuse = FALSE;
2024-12-04 13:48:25 +08:00
m_adsDatas[0].adsDataMemAddr = 65535;
m_adsDatas[1].adsDataMemAddr = 65535;
m_adsDatas[2].adsDataMemAddr = 65535;
m_adsDatas[3].adsDataMemAddr = 65535;
2024-12-03 10:36:06 +08:00
int yccount, ymcount, yxcount;
yccount = GetUnitYCCount(uid);
ymcount = GetUnitYMCount(uid);
yxcount = GetUnitYXCount(uid);
2024-12-05 14:03:07 +08:00
//vLog(LOG_DEBUG, "unit %d, yc count is: %d, and yx count is: %d\n", uid, yccount, yxcount);
2024-12-03 10:36:06 +08:00
BYTE params[MAX_UNIT_POINT_PARAM_SIZE];
BYTE* pData = params;
WORD registerAddr = 0;
BYTE value_type = 0;
for (n = 0; n < yccount; n++)
{
pData = GetUnitYCParamByPoint(uid, n);
if (pData[4] == 1) continue;
registerAddr = MAKEWORD(pData[0], pData[1]);
2025-01-13 10:13:48 +08:00
if (registerAddr <= 0) continue;
2024-12-04 08:48:18 +08:00
if (registerAddr < DATA_BLOCK_BOUNDARY)
{
if (!m_adsDatas[0].inuse) m_adsDatas[0].inuse = TRUE;
if (registerAddr < m_adsDatas[0].adsDataMemAddr) m_adsDatas[0].adsDataMemAddr = registerAddr;
if (m_adsDatas[0].adsDataBlocks.find(registerAddr) == m_adsDatas[0].adsDataBlocks.end()) {
m_adsDatas[0].adsDataBlocks.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YC));
} else {
2024-12-05 14:03:07 +08:00
//vLog(LOG_WARN, "遥测测点配置了相同的寄存器地址\n");
2024-12-04 08:48:18 +08:00
}
}
else
{
if (!m_adsDatas[1].inuse) m_adsDatas[1].inuse = TRUE;
if (registerAddr < m_adsDatas[1].adsDataMemAddr) m_adsDatas[1].adsDataMemAddr = registerAddr;
if (m_adsDatas[1].adsDataBlocks.find(registerAddr) == m_adsDatas[1].adsDataBlocks.end()) {
m_adsDatas[1].adsDataBlocks.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YC));
} else {
2024-12-05 14:03:07 +08:00
//vLog(LOG_WARN, "遥测测点配置了相同的寄存器地址\n");
2024-12-04 08:48:18 +08:00
}
2024-12-03 10:36:06 +08:00
}
}
for (n = 0; n < ymcount; n++)
{
pData = GetUnitYMParamByPoint(uid, n);
if (pData[4] == 1) continue;
registerAddr = MAKEWORD(pData[0], pData[1]);
2025-01-13 10:13:48 +08:00
if (registerAddr <= 0) continue;
2024-12-04 08:48:18 +08:00
if (registerAddr < DATA_BLOCK_BOUNDARY)
{
if (!m_adsDatas[0].inuse) m_adsDatas[0].inuse = TRUE;
if (registerAddr < m_adsDatas[0].adsDataMemAddr) m_adsDatas[0].adsDataMemAddr = registerAddr;
if (m_adsDatas[0].adsDataBlocks.find(registerAddr) == m_adsDatas[0].adsDataBlocks.end()) {
m_adsDatas[0].adsDataBlocks.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YM));
} else {
2024-12-05 14:03:07 +08:00
//vLog(LOG_WARN, "遥脉测点配置了相同的寄存器地址\n");
2024-12-04 08:48:18 +08:00
}
}
else
{
if (!m_adsDatas[1].inuse) m_adsDatas[1].inuse = TRUE;
if (registerAddr < m_adsDatas[1].adsDataMemAddr) m_adsDatas[1].adsDataMemAddr = registerAddr;
if (m_adsDatas[1].adsDataBlocks.find(registerAddr) == m_adsDatas[1].adsDataBlocks.end()) {
m_adsDatas[1].adsDataBlocks.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YM));
} else {
2024-12-05 14:03:07 +08:00
//vLog(LOG_WARN, "遥脉测点配置了相同的寄存器地址\n");
2024-12-04 08:48:18 +08:00
}
2024-12-03 10:36:06 +08:00
}
}
for (n = 0; n < yxcount; n++)
{
pData = GetUnitYXParamByPoint(uid, n);
if (pData[4] == 1) continue;
registerAddr = MAKEWORD(pData[0], pData[1]);
2025-01-13 10:13:48 +08:00
if (registerAddr <= 0) continue;
2024-12-03 10:36:06 +08:00
value_type = pData[2];
2024-12-04 08:48:18 +08:00
if (registerAddr < DATA_BLOCK_BOUNDARY)
{
if (!m_adsDatas[0].inuse) m_adsDatas[0].inuse = TRUE;
if (registerAddr < m_adsDatas[0].adsDataMemAddr) m_adsDatas[0].adsDataMemAddr = registerAddr;
if (m_adsDatas[0].adsDataBlocks.find(registerAddr) == m_adsDatas[0].adsDataBlocks.end()) {
m_adsDatas[0].adsDataBlocks.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YX_BYTE + value_type));
}
}
else
{
if (!m_adsDatas[1].inuse) m_adsDatas[1].inuse = TRUE;
if (registerAddr < m_adsDatas[1].adsDataMemAddr) m_adsDatas[1].adsDataMemAddr = registerAddr;
if (m_adsDatas[1].adsDataBlocks.find(registerAddr) == m_adsDatas[1].adsDataBlocks.end()) {
m_adsDatas[1].adsDataBlocks.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YX_BYTE + value_type));
}
2024-12-03 10:36:06 +08:00
}
}
return TRUE;
}
BOOLEAN CHostADSBFProcess::OnPreCreate(int id)
{
if (!CProcess::OnPreCreate(id)) return FALSE;
if (!GetOption(&m_nOptions, sizeof(m_nOptions)))
{
vLog(LOG_DEBUG, "润阳ADS读取配置错误。");
return FALSE;
}
2024-12-10 10:14:40 +08:00
2024-12-03 20:27:52 +08:00
char ipaddress[32];
2024-12-04 16:02:58 +08:00
2024-12-10 10:14:40 +08:00
m_pidName = std::string(GetCurProcessName());
2024-12-04 16:02:58 +08:00
//本机IP和netid
2024-12-03 20:27:52 +08:00
memset(ipaddress, '\0', sizeof(ipaddress));
inet_ntop(AF_INET, &m_nOptions.net.bind_addr, ipaddress, 16);
m_localIp = std::string(ipaddress);
m_localNetId = m_localIp + std::string(".1.1");
2024-12-04 16:02:58 +08:00
//目标IP和netid
2024-12-03 20:27:52 +08:00
memset(ipaddress, '\0', sizeof(ipaddress));
inet_ntop(AF_INET, &m_nOptions.net.target_addr, ipaddress, 16);
m_remoteIp = std::string(ipaddress);
m_remoteNetId = m_remoteIp + std::string(".1.1");
2024-12-04 16:02:58 +08:00
//目标端口
m_remotePort = m_nOptions.net.target_port;
2024-12-03 10:36:06 +08:00
2024-12-24 12:14:20 +08:00
m_adsUser = std::string(m_nOptions.user);
m_adsPassword = std::string(m_nOptions.password);
2024-12-24 11:37:05 +08:00
2024-12-03 10:36:06 +08:00
m_bHaveFTP = m_nOptions.bHaveFTP;
2024-12-30 17:20:28 +08:00
//需要给单元添加一个是否有ftp数据的标识
int uid = GetCurUnitID();
2025-01-10 09:12:01 +08:00
//if (uid < 0 || uid >= UNIT_NUM) return FALSE;
2024-12-30 17:20:28 +08:00
if (m_bHaveFTP) {
2025-01-10 09:12:01 +08:00
if (uid >= 0 && uid < UNIT_NUM)
{
config.units[uid].state |= 0x20; //存在ftp标识
}
2024-12-30 17:20:28 +08:00
config.processes[id].state |= 0x20;
}
2024-12-03 10:36:06 +08:00
calc();
2025-01-10 09:12:01 +08:00
vLog(LOG_DEBUG, "%s local ip is: %s, netid is: %s, remote ip is: %s, and netid is: %s\n", m_pidName.c_str(), m_localIp.c_str(), m_localNetId.c_str(), m_remoteIp.c_str(), m_remoteNetId.c_str());
2024-12-04 16:02:58 +08:00
2024-12-10 10:14:40 +08:00
m_turbine = NULL;
2024-12-11 10:30:30 +08:00
m_bRouteAdded = FALSE;
2024-12-26 10:08:40 +08:00
m_connect_count = 0;
2024-12-11 20:25:29 +08:00
m_apdu_t0_begin = 10;
2024-12-10 14:25:46 +08:00
SetLocalAmsNetId(AmsNetId(m_localNetId));
2024-12-30 17:20:28 +08:00
2024-12-03 10:36:06 +08:00
if (m_bHaveFTP)
{
snprintf(m_user, sizeof(m_user), "%s", m_nOptions.ftp.user);
snprintf(m_password, sizeof(m_password), "%s", m_nOptions.ftp.password);
snprintf(m_remotePath, sizeof(m_remotePath), "%s", m_nOptions.ftp.remotePath);
snprintf(m_localPath, sizeof(m_localPath), "%s", m_nOptions.ftp.localPath);
//读取文件
m_lastReadDirNo = 1;
m_lastReadFileNo = 1;
m_lastReadDirStartFileNo = 1;
m_bHaveUnReadFile = TRUE;
char fileName[260];
snprintf(fileName, sizeof(fileName), "hostads_%d.mem", GetCurID());
FILE *pf = fopen(fileName, "rb");
if (pf)
{
fread(&m_lastReadDirNo, sizeof(LONG), 1, pf);
fread(&m_lastReadFileNo, sizeof(LONG), 1, pf);
fread(&m_lastReadDirStartFileNo, sizeof(LONG), 1, pf);
fclose(pf);
}
//启动后创建ftp线程
2024-12-11 16:30:53 +08:00
if (m_cpid <= 0) {
2024-12-03 10:36:06 +08:00
m_bFtpRun = TRUE;
2024-12-09 09:41:04 +08:00
vLog(LOG_DEBUG, "ads create a ftp thread.\n");
2024-12-03 10:36:06 +08:00
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, MEMERY_1M);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
2025-01-16 13:23:42 +08:00
if (pthread_create(&m_cpid, &attr, ryftp_process, this) < 0)
{
2024-12-10 14:25:46 +08:00
vLog(LOG_ERROR, "ads create ryftp_process error(%d,%s).\n", errno, strerror(errno));
2024-12-03 10:36:06 +08:00
return TRUE;
}
2025-01-10 09:12:01 +08:00
snprintf(m_cpidName, 16, "%s_ftp", m_pidName.c_str());
pthread_setname_np(m_cpid, m_cpidName);
2024-12-03 10:36:06 +08:00
pthread_attr_destroy(&attr);
}
}
return TRUE;
}
BOOLEAN CHostADSBFProcess::Run(void)
{
if (!CProcess::Run()) return FALSE;
return TRUE;
}
BOOLEAN CHostADSBFProcess::OnTimer(void)
{
if (!CProcess::OnTimer()) return FALSE;
BOOLEAN sec_changed = FALSE;
if (last_sec != system32.timers)
{
last_sec = system32.timers;
sec_changed = TRUE;
}
2024-12-30 17:20:28 +08:00
2024-12-27 13:30:46 +08:00
FeedDog();
2024-12-03 10:36:06 +08:00
if (sec_changed)
{
2024-12-30 17:20:28 +08:00
//if (GetCurID() == 52) fprintf(stderr, "here second changed m_turbine is: %lu\n", m_turbine);
2024-12-11 20:25:29 +08:00
if (m_turbine == NULL)
{
if ((m_apdu_t0_begin + 20) < system32.timers)
2024-12-10 21:31:56 +08:00
{
2024-12-30 17:20:28 +08:00
//if (GetCurID() == 52) fprintf(stderr, "here apdu t0 timeout, start to connect\n");
2024-12-11 20:25:29 +08:00
m_apdu_t0_begin = system32.timers;
//先添加一条路由
if (m_bRouteAdded == FALSE)
{
2024-12-30 17:20:28 +08:00
//if (GetCurID() == 52) fprintf(stderr, "here route not add, start to add a route: %s to %s\n", m_localIp.c_str(), m_remoteIp.c_str());
2024-12-24 12:14:20 +08:00
long ret = AddRemoteRoute(m_remoteIp, AmsNetId(m_localNetId), m_localIp, std::string("isoftstone"), m_adsUser, m_adsPassword);
2024-12-30 17:20:28 +08:00
//if (GetCurID() == 52) fprintf(stderr, "here add route return value is: %d\n", ret);
2024-12-24 12:14:20 +08:00
vLog(LOG_DEBUG, "%s add route(%s to %s) with remote user name: %s, and remote password: %s, return value is: %d\n", m_pidName.c_str(), m_localIp.c_str(), m_remoteIp.c_str(), m_adsUser.c_str(), m_adsPassword.c_str(), ret);
2024-12-11 20:25:29 +08:00
if (ret != 0) return TRUE;
}
//添加成功
2024-12-30 17:20:28 +08:00
//if (GetCurID() == 52) fprintf(stderr, "here start to connect(%s:%d)\n", m_remoteIp.c_str(), m_remotePort);
2024-12-11 20:25:29 +08:00
vLog(LOG_DEBUG, "%s start to connect(%s:%d)\n", m_pidName.c_str(), m_remoteIp.c_str(), m_remotePort);
m_turbine = new AdsDevice{m_remoteIp, AmsNetId(m_remoteNetId), m_remotePort};
2024-12-30 17:20:28 +08:00
//if (GetCurID() == 52) fprintf(stderr, "here start to get device state\n");
2024-12-11 20:25:29 +08:00
const auto state = m_turbine->GetState();
if ((uint16_t)state.ads >= ADSSTATE::ADSSTATE_MAXSTATES || (uint16_t)state.device >= ADSSTATE::ADSSTATE_MAXSTATES)
{
2024-12-15 20:52:10 +08:00
m_bRouteAdded = FALSE;
2024-12-11 20:25:29 +08:00
vLog(LOG_DEBUG, "%s read device state error.\n", m_pidName.c_str());
delete m_turbine;
m_turbine = NULL;
2024-12-26 10:10:07 +08:00
return TRUE;
2024-12-11 20:25:29 +08:00
}
2024-12-26 10:10:07 +08:00
m_bRouteAdded = TRUE;
m_connect_count = 0;
2024-12-10 21:31:56 +08:00
}
2024-12-10 14:25:46 +08:00
return TRUE;
}
2024-12-16 10:53:31 +08:00
if (!m_turbine->IsConnected())
{
vLog(LOG_DEBUG, "%s device not connected.\n", m_pidName.c_str());
2024-12-26 10:08:40 +08:00
m_connect_count++;
2024-12-30 17:20:28 +08:00
//if (m_connect_count >= 10)
2024-12-26 10:08:40 +08:00
{
m_connect_count = 10;
m_bRouteAdded = FALSE;
}
2024-12-16 15:47:48 +08:00
delete m_turbine;
m_turbine = NULL;
2024-12-16 10:53:31 +08:00
return TRUE;
}
2024-12-11 20:25:29 +08:00
m_apdu_t0_begin = system32.timers;
if (m_bHaveFTP)
{ //启动时读取一次,后面自己维护序号
if ((m_currentDirNo == -1) && (m_currentFileNo == -1))
{ //当前文件和目录都为-1程序第一次启动。需要获取ftp目录及文件ID
readFileID();
2024-12-03 10:36:06 +08:00
}
2024-12-11 20:25:29 +08:00
}
readRealData();
2024-12-03 10:36:06 +08:00
}
return TRUE;
}
BOOLEAN CHostADSBFProcess::readFileID()
{
int uid = GetCurUnitID();
if (uid < 0 || uid >= UNIT_NUM) return TRUE;
2024-12-10 10:14:40 +08:00
vLog(LOG_DEBUG, "%s here read file info\n", m_pidName.c_str());
2024-12-26 19:59:34 +08:00
#if 0
2024-12-05 11:04:47 +08:00
AdsVariable <WORD> wPathInfoInvalid {*m_turbine, ".gwPathInfoInvalid"};
//vLog(LOG_DEBUG, "Read back with first value %d\n", (WORD)wPathInfoInvalid);
AdsVariable <DWORD> wCurrentFolderNo {*m_turbine, ".gwCurrentFolderNo"};
//vLog(LOG_DEBUG, "Read back with first value %d\n", (DWORD)wCurrentFolderNo);
AdsVariable <DWORD> wCurrentFileNo {*m_turbine, ".gwCurrentFileNo"};
//vLog(LOG_DEBUG, "Read back with first value %d\n", (DWORD)wCurrentFileNo);
AdsVariable <DWORD> wFirstFileNoInFolder {*m_turbine, ".gwFirstFileNoInFolder"};
//vLog(LOG_DEBUG, "Read back with first value %d\n", (DWORD)wFirstFileNoInFolder);
AdsVariable <DWORD> wFileCountInFolder {*m_turbine, ".gwFileCountInFolder"};
//vLog(LOG_DEBUG, "Read back with first value %d\n", (DWORD)wFileCountInFolder);
AdsVariable <DWORD> wFirstFolderNoRecoverable {*m_turbine, ".gwFirstFolderNoRecoverable"};
//vLog(LOG_DEBUG, "Read back with first value %d\n", (DWORD)wFirstFolderNoRecoverable);
AdsVariable <DWORD> wFirstFileNoRecoverable {*m_turbine, ".gwFirstFileNoRecoverable"};
//vLog(LOG_DEBUG, "Read back with first value %d\n", (DWORD)wFirstFileNoRecoverable);
2024-12-26 19:59:34 +08:00
#else
2025-01-13 10:20:13 +08:00
WORD wPathInfoInvalid = 1;
2024-12-26 19:59:34 +08:00
myAdsVariable myPathInfoInvalid {*m_turbine, ".gwPathInfoInvalid"};
if (!myPathInfoInvalid.Read(2, &wPathInfoInvalid))
{
2025-01-13 10:13:48 +08:00
vLog(LOG_ERROR, "Read .gwPathInfoInvalid error.\n");
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
return TRUE;
}
DWORD wCurrentFolderNo;
myAdsVariable myCurrentFolderNo {*m_turbine, ".gwCurrentFolderNo"};
if (!myCurrentFolderNo.Read(4, &wCurrentFolderNo))
{
vLog(LOG_ERROR, "Read .gwCurrentFolderNo error.\n");
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
return TRUE;
}
DWORD wCurrentFileNo;
myAdsVariable myCurrentFileNo {*m_turbine, ".gwCurrentFileNo"};
if (!myCurrentFileNo.Read(4, &wCurrentFileNo))
{
vLog(LOG_ERROR, "Read .gwCurrentFileNo error.\n");
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
return TRUE;
}
DWORD wFirstFileNoInFolder;
myAdsVariable myFirstFileNoInFolder {*m_turbine, ".gwFirstFileNoInFolder"};
if (!myFirstFileNoInFolder.Read(4, &wFirstFileNoInFolder))
{
vLog(LOG_ERROR, "Read .gwFirstFileNoInFolder error.\n");
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
return TRUE;
}
DWORD wFileCountInFolder;
myAdsVariable myFileCountInFolder {*m_turbine, ".gwFileCountInFolder"};
if (!myFileCountInFolder.Read(4, &wFileCountInFolder))
{
vLog(LOG_ERROR, "Read .gwFileCountInFolder error.\n");
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
return TRUE;
}
DWORD wFirstFolderNoRecoverable;
myAdsVariable myFirstFolderNoRecoverable {*m_turbine, ".gwFirstFolderNoRecoverable"};
if (!myFirstFolderNoRecoverable.Read(4, &wFirstFolderNoRecoverable))
{
vLog(LOG_ERROR, "Read .gwFirstFolderNoRecoverable error.\n");
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
return TRUE;
}
DWORD wFirstFileNoRecoverable;
myAdsVariable myse {*m_turbine, ".gwFirstFileNoRecoverable"};
if (!myFirstFolderNoRecoverable.Read(4, &wFirstFileNoRecoverable))
{
vLog(LOG_ERROR, "Read .gwFirstFileNoRecoverable error.\n");
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
return TRUE;
}
#endif
2025-01-13 10:20:13 +08:00
m_iv = (int)wPathInfoInvalid;
if (m_iv == 1) {
2024-12-04 13:48:25 +08:00
vLog(LOG_DEBUG, "路径信息无效\n");
2025-01-13 10:18:26 +08:00
return TRUE;
2024-12-04 13:48:25 +08:00
}
//当前文件夹路径名
2024-12-05 11:04:47 +08:00
m_currentDirNo = (DWORD)wCurrentFolderNo;
2024-12-04 13:48:25 +08:00
//当前文件夹下最后新文件
2024-12-05 11:04:47 +08:00
m_currentFileNo = (DWORD)wCurrentFileNo;
2024-12-04 13:48:25 +08:00
//当前目录文件开始编号
2024-12-05 11:04:47 +08:00
m_currentDirStartFileNo = (DWORD)wFirstFileNoInFolder;
2024-12-04 13:48:25 +08:00
m_curStartDirNo = m_currentDirNo; //当前开始目录
m_curStartFileNo = m_currentFileNo; //当前开始文件
//判断是否有要读取的文件
if (m_curStartDirNo <= m_lastReadDirNo && m_curStartFileNo <= m_lastReadFileNo)
{
2024-12-10 14:25:46 +08:00
vLog(LOG_DEBUG, "%s 不存在未读的文件。\n", m_pidName.c_str());
2024-12-04 13:48:25 +08:00
m_bHaveUnReadFile = FALSE;
}
else
{
m_bHaveUnReadFile = TRUE;
int dir_count = m_curStartDirNo - m_lastReadDirNo + 1;
int file_count = m_curStartFileNo - m_lastReadFileNo;
2024-12-10 10:14:40 +08:00
vLog(LOG_DEBUG, "%s 总共有%d个目录的%d个文件未读取。\n", m_pidName.c_str(), dir_count, file_count);
2024-12-04 13:48:25 +08:00
}
2024-12-10 10:14:40 +08:00
vLog(LOG_DEBUG, "%s 最新文件夹编号: %ld, 最新文件名编号: %ld: 最新文件夹中第一个文件的编号: %ld\n", m_pidName.c_str(), m_currentDirNo, m_currentFileNo, m_currentDirStartFileNo);
2024-12-04 13:48:25 +08:00
2024-12-03 10:36:06 +08:00
return TRUE;
}
BOOLEAN CHostADSBFProcess::readRealData()
{
int uid = GetCurUnitID();
if (uid < 0 || uid >= UNIT_NUM) return TRUE;
2024-12-04 08:48:18 +08:00
for (int k = 0; k < 4; k++)
{
if (!m_adsDatas[k].inuse) continue;
WORD m_adsOverviewDataMemAddr = m_adsDatas[k].adsDataMemAddr;
register2typemap m_register2type_map = m_adsDatas[k].adsDataBlocks;
2024-12-03 10:36:06 +08:00
2024-12-04 08:48:18 +08:00
BYTE buffer[1024];
BYTE *pData = buffer;
2024-12-03 10:36:06 +08:00
2024-12-04 08:48:18 +08:00
BYTE params[MAX_UNIT_POINT_PARAM_SIZE];
BYTE* pParam = params;
2024-12-03 10:36:06 +08:00
2024-12-26 19:59:34 +08:00
// AdsVariable<std::array<BYTE, MAX_BLOCKF_SIZE>> turbineData {*m_turbine, ADSIGRP_IOIMAGE_RWOB, m_adsOverviewDataMemAddr};
// pData = ((std::array<BYTE, MAX_BLOCKF_SIZE>)turbineData).data();
myAdsVariable turbineData {*m_turbine, ADSIGRP_IOIMAGE_RWOB, m_adsOverviewDataMemAddr};
if (!turbineData.Read(1024, buffer))
2024-12-25 10:59:46 +08:00
{
2024-12-25 11:00:13 +08:00
vLog(LOG_ERROR, "%s Read data error\n", m_pidName.c_str());
2024-12-30 17:20:28 +08:00
m_bRouteAdded = FALSE;
2024-12-26 19:59:34 +08:00
delete m_turbine;
m_turbine = NULL;
2024-12-25 10:59:46 +08:00
return TRUE;
}
2024-12-05 11:04:47 +08:00
2024-12-04 08:48:18 +08:00
WORD registerAddr = m_adsOverviewDataMemAddr;
2024-12-03 10:36:06 +08:00
2024-12-04 08:48:18 +08:00
float f_val;
DWORD dw[2]; //双精度转换中间变量
double d_val;
DWORD bin_value;
DWORD nValue = 0;
int point;
2024-12-11 13:33:15 +08:00
UnitFeedDog(uid);
2024-12-04 08:48:18 +08:00
for (int i = 0; i < MAX_BLOCKF_SIZE;)
2024-12-03 10:36:06 +08:00
{
2024-12-16 12:35:13 +08:00
//vLog(LOG_DEBUG, "registerAddr is: %d\n", registerAddr);
2024-12-04 08:48:18 +08:00
if (m_register2type_map.find(registerAddr) != m_register2type_map.end())
{
int type = m_register2type_map[registerAddr];
if (type == REGISTER_DATA_TYPE_YC)
{ //遥测
point = GetUnitYCPointByParam(uid, (BYTE *)&registerAddr, 2);
if (point >= 0)
2024-12-03 10:36:06 +08:00
{
2024-12-04 08:48:18 +08:00
pParam = GetUnitYCParamByPoint(uid, point);
BYTE value_type = pParam[2]; //数据类型
BYTE sign_mark = pParam[3];
//vLog(LOG_DEBUG, "value type is: %d, ", value_type);
//32位测量值
if (0 == value_type)
{ //浮点数,高位在第一个寄存器
nValue = (DWORD)(pData[1] << 24 | pData[0] << 16 | pData[3] << 8 | pData[2]);
memcpy(&f_val, &nValue, 4);
SetUnitYC(uid, point, f_val);
registerAddr += 4; i += 4; pData += 4;
}
else if (1 == value_type)
{
nValue = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]);
memcpy(&f_val, &nValue, 4);
SetUnitYC(uid, point, f_val);
registerAddr += 4; i += 4; pData += 4;
}
//16位归一化值
else if (2 == value_type)
{
if (sign_mark == 0) nValue = (DWORD)(WORD)((pData[1] << 8) | pData[0]);
else nValue = (DWORD)(short)((pData[1] << 8) | pData[0]);
SetUnitYC(uid, point, (LONG)nValue);
//vLog(LOG_DEBUG, "value is: %d \n", nValue);
registerAddr += 2; i += 2; pData += 2;
}
else if (3 == value_type)
{ //归一化值,高位在第一个寄存器
nValue = (DWORD)(pData[1] << 24 | pData[0] << 16 | pData[3] << 8 | pData[2]);
SetUnitYC(uid, point, (LONG)nValue);
registerAddr += 2; i += 2; pData += 2;
}
else if (4 == value_type)
{ //归一化值,高位在第二个寄存器
nValue = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]);
SetUnitYC(uid, point, (LONG)nValue);
registerAddr += 4; i += 4; pData += 4;
//vLog(LOG_DEBUG, "value is: %d\n", nValue);
}
else if (5 == value_type)
{ //小端系统浮点值
nValue = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]);
memcpy(&f_val, &nValue, 4);
SetUnitYC(uid, point, f_val);
//vLog(LOG_DEBUG, "value is: %f\n", f_val);
registerAddr += 4; i += 4; pData += 4;
}
else if (6 == value_type)
{ //32位bcd数据高位在第一个寄存器
nValue = (DWORD)((pData[1] << 24) | (pData[0] << 16) | (pData[3] << 8) | pData[2]);
bin_value = bcd_to_int((const BYTE*)&nValue, sizeof(DWORD));
SetUnitYC(uid, point, (LONG)bin_value);
registerAddr += 4; i += 4; pData += 4;
}
else if (7 == value_type)
{ //32位bcd数据高位在第二个寄存器
nValue = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
bin_value = bcd_to_int((const BYTE*)&nValue, sizeof(DWORD));
SetUnitYC(uid, point, (LONG)bin_value);
registerAddr += 4; i += 4; pData += 4;
}
else if (8 == value_type)
{ //16位BCD
if (sign_mark == 0) nValue = (DWORD)(WORD)((pData[1] << 8) | pData[0]);
else nValue = (DWORD)(short)((pData[1] << 8) | pData[0]);
nValue = bcd_to_int((const BYTE*)&nValue, sizeof(WORD));
SetUnitYC(uid, point, (LONG)nValue);
registerAddr += 2; i += 2; pData += 2;
//vLog(LOG_DEBUG, "value is: %d\n", nValue);
}
else if (9 == value_type)
{ //
if (sign_mark == 0) nValue = (DWORD)(BYTE)(pData[0]);
else nValue = (DWORD)(short)(pData[0]);
SetUnitYC(uid, point, (LONG)nValue);
registerAddr++; i++; pData++;
//vLog(LOG_DEBUG, "value is: %d\n", nValue);
}
else
{
registerAddr++; i++; pData++;
}
2024-12-03 10:36:06 +08:00
}
2024-12-04 08:48:18 +08:00
}
else if (type == REGISTER_DATA_TYPE_YM)
{ //遥脉
point = GetUnitYMPointByParam(uid, (BYTE *)&registerAddr, 2);
if (point >= 0)
2024-12-03 10:36:06 +08:00
{
2024-12-04 08:48:18 +08:00
pParam = GetUnitYMParamByPoint(uid, point);
BYTE value_type = pParam[2]; //数据类型
if (0 == value_type)
{ //16位无符号整型
nValue = (pData[1] << 8) | pData[0];
SetUnitYM(uid, point, nValue);
registerAddr += 2; i += 2; pData += 2;
}
else if (1 == value_type)
{ //32位无符号整型高位在第一个寄存器
nValue = (DWORD)((pData[1] << 24) | (pData[0] << 16) | (pData[3] << 8) | pData[2]);
SetUnitYM(uid, point, nValue);
registerAddr += 4; i += 4; pData += 4;
}
else if (2 == value_type)
{ //32位整型高位在第一个寄存器
nValue = (DWORD)((pData[1] << 24) | (pData[0] << 16) | (pData[3] << 8) | pData[2]);
SetUnitYM(uid, point, nValue);
registerAddr += 4; i += 4; pData += 4;
}
else if (3 == value_type)
{ //32位无符号整型高位在第二个寄存器
nValue = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
SetUnitYM(uid, point, nValue);
registerAddr += 4; i += 4; pData += 4;
}
else if (4 == value_type)
{ //32位整型高位在第二个寄存器
nValue = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
SetUnitYM(uid, point, nValue);
registerAddr += 4; i += 4; pData += 4;
}
else if (5 == value_type)
{ //32位浮点数高位在第一个寄存器
nValue = (DWORD)((pData[1] << 24) | (pData[0] << 16) | (pData[3] << 8) | pData[2]);
memcpy(&f_val, &nValue, 4);
SetUnitYM(uid, point, (DWORD)f_val);
registerAddr += 4; i += 4; pData += 4;
}
else if (6 == value_type)
{ //32位浮点数高位在第二个寄存器
nValue = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
memcpy(&f_val, &nValue, 4);
SetUnitYM(uid, point, (DWORD)f_val);
registerAddr += 4; i += 4; pData += 4;
}
else if (7 == value_type)
{ //64位浮点数高位在第一个寄存器
dw[1] = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
dw[0] = (DWORD)((pData[7] << 24) | (pData[6] << 16) | (pData[5] << 8) | pData[4]);
memcpy(&d_val, dw, 8);
SetUnitYM(uid, point, (DWORD)(d_val));
registerAddr += 8; i += 8; pData += 8;
}
else if (8 == value_type)
{
dw[0] = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
dw[1] = (DWORD)((pData[7] << 24) | (pData[6] << 16) | (pData[5] << 8) | pData[4]);
memcpy(&d_val, dw, 8);
SetUnitYM(uid, point, (DWORD)(d_val));
registerAddr += 8; i += 8; pData += 8;
}
else if (9 == value_type)
{
nValue = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
memcpy(&f_val, &nValue, 4);
SetUnitYM(uid, point, (DWORD)(f_val * 10));
registerAddr += 4; i += 4; pData += 4;
}
else
{
registerAddr++; i++; pData++;
}
2024-12-03 10:36:06 +08:00
}
2024-12-04 08:48:18 +08:00
}
else
{ //遥信
int data_bits = 8;
BYTE params[4];
params[0] = (BYTE)(registerAddr & 0xff);
params[1] = (BYTE)((registerAddr >> 8) & 0xff);
params[2] = type - REGISTER_DATA_TYPE_YX_BYTE;
if (type == REGISTER_DATA_TYPE_YX_BYTE)
2024-12-03 10:36:06 +08:00
{
2024-12-04 08:48:18 +08:00
nValue = (DWORD)pData[0];
2024-12-03 10:36:06 +08:00
registerAddr++; i++; pData++;
2024-12-04 08:48:18 +08:00
data_bits = 8;
2024-12-03 10:36:06 +08:00
}
2024-12-04 08:48:18 +08:00
else if (type == REGISTER_DATA_TYPE_YX_WORD)
2024-12-03 10:36:06 +08:00
{
2024-12-04 08:48:18 +08:00
nValue = (DWORD)((pData[1] << 8) | pData[0]);
registerAddr += 2; i += 2; pData += 2;
data_bits = 16;
2024-12-03 10:36:06 +08:00
}
2024-12-04 08:48:18 +08:00
else if (type == REGISTER_DATA_TYPE_YX_DWORD)
2024-12-03 10:36:06 +08:00
{
nValue = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
registerAddr += 4; i += 4; pData += 4;
2024-12-04 08:48:18 +08:00
data_bits = 32;
2024-12-03 10:36:06 +08:00
}
else
{
registerAddr++; i++; pData++;
}
2024-12-04 08:48:18 +08:00
DWORD nTemp = 0x00000001;
for (int j = 0; j < data_bits; j++)
2024-12-03 10:36:06 +08:00
{
2024-12-04 08:48:18 +08:00
params[3] = j;
point = GetUnitYXPointByParam(uid, (BYTE *)params, 4);
if (point >= 0)
2024-12-03 10:36:06 +08:00
{
2024-12-04 08:48:18 +08:00
BOOLEAN yxVal = SPI_OFF;
if ((nValue) & nTemp)
{
yxVal = SPI_ON;
}
SetUnitYX(uid, point, yxVal);
2024-12-03 10:36:06 +08:00
}
2024-12-04 08:48:18 +08:00
nTemp <<= 1;
2024-12-03 10:36:06 +08:00
}
}
}
2024-12-04 08:48:18 +08:00
else
{
registerAddr++; i++; pData++;
}
2024-12-03 10:36:06 +08:00
}
}
return TRUE;
}