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 + -
显示快捷键?