📄 pmacmas.cpp
字号:
#include "msystem.h"#include "PMACMas.h"//#pragma pack(pop)void* CPMACMas::PMACMaster(void *pVoid)//Period and Cycle for PRM=1; Wait IND for PRM=0{ CPMACMas *pAS = (CPMACMas *)pVoid; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); sleep(2); while (1) { pAS->Query(); #ifndef _VIRTUAL_COMM usleep(20000); #else usleep(10000); #endif }}CPMACMas::~CPMACMas(){ if (m_hThread > 0) { cout << "CPMACMas" << m_hThread << endl; pthread_cancel(m_hThread); }}bool CPMACMas::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,PMACMaster,(void *)this) == 0) bRet = true; pthread_attr_destroy(&attr); return bRet;}void CPMACMas::Query(){ for (WORD w=0;w<256;w++) { if (m_wBreakCount[w] < 5) { m_dwPrev++; break; } } if (!m_subdevmgr.HasOn()) { m_dwPrev++; return; } BYTE byAddr = m_subdevmgr.GetAddrFrmNo(m_bySendNo); BYTE byType = m_subdevmgr.GetTypeFrmAddr(byAddr); if (byAddr == 0xff) return; if(m_bySendOrder==0) { GetData(byAddr,byType); } else if(byType==dt_ehlk2&&m_bySendOrder==m_byLoopEnd) { Gethlk2YX(byAddr); } else if(byType==dt_eGKJ0&&m_bySendOrder==m_byLoopEnd) { GetGKJ0YX(byAddr); } else if(byType==dt_ePMAC720&&m_bySendOrder==m_byLoopEnd) { GetData(byAddr,byType); } else if(byType==dt_ePDM803A&&m_bySendOrder==m_byLoopEndDEF) { GetData(byAddr,byType); } else if(byType==dt_ePDM820&&m_bySendOrder==m_byLoopEndDEF) { GetData(byAddr,byType); } else if(byType==dt_eDDEF&&m_bySendOrder==1) //test by lisheng 6.21 { GetREF542plusYX(byAddr); } else if(byType==dt_eDDEF&&m_bySendOrder==2) //test by lisheng 6.21 { GetREF542plusYX1(byAddr); } else if(byType==dt_eDDEF&&m_bySendOrder==3) //test by lisheng 6.21 { GetREF542plusYX2(byAddr); } else if(byType==dt_eDDEF&&m_bySendOrder==4) //test by lisheng 6.21 { GetREF542plusYX3(byAddr); } else if(byType==dt_eDDEF1&&m_bySendOrder==1) //test by lisheng 6.21 { GetREF543plusYX(byAddr); } else if(byType==dt_eDDEF1&&m_bySendOrder==2) //test by lisheng 6.21 { GetREF543plusYX1(byAddr); } else if(byType==dt_eDDEF1&&m_bySendOrder==3) //test by lisheng 6.21 { GetREF543plusYX2(byAddr); } else if(byType==dt_eDDEF&&m_bySendOrder==4) //test by lisheng 6.21 { GetREF543plusYX3(byAddr); } if((m_bySendOrder++>=6) || (m_bySendNo == 0xff)) { m_bySendOrder = 0; m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo);//2007.03.15 if(m_bySendNo==0) { if(m_byLoopEnd++>=6) m_byLoopEnd=1; } }}void CPMACMas::SyncClock(){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x10; FNSend.m_byDesAddr =0;//byAddr; //广播地址 FNSend.SetSize(9); BYTE* pbyTemp = FNSend.m_pbyData; SW(1200,pbyTemp); SW(2,pbyTemp); *pbyTemp++ = 4; CTimeVal tv; SHDW(tv.Get_sec()+8*3600,pbyTemp); m_DLService.REQ(0,&FNSend,FNRecv,0,false);//Send - No Respond pthread_mutex_unlock(&m_mutex);}bool CPMACMas::YK(WORD wDevNo,BYTE byRoute,bool bIsOn){ bool bRet = false; pthread_mutex_lock(&m_mutex); BYTE byAddr = m_subdevmgr.GetAddrFrmDevNo(wDevNo); BYTE byType = m_subdevmgr.GetTypeFrmAddr(byAddr); if (byAddr != 0xff) { switch (byType) { case dt_ePMAC9900E: //PMAC9900E写继电器寄存器 { WORD byRoadNo = 905 + byRoute - 1; CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x10; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(7); BYTE* pbyTemp = FNSend.m_pbyData; SW(byRoadNo,pbyTemp); SW(1,pbyTemp); *pbyTemp++ = 2; SW((bIsOn ? 1:0),pbyTemp); m_DLService.SetEchoLen(8); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x10) bRet = true; } } break; case dt_eDDEF: //dt_eDDEF写继电器寄存器 { WORD byRoadNo = byRoute - 1; CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x0F; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(34); BYTE* pbyTemp = FNSend.m_pbyData; SW(byRoadNo,pbyTemp); SW((bIsOn ? 1:0),pbyTemp); m_DLService.SetEchoLen(34); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x0F) bRet = true; } } break; default: { BYTE byRoadNo = byRoute - 1; CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x5; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); BYTE* pbyTemp = FNSend.m_pbyData; SW(byRoadNo,pbyTemp); SW((bIsOn ? 0xff00:0),pbyTemp); m_DLService.SetEchoLen(8); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x5) bRet = true; } } break; } } pthread_mutex_unlock(&m_mutex); return bRet;}void CPMACMas::GetData(BYTE byAddr,BYTE byType){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); BYTE* pbyTemp = FNSend.m_pbyData; WORD wEcho=0; switch (byType) { case dt_ePM100EN: SW(0,pbyTemp); SW(58,pbyTemp); wEcho = 58*2 + 1; break; case dt_ePMAC720: switch(m_bySendOrder) { case 0: SW(0,pbyTemp); SW(58,pbyTemp); wEcho = 58*2 + 1; break; default: SW((m_bySendOrder+1)*100,pbyTemp); SW(16,pbyTemp); wEcho = 16*2 + 1; break; } break; case dt_ePMAC9900E: SW(10,pbyTemp); SW(52,pbyTemp); wEcho = 52*2 + 1; break; case dt_ePMAC9900N: SW(10,pbyTemp); SW(8,pbyTemp); wEcho = 8*2 + 1; break; case dt_ePMAC9900: SW(10,pbyTemp); SW(62,pbyTemp); wEcho = 62*2 + 1; break; case dt_ePMAC600B: SW(0,pbyTemp); SW(36,pbyTemp); wEcho = 36*2 + 1; break; case dt_ePDM820: //add by li sheng SW(378,pbyTemp); //(add by lisheng 2007 .3.26) 6.15 瞬时值地址 SW(33,pbyTemp); //(add by lisheng 2007 .3.26) 6.15 wEcho =33*2 + 1; //(add by lisheng 2007.3.26) 6.15 break; case dt_ePDM803A: //add by li sheng SW(253,pbyTemp); //(add by lisheng) SW(35,pbyTemp); //(add by lisheng) wEcho = 35*2 + 1; //(add by lisheng) break; case dt_eDDEF: //add by li sheng SW(0,pbyTemp); SW(34,pbyTemp); wEcho = 34*2 + 1; FNSend.m_byCID = 0x4; break; case dt_eDDEF1: //add by li sheng SW(0,pbyTemp); SW(34,pbyTemp); wEcho = 34*2 + 1; FNSend.m_byCID = 0x4; break; case dt_ePMAC600A: SW(0,pbyTemp); SW(12,pbyTemp); wEcho = 12*2 + 1; break; case dt_ePMAC303: SW(10,pbyTemp); SW(66,pbyTemp); wEcho = 66*2 + 1; break; case dt_ePMAC503: SW(0,pbyTemp); SW(18,pbyTemp); wEcho = 18*2 + 1; break; case dt_ePMAC503E: SW(0,pbyTemp); SW(19,pbyTemp); wEcho = 19*2 + 1; break; case dt_eREF542plus: SW(0,pbyTemp); SW(34,pbyTemp); wEcho = 34*2 + 2; FNSend.m_byCID = 0x4; break; case dt_eWGK31001: SW(0,pbyTemp); SW(34,pbyTemp); wEcho = 34*2 + 1; FNSend.m_byCID = 0x4; break; case dt_eLDWKY: SW(0,pbyTemp); SW(4,pbyTemp); wEcho = 4*2 + 1; FNSend.m_byCID = 0x3; break; case dt_eDCRJ: SW(1,pbyTemp); SW(16,pbyTemp); wEcho = 16*2 + 1; FNSend.m_byCID = 0x4; break; case dt_eJBK3000: SW(0x1000,pbyTemp); SW(25,pbyTemp); wEcho = 25*2 + 1; break; case dt_eFJTWKY: SW(0,pbyTemp); SW(6,pbyTemp); wEcho = 6*2 + 1; break; case dt_eZGDWKY: SW(99,pbyTemp); SW(6,pbyTemp); wEcho = 6*2 + 1; break; case dt_ehlk2: SW(0,pbyTemp); SW(16,pbyTemp); wEcho = 16*2 + 1; break; case dt_eTTC310: SW(43,pbyTemp); SW(4,pbyTemp); wEcho = 4*2 + 1; break; case dt_eWKY0: SW(0,pbyTemp); SW(5,pbyTemp); wEcho = 5*2 + 1; break; case dt_eGKJ0: SW(0,pbyTemp); SW(42,pbyTemp); wEcho = 42*2 + 1; break; case dt_eSepam20_B21: SW(262,pbyTemp); SW(17,pbyTemp); wEcho = 17*2 + 1; break; case dt_eSepam40_S40: SW(275,pbyTemp); SW(70,pbyTemp); wEcho = 70*2 + 1; break; default: return; } #ifdef _VIRTUAL_COMM BYTE* pbyVD = new BYTE[wEcho]; for (WORD ww=0;ww<wEcho; ww++) { if (ww == 0) pbyVD[ww] = wEcho-1; else pbyVD[ww] = ww; } switch (byType) { case dt_ePMAC9900: Exp9900Data(byAddr,pbyVD,wEcho); break; case dt_ePMAC720:// Exp720Data(byAddr,pbyVD,wEcho); break; case dt_ePMAC303:// ExpPMAC303Data(byAddr,pbyVD,wEcho); break; case dt_ePMAC9900N:// Exp9900NData(byAddr,pbyVD,wEcho); break; case dt_ePMAC600B:// Exp600BData(byAddr,pbyVD,wEcho); break; case dt_ePDM820://add by li sheng ExpPDM800Data(byAddr,pbyVD,wEcho); break; case dt_ePDM803A://add by li sheng ExpPDM803AData(byAddr,pbyVD,wEcho); break; case dt_eDDEF://add by li sheng ExpDDEFData(byAddr,pbyVD,wEcho); break; case dt_eDDEF1://add by li sheng ExpDDEF1Data(byAddr,pbyVD,wEcho); case dt_eREF542plus: ExpREF542plusYX(byAddr,pbyVD,wEcho); break; case dt_eWGK31001: ExpWGKYC(byAddr,pbyVD,wEcho); break; case dt_eJBK3000: ExpJBK3000YC(byAddr,pbyVD,wEcho); break; case dt_eLDWKY: ExpLDWKYYC(byAddr,pbyVD,wEcho); break; case dt_eTTC310: ExpTTC310YC(byAddr,pbyVD,wEcho); break; case dt_eDCRJ: ExpDCRJData(byAddr,pbyVD,wEcho,0); break; case dt_eFJTWKY: ExpFJTWKYData(byAddr,pbyVD,wEcho); break; case dt_ePMAC503E: Exp503EData(byAddr,pbyVD,wEcho); break; case dt_ehlk2: Exphlk2YC(byAddr,pbyVD,wEcho); case dt_eGKJ0: ExpGKJ0YC(byAddr,pbyVD,wEcho); break; default: break; } delete [] pbyVD; #else m_DLService.SetEchoLen(4+wEcho); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (((FNRecv.m_byCID & 0x80) == 0) && (FNRecv.m_wSize == wEcho)) { switch (byType) { case dt_ePMAC9900: Exp9900Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePMAC720:// Exp720Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePM100EN:// Exp100ENData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePMAC9900E: Exp9900EData(byAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePMAC9900N:// Exp9900NData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); #ifdef _DEBUGUC cout<<"9900N \r\n"<<endl; #endif break; case dt_ePMAC600B:// Exp600BData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePDM820://add by li sheng ExpPDM800Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); //add by li sheng break; //add by li sheng case dt_ePDM803A://add by li sheng ExpPDM803AData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); //add by li sheng break; case dt_eDDEF://add by li sheng ExpDDEFData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); //add by li sheng break; case dt_eDDEF1://add by li sheng ExpDDEF1Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); //add by li sheng break; case dt_ePMAC600A:// Exp600AData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePMAC303:// ExpPMAC303Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePMAC503:// ExpPMAC503Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eREF542plus: ExpREF542plusYX(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ePMAC503E: ExpPMAC503EData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eWGK31001: ExpWGKYC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eJBK3000: ExpJBK3000YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eLDWKY: ExpLDWKYYC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eDCRJ: ExpDCRJData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize,0); break; case dt_eFJTWKY:// ExpFJTWKYData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eZGDWKY:// ExpZGDWKYData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_ehlk2://hlk2类型和遥测解析函数的指向声明 Exphlk2YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eTTC310: ExpTTC310YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eWKY0: ExpWKY0Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eGKJ0: ExpGKJ0YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eSepam20_B21: ExpSepam20_B21YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; case dt_eSepam40_S40: ExpSepam40_S40YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); break; default: break; } } if (m_wBreakCount[byAddr]==0) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = 0xff; m_pAllMgr->YX(&d, 1); } m_wBreakCount[byAddr] = 0; } else { if (m_wBreakCount[byAddr] >= 5) { m_wBreakCount[byAddr]++; YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = 0xff00; m_pAllMgr->YX(&d, 1); } else if (m_wBreakCount[byAddr] < 5) m_wBreakCount[byAddr]++; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -