⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sepam2000mas.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -