📄 sepam2000mas.cpp
字号:
#include "msystem.h"#include "Sepam2000Mas.h"void* Sepam2000Master(void *pVoid)//Period and Cycle for PRM=1; Wait IND for PRM=0{ CSepam2000Mas *pAS = (CSepam2000Mas *)pVoid; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); sleep(2); while (1) { pAS->Query(); usleep(10000); }}CSepam2000Mas::~CSepam2000Mas(){ if (m_hThread > 0) { cout << "CSepam2000Mas" << m_hThread << endl; pthread_cancel(m_hThread); }}bool CSepam2000Mas::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,Sepam2000Master,(void *)this) == 0) bRet = true; pthread_attr_destroy(&attr); return bRet;}void CSepam2000Mas::Query(){ while (!m_subdevmgr.HasOn()) sleep(1); while (m_subdevmgr.GetNum() != 11) sleep(1); CTimeVal tmCurrent; CTimeValSpan tvs = tmCurrent - m_tmRectify; if (m_bFirst || (tvs.GetMinute() >= 1)) { m_bFirst = false; SyncClock(); m_tmRectify = tmCurrent; } else { if((m_bySendOrder++>=2) || (m_bySendNo == 0xff)) { m_bySendOrder = 0; m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo); } BYTE byAddr = m_subdevmgr.GetAddrFrmNo(m_bySendNo); if (byAddr == 0xff) return; switch(m_bySendOrder) { case 0: GetYX1(byAddr); break; case 1: GetYX2(byAddr); break; case 2: GetEvent(byAddr); break; default: // GetYC(byAddr);// break; break; } }}/*void CSepam2000Mas::ACK(BYTE byNo,CFrameNode& fn){ CModbusFrame frame; BYTE byAddr = m_subdevmgr.GetAddr(byNo); if (byAddr == 0xff) return; BYTE* b = new BYTE[4]; WORD* pData = (WORD *)b; pData[0] = CW(0x40); pData[1] = m_byExchanged; frame.SetupFrame(byAddr,0x6,b,4); mn.m_lSize = frame.FrameToBuffer(mn.m_pBuf); m_byFrameType = 4;}*//*void CSepam2000Mas::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; if ((nEcho!=-1) && (m_DLService.REQ((BYTE) nEcho,&FNSend,FNRecv,(BYTE) 0,true) == 1)) { ExplainRESP(&FNRecv); } pthread_mutex_unlock(&m_mutex);}*//*int CSepam2000Mas::GetPeriod(CFrameNode& fn) //-1:failure;0:no echo; 1:have echo//int CSepam2000Mas::GetSendData(CFrameNode& fn){ int nRet = -1; while (!m_subdevmgr.HasOn()) Sleep(10);// while (m_subdevmgr.GetNum() != 5) Sleep(10); if (m_bIsAck) { ACK(m_bySendNo,mn); m_bIsAck = FALSE; m_frmEcho.m_wXLen = 8; bRet = TRUE;// m_byQueryAddr = byQueryAddr; m_bHasEcho = TRUE; } else { CMailQueue* pmqSend = m_mail.GetSendMailQueue(); if (pmqSend->GetMailCount()) {// ASSERT(m_bIsNormal==FALSE); m_bIsExpr = TRUE; pmqSend->GetHeadNode(mn); bRet = TRUE; } else if (m_bIsNormal) { m_bHasEcho = TRUE; m_bIsExpr = FALSE; bRet = TRUE; CTime tmCurrent = CTime::GetCurrentTime(); if (tmCurrent.GetMinute()!= m_tmRectify.GetMinute()) { SyncClock(mn); m_tmRectify = tmCurrent; } else { Sleep(20); if((m_bySendOrder++%4==3) || (m_bySendNo == 0xff)) {// m_bySendOrder = 0; m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo); m_byQueryNo = m_bySendNo; } switch(m_bySendOrder%4) { case 0: if (m_bySendOrder % 8 == 0) GetYC(m_bySendNo,mn); break; case 1: GetYX1(m_bySendNo,mn); break; case 2: GetYX2(m_bySendNo,mn); break; case 3:// GetClock(m_bySendNo,mn); if (m_bySendOrder % 16 == 3) GetEvent(m_bySendNo,mn); break; } } } } return bRet;}*//*void CSepam2000Mas::ExplainRecvData(BYTE* pbyInBuf,WORD wInSize){ if (m_bIsExpr) { CMailQueue* pmqRecv = m_mail.GetRecvMailQueue(); pmqRecv->AddMailTail(pbyInBuf,wInSize); } else if (wInSize > 1) { CFrame* pEchoFrame = GetEchoFrame(); if (pEchoFrame->BufferToFrame(pbyInBuf,wInSize)) { BYTE* pbyData = pEchoFrame->GetDataPtr(); if (pbyData == NULL) return; BYTE bySize = BYTE(pEchoFrame->GetDataSize()); BYTE byAddr = pEchoFrame->GetAddr(); BYTE byNo = m_subdevmgr.GetNo(byAddr,0xff); switch (m_byFrameType) { case 0: ExpYCData(byNo,pbyData,bySize); break; case 1: ExpYXData(byNo,pbyData,bySize,0); break; case 2: ExpYXData(byNo,pbyData,bySize,1); break; case 3: ExpEventData(byNo,pbyData,bySize); break; default: break; } if(m_byQueryNo != 0) { BYTE abyData[3]; WORD* pw = (WORD *)abyData; m_byBreakCount[m_byQueryNo] = 0;// BYTE byNo = m_subdevmgr.GetNo(m_byQueryNo,0xff); DWORD dwConnectYXNo = m_subdevmgr.GetConnectYXNo(m_byQueryNo); *pw = WORD(dwConnectYXNo%10000); abyData[2] = 0; MailYX(BYTE(dwConnectYXNo/10000),abyData,3); m_byQueryNo = 0; } } } else if ((wInSize == 1) && (pbyInBuf[0] == 0xe)) { if(m_byQueryNo != 0) { if (m_byBreakCount[m_byQueryNo]++ > 2) { BYTE abyData[3]; WORD* pw = (WORD *)abyData;// BYTE byNo = m_subdevmgr.GetNo(m_byQueryNo,0xff); DWORD dwConnectYXNo = m_subdevmgr.GetConnectYXNo(m_byQueryNo); *pw = WORD(dwConnectYXNo%10000); abyData[2] = 1; MailYX(BYTE(dwConnectYXNo/10000),abyData,3); m_byQueryNo = 0; } } }}*/void CSepam2000Mas::SyncClock(){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x10; FNSend.m_byDesAddr = 0; //广播地址 FNSend.SetSize(13); WORD *pwTemp = (WORD *)FNSend.m_pbyData; *pwTemp++ = CW(0x2); *pwTemp++ = CW(0x4); BYTE *pbyTemp = (BYTE *)pwTemp; *pbyTemp = 8; pwTemp = (WORD *)++pbyTemp; CTimeVal ctv; struct tm st; ctv.GetTime(&st); *pwTemp++ = CW(st.tm_year - 100); *pwTemp++ = CW(((st.tm_mon+1) << 8) + st.tm_mday); *pwTemp++ = CW((st.tm_hour << 8) + st.tm_min); *pwTemp = CW(ctv.GetMilliSecs()+st.tm_sec *1000); m_DLService.REQ(0,&FNSend,FNRecv,0,false);//Send - No Respond// cout <<"SyncClock" << st.tm_year<<endl; pthread_mutex_unlock(&m_mutex);}/*void CSepam2000Mas::GetClock(BYTE byNo,CFrameNode& fn){ m_byFrameType = 5; CModbusFrame frame; BYTE byAddr = m_subdevmgr.GetAddr(byNo); if (byAddr == 0xff) return; BYTE* b = new BYTE[4]; WORD* pData = (WORD *)b; pData[0] = CW(0x0002); pData[1] = CW(4); m_frmEcho.m_wXLen = 5+4*2; frame.SetupFrame(byAddr,0x3,b,4); mn.m_lSize = frame.FrameToBuffer(mn.m_pBuf);}*/bool CSepam2000Mas::YK(WORD wDevNo,BYTE byRoute,bool bIsOn){ bool bRet = false; pthread_mutex_lock(&m_mutex); BYTE byAddr = m_subdevmgr.GetAddrFrmDevNo(wDevNo); BYTE byRoadNo; if (byRoute%10 > 2) { byRoadNo = byRoute%10 - 1; if (byRoadNo == 4) byRoadNo = 9; if (byRoadNo == 5) byRoadNo = 13; } else byRoadNo = byRoute%10-(bIsOn?0:1); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x5; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0xc800 + byRoadNo); //select pData[1] = CW(0xff00); m_DLService.SetEchoLen(8); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x5) { pData[0] = CW(0xc880 + byRoadNo); //execute pData[1] = CW(0xff00); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x5) bRet = true; } } } pthread_mutex_unlock(&m_mutex); return bRet;/* BYTE byAddr = m_subdevmgr.GetAddrFrmDevNo(BYTE(shRoadNo/10)); m_bIsNormal = FALSE; BYTE byRoadNo; if (shRoadNo%10 > 2) byRoadNo = shRoadNo%10 - 1; else byRoadNo = shRoadNo%10-(bIsOn?0:1); CModbusFrame frameYK1,frameYK2,frameEcho; Sleep(200); BYTE* pData1 = new BYTE[4]; BYTE* pData2 = new BYTE[4]; WORD* pData = (WORD *)pData1; pData[0] = CW(0xc800 + byRoadNo); //select pData[1] = CW(0xff00); pData = (WORD *)pData2; pData[0] = CW(0xc880 + byRoadNo); //execute pData[1] = CW(0xff00);// pData1[0] = pData[0] = (bIsOn?0x80:0x40) | byRoadNo;// pData1[1] = pData[1] = ~pData[0]; frameYK1.SetupFrame(byAddr,0x5, pData1, 4); frameYK2.SetupFrame(byAddr,0x5, pData2, 4); BYTE* pbyData; WORD wFrameSize = frameYK1.FrameToBuffer(pbyData); CMailQueue* pmqSend = m_mail.GetSendMailQueue(); CMailQueue* pmqRecv = m_mail.GetRecvMailQueue(); m_frmEcho.m_wXLen = 8; pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp; pmqRecv->GetHeadNode(mnTemp); if ((mnTemp.m_lSize == 1) && ((mnTemp.m_pBuf[0] == 0x0e)||(mnTemp.m_pBuf[0] == 0x0d))) ce = ce_eTimeout; else { if (frameEcho.BufferToFrame(mnTemp.m_pBuf,WORD(mnTemp.m_lSize))) { if (frameEcho.GetCID() == 0x5) { BYTE* pbyValue = frameEcho.GetDataPtr(); WORD wSize = frameEcho.GetDataSize();// if ((wSize==4)&&(pbyValue[1]==pData[0])&&(pbyValue[2]==pData[1])) { wFrameSize = frameYK2.FrameToBuffer(pbyData); Sleep(200); m_frmEcho.m_wXLen = 8; pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp1; pmqRecv->GetHeadNode(mnTemp1); if ((mnTemp1.m_lSize == 1) && ((mnTemp1.m_pBuf[0] == 0x0e)||(mnTemp.m_pBuf[0] == 0x0d))) ce = ce_eTimeout; else { if (frameEcho.BufferToFrame(mnTemp1.m_pBuf,WORD(mnTemp1.m_lSize))) { ce = ce_eFail; if (frameEcho.GetCID() == 0x5) { BYTE* pbyValue = frameEcho.GetDataPtr(); wSize = frameEcho.GetDataSize();// if ((wSize==3) && (pbyValue[1]==0xaa) && (pbyValue[2]==0x55)) ce = ce_eOK; } } } } } } } m_bIsNormal = TRUE; return bRet; */}bool CSepam2000Mas::GetFV(WORD wDevNo,BYTE*& pbyBuf,WORD& wSize,WORD wFuncCode){ bool bRet = false; pthread_mutex_lock(&m_mutex); BYTE byAddr = m_subdevmgr.GetAddrFrmDevNo(wDevNo); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x6; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0xd080); pData[1] = CW(wFuncCode); m_DLService.SetEchoLen(8); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x6) { FNSend.m_byCID = 0x3; pData[0] = CW(0xd000); pData[1] = CW(wSize*2+1); m_DLService.SetEchoLen(5+2*(wSize*2+1)); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x3) { BYTE *pbyD = FNRecv.m_pbyData; BYTE bySize = pbyD[0]; WORD *pw = (WORD *)&pbyD[1]; if (((wSize*2 + 1)*2 == bySize) && (CW(*pw++) == wFuncCode)) { DWORD* pdw = (DWORD *)pw; wSize = FNRecv.m_wSize - 3; pbyBuf = new BYTE [wSize]; DWORD* pdwTemp = (DWORD *)pbyBuf; for (BYTE b=0; b<wSize/4;b++,pdw++) { DWORD dw111 = *pdw; pdwTemp[b] = CDW(dw111); } bRet = true; } } } } } pthread_mutex_unlock(&m_mutex); return bRet; /* cmd_echo ce = ce_eFail; m_bIsNormal = FALSE; BYTE byAddr = m_subdevmgr.GetAddr(byNo); CModbusFrame frameFV,frameFV1,frameEcho; Sleep(200); BYTE* pData1 = new BYTE[4]; BYTE* pData2 = new BYTE[4]; WORD* pData = (WORD *)pData1; pData[0] = CW(0xd080); pData[1] = CW(wFuncCode); pData = (WORD *)pData2; pData[0] = CW(0xd000); pData[1] = CW(wSize*2+1); frameFV.SetupFrame(byAddr,0x6,pData1,4); frameFV1.SetupFrame(byAddr,0x3,pData2,4); BYTE* pbyData; WORD wFrameSize = frameFV.FrameToBuffer(pbyData); CMailQueue* pmqSend = m_mail.GetSendMailQueue(); CMailQueue* pmqRecv = m_mail.GetRecvMailQueue(); m_frmEcho.m_wXLen = 8; pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp; pmqRecv->GetHeadNode(mnTemp); if ((mnTemp.m_lSize == 1) && (mnTemp.m_pBuf[0] == 0x0e)) ce = ce_eTimeout; else if (frameEcho.BufferToFrame(mnTemp.m_pBuf,WORD(mnTemp.m_lSize))) { if (frameEcho.GetCID() == 0x6) { Sleep(200); wFrameSize = frameFV1.FrameToBuffer(pbyData); m_frmEcho.m_wXLen = 5+2*(wSize*2+1); pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp1; pmqRecv->GetHeadNode(mnTemp1); if ((mnTemp1.m_lSize == 1) && ((mnTemp1.m_pBuf[0] == 0x0e)||(mnTemp.m_pBuf[0] == 0x0d))) ce = ce_eTimeout; else if (frameEcho.BufferToFrame(mnTemp1.m_pBuf,WORD(mnTemp1.m_lSize))) { ce = ce_eFail; if (frameEcho.GetCID() == 0x3) { BYTE *pbyD = frameEcho.GetDataPtr(); BYTE bySize = pbyD[0]; WORD *pw = (WORD *)&pbyD[1]; if (((wSize*2 + 1)*2 == bySize) && (CW(*pw++) == wFuncCode)) { DWORD* pdw = (DWORD *)pw; wSize = frameEcho.GetDataSize() - 3; pbyBuf = new BYTE [wSize]; DWORD* pdwTemp = (DWORD *)pbyBuf; for (BYTE b=0; b<wSize/4;b++) *pdwTemp++ = CDW(*pdw++); ce = ce_eOK; } } } } } m_bIsNormal = TRUE; return ce; */}bool CSepam2000Mas::PutFV(WORD wDevNo,BYTE* pFixVal,WORD wSize,WORD wFuncCode){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -