#include "StdAfx.h" #include ".\kehua_fa_uk.h" CKehua_FR_UK::CKehua_FR_UK(char *szPath,char *szIniName,int nCommPort, int nAddr,int nRate, int nDataBit,int nStopBit, int nParity,int nInterval) { #if IS_USE_READMSG_CS InitializeCriticalSection(&m_csReadMsg); #endif MTVERIFY(m_hSemComm = CreateEvent(NULL, TRUE, TRUE, 0)); for (int i = 0; i < MAX_ADDR ; i++) { memset(m_szMsg[i], 0, sizeof(m_szMsg[i])); m_dwOnlineTick[i] = 0; m_devOnline[i] = TRUE; } } CKehua_FR_UK::~CKehua_FR_UK(void) { #if IS_USE_READMSG_CS DeleteCriticalSection(& m_csReadMsg); #endif MTVERIFY(CloseHandle(m_hSemComm)); CloseComm(); } BOOL CKehua_FR_UK::OpenUPSComm(int nCommPort, int nAddr, int nRate, int nDataBit, int nStopBit, int nParity, int nInterval) { BOOL bResult = FALSE; //LOG4C((LOG_NOTICE,"->OpenUPSComm")); bResult = OpenComm( nCommPort, nAddr, nRate, nDataBit, nStopBit, nParity, nInterval ); return bResult; } int CKehua_FR_UK::GetIniInfo(char *szPath,char *szIniName,char *szCmd,char *IniSendCMD, int &IniSendlen, char *nType,int &nIndex,int &nLen) { CHAR szFile[MAX_PATH + 1] = ""; wsprintf(szFile, "%s\\config\\%s", szPath, szIniName); TRACE("szFile =%s\n",szFile); IniSendlen = GetPrivateProfileString(szCmd, "SendCmd", "", IniSendCMD, 10, szFile); // 返回的字符串是以\0结束的; GetPrivateProfileString(szCmd, "type", "", nType, 10, szFile); nType[strlen(nType)] = '\0'; nIndex = GetPrivateProfileInt(szCmd, "Index", 0, szFile); nLen = GetPrivateProfileInt(szCmd, "Len", 0, szFile); return 0; } int CKehua_FR_UK::SendReadRequest( char *szPath, char *szIniName, int nCommPort, int nAddr, char *szCmd, char *szMsg, int nReversed1, int nReversed2, int nReversed3, int nReversed4, int nReversed5, float fReversed1, float fReversed2, float fReversed3, char *szReversed1, char *szReversed2, char *szReversed3, char *szReversed4, char *szReversed5 ) { //LOG4C((LOG_NOTICE,"->SendReadRequest")); CCommProcess *pComm = FindComm(nCommPort); if( pComm == NULL ) return -1; int nRet(-1); int nIndex(0), nLen(0), IniSendlen(0); char IniSendCMD[MAX_CMD] = {0}, szDataType[CMD_TYPE] = {0}; GetIniInfo(szPath,szIniName,szCmd,IniSendCMD,IniSendlen,szDataType,nIndex,nLen); if ( (strlen(m_szMsg[nAddr -1]) == 0 && ( strcmp(szCmd, "cmd-1") ==0 || strcmp(szCmd, "cmd-2") ==0 || strcmp(szCmd, "cmd-3") ==0 || strcmp(szCmd, "cmd-4") ==0 || strcmp(szCmd, "cmd-5") ==0 || strcmp(szCmd, "cmd-6") ==0 || strcmp(szCmd, "cmd-7") ==0 || strcmp(szCmd, "cmd-8") ==0 || strcmp(szCmd, "cmd-9") ==0 || strcmp(szCmd, "cmd-10") ==0 || strcmp(szCmd, "cmd-11") ==0 || strcmp(szCmd, "cmd-12") ==0 || strcmp(szCmd, "cmd-13") ==0 || strcmp(szCmd, "cmd-14") ==0 || strcmp(szCmd, "cmd-15") ==0 )|| strcmp(szCmd, "cmd-1") == 0 || strcmp(szCmd, "cmd-16") == 0 || strcmp(szCmd, "cmd-32") == 0 || strcmp(szCmd, "cmd-52") == 0 || strcmp(szCmd, "cmd-62") == 0 || strcmp(szCmd, "cmd-71") == 0 || strcmp(szCmd, "cmd-96") == 0 ) ) { nRet = GetDeviceParam(nAddr ,pComm, IniSendCMD,IniSendlen, szCmd ); if( nRet != 0 ) return nRet; } if( GetTickCount() - m_dwOnlineTick[nAddr -1] > 60 * 1000 && m_dwOnlineTick[nAddr -1] > 0 ) { m_devOnline[nAddr -1] = FALSE; } else if( GetTickCount() - m_dwOnlineTick[nAddr -1] < 60 * 1000 && m_dwOnlineTick[nAddr -1] > 0 ) { m_devOnline[nAddr -1] = TRUE; } if( m_devOnline[nAddr -1] == FALSE ) { return -1; } ///LOG4C((LOG_NOTICE,"->GetUPS_42Msg")); nRet = GetUPSMsg(nAddr, szCmd, szMsg, nIndex, nLen, szDataType); LOG4C((LOG_NOTICE,"nRet = %d,cmd = %s,值 = %s",nRet,szCmd,szMsg)); return nRet; } // 发送写设置; int CKehua_FR_UK::SendSetReuest( char *szPath, char *szIniName, int nCommPort, int nAddr, char *szCmd, char *szMsg, int nReversed1, int nReversed2, int nReversed3, int nReversed4, int nReversed5, float fReversed1, float fReversed2, float fReversed3, char *szReversed1, char *szReversed2, char *szReversed3, char *szReversed4, char *szReversed5 ) { return 0; } int CKehua_FR_UK::GetDeviceParam(int naddr, CCommProcess *pComm,char *IniSendCMD,const int &IniSendlen ,char *szCmd) { //LOG4C((LOG_NOTICE,"->GetDeviceParam")); int nRet(-1); nRet = Send_ReadDeviceData(naddr, pComm, IniSendCMD, IniSendlen); if( nRet != 0 ) { return nRet; } nRet = Recv_ReadDeviceData(naddr, pComm, szCmd); return nRet; } int CKehua_FR_UK::Send_ReadDeviceData(int nAddr,CCommProcess *pComm,const char *IniSendCMD,const int &IniSendlen) { #if DEBUG_KH_FRUK //LOG4C((LOG_NOTICE,"->Send_ReadDeviceData")); BYTE szSendMSG[32] = {0}; // 对数组进行赋值; szSendMSG[0] = 0x40 + nAddr; szSendMSG[1] = 0x00; szSendMSG[2] = 0x00; szSendMSG[3] = 0x00; WORD nSum = szSendMSG[0] + szSendMSG[1] + szSendMSG[2]; szSendMSG[4] = nSum & 0x00FF; szSendMSG[5] = nSum >> 8; szSendMSG[6] = (szSendMSG[0] >> 7) + (szSendMSG[1] >> 7) + (szSendMSG[2] >> 7) + (szSendMSG[3] >> 7) + (szSendMSG[4] >> 7) + (szSendMSG[5] >> 7); int iLen = 7; if (WaitForSingleObject(m_hSemComm,0) == WAIT_OBJECT_0 ) { ResetEvent(m_hSemComm); int nResult = pComm->Write(szSendMSG, iLen); if (nResult != iLen){ SetEvent(m_hSemComm); return EER_CODE_COM_REGNUM; } } else{ return ERR_CODE_COM_BUSY; } #endif return 0; } int CKehua_FR_UK::Recv_ReadDeviceData(int nAddr,CCommProcess *pComm,char *szCmd) { #if DEBUG_KH_FRUK //LOG4C((LOG_NOTICE,"->Recv_ReadDeviceData")); int nProcessLen(0),nReadLen(0); char *pBuff = new char[MAX_RECE_MSG]; memset(pBuff, 0 , MAX_RECE_MSG); nReadLen = pComm->Read((BYTE *)pBuff,MAX_RECE_MSG); int nRet = 0; if (nRet != 0) { SetEvent( m_hSemComm ); if( pBuff != NULL) { delete[] pBuff; pBuff = NULL; } LOG4C((LOG_NOTICE,"->RTN校验出错:%d",nRet)); return nRet; //RTN校验出错 } if (nReadLen <= 0){ SetEvent(m_hSemComm); if (pBuff != NULL) { delete [] pBuff; pBuff = NULL; } LOG4C((LOG_NOTICE,"->串口没有读到数据")); return ERR_CODE_COM_READ_NO_DATA; } //长度校验出错 ; //LOG4C((LOG_NOTICE,"->**0**")); CopyUPSMsg(nAddr, szCmd, pBuff); //LOG4C((LOG_NOTICE,"->**1**")); m_dwOnlineTick[nAddr -1] = GetTickCount(); SetEvent( m_hSemComm ); if( pBuff != NULL) { delete[] pBuff; pBuff = NULL; } #else SimulationCommData(nAddr); #endif return 0; } void CKehua_FR_UK::CopyUPSMsg( int nAddr, char *szCmd, char *pBuffer) { if ( strcmp(szCmd, "cmd-1") ==0 || strcmp(szCmd, "cmd-2") ==0 || strcmp(szCmd, "cmd-3") ==0 || strcmp(szCmd, "cmd-4") ==0 || strcmp(szCmd, "cmd-5") ==0 || strcmp(szCmd, "cmd-6") ==0 || strcmp(szCmd, "cmd-7") ==0 || strcmp(szCmd, "cmd-8") ==0 || strcmp(szCmd, "cmd-9") ==0 || strcmp(szCmd, "cmd-10") ==0 || strcmp(szCmd, "cmd-11") ==0 || strcmp(szCmd, "cmd-12") ==0 || strcmp(szCmd, "cmd-13") ==0 || strcmp(szCmd, "cmd-14") ==0 || strcmp(szCmd, "cmd-15") ==0 ) { #if IS_USE_READMSG_CS EnterCriticalSection(&m_csReadMsg); #endif memcpy(m_szMsg[nAddr -1], pBuffer, sizeof(m_szMsg[nAddr -1])); #if IS_USE_READMSG_CS LeaveCriticalSection(&m_csReadMsg); #endif } } int CKehua_FR_UK::GetUPSMsg(int nAddr, char *szCmd, char *szMsg, int &nIndex, int &nLen, char *szType ) { int nRet(0); if (strcmp(szCmd, "cmd-1") ==0 || strcmp(szCmd, "cmd-2") ==0 || strcmp(szCmd, "cmd-3") ==0 || strcmp(szCmd, "cmd-4") ==0 || strcmp(szCmd, "cmd-5") ==0 || strcmp(szCmd, "cmd-6") ==0 || strcmp(szCmd, "cmd-7") ==0 || strcmp(szCmd, "cmd-8") ==0 || strcmp(szCmd, "cmd-9") ==0 || strcmp(szCmd, "cmd-10") ==0 || strcmp(szCmd, "cmd-11") ==0 || strcmp(szCmd, "cmd-12") ==0 || strcmp(szCmd, "cmd-13") ==0 || strcmp(szCmd, "cmd-14") ==0 || strcmp(szCmd, "cmd-15") ==0 ) { #if IS_USE_READMSG_CS EnterCriticalSection(&m_csReadMsg); #endif DataConversion(szType, m_szMsg[nAddr -1] + nIndex, szMsg, nLen); #if IS_USE_READMSG_CS LeaveCriticalSection(&m_csReadMsg); #endif nRet = 0; } return nRet; } void CKehua_FR_UK::SimulationCommData(int nAddr) { //~10012A0020680033335F439A1963439A99644366665C4333335A4333335D433333B33F0000C03FCDCC8C3F33B3DA43CDCC474200000033B3DA43E71D. memcpy(m_szMsg[nAddr -1], "~10012A0020680033335F439A1963439A99644366665C4333335A4333335D433333B33F0000C03FCDCC8C3F33B3DA43CDCC474200000033B3DA43E71D.", sizeof("~10012A0020680033335F439A1963439A99644366665C4333335A4333335D433333B33F0000C03FCDCC8C3F33B3DA43CDCC474200000033B3DA43E71D.")); } /////////