#include "stdafx.h" #include "Global.h" #include "struct.h" #include "NoticeQueue.h" #include "Separate.h" HANDLE g_SeparateRequestThread = NULL; HANDLE g_SeparateResponseThread = NULL; DWORD g_dwSeparateVariantTick = 0; CRITICAL_SECTION g_csSeparateReadOneData; //icpdas动态库输出函数 HINSTANCE g_hSeparateLibModule = NULL; SEPARATE_DLLInit pSeparate_DLLInit = NULL; SEPARATE_DLLUnInit pSeparate_DLLUnInit; SEPARATE_DLLRead pSeparate_DLLRead = NULL; SEPARATE_DLLWrite pSeparate_DLLWrite = NULL; BOOL LoadSeparateDll(CString strpath) { char strFile[256] = {0}; g_hSeparateLibModule = NULL; sprintf(strFile, "%s\\dll\\Separate.dll", strpath); g_hSeparateLibModule = AfxLoadLibrary(strFile); InitializeCriticalSection( &g_csSeparateReadOneData ); //Separate 动态库初始化 if (NULL != g_hSeparateLibModule) { pSeparate_DLLInit = (SEPARATE_DLLInit)::GetProcAddress(g_hSeparateLibModule, "SEPARATE_DLLInit"); pSeparate_DLLUnInit = (SEPARATE_DLLUnInit)::GetProcAddress(g_hSeparateLibModule, "SEPARATE_DLLUnInit"); pSeparate_DLLRead = (SEPARATE_DLLRead)::GetProcAddress(g_hSeparateLibModule, "SEPARATE_DLLRead"); pSeparate_DLLWrite = (SEPARATE_DLLWrite)::GetProcAddress(g_hSeparateLibModule, "SEPARATE_DLLWrite"); return TRUE; } else { return FALSE; } } BOOL InitSeparateComm(int iAddr, int iPort, int iBaudrate, int iDataBit, int iStopBit, int iParity, int iIntervals) { if (pSeparate_DLLInit(iAddr,iPort, iBaudrate, iDataBit, iStopBit, iParity, iIntervals))//初始化串口 return TRUE; else return FALSE; } int SeparateRequestData( int nPort, int nDevAddr, char szDevUid[20], int iVarID, char szRs232cmd[MAX_CMD], char szIniName[MAX_PATH]) { char szMsg[MAX_VAR_MSG] = {0}; if( pSeparate_DLLRead(nPort, nDevAddr, g_strDirectory, szIniName, szRs232cmd, szMsg)==0) { } else { return -1; } return SeparateSingleResponseData(szDevUid, iVarID, szMsg); //return -1; } int SeparateSingleResponseData(char chDevUid[20], int iVarID, char chMsg[MAX_VAR_MSG]) { int nDeviceIndex = -1, nVarIndex = -1; BOOL bFind = FindVar(chDevUid, iVarID, nDeviceIndex, nVarIndex); if( bFind == FALSE ) return -1; CDevice *pDev = g_pDevicesManager->m_Devices[nDeviceIndex]; CBaseVar *pBaseVar = pDev->m_Vars[nVarIndex]; EnterCriticalSection(&g_csSeparateReadOneData); pDev->m_dwOnlineTick = GetTickCount(); LeaveCriticalSection(&g_csSeparateReadOneData); DWORD nValue = 0; WORD wdValue = 0; double fCoef = pBaseVar->m_dbCoefficient; int nDataLen = pBaseVar->m_iDataLen; int nVarItemID = pBaseVar->m_nVarItemID; if( nVarItemID > 0 )//BIT位变量 { int nStartBit = pBaseVar->m_nStartBit; int nEndBit = pBaseVar->m_nEndBit; if( nEndBit - nStartBit < 7 ) // 一般告警状态会这样子定义,Modbus Ascii码暂时没有碰到,没有经过调试,待测试 { CString strTemp; switch( nEndBit - nStartBit ) { case 0: strTemp.Format("%d", chMsg[nStartBit] - 30); break; } nValue = atoi(strTemp); } EnterCriticalSection( &g_csSeparateReadOneData ); pBaseVar->m_dbData = (double)(nValue * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csSeparateReadOneData ); //TRACE2("变量ID%d, 值=%d\r\n", iVarID, nValue); } else { CString strMsg = CString(chMsg); // 联合类型变量做特殊处理(Separate没有联合类型) if( pBaseVar->m_nVarTypeID >= UNION_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= UNION_TYPE_MAX_ID ) { } else if( nDataLen == 1 ) { EnterCriticalSection( &g_csSeparateReadOneData ); pBaseVar->m_dbData = (double)(atoi(strMsg) * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csSeparateReadOneData ); } else { EnterCriticalSection( &g_csSeparateReadOneData ); if( pBaseVar->m_nMaxValues != 0 || pBaseVar->m_nMinValues != 0 || pBaseVar->m_nMaxConvtRate != 0 || pBaseVar->m_nMinConvtRate != 0 ) { double fScale = (double)(pBaseVar->m_nMaxConvtRate - pBaseVar->m_nMinConvtRate) / (double)(pBaseVar->m_nMaxValues - pBaseVar->m_nMinValues); pBaseVar->m_dbData = atof(strMsg) * fCoef * fScale; } else { pBaseVar->m_dbData = (double)(atof(strMsg) * fCoef); } if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csSeparateReadOneData ); //g_IcpdasReadOneData.dbData = (double)(nValue * fCoef); //TRACE2("普通变量ID%d, 值=%d\r\n", iVarID, g_IcpdasReadOneData.dbData); } } EnterCriticalSection(&g_csSeparateReadOneData); pDev->m_dwOnlineTick = GetTickCount(); LeaveCriticalSection(&g_csSeparateReadOneData); return 0; } void UnInitSeparateDll() { if (g_hSeparateLibModule != NULL && ( NULL != pSeparate_DLLUnInit )) { pSeparate_DLLUnInit(); } DeleteCriticalSection( &g_csSeparateReadOneData ); if (g_hSeparateLibModule!= NULL) { AfxFreeLibrary(g_hSeparateLibModule); g_hSeparateLibModule = NULL; } }