Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
027b4b65ac
@ -1320,6 +1320,7 @@ BOOLEAN CRYDevice::processRyADSParam(const Json::Value jsonRoot, int pid)
|
||||
snprintf(config_config.processes[pid].option.ryads.ftp.remotePath, sizeof(config_config.processes[pid].option.ryads.ftp.remotePath), "%s", "/data/rtdatalog");
|
||||
}
|
||||
|
||||
//目标地址
|
||||
if (jsonRoot["targetAddr"].isInt()) {
|
||||
config_config.processes[pid].option.ryads.net.target_addr = jsonRoot["targetAddr"].asInt();
|
||||
} else if (jsonRoot["targetAddr"].isString()) {
|
||||
@ -1329,6 +1330,13 @@ BOOLEAN CRYDevice::processRyADSParam(const Json::Value jsonRoot, int pid)
|
||||
vLog(LOG_ERROR, "inet_pton error(%d,%s).\n", errno, strerror(errno));
|
||||
}
|
||||
}
|
||||
//端口
|
||||
if (jsonRoot["targetPort"].isInt()) {
|
||||
config_config.processes[pid].option.ryads.net.target_port = jsonRoot["targetPort"].asInt();
|
||||
} else if (jsonRoot["targetPort"].isString()) {
|
||||
config_config.processes[pid].option.ryads.net.target_port = atoi(jsonRoot["targetPort"].asCString());
|
||||
}
|
||||
//本机地址
|
||||
if (jsonRoot["bindAddr"].isInt()) {
|
||||
config_config.processes[pid].option.ryads.net.bind_addr = jsonRoot["bindAddr"].asInt();
|
||||
} else if (jsonRoot["bindAddr"].isString()) {
|
||||
@ -1912,7 +1920,15 @@ BOOLEAN CRYDevice::processHostADSPointParam(const Json::Value jsonRoot, int uid,
|
||||
BYTE dataType = (BYTE)jsonRoot["dataType"].asInt();
|
||||
config_config.units[uid].ycs[point].m_param[2] = dataType;
|
||||
} else {
|
||||
config_config.units[uid].ycs[point].m_param[2] = 0;
|
||||
config_config.units[uid].ycs[point].m_param[2] = 9; //8位数据,占一个寄存器
|
||||
}
|
||||
{
|
||||
BYTE data_type = config_config.units[uid].ycs[point].m_param[2];
|
||||
if ((data_type == 5) || (data_type == 0) || (data_type == 1))
|
||||
{ //浮点数
|
||||
config_config.units[uid].ycs[point].factor = 1000;
|
||||
config_config.units[uid].ycs[point].coef = 0.001;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case POINT_TYPE_YM:
|
||||
|
@ -108,11 +108,7 @@ const BYTE crc16tableLo[] = {
|
||||
CProcess::CProcess()
|
||||
{
|
||||
int i;
|
||||
#ifdef WIN32
|
||||
memset(&m_pid, NULL, sizeof(m_pid));
|
||||
#else
|
||||
m_pid = 0;
|
||||
#endif
|
||||
m_nProcess = -1;
|
||||
m_nCurUnit = 0;
|
||||
m_bUnitLoop = FALSE;
|
||||
|
@ -52,8 +52,6 @@ void CYCBW::PushYCBW(unionCP56Time& st, int order, LONG value, BYTE qds, int uid
|
||||
#endif
|
||||
m_save++;
|
||||
m_save = m_save % DATABASE_YCBW_NUM;
|
||||
|
||||
vLog(LOG_DEBUG, "push a ycbw value.\n");
|
||||
}
|
||||
|
||||
void CYCBW::DumpYCBW(void)
|
||||
|
@ -4,7 +4,8 @@
|
||||
#include <curl/curl.h>
|
||||
#include <ry.h>
|
||||
|
||||
#define MAX_BUF_SIZE 512
|
||||
#define MAX_BLOCKF_SIZE 512
|
||||
#define DATA_BLOCK_BOUNDARY 400
|
||||
|
||||
#define REGISTER_DATA_TYPE_YC 1
|
||||
#define REGISTER_DATA_TYPE_YM 2
|
||||
@ -12,6 +13,11 @@
|
||||
#define REGISTER_DATA_TYPE_YX_WORD 4
|
||||
#define REGISTER_DATA_TYPE_YX_DWORD 5
|
||||
|
||||
#define ADSP_READ_ID 100 //读取文件及文件夹ID
|
||||
#define ADSP_READ_ID_FUNCCODE 0x03 //读取文件及文件夹ID功能码。
|
||||
#define ADSP_READ_ID_REGISTER_ADDRESS 300 //读取文件及文件夹ID寄存器地址。
|
||||
#define ADSP_READ_ID_REGISTER_LENGTH 32 //读取文件及文件夹ID寄存器长度。
|
||||
|
||||
|
||||
static datalen2mbaddrmap m_datalen2mbaddr_map;
|
||||
static struDataLengthMBAddr m_datalen_mbaddr[] = {
|
||||
@ -219,7 +225,6 @@ static bool publish_sensor_data(const char* command, const Json::Value payload)
|
||||
jsonRoot["time"] = mtime;
|
||||
jsonRoot["data"] = payload;
|
||||
|
||||
//vLog(LOG_DEBUG, "here start to send.\n");
|
||||
std::string outputConfig = Json::writeString(builder, jsonRoot);
|
||||
g_conn->sendMsg(outputConfig);
|
||||
|
||||
@ -236,7 +241,7 @@ static WORD GetUnitYCRegisterAddr(int uid, int point)
|
||||
if (pUnit->yccount <= 0) return (WORD)65535;
|
||||
if (point < 0 || point >= pUnit->yccount) return (WORD)65535;
|
||||
pYC = &pUnit->ycs[point];
|
||||
return (MAKEWORD(pYC->m_param[1], pYC->m_param[2]));
|
||||
return (MAKEWORD(pYC->m_param[0], pYC->m_param[1]));
|
||||
}
|
||||
|
||||
static WORD GetUnitYXRegisterAddr(int uid, int point)
|
||||
@ -249,7 +254,7 @@ static WORD GetUnitYXRegisterAddr(int uid, int point)
|
||||
if (pUnit->yxcount <= 0) return (WORD)65535;
|
||||
if (point < 0 || point >= pUnit->yxcount) return (WORD)65535;
|
||||
pYX = &pUnit->yxs[point];
|
||||
return (MAKEWORD(pYX->m_param[1], pYX->m_param[2]));
|
||||
return (MAKEWORD(pYX->m_param[0], pYX->m_param[1]));
|
||||
}
|
||||
|
||||
static BYTE GetUnitYXDataPos(int uid, int point)
|
||||
@ -343,7 +348,7 @@ static bool publishhistoryLowSpeedData(const noPollConn* conn, const int uid, co
|
||||
|
||||
static int ftpget(const char* remote, const char* local, const char* user, const char* pwd, const long timeout = 3, struct memory* chunk = NULL)
|
||||
{
|
||||
//vLog(LOG_DEBUG, "start to get %s to local %s, with name: %s, and password: %s.\n", remote, local, user, pwd);
|
||||
vLog(LOG_DEBUG, "start to get %s to local %s, with name: %s, and password: %s.\n", remote, local, user, pwd);
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
CURL* curl = curl_easy_init();
|
||||
|
||||
@ -383,6 +388,8 @@ static void* ryftp_process(void* param)
|
||||
char remotePath[128] = "Hard Disk2/data/rtdatalog";
|
||||
char pathName[128] = "./";
|
||||
|
||||
char processName[128];
|
||||
snprintf(processName, sizeof(processName), "%s", mbt->GetCurProcessName());
|
||||
//配置远方路径
|
||||
char* escaped_string = escape_char_in_string(mbt->m_remotePath, ' ');
|
||||
if (escaped_string == NULL)
|
||||
@ -489,7 +496,7 @@ static void* ryftp_process(void* param)
|
||||
int result = ftpget(remote, name, user, password, 3, &chunk);
|
||||
if (result == CURLE_OK) {
|
||||
//成功,处理文件
|
||||
vLog(LOG_DEBUG, "get %s to local memory, with name: %s, and password: %s okay, and file length is: %d.\n", remote, user, password, chunk.size);
|
||||
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);
|
||||
ftpget_retry_count = 0;
|
||||
if (chunk.size <= (int)(sizeof(struRYDeviceData) << 5)) {
|
||||
vLog(LOG_DEBUG, "PLC文件生成未完成!\n");
|
||||
@ -592,7 +599,7 @@ static void* ryftp_process(void* param)
|
||||
mbt->m_lastReadDirNo++;
|
||||
}
|
||||
if (mbt->m_curStartDirNo <= mbt->m_lastReadDirNo && mbt->m_curStartFileNo <= mbt->m_lastReadFileNo) {
|
||||
vLog(LOG_DEBUG, "a已读取完成所有未读的文件。\n");
|
||||
vLog(LOG_DEBUG, "%s a已读取完成所有未读的文件。\n", processName);
|
||||
mbt->m_bHaveUnReadFile = FALSE;
|
||||
}
|
||||
}
|
||||
@ -612,7 +619,7 @@ static void* ryftp_process(void* param)
|
||||
bReadCurrentFile = FALSE;
|
||||
}
|
||||
} else if (result == CURLE_REMOTE_ACCESS_DENIED) {
|
||||
vLog(LOG_DEBUG, "b已读取完成所有未读的文件。\n");
|
||||
vLog(LOG_DEBUG, "%s b已读取完成所有未读的文件。\n", processName);
|
||||
mbt->m_bHaveUnReadFile = FALSE;
|
||||
bReadCurrentFile = TRUE;
|
||||
}
|
||||
@ -626,7 +633,15 @@ static void* ryftp_process(void* param)
|
||||
|
||||
CHostADSBFProcess::CHostADSBFProcess()
|
||||
{
|
||||
m_adsOverviewDataMemAddr = 1000;
|
||||
m_adsDatas[0].inuse = FALSE;
|
||||
m_adsDatas[1].inuse = FALSE;
|
||||
m_adsDatas[2].inuse = FALSE;
|
||||
m_adsDatas[3].inuse = FALSE;
|
||||
m_adsDatas[0].adsDataMemAddr = 65535;
|
||||
m_adsDatas[1].adsDataMemAddr = 65535;
|
||||
m_adsDatas[2].adsDataMemAddr = 65535;
|
||||
m_adsDatas[3].adsDataMemAddr = 65535;
|
||||
|
||||
m_localIp = "192.168.0.1"; //本机IP地址
|
||||
m_localNetId = "192.168.0.1.1.1"; //本机IP地址
|
||||
m_remoteIp = "192.168.0.2"; //PLC设备ip地址
|
||||
@ -669,7 +684,14 @@ BOOLEAN CHostADSBFProcess::calc(void)
|
||||
uid = GetCurUnitID();
|
||||
if (uid < 0 || uid >= UNIT_NUM) return FALSE;
|
||||
|
||||
m_adsOverviewDataMemAddr = 65535;
|
||||
m_adsDatas[0].inuse = FALSE;
|
||||
m_adsDatas[1].inuse = FALSE;
|
||||
m_adsDatas[2].inuse = FALSE;
|
||||
m_adsDatas[3].inuse = FALSE;
|
||||
m_adsDatas[0].adsDataMemAddr = 65535;
|
||||
m_adsDatas[1].adsDataMemAddr = 65535;
|
||||
m_adsDatas[2].adsDataMemAddr = 65535;
|
||||
m_adsDatas[3].adsDataMemAddr = 65535;
|
||||
//需要给单元添加一个是否有ftp数据的标识
|
||||
if (m_bHaveFTP) config.units[uid].state |= 0x20; //存在ftp标识
|
||||
|
||||
@ -690,11 +712,26 @@ BOOLEAN CHostADSBFProcess::calc(void)
|
||||
pData = GetUnitYCParamByPoint(uid, n);
|
||||
if (pData[4] == 1) continue;
|
||||
registerAddr = MAKEWORD(pData[0], pData[1]);
|
||||
if (registerAddr < m_adsOverviewDataMemAddr) m_adsOverviewDataMemAddr = registerAddr;
|
||||
if (m_register2type_map.find(registerAddr) == m_register2type_map.end()) {
|
||||
m_register2type_map.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YC));
|
||||
} else {
|
||||
vLog(LOG_WARN, "遥测测点配置了相同的寄存器地址\n");
|
||||
vLog(LOG_DEBUG, "registerAddr is: %d\n", registerAddr);
|
||||
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 {
|
||||
vLog(LOG_WARN, "遥测测点配置了相同的寄存器地址\n");
|
||||
}
|
||||
}
|
||||
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 {
|
||||
vLog(LOG_WARN, "遥测测点配置了相同的寄存器地址\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -703,11 +740,25 @@ BOOLEAN CHostADSBFProcess::calc(void)
|
||||
pData = GetUnitYMParamByPoint(uid, n);
|
||||
if (pData[4] == 1) continue;
|
||||
registerAddr = MAKEWORD(pData[0], pData[1]);
|
||||
if (registerAddr < m_adsOverviewDataMemAddr) m_adsOverviewDataMemAddr = registerAddr;
|
||||
if (m_register2type_map.find(registerAddr) == m_register2type_map.end()) {
|
||||
m_register2type_map.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YM));
|
||||
} else {
|
||||
vLog(LOG_WARN, "遥脉测点配置了相同的寄存器地址\n");
|
||||
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 {
|
||||
vLog(LOG_WARN, "遥脉测点配置了相同的寄存器地址\n");
|
||||
}
|
||||
}
|
||||
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 {
|
||||
vLog(LOG_WARN, "遥脉测点配置了相同的寄存器地址\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -717,13 +768,24 @@ BOOLEAN CHostADSBFProcess::calc(void)
|
||||
if (pData[4] == 1) continue;
|
||||
registerAddr = MAKEWORD(pData[0], pData[1]);
|
||||
value_type = pData[2];
|
||||
if (registerAddr < m_adsOverviewDataMemAddr) m_adsOverviewDataMemAddr = registerAddr;
|
||||
if (m_register2type_map.find(registerAddr) == m_register2type_map.end()) {
|
||||
m_register2type_map.insert(register2typemap::value_type(registerAddr, REGISTER_DATA_TYPE_YX_BYTE + value_type));
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vLog(LOG_DEBUG, "m_adsOverviewDataMemAddr is: %d\n", m_adsOverviewDataMemAddr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -743,24 +805,41 @@ BOOLEAN CHostADSBFProcess::OnPreCreate(int id)
|
||||
m_remoteNetId = m_nOptions.remoteNetId;
|
||||
#endif
|
||||
char ipaddress[32];
|
||||
|
||||
//本机IP和netid
|
||||
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");
|
||||
//目标IP和netid
|
||||
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");
|
||||
//目标端口
|
||||
m_remotePort = m_nOptions.net.target_port;
|
||||
|
||||
m_bHaveFTP = m_nOptions.bHaveFTP;
|
||||
calc();
|
||||
|
||||
vLog(LOG_DEBUG, "local ip is: %s, netid is: %s, remote ip is: %s, and netid is: %s\n", m_localIp.c_str(), m_localNetId.c_str(), m_remoteIp.c_str(), m_remoteNetId.c_str());
|
||||
SetLocalAmsNetId(AmsNetId(m_localNetId));
|
||||
|
||||
//192.168.0.231 addroute --addr=192.168.0.1 --netid=192.168.0.1.1.1 --password=1 --username=guest --routename=Testroute
|
||||
//AddRemoteRoute(m_remoteIp, m_localNetId, m_localIp, std::string("isoftstone"), std::string("guest"), std::string("1"));
|
||||
|
||||
m_turbine = new AdsDevice{m_remoteIp, AmsNetId(m_remoteNetId), AMSPORT_R0_PLC_RTS1};
|
||||
//m_remotePort
|
||||
//m_turbine = new AdsDevice{m_remoteIp, AmsNetId(m_remoteNetId), AMSPORT_R0_PLC_RTS1};
|
||||
|
||||
m_turbine = new AdsDevice{m_remoteIp, AmsNetId(m_remoteNetId), m_remotePort};
|
||||
if (m_turbine->IsConnected())
|
||||
{
|
||||
if (!readDeviceState(*m_turbine))
|
||||
{
|
||||
// delete m_turbine;
|
||||
// m_turbine = NULL;
|
||||
// m_turbine = new AdsDevice{m_remoteIp, AmsNetId(m_remoteNetId), m_remotePort};
|
||||
}
|
||||
}
|
||||
|
||||
if (m_bHaveFTP)
|
||||
{
|
||||
@ -831,33 +910,85 @@ BOOLEAN CHostADSBFProcess::OnTimer(void)
|
||||
}
|
||||
if (sec_changed)
|
||||
{
|
||||
if (m_bHaveFTP)
|
||||
{ //启动时读取一次,后面自己维护序号
|
||||
if ((m_currentDirNo == -1) && (m_currentFileNo == -1))
|
||||
{ //当前文件和目录都为-1,程序第一次启动。需要获取ftp目录及文件ID
|
||||
readFileID();
|
||||
//return TRUE;
|
||||
if (m_turbine->IsConnected())
|
||||
{
|
||||
if (m_bHaveFTP)
|
||||
{ //启动时读取一次,后面自己维护序号
|
||||
if ((m_currentDirNo == -1) && (m_currentFileNo == -1))
|
||||
{ //当前文件和目录都为-1,程序第一次启动。需要获取ftp目录及文件ID
|
||||
readFileID();
|
||||
}
|
||||
}
|
||||
readRealData();
|
||||
}
|
||||
readRealData();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOLEAN CHostADSBFProcess::readDeviceState(const AdsDevice& route)
|
||||
{
|
||||
const auto state = route.GetState();
|
||||
vLog(LOG_DEBUG, "ADS state: %d devState: %d\n", (uint16_t)state.ads, (uint16_t)state.device);
|
||||
if ((uint16_t)state.ads >= ADSSTATE::ADSSTATE_MAXSTATES && (uint16_t)state.device >= ADSSTATE::ADSSTATE_MAXSTATES)
|
||||
{
|
||||
vLog(LOG_DEBUG, "try to add a route to remote device.\n");
|
||||
AddRemoteRoute(m_remoteIp, m_localNetId, m_localIp, std::string("isoftstone"), std::string("guest"), std::string("1"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOLEAN CHostADSBFProcess::readFileID()
|
||||
{
|
||||
int uid = GetCurUnitID();
|
||||
if (uid < 0 || uid >= UNIT_NUM) return TRUE;
|
||||
|
||||
AdsVariable<std::array<BYTE, MAX_BUF_SIZE>> turbineData {*m_turbine, ADSIGRP_IOIMAGE_RWOB, m_adsOverviewDataMemAddr};
|
||||
AdsVariable<std::array<BYTE, ADSP_READ_ID_REGISTER_LENGTH>> turbineData {*m_turbine, ADSIGRP_IOIMAGE_RWOB, ADSP_READ_ID_REGISTER_ADDRESS};
|
||||
BYTE buffer[1024];
|
||||
BYTE *pData = buffer;
|
||||
|
||||
BYTE params[MAX_UNIT_POINT_PARAM_SIZE];
|
||||
BYTE* pParam = params;
|
||||
pData = ((std::array<BYTE, ADSP_READ_ID_REGISTER_LENGTH>)turbineData).data();
|
||||
WORD wPathInfoInvalid = (WORD)((pData[1] << 8) | pData[0]); pData += 2;
|
||||
DWORD wCurrentFolderNo = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]); pData += 4;
|
||||
DWORD wCurrentFileNo = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]); pData += 4;
|
||||
DWORD wFirstFileNoInFolder = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]); pData += 4;
|
||||
DWORD wFileCountInFolder = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]); pData += 4;
|
||||
DWORD wFirstFolderNoRecoverable = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]); pData += 4;
|
||||
DWORD wFirstFileNoRecoverable = (DWORD)(pData[3] << 24 | pData[2] << 16 | pData[1] << 8 | pData[0]); pData += 4;
|
||||
|
||||
m_iv = wPathInfoInvalid;
|
||||
if (m_iv) {
|
||||
vLog(LOG_DEBUG, "路径信息无效\n");
|
||||
return FALSE;
|
||||
}
|
||||
//当前文件夹路径名
|
||||
m_currentDirNo = wCurrentFolderNo;
|
||||
//当前文件夹下最后新文件
|
||||
m_currentFileNo = wCurrentFileNo;
|
||||
//当前目录文件开始编号
|
||||
m_currentDirStartFileNo = wFirstFileNoInFolder;
|
||||
|
||||
|
||||
m_curStartDirNo = m_currentDirNo; //当前开始目录
|
||||
m_curStartFileNo = m_currentFileNo; //当前开始文件
|
||||
//判断是否有要读取的文件
|
||||
if (m_curStartDirNo <= m_lastReadDirNo && m_curStartFileNo <= m_lastReadFileNo)
|
||||
{
|
||||
vLog(LOG_DEBUG, "不存在未读的文件。\n");
|
||||
m_bHaveUnReadFile = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bHaveUnReadFile = TRUE;
|
||||
int dir_count = m_curStartDirNo - m_lastReadDirNo + 1;
|
||||
int file_count = m_curStartFileNo - m_lastReadFileNo;
|
||||
vLog(LOG_DEBUG, "%s 总共有%d个目录的%d个文件未读取。\n", GetCurProcessName(), dir_count, file_count);
|
||||
}
|
||||
|
||||
vLog(LOG_DEBUG, "%s 最新文件夹编号: %ld, 最新文件名编号: %ld: 最新文件夹中第一个文件的编号: %ld\n", GetCurProcessName(), m_currentDirNo, m_currentFileNo, m_currentDirStartFileNo);
|
||||
|
||||
pData = ((std::array<BYTE, MAX_BUF_SIZE>)turbineData).data();
|
||||
WORD registerAddr = m_adsOverviewDataMemAddr;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -867,252 +998,259 @@ BOOLEAN CHostADSBFProcess::readRealData()
|
||||
int uid = GetCurUnitID();
|
||||
if (uid < 0 || uid >= UNIT_NUM) return TRUE;
|
||||
|
||||
AdsVariable<std::array<BYTE, MAX_BUF_SIZE>> turbineData {*m_turbine, ADSIGRP_IOIMAGE_RWOB, m_adsOverviewDataMemAddr};
|
||||
BYTE buffer[1024];
|
||||
BYTE *pData = buffer;
|
||||
|
||||
BYTE params[MAX_UNIT_POINT_PARAM_SIZE];
|
||||
BYTE* pParam = params;
|
||||
|
||||
pData = ((std::array<BYTE, MAX_BUF_SIZE>)turbineData).data();
|
||||
WORD registerAddr = m_adsOverviewDataMemAddr;
|
||||
|
||||
float f_val;
|
||||
DWORD dw[2]; //双精度转换中间变量
|
||||
double d_val;
|
||||
DWORD bin_value;
|
||||
DWORD nValue = 0;
|
||||
int point;
|
||||
|
||||
for (int i = 0; i < MAX_BUF_SIZE;)
|
||||
for (int k = 0; k < 4; k++)
|
||||
{
|
||||
//vLog(LOG_DEBUG, "registerAddr is: %d\n", registerAddr);
|
||||
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 *)®isterAddr, 2);
|
||||
if (point >= 0)
|
||||
{
|
||||
pParam = GetUnitYCParamByPoint(uid, point);
|
||||
BYTE value_type = pParam[2]; //数据类型
|
||||
BYTE sign_mark = pParam[3];
|
||||
if (!m_adsDatas[k].inuse) continue;
|
||||
WORD m_adsOverviewDataMemAddr = m_adsDatas[k].adsDataMemAddr;
|
||||
register2typemap m_register2type_map = m_adsDatas[k].adsDataBlocks;
|
||||
|
||||
//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)
|
||||
AdsVariable<std::array<BYTE, MAX_BLOCKF_SIZE>> turbineData {*m_turbine, ADSIGRP_IOIMAGE_RWOB, m_adsOverviewDataMemAddr};
|
||||
BYTE buffer[1024];
|
||||
BYTE *pData = buffer;
|
||||
|
||||
BYTE params[MAX_UNIT_POINT_PARAM_SIZE];
|
||||
BYTE* pParam = params;
|
||||
|
||||
pData = ((std::array<BYTE, MAX_BLOCKF_SIZE>)turbineData).data();
|
||||
WORD registerAddr = m_adsOverviewDataMemAddr;
|
||||
|
||||
float f_val;
|
||||
DWORD dw[2]; //双精度转换中间变量
|
||||
double d_val;
|
||||
DWORD bin_value;
|
||||
DWORD nValue = 0;
|
||||
int point;
|
||||
|
||||
for (int i = 0; i < MAX_BLOCKF_SIZE;)
|
||||
{
|
||||
//vLog(LOG_DEBUG, "registerAddr is: %d\n", registerAddr);
|
||||
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 *)®isterAddr, 2);
|
||||
if (point >= 0)
|
||||
{
|
||||
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++;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type == REGISTER_DATA_TYPE_YM)
|
||||
{ //遥脉
|
||||
point = GetUnitYMPointByParam(uid, (BYTE *)®isterAddr, 2);
|
||||
if (point >= 0)
|
||||
{
|
||||
pParam = GetUnitYMParamByPoint(uid, point);
|
||||
BYTE value_type = pParam[2]; //数据类型
|
||||
if (0 == value_type)
|
||||
{ //16位无符号整型
|
||||
nValue = (pData[1] << 8) | pData[0];
|
||||
SetUnitYM(uid, point, nValue);
|
||||
else if (type == REGISTER_DATA_TYPE_YM)
|
||||
{ //遥脉
|
||||
point = GetUnitYMPointByParam(uid, (BYTE *)®isterAddr, 2);
|
||||
if (point >= 0)
|
||||
{
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
nValue = (DWORD)pData[0];
|
||||
registerAddr++; i++; pData++;
|
||||
data_bits = 8;
|
||||
}
|
||||
else if (type == REGISTER_DATA_TYPE_YX_WORD)
|
||||
{
|
||||
nValue = (DWORD)((pData[1] << 8) | pData[0]);
|
||||
registerAddr += 2; i += 2; pData += 2;
|
||||
data_bits = 16;
|
||||
}
|
||||
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)
|
||||
else if (type == REGISTER_DATA_TYPE_YX_DWORD)
|
||||
{
|
||||
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;
|
||||
data_bits = 32;
|
||||
}
|
||||
else
|
||||
{
|
||||
registerAddr++; i++; pData++;
|
||||
}
|
||||
DWORD nTemp = 0x00000001;
|
||||
for (int j = 0; j < data_bits; j++)
|
||||
{
|
||||
params[3] = j;
|
||||
point = GetUnitYXPointByParam(uid, (BYTE *)params, 4);
|
||||
if (point >= 0)
|
||||
{
|
||||
BOOLEAN yxVal = SPI_OFF;
|
||||
if ((nValue) & nTemp)
|
||||
{
|
||||
yxVal = SPI_ON;
|
||||
}
|
||||
SetUnitYX(uid, point, yxVal);
|
||||
}
|
||||
nTemp <<= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
nValue = (DWORD)pData[0];
|
||||
registerAddr++; i++; pData++;
|
||||
data_bits = 8;
|
||||
}
|
||||
else if (type == REGISTER_DATA_TYPE_YX_WORD)
|
||||
{
|
||||
nValue = (DWORD)((pData[1] << 8) | pData[0]);
|
||||
registerAddr += 2; i += 2; pData += 2;
|
||||
data_bits = 16;
|
||||
}
|
||||
else if (type == REGISTER_DATA_TYPE_YX_DWORD)
|
||||
{
|
||||
nValue = (DWORD)((pData[3] << 24) | (pData[2] << 16) | (pData[1] << 8) | pData[0]);
|
||||
registerAddr += 4; i += 4; pData += 4;
|
||||
data_bits = 32;
|
||||
}
|
||||
else
|
||||
{
|
||||
registerAddr++; i++; pData++;
|
||||
}
|
||||
DWORD nTemp = 0x00000001;
|
||||
for (int j = 0; j < data_bits; j++)
|
||||
{
|
||||
params[3] = j;
|
||||
point = GetUnitYXPointByParam(uid, (BYTE *)params, 4);
|
||||
if (point >= 0)
|
||||
{
|
||||
BOOLEAN yxVal = SPI_OFF;
|
||||
if ((nValue) & nTemp)
|
||||
{
|
||||
yxVal = SPI_ON;
|
||||
}
|
||||
SetUnitYX(uid, point, yxVal);
|
||||
}
|
||||
nTemp <<= 1;
|
||||
}
|
||||
{
|
||||
registerAddr++; i++; pData++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
registerAddr++; i++; pData++;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
@ -11,6 +11,14 @@ using namespace Beckhoff::Ads;
|
||||
|
||||
typedef std::unordered_map<short, short> register2typemap;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
BOOLEAN inuse;
|
||||
WORD adsDataMemAddr;
|
||||
WORD adsDataMaxAddr;
|
||||
register2typemap adsDataBlocks;
|
||||
} struADSData;
|
||||
typedef std::vector<struADSData> adsReadDataVector;
|
||||
class CHostADSBFProcess : public CProcess
|
||||
{
|
||||
public:
|
||||
@ -32,13 +40,11 @@ private:
|
||||
std::string m_remoteNetId;
|
||||
|
||||
AdsDevice *m_turbine;
|
||||
WORD m_adsOverviewDataMemAddr;
|
||||
|
||||
int m_total_length;
|
||||
DWORD last_sec;
|
||||
|
||||
register2typemap m_register2type_map; //寄存器类型表
|
||||
|
||||
struADSData m_adsDatas[4];
|
||||
public:
|
||||
BOOLEAN m_bHaveFTP; //存在FTP协议
|
||||
|
||||
@ -47,6 +53,7 @@ public:
|
||||
char m_password[64];
|
||||
char m_remotePath[128];
|
||||
char m_localPath[128];
|
||||
WORD m_remotePort;
|
||||
|
||||
//文件信息
|
||||
int m_iv;
|
||||
@ -68,6 +75,7 @@ public:
|
||||
private:
|
||||
BOOLEAN calc(void);
|
||||
|
||||
BOOLEAN readDeviceState(const AdsDevice& route);
|
||||
BOOLEAN readRealData(void);
|
||||
BOOLEAN readFileID(void);
|
||||
};
|
||||
|
@ -1739,11 +1739,11 @@ BOOLEAN CHostModbusTcpBFProcess::OnReceiveIDData(CHostModbusTcpBFProcessItem *pI
|
||||
pBuf = pData;
|
||||
|
||||
/*
|
||||
1)、路径信息是否有效 byte;
|
||||
1)、路径信息是否有效 byte;
|
||||
2)、当前文件夹路径名的后缀 dint,按照顺序增加1(转字符串时在前补0);
|
||||
3)、当前文件夹下最后新文件的编号 dint;
|
||||
4)、当前文件夹下第一个文件的编号 dint;
|
||||
5)、当前文件夹下文件个数 dint;
|
||||
5)、当前文件夹下文件个数 dint;
|
||||
*/
|
||||
//路径有效性判断
|
||||
int iv = ((pBuf[0] << 8) | pBuf[1]); pBuf += 2;
|
||||
|
@ -52,6 +52,7 @@ public:
|
||||
if (m_nProcess < 0 || m_nProcess >= PROCESSES_NUM) return NULL;
|
||||
return config.processes[m_nProcess].name;
|
||||
}
|
||||
|
||||
inline int GetCurID(void) const
|
||||
{
|
||||
return m_nProcess;
|
||||
|
@ -2,6 +2,7 @@
|
||||
#define _RYFILE_DEFINE_H_
|
||||
|
||||
#include "zjdtypes.h"
|
||||
#include <cstddef>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
|
||||
|
5
das-dn/third_party/AdsLib/AdsDevice.cpp
vendored
5
das-dn/third_party/AdsLib/AdsDevice.cpp
vendored
@ -24,6 +24,7 @@ static AmsNetId* Connect(AmsNetId ams, const char* ip)
|
||||
|
||||
return new AmsNetId { 0, 0, 0, 0, 1, 1 };
|
||||
}
|
||||
|
||||
return new AmsNetId { ams };
|
||||
}
|
||||
|
||||
@ -143,8 +144,8 @@ long AdsDevice::GetLocalPort() const
|
||||
|
||||
AdsDeviceState AdsDevice::GetState() const
|
||||
{
|
||||
uint16_t state[2];
|
||||
if(m_Connected == true){
|
||||
uint16_t state[2] = {ADSSTATE_MAXSTATES, ADSSTATE_MAXSTATES};
|
||||
if (m_Connected == true) {
|
||||
auto error = AdsSyncReadStateReqEx(GetLocalPort(), &m_Addr, &state[0], &state[1]);
|
||||
if (error) {
|
||||
LOG_ERROR("AdsDevice can not read device state.");
|
||||
|
2
das-dn/third_party/AdsLib/Sockets.cpp
vendored
2
das-dn/third_party/AdsLib/Sockets.cpp
vendored
@ -126,7 +126,7 @@ Socket::Socket(const struct addrinfo* const host, const int type)
|
||||
|
||||
if (SOCK_STREAM == type) {
|
||||
if (::connect(m_Socket, rp->ai_addr, rp->ai_addrlen)) {
|
||||
LOG_WARN("Socket connect["<<std::string(inet_ntoa(reinterpret_cast<sockaddr_in*>(rp->ai_addr)->sin_addr)) << "] timeout");
|
||||
LOG_WARN("Socket connect[" << std::string(inet_ntoa(reinterpret_cast<sockaddr_in*>(rp->ai_addr)->sin_addr)) << "] timeout");
|
||||
closesocket(m_Socket);
|
||||
m_Socket = INVALID_SOCKET;
|
||||
continue;
|
||||
|
@ -43,6 +43,7 @@ long ConnectTarget(const AmsNetId ams, const char* ip)
|
||||
|
||||
void DisconnectTarget(const AmsNetId ams)
|
||||
{
|
||||
fprintf(stderr, "%s-------------------\n", __func__);
|
||||
GetLocalAmsRouter().DisconnectTarget(ams);
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
BIN
document/风电场数据采集系统使用手册.docx
Normal file
BIN
document/风电场数据采集系统使用手册.docx
Normal file
Binary file not shown.
@ -284,18 +284,62 @@ export const excelDefaultConfig: any = {
|
||||
label: '寄存器地址',
|
||||
code: 'registerAddr',
|
||||
},
|
||||
{
|
||||
label: '上界',
|
||||
code: 'upBound',
|
||||
},
|
||||
{
|
||||
label: '下界',
|
||||
code: 'lowBound'
|
||||
},
|
||||
{
|
||||
label: '基值',
|
||||
code: 'base',
|
||||
default: 0
|
||||
},
|
||||
{
|
||||
label: '系数',
|
||||
code: 'coef',
|
||||
default: 1
|
||||
},
|
||||
{
|
||||
label: '限值1',
|
||||
code: 'limit1Enable',
|
||||
default: 0
|
||||
},
|
||||
{
|
||||
label: '限值1上限',
|
||||
code: 'limit1High'
|
||||
},
|
||||
{
|
||||
label: '限值1下限',
|
||||
code: 'limit1Low'
|
||||
},
|
||||
{
|
||||
label: '限值2',
|
||||
code: 'limit2Enable',
|
||||
default: 0
|
||||
},
|
||||
{
|
||||
label: '限值2上限',
|
||||
code: 'limit2High'
|
||||
},
|
||||
{
|
||||
label: '限值2下限',
|
||||
code: 'limit2Low'
|
||||
}
|
||||
],
|
||||
R0C4: [
|
||||
"1、32位浮点数(高位在第一个寄存器)",
|
||||
"2、32位浮点数(高位在第二个寄存器)",
|
||||
"2、16位归一化值",
|
||||
"4、32位归一化值(高位在第一个寄存器)",
|
||||
"5、32位归一化值(高位在第二个寄存器)",
|
||||
"6、32位浮点数(小端系统模式)",
|
||||
"7、32位BCD数据(*高位在第一个寄存器*)",
|
||||
"8、32位BCD数据(*高位在第二个寄存器*)",
|
||||
"9、16位BCD数据",
|
||||
"10、8位归一化值"
|
||||
"0. 32位浮点数(高位在第一个寄存器)",
|
||||
"1. 32位浮点数(高位在第二个寄存器)",
|
||||
"2. 16位归一化值",
|
||||
"3. 32位归一化值(高位在第一个寄存器)",
|
||||
"4. 32位归一化值(高位在第二个寄存器)",
|
||||
"5. 32位浮点数(小端系统模式)",
|
||||
"6. 32位BCD数据(*高位在第一个寄存器*)",
|
||||
"7. 32位BCD数据(*高位在第二个寄存器*)",
|
||||
"8. 16位BCD数据",
|
||||
"9. 8位归一化值"
|
||||
], // 数据类型的提示
|
||||
},
|
||||
//遥控147 CONTROL
|
||||
|
Loading…
Reference in New Issue
Block a user