| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- //////////////////////////////////////////////////////////////////////////////
- ////// //////
- ////// 文 件: UpsSanTak.cpp //////
- ////// 作 者: Suguobing //////
- ////// 创建时间: //////
- ////// 说 明: SanTak协议 //////
- ////// //////
- ////// 修改时间:2010-08-23 //////
- ////// 修改说明: //////
- ////// //////
- //////////////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "CommProcess.h"
- #include "SanTak_ShiWei.h"
- CSanTakShiWei::CSanTakShiWei( 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_szSanTak_SW_Q2Msg, 0, sizeof(m_szSanTak_SW_Q2Msg));
- memset(m_szSanTak_SW_WAMsg, 0, sizeof(m_szSanTak_SW_WAMsg));
- m_dwOnlineTick = 0;
- m_devOnline = TRUE;
- }
- CSanTakShiWei::~CSanTakShiWei()
- {
- #if IS_USE_READMSG_CS
- DeleteCriticalSection(& m_csReadMsg);
- #endif
- MTVERIFY(CloseHandle(m_hSemComm));
- CloseComm();
- }
- BOOL CSanTakShiWei::UpsSanTakSwOpenComm(int nCommPort, int nAddr, int nRate, int nDataBit, int nStopBit, int nParity, int nInterval)
- {
- BOOL bResult = FALSE;
- bResult = OpenComm( nCommPort, nAddr, nRate, nDataBit, nStopBit, nParity, nInterval );
- return bResult;
- }
- int CSanTakShiWei::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 szSendMsg[UPS_SANTAKSHIWEI_SEND_MSG] = {0};
- char szType[UPS_TYPE_LENGTH] = {0};
- int startBit = 0;
- int endBit = 0;
- m_address = nAddr;
- GetSanTakSwFromIni(szPath, szIniName, szCmd, szSendMsg, szType, nIndex, nLen, startBit, endBit);
- CCommProcess *pComm = FindComm(nCommPort);
- if( pComm == NULL ) return -1;
- int nRet = -1;
-
- if( ( strlen(m_szSanTak_SW_Q2Msg) == 0 &&
- (strcmp(szCmd, "cmd-1") == 0 || strcmp(szCmd, "cmd-2") == 0 ||
- strcmp(szCmd, "cmd-3") == 0 || strcmp(szCmd, "cmd-4") == 0 ||
- strcmp(szCmd, "cmd-6") == 0 || strcmp(szCmd, "cmd-5") == 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-16") == 0 ||
- strcmp(szCmd, "cmd-17") == 0 || strcmp(szCmd, "cmd-18") == 0 ||
- strcmp(szCmd, "cmd-19") == 0 || strcmp(szCmd, "cmd-20") == 0 ||
- strcmp(szCmd, "cmd-31") ==0 ) ||
- (strlen(m_szSanTak_SW_WAMsg) == 0 &&
- (strcmp(szCmd, "cmd-21")==0 || strcmp(szCmd, "cmd-22") == 0 ||
- strcmp(szCmd, "cmd-23") == 0 || strcmp(szCmd, "cmd-24") == 0 ||
- strcmp(szCmd, "cmd-26") == 0 || strcmp(szCmd, "cmd-25") == 0 ||
- strcmp(szCmd, "cmd-27") == 0 || strcmp(szCmd, "cmd-28") == 0 ||
- strcmp(szCmd, "cmd-29") == 0 || strcmp(szCmd, "cmd-30") == 0)) ||
- strcmp(szCmd, "cmd-1") == 0 ||
- strcmp(szCmd, "cmd-11") == 0 ||
- strcmp(szCmd, "cmd-21") == 0 ||
- strcmp(szCmd, "cmd-30") == 0))//UPS工作状态及传送顺序( strlen(m_szSanTak_3C_Q4Msg) == 0 &&
- {
-
- nRet = GetDeviceParam(nAddr, pComm, szSendMsg, 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 = GetSanTak_Sw_Q2Msg(szCmd, szMsg, nIndex, nLen, szType, startBit, endBit);
- nRet = GetSanTak_Sw_WAMsg(szCmd, szMsg, nIndex, nLen, szType, startBit, endBit);
- //LOG4C_HEX_DUMP((LOG_NOTICE, szMsg, sizeof(szMsg)));
- //LOG4C((LOG_NOTICE, "%s=%d, sizeof = %d, return %d", szCmd, atoi(szMsg), sizeof(buf), nRet));
- return nRet;
- }
- int CSanTakShiWei::GetSanTak_Sw_Q2Msg(char szCmd[MAX_CMD], char szMsg[VAR_MSG], int &nIndex, int &nLen, char szType[TYPE_LENGTH], int startBit, int endBit)
- {
- 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-6") == 0 || strcmp(szCmd, "cmd-5") == 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-16") == 0 ||
- strcmp(szCmd, "cmd-17") == 0 || strcmp(szCmd, "cmd-18") == 0 ||
- strcmp(szCmd, "cmd-19") == 0 || strcmp(szCmd, "cmd-20") == 0 ||
- strcmp(szCmd, "cmd-31") == 0)
- {
- #if IS_USE_READMSG_CS
- EnterCriticalSection(&m_csReadMsg);
- #endif
- DataConversion(szType, m_szSanTak_SW_Q2Msg + nIndex, szMsg, nLen, startBit, endBit);
- //LOG4C((LOG_NOTICE, "GetSanTak_3C_Q1Msg"));
- //LOG4C_HEX_DUMP((LOG_INFO, m_szSanTak_SW_Q2Msg, sizeof(m_szSanTak_SW_Q2Msg)));
- //LOG4C_HEX_DUMP((LOG_INFO, szMsg, 6 ));
- #if IS_USE_READMSG_CS
- LeaveCriticalSection(&m_csReadMsg);
- #endif
- nRet = 0;
- }
- return nRet;
- }
- int CSanTakShiWei::GetSanTak_Sw_WAMsg(char szCmd[MAX_CMD], char szMsg[VAR_MSG], int &nIndex, int &nLen, char szType[TYPE_LENGTH], int startBit, int endBit )
- {
- int nRet = 0;
- if (strcmp(szCmd, "cmd-21")==0 || strcmp(szCmd, "cmd-22") == 0 ||
- strcmp(szCmd, "cmd-23") == 0 || strcmp(szCmd, "cmd-24") == 0 ||
- strcmp(szCmd, "cmd-26") == 0 || strcmp(szCmd, "cmd-25") == 0 ||
- strcmp(szCmd, "cmd-27") == 0 || strcmp(szCmd, "cmd-28") == 0 ||
- strcmp(szCmd, "cmd-29") == 0 || strcmp(szCmd, "cmd-30") == 0)
- {
- #if IS_USE_READMSG_CS
- EnterCriticalSection(&m_csReadMsg);
- #endif
- DataConversion(szType, m_szSanTak_SW_WAMsg + nIndex, szMsg, nLen, startBit, endBit);
- //LOG4C((LOG_NOTICE, "GetSanTak_3C_Q4Msg"));
- //LOG4C_HEX_DUMP((LOG_INFO, m_szSanTak_3C_Q4Msg,sizeof(m_szSanTak_3C_Q4Msg)));
- //LOG4C_HEX_DUMP((LOG_INFO, szMsg, 5 ));
- #if IS_USE_READMSG_CS
- LeaveCriticalSection(&m_csReadMsg);
- #endif
- nRet = 0;
- }
- return nRet;
- }
- int CSanTakShiWei::GetDeviceParam(int nAddr,
- CCommProcess *pComm, //串口对象指针
- char szSendMsg[UPS_SANTAKSHIWEI_SEND_MSG], //发送Buffer
- char szCmd[MAX_CMD], // 命令
- char szMsg[VAR_MSG], // 接收Buffer
- int &nIndex, // 变量索引,针对接收Buffer而言
- int &nLen, // 变量长度
- char szType[TYPE_LENGTH]) // 变量数据类型
- {
- int nRet = -1;
- nRet = RequestStatus(nAddr, pComm, szSendMsg);
- if( nRet != 0 )
- {
- return nRet; // 串口忙
- }
- nRet = ResponseStatus(nAddr, pComm, szCmd, szMsg, nIndex, nLen, szType);
- return nRet;
- }
- int CSanTakShiWei::GetSanTakSwFromIni( char szPath[MAX_PATH], //服务器程序所在目录
- char szIniName[MAX_PATH], //配置文件名
- char szCmd[MAX_CMD], //命令
- char szSanTakSendMsg[MAX_CMD], //发送Buffer
- char nType[MAX_CMD],
- int &nIndex,
- int &nLen,
- int &startBit,
- int &endBit)
- {
- CHAR szFile[MAX_PATH + 1] = "";
- wsprintf(szFile, "%s\\config\\%s", szPath, szIniName);
- TRACE("szFile =%s\n",szFile);
- GetPrivateProfileString(szCmd, "SendCmd", "", szSanTakSendMsg, 10, szFile);
- szSanTakSendMsg[strlen(szSanTakSendMsg)] = 0x0D;
- 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 CSanTakShiWei::RequestStatus(int nAddr, CCommProcess *pComm, char chSendMsg[UPS_SANTAKSHIWEI_SEND_MSG] )
- {
- #if DEBUG_SANTAKSHIWEI //开关量,用于测试模拟数据
- REQUEST_STRUCT structResuest;
- int nLen = sizeof(REQUEST_STRUCT);
- char chkSumBuf[5] ={0};
- char addBuf[UPS_TYPE_LENGTH] = {0};
- memset(&structResuest,0,nLen);
- //
- memcpy(structResuest.chkSum, chSendMsg, 2);
- structResuest.midBuf = 0x2C;
- structResuest.addr[0] = ByteToAscii((nAddr >> 4) & 0x0f);;
- structResuest.addr[1] = ByteToAscii(nAddr & 0x0f);
- 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);
- //LOG4C_HEX_DUMP((LOG_NOTICE, chSendMsg, 3));
- //LOG4C((LOG_NOTICE, "CSanTak::RequestStatus chSendMsg = %s, nResult = %d, nDatalen = %d", chSendMsg,nResult, nDatalen));
- if (nResult == nDatalen)
- {
- }
- else
- {
- SetEvent(m_hSemComm);
- return EER_CODE_SANTAKSHIWEI_COM_REGNUM;
- }
- }
- else
- {
- return ERR_CODE_SANTAKSHIWEI_COM_BUSY; //串口忙
- }
- #endif
- return 0;
- }
- int CSanTakShiWei::ResponseStatus(int nAddr,
- CCommProcess *pComm,
- char szCmd[MAX_CMD],
- char szMsg[VAR_MSG],
- int &nIndex,
- int &nLen,
- char szType[TYPE_LENGTH]
- )
- {
- #if DEBUG_SANTAKSHIWEI
- int nReceiveLen = 0;
- int nProcessLen = 0;
- int nReadLen = 0;
- RESPONSE_STRUCT strcutResponse;
- memset(&strcutResponse, 0, sizeof(RESPONSE_STRUCT));
- nReceiveLen = sizeof(RESPONSE_STRUCT);
- char *pBuff = new char[nReceiveLen];
- memset(pBuff, 0 , nReceiveLen);
- nReadLen = pComm->Read((BYTE *)pBuff,nReceiveLen);
- //LOG4C((LOG_NOTICE, "CSanTak::ResponseStatus pBuff = %s, nReadLen = %d, nReceiveLen = %d", pBuff, nReadLen, nReceiveLen));
- if (nReadLen <= 0)
- {
- SetEvent(m_hSemComm);
- if (pBuff != NULL)
- {
- delete [] pBuff;
- pBuff = NULL;
- }
- return ERR_CODE_SANTAKSHIWEI_COM_READ_NO_DATA;
- }
- //长度校验出错
- SetSanTakSwQ2Msg(szCmd, pBuff);
- SetSanTakSwWAMsg(szCmd, pBuff);
- m_dwOnlineTick = GetTickCount();
- // 设置串口等待事件为有信号
- SetEvent( m_hSemComm );
- if( pBuff != NULL)
- {
- delete[] pBuff;
- pBuff = NULL;
- }
- #else
- SimulationCommData();
- #endif
- //LOG4C((LOG_NOTICE, "SimulationCommData"));
- return 0;
- }
- void CSanTakShiWei::SetSanTakSwQ2Msg(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 ||
- strcmp(szCmd, "cmd-6") == 0 || strcmp(szCmd, "cmd-5") == 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-16") == 0 ||
- strcmp(szCmd, "cmd-17") == 0 || strcmp(szCmd, "cmd-18") == 0 ||
- strcmp(szCmd, "cmd-19") == 0 || strcmp(szCmd, "cmd-20") == 0 ||
- strcmp(szCmd, "cmd-31") == 0)
- {
- #if IS_USE_READMSG_CS
- EnterCriticalSection(&m_csReadMsg);
- #endif
- memcpy(m_szSanTak_SW_Q2Msg, pBuff, sizeof(m_szSanTak_SW_Q2Msg));
- #if IS_USE_READMSG_CS
- LeaveCriticalSection(&m_csReadMsg);
- #endif
- }
- }
- void CSanTakShiWei::SetSanTakSwWAMsg(char szCmd[MAX_CMD], char *pBuff)
- {
- if ( strcmp(szCmd, "cmd-21")==0 || strcmp(szCmd, "cmd-22") == 0 ||
- strcmp(szCmd, "cmd-23") == 0 || strcmp(szCmd, "cmd-24") == 0 ||
- strcmp(szCmd, "cmd-26") == 0 || strcmp(szCmd, "cmd-25") == 0 ||
- strcmp(szCmd, "cmd-27") == 0 || strcmp(szCmd, "cmd-28") == 0 ||
- strcmp(szCmd, "cmd-29") == 0 || strcmp(szCmd, "cmd-30") == 0 )
- {
- #if IS_USE_READMSG_CS
- EnterCriticalSection(&m_csReadMsg);
- #endif
- memcpy(m_szSanTak_SW_WAMsg, pBuff, sizeof(m_szSanTak_SW_WAMsg));
- #if IS_USE_READMSG_CS
- LeaveCriticalSection(&m_csReadMsg);
- #endif
- }
- }
- void CSanTakShiWei::SimulationCommData(void)
- {
- memcpy(m_szSanTak_SW_Q2Msg, "(00 000.0 000.0 000.0 000.0 219.0 219.0 220.0 002 009 021 00.0 407.0 28.3 10000010 000.00 091 0000 00 00 00 06030000 01..", sizeof("(00 000.0 000.0 000.0 000.0 219.0 219.0 220.0 002 009 021 00.0 407.0 28.3 10000000 000.00 091 0000 00 00 00 06030000 01.."));
- memcpy(m_szSanTak_SW_WAMsg, "(01 000.2 000.0 000.0 000.2 000.0 000.0 000.2 000.2 000.1 000.1 000.2 005 00000000.", sizeof("(01 000.2 000.0 000.0 000.2 000.0 000.0 000.2 000.2 000.0 000.0 000.0 005 00000000."));
- }
- int CSanTakShiWei::WriteRequestStatus(char szCmd[MAX_CMD], CCommProcess *pComm, char chSendMsg[UPS_SANTAKSHIWEI_SEND_MSG])
- {
- return 0;
- }
- int CSanTakShiWei::WriteResponseStatus( CCommProcess *pComm, //串口对象指针
- int nAddr, // 设备地址
- char szCmd[MAX_CMD], // 命令
- char szMsg[VAR_MSG], // 接收Buffer
- int &nIndex, // 变量索引,针对接收Buffer而言
- int &nLen, // 变量长度
- char szType[TYPE_LENGTH] // 变量数据类型
- )
- {
- return 0;
- }
- int CSanTakShiWei::SendSetReuest(
- char szPath[MAX_PATH], // 程序所在路径
- char szIniName[MAX_PATH], // 配置文件名称
- int nCommPort, // 串行端口
- int nAddr, // 设备地址
- char szCmd[MAX_CMD], // 请求命令
- char szMsg[VAR_MSG], // 响应的值
- int nReversed1, // 预留整形参数1接口
- int nReversed2, // 预留整形参数2接口
- int nReversed3, // 预留整形参数3接口
- int nReversed4, // 预留整形参数4接口
- int nReversed5, // 预留整形参数5接口
- float fReversed1, // 预留float参数1接口
- float fReversed2, // 预留float参数2接口
- float fReversed3, // 预留float参数3接口
- char szReversed1[MAX_RESERVED1], // 预留字符数组参数1接口
- char szReversed2[MAX_RESERVED2], // 预留字符数组参数2接口
- char szReversed3[MAX_RESERVED3], // 预留字符数组参数3接口
- char szReversed4[MAX_RESERVED4], // 预留字符数组参数4接口
- char szReversed5[MAX_RESERVED5] // 预留字符数组参数5接口
- )
- {
- return 0;
- }
- int CSanTakShiWei::SetDeviceParam( CCommProcess *pComm, //串口对象指针
- int nAddr, // 设备地址
- char szSendMsg[UPS_SANTAKSHIWEI_SEND_MSG], //发送Buffer
- char szCmd[MAX_CMD], // 命令
- char szMsg[VAR_MSG], // 接收Buffer
- int &nIndex, // 变量索引,针对接收Buffer而言
- int &nLen, // 变量长度
- char szType[TYPE_LENGTH] ) // 变量数据类型
- {
-
- return 0;
- }
|