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

📄 pdm.cpp

📁 pdm装置通讯规约
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	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 + -