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

📄 pdm.cpp

📁 pdm装置通讯规约
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////////////////
//					PDM规约部分								//
/////////////////////////////////////////////////////////////////////////////////////////
#include "PDM.h"
/////////////////////////////////////////////////////////////////////////////////////////
BYTE	g_byModBusCRC[]={
/////////////////////////////////////////////////////////////////////////////////////////
///BCD码转化函数 帧中地址域为BCD编码
BYTE CPdm::BCDToValue(BYTE byBCD)
{
	return ((byBCD/16)*10+byBCD%16);
}
/////////////////////////////////////////////////////////////////////////////////////////
BYTE CPdm::ValueToBCD(BYTE byVal)
{
	return ((byVal/10)*16+byVal%10);
}
/////////////////////////////////////////////////////////////////////////////////////////
// FUNCTION(功能):
void CPdm::InitPtl()
{
	m_byAskMeterNo=0;
	m_wAskStep=0;
	m_byStartNo=0;
	m_byEndNo=0;
	if(m_pCH->m_PtlPara[0]<CH_MAX_IED_NUM&&m_pCH->m_PtlPara[0]>=0)
	{
		m_byAskMeterNo=m_pCH->m_PtlPara[0];
		m_byStartNo=m_pCH->m_PtlPara[0];
	}
	if(m_pCH->m_PtlPara[1]<CH_MAX_IED_NUM&&m_pCH->m_PtlPara[1]>=0)
		m_byEndNo=m_pCH->m_PtlPara[1];

	if(m_pCH->m_PtlPara[2]==0||m_pCH->m_PtlPara[2]>=600)
		SetTimer(1);
	else
		SetTimer(m_pCH->m_PtlPara[2]);
	for(n=0;n<CH_MAX_IED_NUM;n++)
	{
		m_PDMPara[n].wYcStartAddr=0;
		m_PDMPara[n].wYxIStartAddr=0;
		m_PDMPara[n].wYxOStartAddr=0;
		m_PDMPara[n].wDdStartAddr=0;
		m_PDMPara[n].wYkStartAddr=0;

		m_PDMPara[n].wYcMod=0;
		m_PDMPara[n].wDdMod=0;
		m_PDMPara[n].wYcNum=0;
		m_PDMPara[wID].wYxINum=0;
		m_PDMPara[wID].wYxONum=0;
		m_PDMPara[wID].wYxOGoupNum=0;
		m_PDMPara[wID].wYxMod=0;
		m_PDMPara[n].wDdNum=0;
		m_PDMPara[n].wYkNum=0;
		m_PDMPara[n].wYtNum=0;
	}
	initIEDPara();
}
///////////////////////////////////////////////////////////////////////////////////
void CPdm::initIEDPara()
{
	CIED* pIED;
	for(n=m_byStartNo;n<=m_byEndNo;n++)
	{
		pIED=GetIED(n);
		loadIEDPara(pIED,n);
	}
}
///////////////////////////////////////////////////////////////////////////////////
//加载装置参数
void CPdm::loadIEDPara(CIED* pIED,WORD wID)
{
	if(!pIED||wID>=CH_MAX_IED_NUM)
		return;
	switch (pIED->m_IEDConfig.usIEDType)
	{
		case 800:
			nRet=load800IEDPara(pIED,wID);
			break;
		case 801:
			nRet=load801IEDPara(pIED,wID);
			break;
		case 803:
			nRet=load803IEDPara(pIED,wID);
			break;
		case 810:
			nRet=load810IEDPara(pIED,wID);
			break;
		case 820:
			nRet=load820IEDPara(pIED,wID);
			break;
		default:
			break;
	}
}
///////////////////////////////////////////////////////////////////////////////////
//加载800装置参数
void CPdm::load800IEDPara(CIED* pIED,WORD wID)
{
	if(!pIED||wID>=CH_MAX_IED_NUM)
		return;
	m_PDMPara[wID].wYcStartAddr=PDM800_YCSSZ_STARTADDR;
/*
	m_PDMPara[wID].wYcMod = pIED->m_IEDConfig.usYcMod;
	switch (pIED->m_IEDConfig.usYcMod)
	{
		case 1:
			m_PDMPara[wID].wYcStartAddr=PDM800_YCPJZ_STARTADDR;
			break;
		case 2:
			m_PDMPara[wID].wYcStartAddr=PDM800_YCZDZ_STARTADDR;
			break;
		case 3:
			m_PDMPara[wID].wYcStartAddr=PDM800_YCZXZ_STARTADDR;
			break;
		default:
			break;
	}
*/
	m_PDMPara[wID].wYxO1StartAddr=PDM800_YXO1_STARTADDR;
	m_PDMPara[wID].wYxO2StartAddr=PDM800_YXO2_STARTADDR;

	m_PDMPara[wID].wDdMod=1;
	m_PDMPara[wID].wDdStartAddr=PDM800_DDMOD2_STARTADDR;

	m_PDMPara[wID].wYkStartAddr=0;

	m_PDMPara[wID].wYcNum=34;
	m_PDMPara[wID].wYxINum=0;
	m_PDMPara[wID].wYxONum=32;
	m_PDMPara[wID].wYxOGoupNum=2;
	m_PDMPara[wID].wDdNum=4;
	m_PDMPara[wID].wYkNum=0;
}
///////////////////////////////////////////////////////////////////////////////////
//加载801装置参数
void CPdm::load801IEDPara(CIED* pIED,WORD wID)
{
	if(!pIED||wID>=CH_MAX_IED_NUM)
		return;
	m_PDMPara[wID].wYcStartAddr=PDM801_YCSSZ_STARTADDR;
	m_PDMPara[wID].wYcMod = 0;
	m_PDMPara[wID].wYxIStartAddr=PDM801_YXI_STARTADDR;

//	m_PDMPara[wID].wDdMod=pIED->m_IEDConfig.usDdMod;
	m_PDMPara[wID].wDdStartAddr=PDM801_DDMOD1_STARTADDR;
//	if(m_PDMPara[wID].wDdMod)
//		m_PDMPara[wID].wDdStartAddr=PDM801_DDMOD2_STARTADDR;
	m_PDMPara[wID].wYkStartAddr=PDM801_YK_STARTADDR;

	m_PDMPara[wID].wYcNum=5;
	m_PDMPara[wID].wYxINum=4;
	m_PDMPara[wID].wYxONum=0;
	m_PDMPara[wID].wYxOGoupNum=0;
	m_PDMPara[wID].wDdNum=2;
	m_PDMPara[wID].wYkNum=2;

}
///////////////////////////////////////////////////////////////////////////////////
//加载803装置参数
void CPdm::load803IEDPara(CIED* pIED,WORD wID)
{
	if(!pIED||wID>=CH_MAX_IED_NUM)
		return;
	m_PDMPara[wID].wYcStartAddr=PDM803_YCSSZ_STARTADDR;
	m_PDMPara[wID].wYcMod = 0;
	m_PDMPara[wID].wYxIStartAddr=PDM803_YXI_STARTADDR;

//	m_PDMPara[wID].wDdMod=pIED->m_IEDConfig.usDdMod;
	m_PDMPara[wID].wDdStartAddr=PDM803_DDMOD1_STARTADDR;
//	if(m_PDMPara[wID].wDdMod)
//		m_PDMPara[wID].wDdStartAddr=PDM803_DDMOD2_STARTADDR;

	m_PDMPara[wID].wYkStartAddr=PDM803_YK_STARTADDR;

	m_PDMPara[wID].wYcNum=8;
	m_PDMPara[wID].wYxINum=4;
	m_PDMPara[wID].wYxONum=0;
	m_PDMPara[wID].wYxOGoupNum=0;
	m_PDMPara[wID].wDdNum=2;
	m_PDMPara[wID].wYkNum=2;

}
///////////////////////////////////////////////////////////////////////////////////
//加载810装置参数
void CPdm::load810IEDPara(CIED* pIED,WORD wID)
{
	if(!pIED||wID>=CH_MAX_IED_NUM)
		return;
	m_PDMPara[wID].wYcStartAddr=PDM810_YCSSZ_STARTADDR;
	m_PDMPara[wID].wYcMod = 0;
	m_PDMPara[wID].wYxIStartAddr=PDM810_YXI_STARTADDR;

//	m_PDMPara[wID].wDdMod=pIED->m_IEDConfig.usDdMod;
	m_PDMPara[wID].wDdStartAddr=PDM810_DDMOD1_STARTADDR;
//	if(m_PDMPara[wID].wDdMod)
//		m_PDMPara[wID].wDdStartAddr=PDM810_DDMOD2_STARTADDR;

	m_PDMPara[wID].wYkStartAddr=PDM810_YK_STARTADDR;

	m_PDMPara[wID].wYcNum=28;
	m_PDMPara[wID].wYxINum=4;
	m_PDMPara[wID].wYxONum=0;
	m_PDMPara[wID].wYxOGoupNum=0;
	m_PDMPara[wID].wDdNum=2;
	m_PDMPara[wID].wYkNum=2;

}
///////////////////////////////////////////////////////////////////////////////////
//加载820装置参数
void CPdm::load820IEDPara(CIED* pIED,WORD wID)
{
	if(!pIED||wID>=CH_MAX_IED_NUM)
		return;
	m_PDMPara[wID].wYcStartAddr=PDM820_YCSSZ_STARTADDR;
	m_PDMPara[wID].wYcMod = 0;
	m_PDMPara[wID].wYxIStartAddr=PDM820_YXI_STARTADDR;

//	m_PDMPara[wID].wDdMod=pIED->m_IEDConfig.usDdMod;
	m_PDMPara[wID].wDdStartAddr=PDM820_DDMOD1_STARTADDR;
//	if(m_PDMPara[wID].wDdMod)
//		m_PDMPara[wID].wDdStartAddr=PDM820_DDMOD2_STARTADDR;

	m_PDMPara[wID].wYkStartAddr=PDM820_YK_STARTADDR;

	m_PDMPara[wID].wYcNum=28;
	m_PDMPara[wID].wYxINum=4;
	m_PDMPara[wID].wYxONum=0;
	m_PDMPara[wID].wYxOGoupNum=0;
	m_PDMPara[wID].wDdNum=2;
	m_PDMPara[wID].wYkNum=2;
}
/////////////////////////////////////////////////////////////////////////////
//解帧
void CPdm::UnFrame(BYTE* pRecvBuf,INT nLen)
{
	if(!CheckCRC(pRecvBuf,wLen))
	{
		m_pCH->m_CommStat.nRecvErr++;
		return;
	}
	m_byRecvMiterAddr = pRecvBuf[0];
	m_byFunCode=pRecvBuf[1];
	m_pUnFrameIED=GetIED(m_byRecvMiterAddr);
	if(!m_pUnFrameIED)
		return;
	switch(m_byFunCode)
	{
	case MODBUS_READ_DO_FUNCODE:
		if(m_wAskStep==2)
			UnFrameYxO1(pRecvBuf,nLen);
		else if(m_wAskStep==3)
			UnFrameYxO2(pRecvBuf,nLen);
		break;
	case MODBUS_READ_DI_FUNCODE:
		UnFrameYxI(pRecvBuf,nLen);
		break;
	case MODBUS_READ_REGISTER_FUNCODE:
		UnFrameYc(pRecvBuf,nLen);
		break;
	case MODBUS_WRITE_DO_FUNCODE:
		UnFrameYk(pRecvBuf,nLen);
		break;
	case MODBUS_WRITE_SREGISTER_FUNCODE:
//		UnFrameWrite(pRecvBuf,nLen);
		break;
	case MODBUS_WRITE_MREGISTER_FUNCODE:
//		UnFrameWrite(pRecvBuf,nLen);
		break;
	default:
		break;
	}
}	
/////////////////////////////////////////////////////////////////////////////////////////
void CPdm::UnFrameYxO1(BYTE* pRecvBuf,INT nLen)
{
	int nCnt;
	int nYxIndex=m_PDMPara[m_byRecvMiterAddr].wYxINum;
	for(nCnt=0;nCnt<8;nCnt++)
	{
		if((pRecvBuf[3]&g_byBit[nCnt])!=0)
			m_pUnFrameIED->SetDataRecvVal(dataYx,0,nYxIndex+nCnt,1);
		else
			m_pUnFrameIED->SetDataRecvVal(dataYx,0,nYxIndex+nCnt,0);
	}
	return;
}
/////////////////////////////////////////////////////////////////////////////////////////
void CPdm::UnFrameYxO2(BYTE* pRecvBuf,INT nLen)
{
	int nCnt;
	int nYxIndex=m_PDMPara[m_byRecvMiterAddr].wYxINum+m_PDMPara[m_byRecvMiterAddr].wYxONum;
	for(nCnt=0;nCnt<8;nCnt++)
	{
		if((pRecvBuf[3]&g_byBit[nCnt])!=0)
			m_pUnFrameIED->SetDataRecvVal(dataYx,0,nYxIndex+nCnt,1);
		else
			m_pUnFrameIED->SetDataRecvVal(dataYx,0,nYxIndex+nCnt,0);
	}
	return;
}
/////////////////////////////////////////////////////////////////////////////////////////
void CPdm::UnFrameYxI(BYTE* pRecvBuf,INT nLen)
{
	int nCnt;
	int nYxIndex=0;
	for(nCnt=0;nCnt<8;nCnt++)
	{
		if((pRecvBuf[3]&g_byBit[nCnt])!=0)
			m_pUnFrameIED->SetDataRecvVal(dataYx,0,nYxIndex+nCnt,1);
		else
			m_pUnFrameIED->SetDataRecvVal(dataYx,0,nYxIndex+nCnt,0);
	}
	return;
}
/////////////////////////////////////////////////////////////////////////////////////////
void CPdm::UnFrameYc(BYTE* pRecvBuf,INT nLen)

⌨️ 快捷键说明

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