📄 sepam2000mas.cpp
字号:
bool bRet = false; pthread_mutex_lock(&m_mutex); BYTE byAddr = m_subdevmgr.GetAddrFrmDevNo(wDevNo); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x10; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(wSize*4+7); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0xd100); //0x2100 pData[1] = CW(wSize*2+1); BYTE *pbyTemp = (BYTE *)&pData[2]; *pbyTemp++ = (wSize*2+1)*2; WORD *pw = (WORD *)pbyTemp; *pw++ = CW(wFuncCode); DWORD* pdw = (DWORD *)pw; DWORD *pdwV = (DWORD *)pFixVal; for (WORD w=0; w<wSize; w++) *pdw++ = CDW(*pdwV++); m_DLService.SetEchoLen(8); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x10) {// 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)// { bRet = true;// }// } } } pthread_mutex_unlock(&m_mutex); return bRet; /* cmd_echo ce = ce_eFail; m_bIsNormal = FALSE; CModbusFrame framePFV,frameEcho; BYTE byAddr = m_subdevmgr.GetAddr(byNo); BYTE* pData1 = new BYTE[wSize*4+7]; Sleep(200); WORD* pData = (WORD *)pData1; pData[0] = CW(0xd100); //0x2100 pData[1] = CW(wSize*2+1); BYTE *pbyTemp = (BYTE *)&pData[2]; *pbyTemp++ = (wSize*2+1)*2; WORD *pw = (WORD *)pbyTemp; *pw++ = CW(wFuncCode); DWORD* pdw = (DWORD *)pw; DWORD *pdwV = (DWORD *)pFixVal; for (WORD w=0; w<wSize; w++) *pdw++ = CDW(*pdwV++); framePFV.SetupFrame(byAddr,0x10,pData1,wSize*4+7); m_frmEcho.m_wXLen = 8; BYTE* pbyData; WORD wFrameSize = framePFV.FrameToBuffer(pbyData); CMailQueue* pmqSend = m_mail.GetSendMailQueue(); CMailQueue* pmqRecv = m_mail.GetRecvMailQueue(); 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() == 0x10) {// Sleep(2000); BYTE* pData2 = new BYTE[4]; pData = (WORD *)pData2; pData[0] = CW(0xd000); //0x2000; pData[1] = CW(wSize*2+1); CModbusFrame frameGFV; frameGFV.SetupFrame(byAddr,0x3,pData2,4); wFrameSize = frameGFV.FrameToBuffer(pbyData); m_frmEcho.m_wXLen = 5+2*(wSize*2+1); pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp1; pmqRecv->GetHeadNode(mnTemp1);// m_bySendOrder = byAddr;// CMailNode mn;// ACK(byAddr,mn);// pmqSend->AddMailTail(mn.m_pBuf,mn.m_lSize); ce = ce_eOK; } } } m_bIsNormal = TRUE; return ce; */}void CSepam2000Mas::GetYX1(BYTE byAddr){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0x0C8F); pData[1] = CW(0x5); m_DLService.SetEchoLen(5+5*2); WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNSend.m_byDesAddr ); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { ExpYXData(byAddr,FNRecv.m_pbyData,FNRecv.m_wSize,0); if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = false; m_b199[wDevNo] = false; m_pAllMgr->YX(&d, 1); } m_wBreakCount[byAddr] = 0; } else { if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = true; m_b199[wDevNo] = true; m_pAllMgr->YX(&d, 1); } else m_wBreakCount[byAddr]++; } YXData d1; d1.m_wDevNo = wDevNo; d1.m_wDevPtNo = 190; d1.m_bValue = m_b9[wDevNo] | m_b10[wDevNo] | m_b15[wDevNo] | m_b17[wDevNo] | m_b199[wDevNo] ; m_pAllMgr->YX(&d1, 1); pthread_mutex_unlock(&m_mutex);/* m_byFrameType = 1; CModbusFrame frame; BYTE byAddr = m_subdevmgr.GetAddr(byNo); if (byAddr == 0xff) return; BYTE* b = new BYTE[4]; WORD* pData = (WORD *)b; pData[0] = CW(0x0C8F); pData[1] = CW(5); m_frmEcho.m_wXLen = 5+5*2; frame.SetupFrame(byAddr,0x3,b,4); mn.m_lSize = frame.FrameToBuffer(mn.m_pBuf); */}void CSepam2000Mas::GetYX2(BYTE byAddr){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0x0C10); pData[1] = CW(0x4); m_DLService.SetEchoLen(5+4*2); WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNSend.m_byDesAddr ); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { ExpYXData(byAddr,FNRecv.m_pbyData,FNRecv.m_wSize,1); if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = false; m_b199[wDevNo] = false; m_pAllMgr->YX(&d, 1); } m_wBreakCount[byAddr] = 0; } else { if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = true; m_b199[wDevNo] = true; m_pAllMgr->YX(&d, 1); } else m_wBreakCount[byAddr]++; } pthread_mutex_unlock(&m_mutex); /* m_byFrameType = 2; CModbusFrame frame; BYTE byAddr = m_subdevmgr.GetAddr(byNo); if (byAddr == 0xff) return; BYTE* b = new BYTE[4]; WORD* pData = (WORD *)b; pData[0] = CW(0x0C10); 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);*/}void CSepam2000Mas::GetYC(BYTE byAddr){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0xfa00); pData[1] = CW(16); m_DLService.SetEchoLen(5+16*2); WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNSend.m_byDesAddr ); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { ExpYCData(byAddr,FNRecv.m_pbyData,FNRecv.m_wSize); if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = false; m_b199[wDevNo] = false; m_pAllMgr->YX(&d, 1); } m_wBreakCount[byAddr] = 0; } else { if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = true; m_b199[wDevNo] = true; m_pAllMgr->YX(&d, 1); } else m_wBreakCount[byAddr]++; } pthread_mutex_unlock(&m_mutex);/* m_byFrameType = 0; CModbusFrame frame; BYTE byAddr = m_subdevmgr.GetAddr(byNo); if (byAddr == 0xff) return; BYTE* b = new BYTE[4]; WORD* pData = (WORD *)b; pData[0] = CW(0xfa00); pData[1] = CW(16); m_frmEcho.m_wXLen = 5+16*2; frame.SetupFrame(byAddr,0x3,b,4); mn.m_lSize = frame.FrameToBuffer(mn.m_pBuf); */}void CSepam2000Mas::GetEvent(BYTE byAddr){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0x40); pData[1] = CW(0x21); m_DLService.SetEchoLen(5+0x21*2); WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNSend.m_byDesAddr ); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { ExpEventData(byAddr,FNRecv.m_pbyData,FNRecv.m_wSize); //确定并清除 BYTE byExchanged = FNRecv.m_pbyData[1]; BYTE byCount = FNRecv.m_pbyData[2]; if (byCount > 0) { usleep(100000); CFrameNode FNSend1,FNRecv1; FNSend1.m_byCID = 0x6; // FNSend1.m_byDesAddr = byAddr; FNSend1.SetSize(4); pData = (WORD *)FNSend1.m_pbyData; pData[0] = CW(0x40); pData[1] = byExchanged; m_DLService.SetEchoLen(8); if (m_DLService.REQ(1,&FNSend1,FNRecv1,0,true) == 1)//Send - Respond { } } if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = false; m_b199[wDevNo] = false; m_pAllMgr->YX(&d, 1); } m_wBreakCount[byAddr] = 0; } else { if (m_wBreakCount[byAddr] > 5) { YXData d; d.m_wDevNo = wDevNo; d.m_wDevPtNo = 199; d.m_bValue = true; m_b199[wDevNo] = true; m_pAllMgr->YX(&d, 1); } else m_wBreakCount[byAddr]++; } pthread_mutex_unlock(&m_mutex); }void CSepam2000Mas::ExpYCData(BYTE byAddr,BYTE* pbyData,BYTE bySize){ BYTE* pbyTemp = pbyData + 1; WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); YCData* pData = new YCData [bySize/2];// short* pshOrigValue = (short *)pbyData; WORD* pwOrigValue = (WORD *)pbyTemp; for (WORD w=0; w<bySize/2; w++) { pData[w].m_wDevNo = wDevNo; pData[w].m_wDevPtNo = w+1; float ffValue = CW(*pwOrigValue++); if ((w == 10) || (w == 11) || (w == 12) || (w == 13) || (w == 14)) ffValue -= 0x8000; pData[w].m_fValue = ffValue; } m_pAllMgr->YC(pData,(WORD)bySize/2); delete pData;/* WORD wSize = (bySize/2) * (sizeof(float) + sizeof(WORD)); WORD wSendSize = 0; BYTE* pData = new BYTE [wSize]; WORD* pwOrigValue = (WORD *)pbyTemp; WORD* pwYCNo = (WORD *)pData; float* pfValue; for (WORD w=0; w<bySize/2; w++) { *pwYCNo = w+1; pfValue = (float *)(pwYCNo+1); float ffValue = CW(*pwOrigValue++); if ((w == 10) || (w == 11) || (w == 12) || (w == 13) || (w == 14)) ffValue -= 0x8000; *pfValue++ = ffValue; pwYCNo = (WORD *)pfValue; wSendSize += 6; } MailYC(m_subdevmgr.GetDeviceNo(byNo),pData, wSendSize); delete pData; */}void CSepam2000Mas::ExpYXData(BYTE byAddr,BYTE* pbyData,BYTE bySize,BYTE byOrder){ if ((pbyData == NULL) || (bySize < 2)) return; BYTE* pbyTemp = pbyData+1; WORD* pw = (WORD *)pbyTemp; for (BYTE b=0; b<bySize/2;b++) *pw++ = CW(*pw);/* WORD wSize = bySize*8*(sizeof(WORD)+sizeof(BYTE)); WORD wSendSize = 0; BYTE* pData = new BYTE [wSize]; WORD* pwDTemp = (WORD *)pData; BYTE* pbyDTemp; for (WORD w=0; w<bySize-1; w++) { BYTE byA = 1; BYTE byValue = *pbyTemp++; for (BYTE b=0; b<8; b++,byA<<=1) { *pwDTemp++ = b+8*w + 1 + ((m_byFrameType == 2) ? 80 : 0); pbyDTemp = (BYTE *)pwDTemp; *pbyDTemp++ = BYTE((byValue&byA)?1:0); pwDTemp = (WORD *)pbyDTemp; wSendSize += 3; } } MailYX(m_subdevmgr.GetDeviceNo(byNo),pData, wSendSize); delete pData;*/ YXData* pYXData = new YXData [(bySize-1)*8]; WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); for (BYTE by=0; by<(bySize-1); by++) { BYTE byA = 1; BYTE byValue = *pbyTemp++; for (BYTE b=0; b<8; b++,byA<<=1) { pYXData[b+8*by].m_wDevNo = wDevNo; WORD ptno = pYXData[b+8*by].m_wDevPtNo =b+8*by + 1 + ((byOrder == 1) ? 80 : 0); pYXData[b+8*by].m_bValue = bool(byValue & byA); if (ptno == 9) m_b9[wDevNo] = pYXData[b+8*by].m_bValue; if (ptno == 10) m_b10[wDevNo] = pYXData[b+8*by].m_bValue; if (ptno == 15) m_b15[wDevNo] = pYXData[b+8*by].m_bValue; if (ptno == 17) m_b17[wDevNo] = pYXData[b+8*by].m_bValue; } } m_pAllMgr->YX(pYXData, (bySize-1)*8); delete [] pYXData;}void CSepam2000Mas::ExpEventData(BYTE byAddr,BYTE* pbyData,BYTE bySize){// ASSERT(bySize == 67); BYTE byEventCount; m_byExchanged = pbyData[1]; byEventCount = pbyData[2]; WORD* pw = (WORD *)&pbyData[3];// if (byEventCount > 0)// {// m_bIsAck = TRUE;// } WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); for (BYTE b=0; b<byEventCount; b++) { struct tm gt;// CString ss;// SYSTEMTIME st; gt.tm_year = CW(*(pw + 4 + 8*b)); if (gt.tm_year<50) gt.tm_year += 100; gt.tm_mon = ((CW(*(pw + 5 + 8*b)) & 0xff00) >> 8) - 1; gt.tm_mday = CW(*(pw + 5 + 8*b)) & 0xff; gt.tm_hour = (CW(*(pw + 6 + 8*b)) & 0xff00) >> 8; gt.tm_min = CW(*(pw + 6 + 8*b)) & 0xff; gt.tm_sec = CW(*(pw + 7 + 8*b)) /1000; CTimeVal tvg(>,(CW(*(pw + 7 + 8*b)) % 1000)*1000); WORD wEventAddr = CW(*(pw + 1 + 8*b));// BYTE byDeviceNo = m_subdevmgr.GetDeviceNo(byNo); if (wEventAddr < 0xc8f0) wEventAddr = wEventAddr - 0xc100 + 80; else wEventAddr -= 0xc8f0; // cout << gt.tm_year<<"/"<<gt.tm_mon<<"/"<<gt.tm_mday<<" "<<gt.tm_hour<<":"<<gt.tm_min<<":"<<gt.tm_sec<<"."<< CW(*(pw + 7 + 8*b)) % 1000<< "/" <<wEventAddr<<endl; if ((wEventAddr != 39) && (wEventAddr != 18)) { SOEData aSOEData; aSOEData.m_ctv = tvg; aSOEData.m_bValue = (*(pw + 3 + 8*b) == 0) ?false:true; aSOEData.m_wDevNo = wDevNo; aSOEData.m_wDevPtNo = wEventAddr+1; SendSOEData(&aSOEData,1); }/* int nYXNo = byDeviceNo*10000 +wEventAddr+1; int nNo = g_yxk.GetIndex(nYXNo); if(nNo==-1) continue; int kk=g_yxk[nNo]->m_HintKind; CString strYXName = g_yxk[nNo]->m_YXName; CString s1,s2; if(kk<0) { s1 = L"出现"; s2 = L"消失"; } else if(kk<g_OnArray.GetSize()) { s1 = (LPCTSTR)g_OnArray[kk]; s2 = (LPCTSTR)g_OffArray[kk]; } ss.Format("%d/%02d/%02d %02d:%02d:%02d.%03d [%s]%s" ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds,LPCTSTR(m_subdevmgr.GetName(byNo)),LPCTSTR(strYXName)); ss += (*(pw + 3 + 8*b) == 0) ? s2 : s1; MailSOE(m_subdevmgr.GetDeviceNo(byNo),(BYTE *)LPCTSTR(ss),ss.GetLength()+1); */ }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -