maintainview.cpp

来自「串口收发工具」· C++ 代码 · 共 1,199 行 · 第 1/2 页

CPP
1,199
字号
		for(i=0;i<nCount;i++)
			m_ycArray.SetAt(i,MAKEWORD(buf[2*i+9],buf[2*i+10]));
		
		if (ngyTypeFlag == GY_TYPE_FLAG_DF0421)
			nCount = buf[8];//yx字节数   0241规约
		else
			nCount = buf[8]/8;//yx count 0420规约
		
		m_yxArray.SetSize(nCount);
		for(i=0;i<nCount;i++)
			m_yxArray.SetAt(i,buf[9+2*buf[7]+i]);
				
		break;
	case 0xC0://yk return
		if((buf[3] == 0x03)&&(buf[4] == 0x00))
		{
			if(dlgYkYt&&dlgYkYt->m_hWnd)
				dlgYkYt->SendMessage(MSG_CONTROLRETURN,buf[9]?100:101);
		}
		break;
	case 0xC8://yt return
		if((buf[3] == 0x04)&&(buf[4] == 0x00))
		{
			if(dlgYkYt&&dlgYkYt->m_hWnd)
				dlgYkYt->SendMessage(MSG_CONTROLRETURN,buf[10]?200:201);
		}
		break;
	case 0xD0://soe return;
		Create0420SOE(buf,len);
		break;
	case 0xA0://参数设置返回
		if(dlgUpDownLoad&&dlgUpDownLoad->m_hWnd)
			dlgUpDownLoad->SendMessage(MSG_DOWNLOADRETURN,buf[9],buf[10]);
		if ((buf[1]==8)&&(buf[9]==0))//模块号是8,报警控制器且执行结果正确
			((CMainFrame*)AfxGetMainWnd())->InformationDesplay(ALARMER_DOWNLOAD_SUCCESS);
		break;
	case 0xA1://参数上装应答
		GetParaToStruct(buf,len);
		break;
	default:
		break;
	}
}

void CMaintainView::ExplainCDT(BYTE *buf, int len)
{
	CString str;

	if(len < 12)
		return;
	
	BYTE by0,by1,byCDTParity;
	by0 = buf[0];
	if(by0 != 0x71)//CDT数据开始字节
		return;
	by1 = buf[1];
	int i,nGroup = (len-6)/6;
	switch(by1)
	{
	case 0x61://本系统遥测
		m_ycArray.SetSize(nGroup*2);
		for(i=0;i<nGroup;i++)
		{
			byCDTParity = CManager::CdtParity(&buf[(i+1)*6]);
			if(byCDTParity != buf[(i+1)*6+5])
				break;
			m_ycArray.SetAt(i*2,MAKEWORD(buf[(i+1)*6+1],buf[(i+1)*6+2]));
			m_ycArray.SetAt(i*2+1,MAKEWORD(buf[(i+1)*6+3],buf[(i+1)*6+4]));
		}
		
		break;
	case 0xc2://0250遥测
		m_0250ycArray.SetSize(nGroup*2);
		for(i=0;i<nGroup;i++)
		{
			byCDTParity = CManager::CdtParity(&buf[(i+1)*6]);
			if(byCDTParity != buf[(i+1)*6+5])
				break;
			m_0250ycArray.SetAt(i*2,MAKEWORD(buf[(i+1)*6+1],buf[(i+1)*6+2]));
			m_0250ycArray.SetAt(i*2+1,MAKEWORD(buf[(i+1)*6+3],buf[(i+1)*6+4]));
		}
		
		break;
	case 0xb3://接地巡检仪
		m_jdycArray.SetSize(nGroup*2);
		for(i=0;i<nGroup;i++)
		{
			byCDTParity = CManager::CdtParity(&buf[(i+1)*6]);
			if(byCDTParity != buf[(i+1)*6+5])
				break;
			m_jdycArray.SetAt(i*2,MAKEWORD(buf[(i+1)*6+1],buf[(i+1)*6+2]));
			m_jdycArray.SetAt(i*2+1,MAKEWORD(buf[(i+1)*6+3],buf[(i+1)*6+4]));
		}
		
		break;
	case 0xf4://遥信
		ProcessCDTYx(buf,len);
		break;
	case 0x26://SOE
		CreateCDTSOE(buf,len);
		break;
	case 0x9E://遥控反校
		if(dlgYkYt&&dlgYkYt->m_hWnd)
			dlgYkYt->SendMessage(MSG_CONTROLRETURN,ProcessCDTYkReturn(buf,len));
		break;
	default:
		break;
	}
}

void CMaintainView::ExplainSMS(BYTE* buf,int len)
{
	BYTE index;
	SMS_SETUP sms;
	memset(&sms,0,sizeof(SMS_SETUP));
	if (len==8) 
	{
		index = buf[5];
		((CMainFrame*)AfxGetMainWnd())->SetupSmsReturn(index);
	}
	else
	{
		memcpy(&sms,buf,len);
		((CMainFrame*)AfxGetMainWnd())->GetSMSInfo(sms);
	}
}

void CMaintainView::ExplainFDK(BYTE *buf, int len)
{
	if(len < 8)
		return;
	
	BYTE nFuncCode,nExtFuncCode;
	nFuncCode = buf[3];
	nExtFuncCode = buf[4];
	int i,nCount;
	switch(nFuncCode)
	{
	case 0x02://yc return
		if(nExtFuncCode == 0x02)
		{
			nCount = MAKEWORD(buf[8],buf[9]);
			m_ycArray.SetSize(nCount);
			for(i=0;i<nCount;i++)
				m_ycArray.SetAt(i,MAKEWORD(buf[2*i+10],buf[2*i+11]));
		}
		break;
	case 0x03://yx return
		if(nExtFuncCode == 0x02)
			ProcessFDKYx(buf,len);
		break;
	case 0x08://yk return
		if((nExtFuncCode >= 0x02)&&(nExtFuncCode <= 0x05))
		{
			if(dlgYkYt&&dlgYkYt->m_hWnd)
				dlgYkYt->SendMessage(MSG_CONTROLRETURN,buf[4]);
		}
		break;
	case 0x06://ack
		if(nExtFuncCode == 0x00)
		{
			if(dlgYkYt&&dlgYkYt->m_hWnd)
				dlgYkYt->SendMessage(MSG_CONTROLRETURN,0,0);
		}
		break;
	case 0x21://nak
		if((nExtFuncCode > 0)&&(nExtFuncCode < 11))
		{
			if(dlgYkYt&&dlgYkYt->m_hWnd)
				dlgYkYt->SendMessage(MSG_CONTROLRETURN,0,buf[4]);
		}
		break;
	case 0x05://soe return;
		if(nExtFuncCode == 0x06)
			CreateFDKSOE(buf,len);
		break;
	default:
		break;
	}
}
void CMaintainView::SetModbusPara(MODBUS_PARA p)
{
	modbus = p;
	m_buildData.SetModbusPara(modbus);
}

void CMaintainView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	dlgYkYt = new CYkYtDlg(this);
	dlgUpDownLoad = new CDlgParaUpdownLoad(this);

}

void CMaintainView::CreateCDTSOE(BYTE *buf, int len)
{
	if(len<42)//每个SOE去掉帧头都最少是42字节,可能在有效的42个字节数据后加一两个字节
		return;
	int wMilliseconds,wSecond,wMinute,wHour,wDay,yxno,yxstatus;
	BYTE byCDTParity;
	for(int i=0;i<3;i++)//SOE重复发3遍
	{
		if((buf[6+i*12]==0x80)&&(buf[12+i*12]==0x81))
		{
			byCDTParity = CManager::CdtParity(&buf[6+i*12]);
			if(byCDTParity != buf[6+i*12+5])
				continue;
			byCDTParity = CManager::CdtParity(&buf[12+i*12]);
			if(byCDTParity != buf[12+i*12+5])
				continue;
			wMilliseconds = MAKEWORD(buf[6+i*12+1],buf[6+i*12+2]);
			wSecond = buf[6+i*12+3];
			wMinute = buf[6+i*12+4];
			wHour = buf[12+i*12+1];
			wDay = buf[12+i*12+2];
			yxno = MAKEWORD(buf[12+i*12+3],buf[12+i*12+4]&0x7f);
			yxstatus = (buf[12+i*12+4]>>7)&0x1;
			AddSOEToList(wMilliseconds,wSecond,wMinute,wHour,wDay,0,yxno,yxstatus);
			break;
		}
	}
}
void CMaintainView::Create0420SOE(BYTE *buf, int len)
{
	WORD nCount = MAKEWORD(buf[3],buf[4])/16;

	int wMilliseconds,wSecond,wMinute,wHour,wDay,yxno,yxstatus,wMonth;
	for(int i=0;i<nCount;i++)
	{
		yxno = buf[16*i+10];	
		yxstatus = (buf[16*i+11]==0xCC)?1:0;
		wMonth = buf[16*i+15];
		wDay = buf[16*i+16];
		wHour = buf[16*i+17];
		wMinute = buf[16*i+18];
		wSecond = buf[16*i+19];
		wMilliseconds = MAKEWORD(buf[16*i+20],buf[16*i+21]);
		AddSOEToList(wMilliseconds,wSecond,wMinute,wHour,wDay,wMonth,yxno,yxstatus);
		
	}
}

void CMaintainView::CreateFDKSOE(BYTE *buf, int len)
{
	WORD nCount = MAKEWORD(buf[1],buf[2])/16;

	int wMilliseconds,wSecond,wMinute,wHour,wDay,yxno,yxstatus,wMonth;
	for(int i=0;i<nCount;i++)
	{
		yxno = buf[16*i+9];	
		yxstatus = (buf[16*i+11]==0xCC)?1:0;
		wMonth = buf[16*i+14];
		wDay = buf[16*i+15];
		wHour = buf[16*i+16];
		wMinute = buf[16*i+17];
		wSecond = buf[16*i+18];
		wMilliseconds = MAKEWORD(buf[16*i+19],buf[16*i+20]);
		AddSOEToList(wMilliseconds,wSecond,wMinute,wHour,wDay,wMonth,yxno,yxstatus);
		
	}
}
//得到上装的参数后提取数据放在结构中
void CMaintainView::GetParaToStruct(BYTE *buf, int len)
{
	int nDataPackageLen;
	if(nUploadType == 0)
	{
		//if(len<(sizeof(MSU_PARA)+11))
		//	return;
		nDataPackageLen = MAKEWORD(buf[3],buf[4]);
		if(dlgUpDownLoad&&dlgUpDownLoad->m_hWnd)
			dlgUpDownLoad->GetParaToStruct(&buf[9],nDataPackageLen,nUploadType);
	}
	else if(nUploadType == 1)
	{
		//if(len<(sizeof(DCU_PARA)+11))
		//	return;
		nDataPackageLen = MAKEWORD(buf[3],buf[4]);
		if(dlgUpDownLoad&&dlgUpDownLoad->m_hWnd)
			dlgUpDownLoad->GetParaToStruct(&buf[9],nDataPackageLen,nUploadType);
	
	}
	else if(nUploadType == 8)//报警控制器参数上装
	{

		nDataPackageLen = MAKEWORD(buf[3],buf[4]);
		//如果报警控制器查参数窗口就把数据送过去,不送设置参数窗口
		if (((CMainFrame*)AfxGetMainWnd())->IsQueryAlarmerStatus())
		{
			((CMainFrame*)AfxGetMainWnd())->TransBuf(&buf[9],nDataPackageLen);
		}
		else
			((CMainFrame*)AfxGetMainWnd())->PutParaToStruct(&buf[9],nDataPackageLen);

	}
	else
	{
		//if(len<(sizeof(ACU_PARA)+11))
		//	return;
		nDataPackageLen = MAKEWORD(buf[3],buf[4]);
		if(dlgUpDownLoad&&dlgUpDownLoad->m_hWnd)
			dlgUpDownLoad->GetParaToStruct(&buf[9],nDataPackageLen,nUploadType);
	}
	
}
//处理收到的CDT遥信数据,提出具体状态
void CMaintainView::ProcessCDTYx(BYTE *buf, int len)
{
	CString str;

	int nGroup = len/6;
	if(nGroup < 2)
		return;
	
	nGroup = (len-6)/6;
	m_yxArray.SetSize(nGroup*4);
	BYTE byCDTParity;
	for(int i=0;i<nGroup;i++)
	{
		byCDTParity = CManager::CdtParity(&buf[(i+1)*6]);
		if(byCDTParity != buf[(i+1)*6+5])
			break;
		m_yxArray.SetAt(i*4,buf[(i+1)*6+1]);
		m_yxArray.SetAt(i*4+1,buf[(i+1)*6+2]);
		m_yxArray.SetAt(i*4+2,buf[(i+1)*6+3]);
		m_yxArray.SetAt(i*4+3,buf[(i+1)*6+4]);
	}
	
}
//处理CDT遥控反校
int CMaintainView::ProcessCDTYkReturn(BYTE *buf, int len)
{
	int nGroup = len/6;
	if(nGroup < 4)
		return -1;//数据长度错误

	BYTE byCDTParity = CManager::CdtParity(&buf[6]);
	if(buf[11]!=byCDTParity)
		return -1;
	return buf[7];
}
//处理收到的FDK遥信数据,提出具体状态
void CMaintainView::ProcessFDKYx(BYTE *buf, int len)
{
	if(len < 13)
		return;
	WORD nCount = MAKEWORD(buf[8],buf[9]);

	//4850及以后的FDK规约中传送的是YX字节数,以前的186等传送的是YX个数
	if(8*(len-12)==nCount)
		nCount/=8;
	
	m_yxArray.SetSize(nCount);
	for(int i=0;i<nCount;i++)
		m_yxArray.SetAt(i,buf[10+i]);
}

void CMaintainView::AddSOEToList(int wMilliseconds, int wSecond, int wMinute, int wHour, int wDay, int wMonth, int yxno, int yxstatus)
{
	((CMainFrame*)AfxGetMainWnd())->AddSOEToList(wMilliseconds,wSecond,wMinute,wHour,wDay,wMonth,yxno,yxstatus);
}

void CMaintainView::SetParaMsu(int nGroupNo, int nAddrNo, MSU_PARA p)
{
	m_buildData.SetMsuPara(p);
	nLen = m_buildData.BuildDataFrame(PARA_DOWNLOAD_MSU,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

void CMaintainView::SetParaDcu(int nGroupNo, int nAddrNo, DCU_PARA p)
{
	m_buildData.SetDcuPara(p);
	nLen = m_buildData.BuildDataFrame(PARA_DOWNLOAD_DCU,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

void CMaintainView::SetParaAcu(int nGroupNo, int nAddrNo, ACU_PARA p)
{
	m_buildData.SetAcuPara(p);
	nLen = m_buildData.BuildDataFrame(PARA_DOWNLOAD_ACU,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

void CMaintainView::UploadPara(int nTpye)
{
	nUploadType = nTpye;

	switch(nTpye) {
	case 1:
		nLen = m_buildData.BuildDataFrame(PARA_UPLOAD_MSU,sendBuf);
		break;
	case 2:
		nLen = m_buildData.BuildDataFrame(PARA_UPLOAD_DCU,sendBuf);
		break;
	case 3:
		nLen = m_buildData.BuildDataFrame(PARA_UPLOAD_ACU,sendBuf);
		break;
	default:
		return;
	}
	GetDocument()->SendData(sendBuf,nLen,true);
}

void CMaintainView::SetYkPara(int ykno, int ykaction)
{
	nYkNo = ykno;
	nYkAction = ykaction;
	
	m_buildData.SetYkPara(ykno,ykaction);
	nLen = m_buildData.BuildDataFrame(QUERY_YK_SELECT,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);

}

void CMaintainView::SetYtPara(WORD ytvalue,int ytno)
{
	nYtValue = ytvalue;
	nYtNo = ytno;
	m_buildData.SetYtPara(ytno,ytvalue);
	nLen = m_buildData.BuildDataFrame(QUERY_YT,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);

}

void CMaintainView::GetYkPara(WORD &ykno, int &ykaction)
{
	ykno = nYkNo;
	ykaction = nYkAction;
}

void CMaintainView::GetYtPara(WORD &ytvalue,int &ytno)
{
	ytvalue = nYtValue;
	ytno = nYtNo;
}
//返回规约类型
int CMaintainView::GetGuiyueType()
{
	return ngyType;
}
void CMaintainView::YkCancel()
{
	
	nLen = m_buildData.BuildDataFrame(QUERY_YK_CANCEL,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

void CMaintainView::YkExecute()
{
	
	nLen = m_buildData.BuildDataFrame(QUERY_YK_EXECUTE,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}
void CMaintainView::OnClock() 
{
	// TODO: Add your command handler code here
	
	nLen = m_buildData.BuildDataFrame(QUERY_CLOCK,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

void CMaintainView::OnYk() 
{
	// TODO: Add your command handler code here
	dlgYkYt->DoModal();
}

void CMaintainView::OnYt() 
{
	// TODO: Add your command handler code here
	dlgYkYt->DoModal();
}

void CMaintainView::OnYcYx() 
{
	// TODO: Add your command handler code here
	KillTimer(2);
//	ClearArray();
	SetTimer(2,1000,NULL);
}
void CMaintainView::OnManualFrame() 
{
	// TODO: Add your command handler code here
	CDlgSendDataEdit dlgSendDataEdit;
	dlgSendDataEdit.DoModal();
}

void CMaintainView::OnUpdownLoad()
{
	//((CMainFrame*)AfxGetMainWnd())->SetGuiYueTo0420();//上下装默认为DF0420规约
	dlgUpDownLoad->DoModal();
}

void CMaintainView::OnGuiyueCdt() 
{
	// TODO: Add your command handler code here
	ngyType = GY_CDT;
	m_buildData.SetGuiyueType(ngyType);
	ClearArray();
	KillTimer(2);
	if(nCurWorkStatus)
		((CMainFrame*)AfxGetMainWnd())->SetSpecialChar(0xEB);
}

void CMaintainView::OnGuiyueFdk() 
{
	// TODO: Add your command handler code here
	ngyType = GY_FDK;
	m_buildData.SetGuiyueType(ngyType);
	ClearArray();
	if(nCurWorkStatus)
		((CMainFrame*)AfxGetMainWnd())->SetSpecialChar(0x01);
}

void CMaintainView::OnGuiyueJdxj()
{
	ngyType = GY_JDXJ;
	m_buildData.SetGuiyueType(ngyType);
	ClearArray();
	if(nCurWorkStatus)
		((CMainFrame*)AfxGetMainWnd())->SetSpecialChar(0xEB);
}

void CMaintainView::OnGuiyueDf0420() 
{
	// TODO: Add your command handler code here
	ngyType = GY_DF0420;
	ngyTypeFlag = GY_TYPE_FLAG_DF0420;
	m_buildData.SetGuiyueType(ngyType);
	ClearArray();
	if(nCurWorkStatus)
		((CMainFrame*)AfxGetMainWnd())->SetSpecialChar(0x7E);
}

void CMaintainView::OnGuiyueDf0241()
{
	ngyType = GY_DF0420;
	ngyTypeFlag = GY_TYPE_FLAG_DF0421;
	m_buildData.SetGuiyueType(ngyType);
	ClearArray();
	if(nCurWorkStatus)
		((CMainFrame*)AfxGetMainWnd())->SetSpecialChar(0x7E);
}

void CMaintainView::OnGuiyueModbus()
{
	ngyType = GY_MODBUS;
	m_buildData.SetGuiyueType(ngyType);
	ClearArray();
	//if(nCurWorkStatus)
	//	((CMainFrame*)AfxGetMainWnd())->SetSpecialChar(0x01);
}

void CMaintainView::OnGetCommMessage(WPARAM wParam ,LPARAM lParam)
{
	BYTE Buffer[1024];
    WORD Length = 0;
	Length = GetDocument()->ReceiveData(Buffer,1024);

	if(!Length)
		return;
}
bool CMaintainView::CallSMS()
{
	nLen = m_buildData.BuildDataFrame(SMS_CALL,sendBuf);
	return(GetDocument()->SendData(sendBuf,nLen,true));
}
void CMaintainView::SetSMS(SMS_SETUP info)
{
	m_buildData.SetSmsPara(info);
	nLen = m_buildData.BuildDataFrame(SMS_SET,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

void CMaintainView::Smsreset()
{
	nLen = m_buildData.BuildDataFrame(SMS_RESET,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

////////////////////////
//设置报警控制器参数
void CMaintainView::SetAlarmControler(GROUPSTATION info)
{
	m_buildData.SetAlarmerPara(info);
	nLen = m_buildData.BuildDataFrame(PARA_DOWNLOAD_ALARMER,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

//===================
//上装报警控制器参数
void CMaintainView::UploadAlarmPara()
{
	nUploadType = 8;
	nLen = m_buildData.BuildDataFrame(PARA_UPLOAD_ALARMER,sendBuf);
	GetDocument()->SendData(sendBuf,nLen,true);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?