📄 pm500mal.cpp
字号:
#include "pm500mal.h"#include "allmgr.h"CPM500Mas::~CPM500Mas(){ if (m_hThread > 0) { cout << "PM500Mas" << m_hThread << endl; pthread_cancel(m_hThread); }}void* PM500Master(void *pVoid)//Period and Cycle for PRM=1; Wait IND for PRM=0{ CPM500Mas *pAS = (CPM500Mas *)pVoid; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); while (1) { pAS->Run(); }}bool CPM500Mas::Init(){ bool bRet = false; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&m_hThread,&attr,PM500Master,(void *)this) == 0) bRet = true; pthread_attr_destroy(&attr); return bRet;}void CPM500Mas::Run(){ while (m_DLService.Status() != 0) sleep(1); CFrameNode FNSend; CFrameNode FNRecv; int nEcho = GetPeriod(FNSend); pthread_mutex_lock(&m_mutex); //nEcho=0:Send no reply;=1:Send - Respond;=-1:No send; WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNSend.m_byDesAddr ); if ((nEcho!=-1) && (m_DLService.REQ((BYTE) nEcho,&FNSend,FNRecv,(BYTE) 0,true) == 1)) { ExplainRESP(&FNRecv); if (m_wBreakCount[FNSend.m_byDesAddr ] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = false; m_pAllMgr->YX(&d, 1); } m_wBreakCount[FNSend.m_byDesAddr ] = 0; } else { if (m_wBreakCount[FNSend.m_byDesAddr ] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = true; m_pAllMgr->YX(&d, 1); } else m_wBreakCount[FNSend.m_byDesAddr ]++; } pthread_mutex_unlock(&m_mutex);}int CPM500Mas::GetPeriod(CFrameNode& fn) //ret -1:no send data; 0:no echo frame; 1:have echo frame//bool CPM500Mas::GetSendData(CFrameNode& fn){ int nRet = -1; while (!m_subdevmgr.HasOn()) sleep(1); while (m_subdevmgr.GetNum() != 10) sleep(1); if((m_bySendOrder++>=1) || (m_bySendNo == 0xff)) { m_bySendOrder = 0; m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo); } switch(m_bySendOrder) { case 0: GetYC(m_bySendNo,fn,0x300,0x30); nRet = 1; break; case 1: GetYC(m_bySendNo,fn,0x356,0x34); nRet = 1; break; } return nRet;}void CPM500Mas::ExplainRESP(CFrameNode* pFNRecv)//void CPM500Mas::ExplainRecvData(BYTE* pbyInBuf,WORD wInSize){ BYTE* pbyData = pFNRecv->m_pbyData; BYTE bySize = (BYTE) pFNRecv->m_wSize; if (pbyData && bySize) { BYTE byAddr = pFNRecv->m_bySrcAddr; ExpYCData(byAddr,pbyData,bySize); }}void CPM500Mas::GetYC(BYTE byNo,CFrameNode& fn,WORD wAddr,BYTE byLen){ BYTE byAddr = m_subdevmgr.GetAddrFrmNo(m_bySendNo); if (byAddr == 0xff) return; fn.m_byDesAddr = byAddr; fn.m_byCID = 0x3; fn.SetSize(4); WORD* pData = (WORD *)fn.m_pbyData; pData[0] = CW(wAddr); pData[1] = CW(byLen); m_DLService.SetEchoLen(5+byLen*2);}void CPM500Mas::ExpYCData(BYTE byAddr,BYTE* pbyData,BYTE bySize){ BYTE* pbyTemp = pbyData + 1; WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); YCData* pData = new YCData [bySize/4]; DWORD* pdwOrigValue = (DWORD *)pbyTemp; for (WORD w=0; w<bySize/4; w++) { pData[w].m_wDevNo = wDevNo; pData[w].m_wDevPtNo = w + 1 + ((m_bySendOrder%2)?(0x56/2):0); if (((pData[w].m_wDevPtNo >=16) && (pData[w].m_wDevPtNo <= 24)) || (pData[w].m_wDevPtNo ==12) || (pData[w].m_wDevPtNo ==13) || ((pData[w].m_wDevPtNo >=52) && (pData[w].m_wDevPtNo <= 55))) { DWORD dwValue = CDW(*pdwOrigValue++); int* pInt = (int *)&dwValue; pData[w].m_fValue = *pInt; } else pData[w].m_fValue = CDW(*pdwOrigValue++); } m_pAllMgr->YC(pData,(WORD)bySize/4);// MailYC(m_subdevmgr.GetDeviceNo(byNo),pData, wSendSize); delete pData;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -