From d6d031172bd3258a27da8346ea952b5e395b4378 Mon Sep 17 00:00:00 2001 From: zhouhuang Date: Wed, 4 Dec 2024 08:48:18 +0800 Subject: [PATCH] update --- das-dn/hostadsbf/hostadsbf.cpp | 565 ++++++++++++++++++--------------- das-dn/hostadsbf/hostadsbf.h | 12 +- 2 files changed, 324 insertions(+), 253 deletions(-) diff --git a/das-dn/hostadsbf/hostadsbf.cpp b/das-dn/hostadsbf/hostadsbf.cpp index fd42e6ff..42a125e2 100644 --- a/das-dn/hostadsbf/hostadsbf.cpp +++ b/das-dn/hostadsbf/hostadsbf.cpp @@ -4,7 +4,8 @@ #include #include -#define MAX_BUF_SIZE 512 +#define MAX_BLOCKF_SIZE 512 +#define DATA_BLOCK_BOUNDARY 1000 #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 150 //读取文件及文件夹ID寄存器地址。 +#define ADSP_READ_ID_REGISTER_LENGTH 9 //读取文件及文件夹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) @@ -626,7 +631,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 = 99999; + m_adsDatas[1].adsDataMemAddr = 99999; + m_adsDatas[2].adsDataMemAddr = 99999; + m_adsDatas[3].adsDataMemAddr = 99999; + 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 +682,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 = 99999; + m_adsDatas[1].adsDataMemAddr = 99999; + m_adsDatas[2].adsDataMemAddr = 99999; + m_adsDatas[3].adsDataMemAddr = 99999; //需要给单元添加一个是否有ftp数据的标识 if (m_bHaveFTP) config.units[uid].state |= 0x20; //存在ftp标识 @@ -690,11 +710,25 @@ 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"); + 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 +737,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 +765,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; } @@ -836,7 +895,6 @@ BOOLEAN CHostADSBFProcess::OnTimer(void) if ((m_currentDirNo == -1) && (m_currentFileNo == -1)) { //当前文件和目录都为-1,程序第一次启动。需要获取ftp目录及文件ID readFileID(); - //return TRUE; } } readRealData(); @@ -849,15 +907,15 @@ BOOLEAN CHostADSBFProcess::readFileID() int uid = GetCurUnitID(); if (uid < 0 || uid >= UNIT_NUM) return TRUE; - AdsVariable> turbineData {*m_turbine, ADSIGRP_IOIMAGE_RWOB, m_adsOverviewDataMemAddr}; + AdsVariable> 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)turbineData).data(); - WORD registerAddr = m_adsOverviewDataMemAddr; + pData = ((std::array)turbineData).data(); + WORD registerAddr = ADSP_READ_ID_REGISTER_ADDRESS; return TRUE; } @@ -867,252 +925,259 @@ BOOLEAN CHostADSBFProcess::readRealData() int uid = GetCurUnitID(); if (uid < 0 || uid >= UNIT_NUM) return TRUE; - AdsVariable> 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)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> 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)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; diff --git a/das-dn/hostadsbf/hostadsbf.h b/das-dn/hostadsbf/hostadsbf.h index 73a407ec..634261f0 100644 --- a/das-dn/hostadsbf/hostadsbf.h +++ b/das-dn/hostadsbf/hostadsbf.h @@ -11,6 +11,14 @@ using namespace Beckhoff::Ads; typedef std::unordered_map register2typemap; +typedef struct +{ + BOOLEAN inuse; + WORD adsDataMemAddr; + WORD adsDataMaxAddr; + register2typemap adsDataBlocks; +} struADSData; +typedef std::vector 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协议