📄 cdtsas.cpp
字号:
#include "iostream.h" #include "cdtsas.h"#include "allmgr.h"#include "cdt.h"/* WORD m_wPubAddr; //group:function code //yx>=0 and yx<512 BYTE m_byType; //YC1=1,YC2=2,YC3=3 //ZJ(总加遥测) &= 0x10,F=0x20,Water=0x30。即:0x11,0x12,0x13;0x21,0x22,0x23;0x31,0x32,0x33 //DD=6,Work Info=7,SOE=8,YX=9,YK=10,YT=11,SetValue=12 string m_strName; WORD m_wDevNo; //=0: m_nType = YX ,系统信息 WORD m_wDevPubAddr; bool m_bValid; //备用=:true; 采集=:falsestatic struCDTInfo CDTInfos[] = { //yc {0x0000,1,1,1}, {0x0001,1,1,2}, {0x0100,1,1,3}, {0x0101,1,1,4}, {0x0200,1,1,5}, {0x0201,1,1,6}, //yx {0xf000,9,1,1}, {0xf001,9,1,2}, {0xf002,9,1,3}, {0xf003,9,1,4}, {0xf004,9,1,5}, {0xf005,9,1,6}, //yk {0x0000,10,1,1}, {0x0001,10,1,2}, {0x0002,10,2,1}, {0x0003,10,2,2},};*/void CCDTSAS::Load(){ /* for (WORD www=0; www<sizeof(CDTInfos)/sizeof(struCDTInfo); www++) { switch (CDTInfos[www].m_byType & 0xf) { case 1: case 2: case 3: m_YCInfos.Add(&CDTInfos[www]); break; case 9: m_YXInfos.Add(&CDTInfos[www]); break; case 10: m_YKInfos.Add(&CDTInfos[www]); break; default: break; } } */ m_YCInfos.Load(); m_YCInfos.Sort(); m_YXInfos.Load(); m_YXInfos.Sort(); m_SOEInfos.Load(); m_SOEInfos.Sort(); m_YKInfos.Load(); m_YKInfos.Sort();}void* CDTSlaveGetIND(void *pVoid){ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); CCDTSAS *pAS = (CCDTSAS *)pVoid; while (1) { CFrameNode FNRecv; if (pAS->m_DLService.IND(FNRecv)>0) //有指示; pAS->ExplainIND(&FNRecv); else usleep(10000); }}void* CDTSlaveCycleSend(void *pVoid){ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); CCDTSAS *pAS = (CCDTSAS *)pVoid; usleep(1000000); while (1) { while (pAS->m_DLService.Status() != 0) sleep(1); pAS->SendCycleData(); }}bool CCDTSAS::Init(){ bool bRet = false; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&m_hThreadGet,&attr,CDTSlaveGetIND,(void *)this) == 0) { pthread_attr_t attr1; pthread_attr_init(&attr1); pthread_attr_setdetachstate(&attr1,PTHREAD_CREATE_DETACHED); if (pthread_create(&m_hThreadSend,&attr1,CDTSlaveCycleSend,(void *)this) == 0) { Load(); bRet = true; } else { pthread_cancel(m_hThreadGet); m_hThreadGet = 0; m_hThreadSend = 0; } pthread_attr_destroy(&attr1); } else m_hThreadGet = 0; pthread_attr_destroy(&attr); return bRet;}CCDTSAS::CCDTSAS(CAllMgr* pAllMgr,CSerialPortDef* pChannel) : CSAppService(pAllMgr,true) , m_DLService(pChannel) , m_YTInfos(false){ m_hThreadGet = 0; m_hThreadSend = 0; m_byAddr = 1; m_byOrder = 0; m_bRtnCallClock = false; m_bHasYKRtn = false;}CCDTSAS::~CCDTSAS(){ if (m_hThreadGet > 0) { cout << "CDTGet: " << m_hThreadGet << endl; pthread_cancel(m_hThreadGet); } if (m_hThreadSend > 0) { cout << "CDTSend: " << m_hThreadSend << endl; pthread_cancel(m_hThreadSend); }}void CCDTSAS::ExplainIND(CFrameNode* pFNRecv){ BYTE byFrameType = pFNRecv->m_byCID; BYTE bySize = (BYTE)pFNRecv->m_wSize; BYTE* pbyRD=pFNRecv->m_pbyData; switch(byFrameType) { case 0x61: //YK Select if ((bySize >= 6 /* 3*6 */) && (pbyRD[0] == 0xe0) && ((pbyRD[1] == 0xcc) || (pbyRD[1] == 0x33))) { for (int iii=0;m_YXInfos.HasYXChanged() && (iii<10);iii++) usleep(100000); if (m_YXInfos.HasYXChanged()) {//Send Work Info } else { bool bOn = (pbyRD[1] == 0xcc) ? true : false; m_YKInfos.Select(pbyRD[2],bOn,m_abyYKRtn); // Send YK return; m_bHasYKRtn = true; } } break; case 0xc2: //YK Operate if ((bySize >= 6) && (pbyRD[0] == 0xe2) && (pbyRD[1] == 0xaa)) { WORD byDev; WORD wDevPubAddr; bool bOn; if (m_YKInfos.Operate(pbyRD[2],byDev,wDevPubAddr,bOn)) { if (m_YXInfos.HasYXChanged()) {//Send Work Info ; } else m_pAllMgr->YK(byDev,wDevPubAddr,bOn); } } break; case 0xb3: //YK Cancel if ((bySize >= 6) && (pbyRD[0] == 0xe3) && (pbyRD[1] == 0x55)) { m_YKInfos.Cancel(pbyRD[2]); } break; case 0xf4: //升降 Selecout <<nYCKind<<endl; break; case 0x85: //升降 Operator break; case 0x26: //升降 Cancel break; case 0x3d: //复归命令 break; case 0x9e: //广播命令[冻结计数] break; case 0x7a: //设置时钟 if ((bySize == 12) && (pbyRD[0] == 0xee) && (pbyRD[6] == 0xef)) { struct tm t; t.tm_year = pbyRD[10]; t.tm_mon = pbyRD[9]-1; t.tm_mday = pbyRD[8]; t.tm_hour = pbyRD[7]; t.tm_min = pbyRD[4]; t.tm_sec = pbyRD[3]; WORD* pw = (WORD *)&pbyRD[1]; CTimeVal tv(&t,*pw & 0x3ff); m_pAllMgr->RectifyTime(&tv); } break; case 0x0b: //设置时钟校正值 if ((bySize == 6) && (pbyRD[0] == 0xed)) { short* psh = (short *)&pbyRD[1]; CTimeValSpan tvs(0,0,0,0,1000*(*psh)); CTimeVal tv; tv += tvs; m_pAllMgr->RectifyTime(&tv); } break; case 0x4c: //召唤子站时钟 if (bySize == 0) { m_tvCallTime.GetCurrentTime(); m_bRtnCallClock = true; } break; case 0x57: //设定命令 if (m_YXInfos.HasYXChanged()) {//Send Work Info } break; default: usleep(20000); break; }}const char acSendOrder[] = "DABACABAABAE";void CCDTSAS::SendCycleData(){ switch(acSendOrder[m_byOrder++ % ((sizeof(acSendOrder)-1)/sizeof(char))]) { case 'A': SendYC(1); //重要遥测 A break; case 'B': SendYC(2); //次要遥测B break; case 'C': if (!SendSOE()) //E->C { if (SendYC(3)) //一般遥测C break; } else break; case 'D': { CTimeVal tv; CTimeValSpan tvs = tv-m_tvLast; if (tvs.GetASecs() > 1800) { m_tvLast = tv; SendDD(); //D2 } else SendYX(); //D1 break; } case 'E': SendProtInfo(); break; default: m_byOrder = 0; break; }}bool CCDTSAS::SendYC(int nYCKind) //重要遥测 A := 1;//次要遥测B := 2;//一般遥测C := 3{ bool bRet = false; CFrameNode fnR; fnR.m_byCID = (nYCKind == 1) ? 0x61 : ((nYCKind == 2) ? 0xc2 : 0xb3); m_YCInfos.GetYCData(nYCKind,fnR.m_pbyData,fnR.m_wSize); //replace infowords using clock return ,yx change OR yk return BYTE pData[96]; WORD wSize; if (m_bRtnCallClock) { m_bRtnCallClock = false; pData[0] = 0x84; WORD* pw = (WORD *)&pData[1]; *pw = m_tvCallTime.GetMilliSecs(); struct tm t; m_tvCallTime.GetTime(&t); pData[3] = t.tm_sec; pData[4] = t.tm_min; pData[6] = 0x85; pw = (WORD *)&pData[7]; CTimeVal tv; CTimeValSpan tvs = tv-m_tvCallTime; *pw = tvs.GetMicroSecs()/1000; pData[9] = pData[10] = 0; memcpy(fnR.m_pbyData,pData,12); if (fnR.m_wSize < 12) fnR.m_wSize = 12; } else if (m_YXInfos.GetPRMYXData(pData,wSize)) { if (wSize > 6) //All YX { fnR.m_byCID = 0xf4; fnR.m_wSize = wSize; memcpy(fnR.m_pbyData,pData,wSize); } else { memcpy(fnR.m_pbyData,pData,6); memcpy(fnR.m_pbyData+6,pData,6); memcpy(fnR.m_pbyData+12,pData,6); if (fnR.m_wSize < 18) fnR.m_wSize = 18; } } else if (m_bHasYKRtn) { m_bHasYKRtn = false; memcpy(fnR.m_pbyData,m_abyYKRtn,6); memcpy(fnR.m_pbyData+6,m_abyYKRtn,6); memcpy(fnR.m_pbyData+12,m_abyYKRtn,6); if (fnR.m_wSize < 18) fnR.m_wSize = 18; } if (fnR.m_wSize >= 6) { m_DLService.RESP(&fnR); usleep(fnR.m_wSize*28000); bRet = true; } return bRet;}bool CCDTSAS::SendSOE() //E{ bool bRet = false; //insert infowords using clock return ,yx change OR yk return CFrameNode fnR; fnR.m_byCID = 0x26; BYTE pData[96]; WORD wSize; if (m_bRtnCallClock) { m_bRtnCallClock = false; pData[0] = 0x84; WORD* pw = (WORD *)&pData[1]; *pw = m_tvCallTime.GetMilliSecs(); struct tm t; m_tvCallTime.GetTime(&t); pData[3] = t.tm_sec; pData[4] = t.tm_min; pData[6] = 0x85; pw = (WORD *)&pData[7]; CTimeVal tv; CTimeValSpan tvs = tv-m_tvCallTime; *pw = tvs.GetMicroSecs()/1000; pData[9] = pData[10] = 0; memcpy(fnR.m_pbyData,pData,12); fnR.m_wSize = 12; } else if (m_YXInfos.GetPRMYXData(pData,wSize)) { if (wSize > 6) //All YX { fnR.m_byCID = 0xf4; fnR.m_wSize = wSize; memcpy(fnR.m_pbyData,pData,wSize); } else { memcpy(fnR.m_pbyData,pData,6); memcpy(fnR.m_pbyData+6,pData,6); memcpy(fnR.m_pbyData+12,pData,6); fnR.m_wSize = 18; } } else if (m_bHasYKRtn) { m_bHasYKRtn = false; memcpy(fnR.m_pbyData,m_abyYKRtn,6); memcpy(fnR.m_pbyData+6,m_abyYKRtn,6); memcpy(fnR.m_pbyData+12,m_abyYKRtn,6); fnR.m_wSize = 18; } WORD wSOESize = 0; m_SOEInfos.GetSOEData(fnR.m_pbyData+fnR.m_wSize,wSOESize); fnR.m_wSize += wSOESize; if (fnR.m_wSize >= 6) { m_DLService.RESP(&fnR); usleep(fnR.m_wSize*28000); bRet = true; } return bRet;}void CCDTSAS::SendDD() //D2{ CFrameNode fnR; fnR.m_byCID = 0x85; m_DDInfos.GetDDData(fnR.m_pbyData,fnR.m_wSize); //replace infowords using clock return ,yx change OR yk return BYTE pData[96]; WORD wSize; if (m_bRtnCallClock) { m_bRtnCallClock = false; pData[0] = 0x84; WORD* pw = (WORD *)&pData[1]; *pw = m_tvCallTime.GetMilliSecs(); struct tm t; m_tvCallTime.GetTime(&t); pData[3] = t.tm_sec; pData[4] = t.tm_min; pData[6] = 0x85; pw = (WORD *)&pData[7]; CTimeVal tv; CTimeValSpan tvs = tv-m_tvCallTime; *pw = tvs.GetMicroSecs()/1000; pData[9] = pData[10] = 0; memcpy(fnR.m_pbyData,pData,12); if (fnR.m_wSize < 12) fnR.m_wSize = 12; } else if (m_YXInfos.GetPRMYXData(pData,wSize)) { if (wSize > 6) //All YX { fnR.m_byCID = 0xf4; fnR.m_wSize = wSize; memcpy(fnR.m_pbyData,pData,wSize); } else { memcpy(fnR.m_pbyData,pData,6); memcpy(fnR.m_pbyData+6,pData,6); memcpy(fnR.m_pbyData+12,pData,6); if (fnR.m_wSize < 18) fnR.m_wSize = 18; } } else if (m_bHasYKRtn) { m_bHasYKRtn = false; memcpy(fnR.m_pbyData,m_abyYKRtn,6); memcpy(fnR.m_pbyData+6,m_abyYKRtn,6); memcpy(fnR.m_pbyData+12,m_abyYKRtn,6); if (fnR.m_wSize < 18) fnR.m_wSize = 18; } if (fnR.m_wSize >= 6) { m_DLService.RESP(&fnR); usleep(fnR.m_wSize*28000); }}void CCDTSAS::SendYX() //D1{ CFrameNode fnR; fnR.m_byCID = 0xF4; m_YXInfos.GetYXData(0,fnR.m_pbyData,fnR.m_wSize); //replace infowords using clock return ,yx change OR yk return BYTE pData[96]; if (m_bRtnCallClock) { m_bRtnCallClock = false; pData[0] = 0x84; WORD* pw = (WORD *)&pData[1]; *pw = m_tvCallTime.GetMilliSecs(); struct tm t; m_tvCallTime.GetTime(&t); pData[3] = t.tm_sec; pData[4] = t.tm_min; pData[6] = 0x85; pw = (WORD *)&pData[7]; CTimeVal tv; CTimeValSpan tvs = tv-m_tvCallTime; *pw = tvs.GetMicroSecs()/1000; pData[9] = pData[10] = 0; memcpy(fnR.m_pbyData,pData,12); if (fnR.m_wSize < 12) fnR.m_wSize = 12; } else if (m_bHasYKRtn) { m_bHasYKRtn = false; memcpy(fnR.m_pbyData,m_abyYKRtn,6); memcpy(fnR.m_pbyData+6,m_abyYKRtn,6); memcpy(fnR.m_pbyData+12,m_abyYKRtn,6); if (fnR.m_wSize < 18) fnR.m_wSize = 18; } if (fnR.m_wSize >= 6) { m_DLService.RESP(&fnR); usleep(fnR.m_wSize*28000); }}void CCDTSAS::SendProtInfo(){ if (m_queProtInfo.Size()>0) { CFrameNode fnR; fnR.m_byCID = 0x40; CDataNode* pDN; m_queProtInfo.Get(pDN); BYTE bySum = pDN->m_wSize/4 + ((pDN->m_wSize%4)?1:0); fnR.m_wSize = bySum*6; for (BYTE bb=0; bb<bySum;bb++) { fnR.m_pbyData[6*bb] = bb; memcpy((char *)&fnR.m_pbyData[6*bb+1],(char *)&pDN->m_pbyData[4*bb],4); } delete pDN; if (fnR.m_wSize >= 6) { m_DLService.RESP(&fnR); usleep(fnR.m_wSize*28000); } }}void CCDTSAS::YC(YCData* pYCValue,WORD wCount){// cout << "CDT Hello YC" <<endl; for (WORD www=0; www<wCount;www++) { m_YCInfos.SetValue(pYCValue[www].m_wDevNo,pYCValue[www].m_wDevPtNo,pYCValue[www].m_fValue); }}void CCDTSAS::YX(YXData* pBoolValue,WORD wCount){ for (WORD www=0; www<wCount;www++) { m_YXInfos.SetValue(pBoolValue[www].m_wDevNo,pBoolValue[www].m_wDevPtNo,pBoolValue[www].m_bValue); }// cout << "CDT Hello YX" <<endl;}void CCDTSAS::DD(DDData* pDDValue,WORD wCount){ for (WORD www=0; www<wCount;www++) { m_DDInfos.SetValue(pDDValue[www].m_wDevNo,pDDValue[www].m_wDevPtNo,pDDValue[www].m_dwValue); }// cout << "CDT Hello DD" <<endl;}void CCDTSAS::SOE(SOEData* pSOEValue,WORD wCount){ for (WORD www=0; www<wCount;www++) { m_SOEInfos.SetValue(pSOEValue[www].m_wDevNo,pSOEValue[www].m_wDevPtNo,&pSOEValue[www]); }// cout << "CDT Hello SOE" <<endl;}void CCDTSAS::ProtInfo(BYTE* pBuf, WORD wSize){ timeval tv; CDataNode* p = new CDataNode(tv,pBuf,wSize); m_queProtInfo.Add(p);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -