📄 pdm.cpp
字号:
/////////////////////////////////////////////////////////////////////////////////////////
// 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 + -