/************************************************* /* 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)); 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; } } 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,"打开串口")); 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(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-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 [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; } 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[nAddr -1] = GetTickCount(); SetEvent( m_hSemComm ); if( pBuff != NULL){ delete[] pBuff; pBuff = NULL; } #else SimulationCommData(nAddr); #endif return 0; } void CSF6::GetTHData(int nAddr, char szCmd[MAX_CMD],char *szType, char *szConvMsg,int nIndex, int nlen) { DataConversion(szType, m_szMsg[nAddr -1] + nIndex, szConvMsg, nlen); 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(int nAddr, char szCmd[MAX_CMD],char *szType,char *szConvMsg,int nIndex ,int nlen) { DataConversion(szType, m_szMsg[nAddr -1] + 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(nAddr,szCmd,szType,szMsg,nIndex,nLen); break; default: // SF6 O2; GetSF6Data(nAddr, szCmd,szType,szMsg,nIndex,nLen); break; } #if IS_USE_READMSG_CS LeaveCriticalSection(&m_csReadMsg); #endif nRet = 0; } return nRet; } void CSF6::SetMsg(int nAddr ,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[nAddr -1], pBuff, sizeof(m_szMsg[nAddr -1])); #if IS_USE_READMSG_CS LeaveCriticalSection(&m_csReadMsg); #endif } } void CSF6::SimulationCommData(int nAddr) { #if 1 m_szMsg[nAddr -1][0] = 0xF6; m_szMsg[nAddr -1][1] = 0x20; m_szMsg[nAddr -1][2] = 0x6D; m_szMsg[nAddr -1][3] = 0x00; #else m_szMsg[nAddr -1][0] = 0xF6; m_szMsg[nAddr -1][1] = 0x2E; m_szMsg[nAddr -1][2] = 0x86; m_szMsg[nAddr -1][3] = 0x2F; #endif }