📄 pdm.cpp
字号:
{
int nCnt;
int nDataIndex=MODBUS_DATA_START;
int nYcNum=0;
WB_UNION Val;
m_nUnDataLen=pRecvBuf[2];
nYcNum=pRecvBuf[2]/2;
for(nCnt=0;nCnt<nYcNum;nCnt++)
{
Val.bwUnion.byVal[0]=pSendBuf[nDataIndex++];
Val.bwUnion.byVal[1]=pSendBuf[nDataIndex++];
m_pUnFrameIED->SetDataRecvVal(dataYc,0,nCnt,Val.bwUnion.wVal);
}
return;
}
/////////////////////////////////////////////////////////////////////////////////////////
void CPdm::UnFrameYk(BYTE* pRecvBuf,INT nLen)
{
TASK *pTask=NULL;
YK_COMMAND *pCommand;
pTask=m_pCH->GetWaitingTask(taskCmdYkExecute,m_byRecvMiterAddr);//取正等待响应的任务
if(!pTask)
return;
pCommand=(YK_COMMAND*)pTask->iUserData;
pTask->eTaskReturn=retRight;
pTask->eRespType = taskCmdYkReturn;
pCommand->eReturn = act_right;
m_pCH->TaskResp(pTask);
return;
}
/////////////////////////////////////////////////////////////////////////////
//组校时帧
/*
INT CPdm::DNSetNodeTime(BYTE* pSendBuf)
{
BYTE byCS = 0,i,nCnt=0;
TIME_STRUCT clock;
WB_UNION Val;
BYTE byTemp;
fnGetSysTime(&clock);
pSendBuf[nCnt++]=DN_START_CODE;
for( i=0; i<6; i++)
{
pSendBuf[nCnt++]=0x99; //写地址域 广播地址
}
pSendBuf[nCnt++]=DN_START_CODE;
pSendBuf[nCnt++]=0x08;
pSendBuf[nCnt++]=0x06;
pSendBuf[nCnt++]=clock.bySecond+0x33;
pSendBuf[nCnt++]=clock.byMinute+0x33;
pSendBuf[nCnt++]=clock.byHour+0x33;
pSendBuf[nCnt++]=clock.byDay+0x33;
pSendBuf[nCnt++]=clock.byMonth+0x33;
pSendBuf[nCnt++]=clock.nYear-2000+0x33;
for( i=0; i < nCnt; i++)
{
byCS+= pSendBuf[i];
}
pSendBuf[nCnt++]=byCS;
pSendBuf[nCnt++]=DN_END_CODE;
return nCnt;
}
*/
///////////////////////////////////////////////////////////////////////////////////
//组帧
INT CPdm::Frame(BYTE* pSendBuf,INT nLen)
{
INT nRet=0;
if(m_pTask=m_pCH->m_pTaskQue->Read())
{
switch(m_pTask->eTaskType)
{
case taskCmdSetNodeAddr:
// nRet=FrameNodeAddr(pSendBuf,byAddr);
break;
case taskAdjustTime:
// nRet=FrameNodeTime(pSendBuf);
break;
case taskFrame:
nRet=FrameAskData(pSendBuf);
break;
default:
break;
}
}
return nRet;
}
///////////////////////////////////////////////////////////////////////////////////
//组查询帧
INT CPdm::FrameAskData(BYTE* pSendBuf)
{
INT nRet=0;
if(m_byAskMeterNo > m_byEndNo)
m_byAskMeterNo = m_byStartNo;
switch (m_wAskStep)
{
case 0:
nRet=FrameAskYc(m_byAskMeterNo,pSendBuf);
m_wAskStep++;
break;
case 1:
nRet=FrameAskYxI(m_byAskMeterNo,pSendBuf);
m_wAskStep++;
break;
case 2:
nRet=FrameAskYxO1(m_byAskMeterNo,pSendBuf);
m_wAskStep++;
break;
case 3:
nRet=FrameAskYxO2(m_byAskMeterNo,pSendBuf);
m_wAskStep++;
break;
case 4:
nRet=FrameAskDd(m_byAskMeterNo,pSendBuf);
m_wAskStep=0;
break;
default:
m_wAskStep=0;
break;
}
return nRet;
}
/////////////////////////////////////////////////////////////////////////////////////////
//
WORD CPdm::FrameAskYc(WORD wID,BYTE* pSendBuf)
{
WORD wCnt=0;
WB_UNION Val;
if(wID>=CH_MAX_IED_NUM)
return wCnt;
if(m_PDMPara[wID].wYcNum==0)
return wCnt;
pSendBuf[wCnt++]=wID;
Val.bwUnion.wVal=MODBUS_READ_REGISTER_FUNCODE;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYcStartAddr;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYcNum;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=AddCRC(pSendBuf,wCnt);
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
return wCnt;
}
/////////////////////////////////////////////////////////////////////////////////////////
//
WORD CPdm::FrameAskYxI(WORD wID,BYTE* pSendBuf)
{
WORD wCnt=0;
WB_UNION Val;
if(wID>=CH_MAX_IED_NUM)
return wCnt;
if(m_PDMPara[wID].wYxINum==0)
return wCnt;
pSendBuf[wCnt++]=wID;
Val.bwUnion.wVal=MODBUS_READ_REGISTER_FUNCODE;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYxIStartAddr;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYxINum;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=AddCRC(pSendBuf,wCnt);
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
return wCnt;
}
/////////////////////////////////////////////////////////////////////////////////////////
//
WORD CPdm::FrameAskYxO1(WORD wID,BYTE* pSendBuf)
{
WORD wCnt=0;
WB_UNION Val;
if(wID>=CH_MAX_IED_NUM)
return wCnt;
if(m_PDMPara[wID].wYxONum==0)
return wCnt;
pSendBuf[wCnt++]=wID;
Val.bwUnion.wVal=MODBUS_READ_REGISTER_FUNCODE;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYxO1StartAddr;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYxONum;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=AddCRC(pSendBuf,wCnt);
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
return wCnt;
}
/////////////////////////////////////////////////////////////////////////////////////////
//
WORD CPdm::FrameAskYxO2(WORD wID,BYTE* pSendBuf)
{
WORD wCnt=0;
WB_UNION Val;
if(wID>=CH_MAX_IED_NUM)
return wCnt;
if(m_PDMPara[wID].wYxONum==0)
return wCnt;
pSendBuf[wCnt++]=wID;
Val.bwUnion.wVal=MODBUS_READ_REGISTER_FUNCODE;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYxO2StartAddr;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wYxONum;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=AddCRC(pSendBuf,wCnt);
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
return wCnt;
}
/////////////////////////////////////////////////////////////////////////////////////////
//
WORD CPdm::FrameAskDd(WORD wID,BYTE* pSendBuf)
{
WORD wCnt=0;
WB_UNION Val;
if(wID>=CH_MAX_IED_NUM)
return wCnt;
if(m_PDMPara[wID].wDdNum==0)
return wCnt;
pSendBuf[wCnt++]=wID;
Val.bwUnion.wVal=MODBUS_READ_REGISTER_FUNCODE;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wDdStartAddr;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=m_PDMPara[wID].wDdNum;
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
Val.bwUnion.wVal=AddCRC(pSendBuf,wCnt);
pSendBuf[wCnt++]=Val.bwUnion.byVal[0];
pSendBuf[wCnt++]=Val.bwUnion.byVal[1];
return wCnt;
}
/////////////////////////////////////////////////////////////////////////////////////////
//定时器回调函数
void CPdm::OnTimer()
{
m_tempTask.eTaskSource=(eDataSource)(m_pCH->m_ChConfig.eDS);
m_tempTask.eTaskDest=(eDataSource)(m_pCH->m_ChConfig.eDS);
m_tempTask.byDestNodeID=0xff;
m_tempTask.bNeedResp=false;
m_tempTask.bWithDataF=false;
m_tempTask.eTaskType=taskFrame;
m_pCH->m_pTaskQue->Add(m_tempTask);//加入一个任务
}
/////////////////////////////////////////////////////////////////////////////////////////
//CRC校验函数
WORD CPdm::AddCRC(BYTE* pbyBuf,WORD wLen)
{
WORD CRC=0xFFFF;
WORD ARC;
WB_UNION unSwap;
WB_UNION Swap;
int n;
for(n=0;n<wLen;n++)
{
ARC=(pbyBuf[n]^CRC) & 0x00FF;
unSwap.bwUnion.wVal=CRC;
Swap.bwUnion.byVal[0]=unSwap.bwUnion.byVal[1];
Swap.bwUnion.byVal[1]=unSwap.bwUnion.byVal[0];
CRC=Swap.bwUnion.wVal;
CRC=CRC & 0x00FF;
CRC=CRC & g_byPdmCRC[ARC];
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//CRC校验函数(必须包括2个CRC字节)
BOOL CPdm::CheckCRC(BYTE* pbyBuf,WORD wLen)
{
BOOL bRet=false;
WORD CRC=0xFFFF;
WORD ARC;
WB_UNION unSwap;
WB_UNION Swap;
int n;
for(n=0;n<wLen;n++)
{
ARC=(pbyBuf[n]^CRC) & 0x00FF;
unSwap.bwUnion.wVal=CRC;
Swap.bwUnion.byVal[0]=unSwap.bwUnion.byVal[1];
Swap.bwUnion.byVal[1]=unSwap.bwUnion.byVal[0];
CRC=Swap.bwUnion.wVal;
CRC=CRC & 0x00FF;
CRC=CRC & g_byPdmCRC[ARC];
}
if(!CRC)
bRet=true;
return bRet;
}
/////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -