123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- #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;
- default:
- LOG4C((LOG_NOTICE, "起始位与终止位不对",pDev->m_strDeviceName, pBaseVar->m_strDesc));
- }
- 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;
- }
- }
|