#include "stdafx.h" #include "stulzprocess.h" #include "Global.h" #include "struct.h" #include "NoticeQueue.h" HANDLE g_STULZRequestThread = NULL; HANDLE g_STULZResponseThread = NULL; DWORD g_dwStulzVariantTick = 0; CRITICAL_SECTION g_csStulzReadOneData; //UPS PARADIGM动态库输出函数 HINSTANCE g_hSTULZLibModule=NULL; STULZ_DLLInitCom pSTULZ_DLLInitCom=NULL; STULZ_DLLInit pSTULZ_DLLInit=NULL; STULZ_DLLUnInit pSTULZ_DLLUnInit=NULL; STULZ_DLLWrCom pSTULZ_DLLWrCom=NULL; int StulzCommandSend(); void UnInitStulzDll(); int GetStulzFromIni(char chRs232cmd[32], char chDataLen[4], char chFuncCode[4]); BOOL LoadStulzDll(CString strpath) { char strFile[256] = {0}; g_hSTULZLibModule = NULL; sprintf(strFile, "%s\\dll\\stulz.dll", strpath); InitializeCriticalSection( &g_csStulzReadOneData ); g_hSTULZLibModule = AfxLoadLibrary(strFile); //STULZ 动态库初始化 if (NULL != g_hSTULZLibModule) { pSTULZ_DLLInitCom =( STULZ_DLLInitCom)::GetProcAddress(g_hSTULZLibModule, "STULZ_DLLInitCom"); pSTULZ_DLLInit =(STULZ_DLLInit)::GetProcAddress(g_hSTULZLibModule, "STULZ_DLLInit"); pSTULZ_DLLUnInit =(STULZ_DLLUnInit)::GetProcAddress(g_hSTULZLibModule,"STULZ_DLLUnInit"); pSTULZ_DLLWrCom =(STULZ_DLLWrCom)::GetProcAddress(g_hSTULZLibModule,"STULZ_DLLWrCom"); return TRUE; } else { return FALSE; } } BOOL InitStulzComm(int iAddr, int iPort, int iBaudrate, int iDataBit, int iStopBit, int iParity, int iIntervals) { if (pSTULZ_DLLInitCom(iAddr,iPort, iBaudrate, iDataBit, iStopBit, iParity, iIntervals))//初始化串口 return TRUE; else return FALSE; } //在SUTLZ设备中,SETBASEPARAM结构中的参数解释: // int nAddr - 控制器ID // int nStartAddr - 如果命令ID为4,表示需读的EEPROM地址;其他的读命令ID,表示变量所在数据包中字节索引号 // int nRegNum - 读取的寄存器个数, 在stulz空调协议中,它表示是数据和校验位的字节数,即协议中下面字节数 // BYTE FuncCode - 命令ID int StulzRequestData(SETBASEPARAM SetBasePara, int nCmdLen, int nPort, int nDevAddr, //char chCmdLen[4], //char chPort[4], //char chAddr[4], char chDevUid[20], int iVarID, char chRs232cmd[32]) { char chMsg[10] = {0}; char chAdrBeginPos[4] = {0}; char chDataLen[4] = {0};//总数据的长度 char chStartAddr[2] = {0};//起始地址 char chNum[2] = {0};//读取的寄存器个数 char FuncCode[4] = {0};//功能码 GetStulzFromIni((char*)chRs232cmd, chDataLen, FuncCode); SetBasePara.FuncCode = (BYTE)atoi(FuncCode); if (SetBasePara.FuncCode==1 || //长状态请求1 SetBasePara.FuncCode==33 || //长状态请求2 SetBasePara.FuncCode==9 || //控制器状态2 SetBasePara.FuncCode==10 ||//控制器ID SetBasePara.FuncCode==11 ||//单元配置 SetBasePara.FuncCode==12)//c5000增加项 { sprintf(chAdrBeginPos, "%d", SetBasePara.nStartAddr); } int nRet = pSTULZ_DLLInit( nPort, nDevAddr, SetBasePara, atoi(chDataLen), atoi(chAdrBeginPos), nCmdLen, chMsg ); if(nRet==0) { nRet = StulzSingleResponseData(chDevUid, iVarID, chMsg); } return nRet; } int StulzSingleResponseData(char chDevUid[20], int iVarID, char chMsg[10]) { 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_csStulzReadOneData); pDev->m_dwOnlineTick = GetTickCount(); LeaveCriticalSection(&g_csStulzReadOneData); 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; int nStartReg, nEndReg; if( nEndBit - nStartBit < 7 )// 一般告警状态会这样子定义,Modbus Rtu 码暂时没有碰到,没有经过调试,待测试 { if( nDataLen == 1 ) { char chBuffer[8] = {0}; memset(chBuffer, 0, sizeof(chBuffer)); //nValue = (AsciiToBYTE(chMsg[0]) << 4) | ( AsciiToBYTE(chMsg[0 + 1]) & 0x00FF ); nValue = chMsg[0]; DigitToBinary(chMsg[0], chBuffer, 8) ; //itoa(nValue, chBuffer, 2); CString strTemp; switch( nEndBit - nStartBit ) { case 0: strTemp.Format("%c", chBuffer[nStartBit]); break; case 1: strTemp.Format("%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1]); break; case 2: strTemp.Format("%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2]); break; case 3: strTemp.Format("%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit +3]); break; case 4: strTemp.Format("%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4]); break; case 5: strTemp.Format("%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5]); break; case 6: strTemp.Format("%c%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5], chBuffer[nStartBit + 6]); break; } nValue = atoi(strTemp); //strTemp.Format("%d", } else if( nDataLen == 2 ) { char chBuffer[16] = {0}; memset(chBuffer, 0, sizeof(chBuffer)); memcpy(&wdValue, chMsg, sizeof(WORD)); itoa(wdValue, chBuffer, 2); CString strTemp; switch( nEndBit - nStartBit ) { case 0: strTemp.Format("%c", chBuffer[nStartBit]); break; case 1: strTemp.Format("%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1]); break; case 2: strTemp.Format("%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2]); break; case 3: strTemp.Format("%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit +3]); break; case 4: strTemp.Format("%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4]); break; case 5: strTemp.Format("%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5]); break; case 6: strTemp.Format("%c%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5], chBuffer[nStartBit + 6]); break; } nValue = atoi(strTemp); } } // 特殊变量处理(例如,一个命令返回两个变量的情况) else if( nEndBit - nStartBit == 7 ) // 1个字节的情况 { nStartReg = (int)nStartBit / 8; nEndReg = (int)(nEndBit + 1) / 8; nValue = chMsg[nStartReg]; } else if( nEndBit - nStartBit == 15 ) // 2个字节的情况 { nStartReg = (int)nStartBit / 8; nEndReg = (int)(nEndBit + 1) / 8; memcpy(&wdValue, chMsg, sizeof(WORD)); nValue = (DWORD)ntohs(wdValue); } EnterCriticalSection( &g_csStulzReadOneData ); pBaseVar->m_dbData = (double)(nValue * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csStulzReadOneData ); //TRACE2("变量ID%d, 值=%d\r\n", iVarID, nValue); } else { // 联合类型变量做特殊处理 if( pBaseVar->m_nVarTypeID >= UNION_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= UNION_TYPE_MAX_ID ) { if( nDataLen == 2 ) { //int类型 union __UNION_VAR_INT{ char ch[2]; int value; }unionVarInt; unionVarInt.ch[0] = chMsg[1]; unionVarInt.ch[1] = chMsg[0]; EnterCriticalSection( &g_csStulzReadOneData ); pBaseVar->m_dbData = (double)(unionVarInt.value * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csStulzReadOneData ); //TRACE2("联合类型变量ID%d, 值=%d\r\n", iVarID, unionVarInt.value); } else if( nDataLen == 4 ) { //float类型 union __UNION_VAR_FLOAT{ char ch[4]; float value; }unionVarFloat; unionVarFloat.ch[0] = chMsg[3]; unionVarFloat.ch[1] = chMsg[2]; unionVarFloat.ch[2] = chMsg[1]; unionVarFloat.ch[3] = chMsg[0]; EnterCriticalSection( &g_csStulzReadOneData ); pBaseVar->m_dbData = (double)(unionVarFloat.value * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csStulzReadOneData ); //TRACE2("联合类型变量ID%d, 值=%.1f\r\n", iVarID, unionVarFloat.value); } else if( nDataLen == 8 ) { //double类型 union __UNION_VAR_DOUBLE{ char ch[8]; double value; }unionVarDouble; unionVarDouble.ch[0] = chMsg[7]; unionVarDouble.ch[1] = chMsg[6]; unionVarDouble.ch[2] = chMsg[5]; unionVarDouble.ch[3] = chMsg[4]; unionVarDouble.ch[4] = chMsg[3]; unionVarDouble.ch[5] = chMsg[2]; unionVarDouble.ch[6] = chMsg[1]; unionVarDouble.ch[7] = chMsg[0]; EnterCriticalSection( &g_csStulzReadOneData ); pBaseVar->m_dbData = (double)(unionVarDouble.value * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csStulzReadOneData ); //TRACE2("联合类型变量ID%d, 值=%.1f\r\n", iVarID, unionVarDouble.value); } } else { switch( nDataLen ) { case 1: nValue = chMsg[0]; break; case 2: WORD wdValue; memcpy(&wdValue, chMsg, sizeof(WORD)); nValue = wdValue; break; case 3: // 一般为字符串类型,不作处理 break; case 4: // 保留,暂时不知道什么处理 break; case 5: // 一般为字符串类型,不作处理 break; case 6: // 一般为字符串类型,不作处理 break; case 7: // 一般为字符串类型,不作处理 break; case 8: // 保留,暂时没有用到 break; } EnterCriticalSection( &g_csStulzReadOneData ); 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 = nValue * fCoef * fScale; } else { pBaseVar->m_dbData = (double)(nValue * fCoef); } if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } //g_RtuReadOneData.dbData = (double)(nValue * fCoef); LeaveCriticalSection( &g_csStulzReadOneData ); //TRACE2("普通变量ID%d, 值=%f\r\n", iVarID, g_StulzReadOneData.dbData); } } EnterCriticalSection(&g_csStulzReadOneData); pDev->m_dwOnlineTick = GetTickCount(); LeaveCriticalSection(&g_csStulzReadOneData); return 0; } int RequestWrStulzData(char chDevUid[20], int iVarID, double data)//用于请求写命令操作 { 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]; char chMsg[80] = {0}; BYTE Start= 0x0;//起始位 BYTE StartAddr[3] = {0}; BYTE FuncCode[3] = {0}; BYTE byWithAddrFlag = 0; int nLen = 0; chMsg[0] = pBaseVar->m_nRegStartAddr; chMsg[1] = 7; chMsg[2] = 3; char chdata=0x0; switch(pBaseVar->m_iDataLen) { case 1: { union __Rensitivity1{ char ch; char f; }unionRensitivity1; unionRensitivity1.f = (char)data; chMsg[3] = ByteToAscii((unionRensitivity1.ch) & 0x0f); break; } } char ResDataBuffer[2] = {0}; if( pSTULZ_DLLWrCom(pDev->m_iPort, pDev->m_iDevideaddr, chMsg, ResDataBuffer) == 0) return 0; else return -1; } void UnInitStulzDll() { if (g_hSTULZLibModule != NULL && ( NULL != pSTULZ_DLLUnInit )) { pSTULZ_DLLUnInit(); } DeleteCriticalSection( &g_csStulzReadOneData ); if (g_hSTULZLibModule!= NULL) { AfxFreeLibrary(g_hSTULZLibModule); g_hSTULZLibModule = NULL; } } int GetStulzFromIni(char chRs232cmd[32], char chDataLen[4], char chFuncCode[4]) { char strFile[1024] = {0}; char strValue[128]={0}; wsprintf(strFile, "%s\\config\\stulz.ini", g_strDirectory); //命令模块 GetPrivateProfileString("CMD",chRs232cmd, "", strValue, sizeof(strValue), strFile); //数据总长度 GetPrivateProfileString(strValue, "datanum", "", chDataLen, sizeof(chDataLen), strFile); //命令ID GetPrivateProfileString(strValue, "cmdid", "", chFuncCode, 4, strFile); return 0; }