/************************************************* /* Copyright (C), 2010-2011,StoneU. Co., Ltd. /* File name: SF6.h /* Author: Zero.t /* Version: Ver1.0.0.1 /* Date: 2011-10-19 /* Description: ## /* Others: RS485; /* Function List: ### /* History: 1.Date: ### Author: ### Modification: ### *************************************************/ #include "StdAfx.h" #include "CommProcess.h" #include ".\sf6.h" CSF6::CSF6( char szPath[MAX_PATH], char szIniName[MAX_PATH], 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)); memset(m_szMsg, 0, sizeof(m_szMsg)); m_dwOnlineTick = 0; m_devOnline = TRUE; } CSF6::~CSF6() { #if IS_USE_READMSG_CS DeleteCriticalSection(& m_csReadMsg); #endif MTVERIFY(CloseHandle(m_hSemComm)); CloseComm(); } BOOL CSF6::SF6OpenComm(int nCommPort, int nAddr, int nRate, int nDataBit, int nStopBit, int nParity, int nInterval) { //LOG4C((LOG_NOTICE,"SF6OpenComm COM%d",nCommPort)); BOOL bResult = FALSE; bResult = OpenComm( nCommPort, nAddr, nRate, nDataBit, nStopBit, nParity, nInterval ); return bResult; } int CSF6::SendReadRequest( char szPath[MAX_PATH], char szIniName[MAX_PATH], int nCommPort, int nAddr, char szCmd[MAX_CMD], char szMsg[VAR_MSG], int nReversed1, int nReversed2, int nReversed3, int nReversed4, int nReversed5, float fReversed1, float fReversed2, float fReversed3, char szReversed1[MAX_RESERVED1], char szReversed2[MAX_RESERVED2], char szReversed3[MAX_RESERVED3], char szReversed4[MAX_RESERVED4], char szReversed5[MAX_RESERVED5] ) { int nIndex = 0, nLen = 0; char szType[CMD_TYPE] = {0}; m_address = nAddr; GetParFromIni(szPath, szIniName, szCmd, szType, nIndex, nLen); CCommProcess *pComm = FindComm(nCommPort); if( pComm == NULL ) return -1; int nRet = -1; if( ( strlen((char*)m_szMsg) == 0 && ( strcmp(szCmd,"cmd-1") == 0 || strcmp(szCmd,"cmd-2") == 0 || strcmp(szCmd,"cmd-3") == 0 || strcmp(szCmd,"cmd-4") == 0 ))|| strcmp(szCmd,"cmd-1") == 0 || strcmp(szCmd,"cmd-3") == 0 ) { nRet = GetDeviceParam(nAddr, pComm, szCmd, szMsg, nIndex, nLen, szType ); if( nRet != 0 ) return nRet; } if( GetTickCount() - m_dwOnlineTick > 60 * 1000 && m_dwOnlineTick > 0 ){ m_devOnline = FALSE; } else if( GetTickCount() - m_dwOnlineTick < 60 * 1000 && m_dwOnlineTick > 0 ){ m_devOnline = TRUE; } if( m_devOnline == FALSE ){ return -1; } nRet = GetMsg(nAddr,szCmd, szMsg, nIndex, nLen, szType); //LOG4C((LOG_NOTICE,"szCmd = %s, szMsg = %s",szCmd, szMsg)); return nRet; } int CSF6::GetDeviceParam( int nAddr, CCommProcess *pComm, // 串口对象指针 char szCmd[MAX_CMD], // 命令 char szMsg[VAR_MSG], // 接收Buffer int &nIndex, // 变量索引,针对接收Buffer而言 int &nLen, // 变量长度 char szType[CMD_TYPE] // 变量数据类型 ) { int nRet = -1; nRet = RequestStatus(nAddr, pComm); if( nRet != 0 ) { return nRet; // 串口忙 } nRet = ResponseStatus(nAddr, pComm, szCmd, szMsg, nIndex, nLen, szType); return nRet; } int CSF6::GetParFromIni( char szPath[MAX_PATH], //服务器程序所在目录 char szIniName[MAX_PATH], //配置文件名 char szCmd[MAX_CMD], //命令 char nType[MAX_CMD], int &nIndex, int &nLen ) { CHAR szFile[MAX_PATH + 1] = ""; wsprintf(szFile, "%s\\config\\%s", szPath, szIniName); TRACE("szFile =%s\n",szFile); 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 CSF6::RequestStatus(int nAddr, CCommProcess *pComm ) { #if SF6_DEBUG //开关量,用于测试模拟数据 REQUEST_STRUCT structResuest; int nLen = sizeof(REQUEST_STRUCT); memset(&structResuest,0,nLen); structResuest.Start = 0xF7; structResuest.Add = nAddr+30; structResuest.End = 0x0D; if (WaitForSingleObject(m_hSemComm,0) == WAIT_OBJECT_0 ){ int nDatalen = (int)sizeof(structResuest); ResetEvent(m_hSemComm); int nResult = pComm->Write((BYTE *)&structResuest, nDatalen); if (nResult == nDatalen){ } else{ SetEvent(m_hSemComm); return EER_CODE_SF6_COM_REGNUM; } } else{ return ERR_CODE_SF6_COM_BUSY; //串口忙 } #endif return 0; } int CSF6::ResponseStatus( int nAddr, CCommProcess *pComm, char szCmd[MAX_CMD], char szMsg[VAR_MSG], int &nIndex, int &nLen, char szType[CMD_TYPE] ) { #if SF6_DEBUG int nReceiveLen = 0; int nProcessLen = 0; int nReadLen = 0; RESPONE_STRUCT strcutResponse; memset(&strcutResponse, 0, sizeof(RESPONE_STRUCT)); nReceiveLen = sizeof(RESPONE_STRUCT); char *pBuff = new char[nReceiveLen]; memset(pBuff, 0 , nReceiveLen); nReadLen = pComm->Read((BYTE *)pBuff,nReceiveLen); if (nReadLen <= 0){ SetEvent(m_hSemComm); if (pBuff != NULL){ delete [] pBuff; pBuff = NULL; } return ERR_CODE_SF6_COM_READ_NO_DATA; } SetMsg(szCmd, pBuff); m_dwOnlineTick = GetTickCount(); SetEvent( m_hSemComm ); if( pBuff != NULL){ delete[] pBuff; pBuff = NULL; } #else SimulationCommData(); #endif return 0; } void CSF6::GetTHData(char szCmd[MAX_CMD],char *szType, char *szConvMsg,int nIndex, int nlen) { DataConversion(szType, (char*)(m_szMsg + nIndex), szConvMsg, nlen, 0, 0); unsigned char tmp = szConvMsg[0]; if (strcmp(szCmd,"cmd-1") == 0) { double iData = tmp*0.24 -8; sprintf(szConvMsg,"%lf",iData); } else if (strcmp(szCmd,"cmd-2") == 0) { sprintf(szConvMsg,"%d",tmp); } } void CSF6::GetSF6Data(char szCmd[MAX_CMD],char *szType,char *szConvMsg,int nIndex ,int nlen) { DataConversion(szType, (char*)(m_szMsg + nIndex), szConvMsg, nlen); unsigned char tmp = szConvMsg[0]; if (strcmp(szCmd,"cmd-3") == 0) { double iData = tmp*0.2; sprintf(szConvMsg,"%lf",iData); } else if(strcmp(szCmd,"cmd-4") == 0) { if (szConvMsg[0] >= 10){ sprintf(szConvMsg,"%d",1); } else sprintf(szConvMsg,"%d",0); } } int CSF6::GetMsg(int nAddr,char szCmd[MAX_CMD], char szMsg[VAR_MSG], int &nIndex, int &nLen, char szType[CMD_TYPE] ) { int nRet = 0; if ( strcmp(szCmd,"cmd-1") == 0 || strcmp(szCmd,"cmd-2") == 0 || strcmp(szCmd,"cmd-3") == 0 || strcmp(szCmd,"cmd-4") == 0 ){ #if IS_USE_READMSG_CS EnterCriticalSection(&m_csReadMsg); #endif switch (nAddr){ case 0: case 1: case 16: case 17: GetTHData(szCmd,szType,szMsg,nIndex,nLen); break; default: // SF6 O2; GetSF6Data(szCmd,szType,szMsg,nIndex,nLen); break; } #if IS_USE_READMSG_CS LeaveCriticalSection(&m_csReadMsg); #endif nRet = 0; } return nRet; } void CSF6::SetMsg(char szCmd[MAX_CMD], char *pBuff) { if ( strcmp(szCmd,"cmd-1") == 0 || strcmp(szCmd,"cmd-2") == 0 || strcmp(szCmd,"cmd-3") == 0 || strcmp(szCmd,"cmd-4") == 0 ){ #if IS_USE_READMSG_CS EnterCriticalSection(&m_csReadMsg); #endif memcpy(m_szMsg, pBuff, sizeof(m_szMsg)); #if IS_USE_READMSG_CS LeaveCriticalSection(&m_csReadMsg); #endif } } void CSF6::SimulationCommData(void) { #if 1 m_szMsg[0] = 0xF6; m_szMsg[1] = 0x20; m_szMsg[2] = 0x6D; m_szMsg[3] = 0x00; #else m_szMsg[0] = 0xF6; m_szMsg[1] = 0x2E; m_szMsg[2] = 0x86; m_szMsg[3] = 0x2F; #endif }