#include "stdafx.h" #include "Global.h" #include "struct.h" #include "NoticeQueue.h" #include "MostDevice.h" #include "Syslib.h" CRITICAL_SECTION g_csMostDeviceReadOneData; //Most Device动态库输出函数 HINSTANCE g_hMostDeviceLibModule = NULL; DLL_MostDeviceInit pDllMostDeviceInit = NULL; DLL_MostDeviceUnInit pDllMostDeviceUnInit = NULL; DLL_MostDeviceRead pDllMostDeviceRead = NULL; DLL_MostDeviceSet pDllMostDeviceSet = NULL; BOOL LoadMostDeviceDll(CString strpath) { char strFile[256] = {0}; g_hMostDeviceLibModule = NULL; sprintf(strFile, "%s\\dll\\MostDevice.dll", strpath); g_hMostDeviceLibModule = AfxLoadLibrary(strFile); InitializeCriticalSection( &g_csMostDeviceReadOneData ); //Separate 动态库初始化 if (NULL != g_hMostDeviceLibModule) { pDllMostDeviceInit = (DLL_MostDeviceInit)::GetProcAddress(g_hMostDeviceLibModule, "DLL_MostDeviceInit"); pDllMostDeviceUnInit = (DLL_MostDeviceUnInit)::GetProcAddress(g_hMostDeviceLibModule, "DLL_MostDeviceUnInit"); pDllMostDeviceRead = (DLL_MostDeviceRead)::GetProcAddress(g_hMostDeviceLibModule, "DLL_MostDeviceRead"); pDllMostDeviceSet = (DLL_MostDeviceSet)::GetProcAddress(g_hMostDeviceLibModule, "DLL_MostDeviceSet"); return TRUE; } else { return FALSE; } } BOOL InitMostDeviceComm( char szPath[MAX_PATH], // 程序所在路径 char szIniName[MAX_PATH], // 配置文件名称 int iAddr, int iPort, int iBaudrate, int iDataBit, int iStopBit, int iParity, int iIntervals) { if (pDllMostDeviceInit(szPath, szIniName, iPort,iAddr, iBaudrate, iDataBit, iStopBit, iParity, iIntervals))//初始化串口 { return TRUE; } else { return FALSE; } } int MostDeviceRequestData( int nPort, int nDevAddr, char szDevUid[20], int iVarID, char szRs232cmd[MAX_CMD], char szIniName[MAX_PATH]) { int nReversed1 = 0; // 预留整形参数1接口 int nReversed2 = 0; // 预留整形参数2接口 int nReversed3 = 0; // 预留整形参数3接口 int nReversed4 = 0; // 预留整形参数4接口 int nReversed5 = 0; // 预留整形参数5接口 float fReversed1 = 0.0; // 预留float参数1接口 float fReversed2 = 0.0; // 预留float参数2接口 float fReversed3 = 0.0; // 预留float参数3接口 char szReversed1[MAX_RESERVED1] = {0}; // 预留字符数组参数1接口 char szReversed2[MAX_RESERVED2] = {0}; // 预留字符数组参数2接口 char szReversed3[MAX_RESERVED3] = {0}; // 预留字符数组参数3接口 char szReversed4[MAX_RESERVED4] = {0}; // 预留字符数组参数4接口 char szReversed5[MAX_RESERVED5] = {0}; // 预留字符数组参数5接口 char szMsg[MAX_VAR_MSG] = {0}; int nRet = pDllMostDeviceRead(g_strDirectory, szIniName, nPort, nDevAddr, szRs232cmd, szMsg, nReversed1, nReversed2, nReversed3, nReversed4, nReversed5, fReversed1, fReversed2, fReversed3, szReversed1, szReversed2, szReversed3, szReversed4, szReversed5); if( nRet ==0 ) { } else { return -1; } return MostDeviceSingleResponseData(szDevUid, iVarID, szMsg); //return -1; } // 通过采集到的值,赋值变量; int MostDeviceSingleResponseData(char chDevUid[20], int iVarID, char chMsg[MAX_VAR_MSG]) { //*************************通过设备UID,变量ID,获取相应的设备序号,变量索引ID,进行变量赋值************************* 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_csMostDeviceReadOneData); pDev->m_dwOnlineTick = GetTickCount(); LeaveCriticalSection(&g_csMostDeviceReadOneData); DWORD nValue = 0; WORD wdValue = 0; // *********获取转换系数,数据长度,变量子ID************** double fCoef = pBaseVar->m_dbCoefficient; // 转换系数; int nDataLen = pBaseVar->m_iDataLen; // 有效位数; int nVarItemID = pBaseVar->m_nVarItemID; // 取字节位; CString strMsg = CString(chMsg); EnterCriticalSection( &g_csMostDeviceReadOneData ); // m_nMaxValues 最大值,m_nMinValues 最小值 ; m_nMaxConvtRate 最小转换比率 , m_nMinConvtRate 最小转换比率; 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); } // 校正值 m_nRearm; if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csMostDeviceReadOneData ); EnterCriticalSection(&g_csMostDeviceReadOneData); pDev->m_dwOnlineTick = GetTickCount(); //LOG4C((LOG_NOTICE, "pDev->m_dwOnlineTick=%d", pDev->m_dwOnlineTick)); LeaveCriticalSection(&g_csMostDeviceReadOneData); return 0; } int MostDeviceRequestSet( int nPort, int nDevAddr, char szDevUid[20], int iVarID, char szRs232cmd[MAX_CMD], char szIniName[MAX_PATH], char szMsg[MAX_VAR_MSG]) { int nReversed1 = 0; // 预留整形参数1接口 int nReversed2 = 0; // 预留整形参数2接口 int nReversed3 = 0; // 预留整形参数3接口 int nReversed4 = 0; // 预留整形参数4接口 int nReversed5 = 0; // 预留整形参数5接口 float fReversed1 = 0.0; // 预留float参数1接口 float fReversed2 = 0.0; // 预留float参数2接口 float fReversed3 = 0.0; // 预留float参数3接口 char szReversed1[MAX_RESERVED1] = {0}; // 预留字符数组参数1接口 char szReversed2[MAX_RESERVED2] = {0}; // 预留字符数组参数2接口 char szReversed3[MAX_RESERVED3] = {0}; // 预留字符数组参数3接口 char szReversed4[MAX_RESERVED4] = {0}; // 预留字符数组参数4接口 char szReversed5[MAX_RESERVED5] = {0}; // 预留字符数组参数5接口 if( pDllMostDeviceSet(g_strDirectory, szIniName, nPort, nDevAddr, szRs232cmd, szMsg, nReversed1, nReversed2, nReversed3, nReversed4, nReversed5, fReversed1, fReversed2, fReversed3, szReversed1, szReversed2, szReversed3, szReversed4, szReversed5)==0) { } else { return -1; } return 0; //return -1; } void UnInitMostDeviceDll( char szPath[MAX_PATH], // 程序所在路径 char szIniName[MAX_PATH], // 配置文件名称 int nCommPort // 串行端口 ) { if (g_hMostDeviceLibModule != NULL && ( NULL != pDllMostDeviceUnInit )) { pDllMostDeviceUnInit(szPath, szIniName, nCommPort); } DeleteCriticalSection( &g_csMostDeviceReadOneData ); if (g_hMostDeviceLibModule!= NULL) { AfxFreeLibrary(g_hMostDeviceLibModule); g_hMostDeviceLibModule = NULL; } }