?? iec103_xuji.cpp
字號:
#include "IEC103_XUJI.h"
namespace IEC103Ptl_XUJI{
//初始化節點運行參數
BOOL CIEC103_XUJIPtl::CreateRealRunIED(CIED *pIED)
{
if(pIED == NULL)
return FALSE;
BOOL bRtn = TRUE;
BYTE byNodeId = pIED->m_IEDConfig.byNodeID;
RealRunIED *pDevRun = m_IEC103Data.m_RunIed[byNodeId];
if (!pDevRun)
{
pDevRun = new RealRunIED;//規約退出是要釋放
if (pDevRun)
m_IEC103Data.m_RunIed[byNodeId] = pDevRun;
}
if (!pDevRun)
return FALSE;
memset(pDevRun, 0, sizeof(RealRunIED));
pDevRun->pDevData = pIED;
pDevRun->byNodeId = byNodeId;
pDevRun->mode = 0;
pDevRun->fcb = 0;
pDevRun->acd = 0;
pDevRun->sendCode = pDevRun->recvCode = 0;
pDevRun->linkQuery = 0;
pDevRun->linkRes= 1;
pDevRun->query = 0;
pDevRun->queryFull= 0;
pDevRun->sin = 0;
pDevRun->lnkNoRecvCnt = 0;
pDevRun->bCommInitFlag = TRUE;
pDevRun->nASDU5Cnt = 0;
pDevRun->step = eInitStart;
return bRtn;
}
// 得到 fun+inf=>nIndex 的映射關系
int CIEC103_XUJIPtl::GetnIndexbyFuninf(CIED *pIED, eDataSort datatype, FunInf &funInf)
{
int nIndex = -1;
int nSize = 0, i = 0,j;
//得到fun+inf對應的nindex
switch(datatype)
{
case dataYc:
{
YC_PARA para;
for(i=0; i<pIED->m_IEDConfig.nYcNum; i++)
{
if(pIED->GetDataPara(dataYc,0,i, (void*)¶))
{
if(para.nFun == funInf.fun && para.nInfo == funInf.inf)
nIndex = i;
}
}
}
break;
case dataBhAc:
{
YC_PARA para;
{
for(j=ac_Ia; j<ac_Sum; j++)
{
if(pIED->GetDataPara(dataBhAc,i, (eAcycItem)j,(void*)¶))
{
if(para.nFun == funInf.fun && para.nInfo == funInf.inf)
nIndex = i*16 + j;
}
}
}
}
break;
case dataYx:
{
YX_PARA para;
for(i=0; i<pIED->m_IEDConfig.nYxNum; i++)
{
if(pIED->GetDataPara(dataYx,0,i, (void*)¶))
{
if(para.nFun == funInf.fun && para.nInfo == funInf.inf)
nIndex = i;
}
}
}
break;
case dataBhYx:
{
YX_PARA para;
for(i=0; i<pIED->m_IEDConfig.nBhNum; i++)
{
if(pIED->GetDataPara(dataBhYx,0,i, (void*)¶))
{
if(para.nFun == funInf.fun && para.nInfo == funInf.inf)
nIndex = i;
}
}
}
break;
case dataDd:
{
DD_PARA para;
for(i=0; i<pIED->m_IEDConfig.nDdNum; i++)
{
if(pIED->GetDataPara(dataDd,0,i, (void*)¶))
{
if(para.nFun == funInf.fun && para.nInfo == funInf.inf)
nIndex = i;
}
}
}
break;
case dataYk:
{
YK_PARA para;
for(i=0; i<pIED->m_IEDConfig.nYkNum; i++)
{
if(pIED->GetDataPara(dataYk,0,i, (void*)¶))
{
if(para.nFun == funInf.fun && para.nInfo == funInf.inf)
nIndex = i;
}
}
}
break;
case dataYt:
break;
case dataBhDz:
break;
default:
break;
}
return nIndex;
}
//根據IED、數據類型和數據點號得到fun+inf
BOOL CIEC103_XUJIPtl::GetFunInf(CIED *pIED, eDataSort datatype, INT nDataID, FunInf &funinf)
{
BOOL bRet = FALSE;
switch(datatype)
{
case dataYk:
{
YK_PARA para;
if(pIED->GetDataPara(dataYk,0,nDataID,(void*)¶))
{
funinf.fun = para.nFun;
funinf.inf = para.nInfo;
bRet = TRUE;
}
}
break;
default:
break;
}
return bRet;
}
//得到通用分類服務組個數和各個通用分類服務組號
void CIEC103_XUJIPtl::GetGininf(CIED *pIED, TASK* pTask, eDataSort datatype, BYTE &byGrpnum, BYTE* pbyGrpID)
{
switch(datatype)
{
case dataBhAc: //保護模擬量
{
byGrpnum = pTask->iUserData[0]; //得到要召喚的模擬量包含的通用分類服務組個數
for(BYTE i=0; i<byGrpnum; i++)
pbyGrpID[i] = pTask->iUserData[i+1];//把數據區中得通用分類組號考到pbyGrpID中
}
break;
case dataSetting:
{
byGrpnum = pTask->iUserData[2]; //得到要召喚的定值組包含的通用分類服務組個數
for(BYTE i=0; i<byGrpnum; i++)
pbyGrpID[i] = pTask->iUserData[i+3];//把數據區中得通用分類組號考到pbyGrpID中
}
break; //保護定值
default:
break;
}
}
//得到定值組個數
BYTE CIEC103_XUJIPtl::GetSettingGrpNum(CIED *pIED, TASK* pTask)
{
BYTE byNum = 0;
byNum = pTask->iUserData[1]; //所有的定值組個數
return byNum;
}
//得到保護定值組號gin
//pTask->iUserData[0]:要設置的定值組號;pTask->iUserData[1]:組號; pTask->iUserData[2]:條目號
void CIEC103_XUJIPtl::GetProtSetGrpGin(TASK* pTask, GIN &gin)
{
gin.group = pTask->iUserData[1];
gin.entry = pTask->iUserData[2];
}
//得到保護復歸fun+inf
void CIEC103_XUJIPtl::GetProtResetFuninf(TASK* pTask, FunInf &funinf)
{
funinf.fun = pTask->iUserData[0];
funinf.inf = pTask->iUserData[1];
}
//從規約參數中得到保護復歸fun+inf
BOOL CIEC103_XUJIPtl::GetProtResetFuninfFromPara(RealRunIED *pDevRun,FunInf &funinf,BYTE &bycpuaddr)
{
USERPARA para;
CIED *pIED = pDevRun->pDevData;
if(!pIED)
return FALSE;
if(!pIED->GetDataPara(dataUserPara,0,0,(void*)¶))
return FALSE;
funinf.fun = para.wUPara0;
funinf.inf = para.wUPara1;
bycpuaddr = para.wUPara2;
return TRUE;
}
//存儲相應任務數據幀
/*
*
*=======================================================
* 描述 偏移量 占位空間
*-------------------------------------------------------
* 相應數據總長度 0~1 2
* **103數據幀總個數N 2~3 2
*-------------------------------------------------------
* **103數據幀1總長度L1 4 1
* **103數據幀1 5~L1+5 L1
* **103數據幀2總長度L2 L1+6 1
* **103數據幀2 L1+7~L1+7+8 L2
* **。。。 。。。 。。。
* **103數據幀2總長度LN X 1
* **103數據幀N X~X+LN LN
*/
BOOL CIEC103_XUJIPtl::SaveTaskRespFmt(BYTE* buf, WORD wLen, TASK* pTask)
{
if(!pTask->pbyBuff)
return FALSE;
BYTE *pbyData = pTask->pbyBuff;
TaskRespHead *pRespHead = (TaskRespHead *)(pbyData);
if(pTask->nDataBufLen == 0)
{
pRespHead->bufLen = 0;
pRespHead->fmtNum = 0;
}
pRespHead->bufLen += (wLen + 1);
pRespHead->fmtNum ++;
*(pbyData + 4 + pTask->nDataBufLen) = lobyte(wLen);
memcpy(pbyData + 4 + pTask->nDataBufLen + 1, buf, wLen);
pTask->nDataBufLen += (wLen + 1);
return TRUE;
}
//存儲測控遙信
void CIEC103_XUJIPtl::SaveCeKongYaoXin(RealRunIED *pRunIed, FunInf funInf,BYTE yxBit, TIME_4 tm)
{
eDataSort data;
CIED *pIED = pRunIed->pDevData;
int nIndex = GetnIndexbyFuninf(pIED, dataYx, funInf);//先取實遙信的索引;
data = dataYx;
if(nIndex == -1)
{
nIndex = GetnIndexbyFuninf(pIED, dataBhYx, funInf);//取保護虛遙信索引
data = dataBhYx;
}
if (nIndex >= 0)
{
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
if(byYXRecvVal != yxBit)
{
//設置遙信值
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事項存儲
EVENT_STRUCT bhent;
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
bhent.eDS = (eDataSource)m_pCH->m_ChConfig.eDS; // 數據源
bhent.eEventType = data; // 事項類型(開關類)
bhent.nEventNode = nIndex; // 事項點
bhent.nEventVal = 0x10; // 事項值
if(yxBit == 1)
bhent.nEventVal = 0x01;
bhent.nNode = pIED->m_IEDConfig.byNodeID;// 設備節點
WB_UNION wb;
wb.bwUnion.byVal[1] = tm.byLowMs;
wb.bwUnion.byVal[0] = tm.byHighMs;
bhent.TimeStamp.nMs = wb.bwUnion.wVal % 1000;
bhent.TimeStamp.bySecond = wb.bwUnion.wVal / 1000;
bhent.TimeStamp.byMinute = tm.Minutes;
bhent.TimeStamp.byHour = tm.Hours;
bhent.TimeStamp.byDay = sysTime.byDay;
bhent.TimeStamp.byMonth = sysTime.byMonth;
bhent.TimeStamp.nYear = sysTime.nYear;
//m_pCH->m_pYxbwSoeQue->Add(bhent);
m_pCH->m_pYxSoeQue->Add(bhent);
}
}
}
void CIEC103_XUJIPtl::SaveCeKongYaoXin(RealRunIED *pRunIed, FunInf funInf,BYTE yxBit)
{
eDataSort data;
CIED *pIED = pRunIed->pDevData;
int nIndex = GetnIndexbyFuninf(pIED, dataYx, funInf);//先取實遙信的索引;
data = dataYx;
if(nIndex == -1)
{
nIndex = GetnIndexbyFuninf(pIED, dataBhYx, funInf);//取保護虛遙信索引
data = dataBhYx;
}
if (nIndex >= 0)
{
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
if(byYXRecvVal != yxBit)
{
//設置遙信值
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事項存儲
EVENT_STRUCT bhent;
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
bhent.eDS = (eDataSource)m_pCH->m_ChConfig.eDS; // 數據源
bhent.eEventType = data; // 事項類型(開關類)
bhent.nEventNode = nIndex; // 事項點
bhent.nEventVal = 0x10; // 事項值
if(yxBit == 1)
bhent.nEventVal = 0x01;
bhent.nNode = pIED->m_IEDConfig.byNodeID;// 設備節點
bhent.TimeStamp.nMs = sysTime.nMs;
bhent.TimeStamp.bySecond = sysTime.bySecond;
bhent.TimeStamp.byMinute = sysTime.byMinute;
bhent.TimeStamp.byHour = sysTime.byHour;
bhent.TimeStamp.byDay = sysTime.byDay;
bhent.TimeStamp.byMonth = sysTime.byMonth;
bhent.TimeStamp.nYear = sysTime.nYear;
// m_pCH->m_pYxbwSoeQue->Add(bhent);
// m_pCH->m_pYxSoeQue->Add(bhent);
}
}
}
//波特率
DWORD CIEC103_XUJIPtl::GetChRatio(void)
{
DWORD dwRate = m_pCH->m_ChConfig.dwBaudRate;
DWORD dwVal = 1200;
if (110 == dwRate)
dwVal = 110;
else if (300 == dwRate)
dwVal = 300;
else if (600 == dwRate)
dwVal = 600;
else if (1200 == dwRate)
dwVal = 1200;
else if (2400 == dwRate)
dwVal = 2400;
else if (4800 == dwRate)
dwVal = 4800;
else if (9600 == dwRate)
dwVal = 9600;
else if (14400 == dwRate)
dwVal = 14400;
else if (19200 == dwRate)
dwVal = 19200;
else if (38400 == dwRate)
dwVal = 38400;
else if (56000 == dwRate)
dwVal = 56000;
else if (57600 == dwRate)
dwVal = 57600;
else if (115200 == dwRate)
dwVal = 115200;
else if (128000 == dwRate)
dwVal = 128000;
else if (256000 == dwRate)
dwVal = 256000;
return dwVal;
}
//參數轉換函數,從flash參數轉換為規約參數
void CIEC103_XUJIPtl::FlashParaToPtlPara(FlashPara103 * pPara)
{
//先調用默認參數
DafaultPtlPara();
// 保護遙信復歸
if(pPara->bOrdAfmReset > 0)
m_IEC103PtlPara.bOrdAfmReset = 1; // 確認復歸(復歸命令肯定確認時,保護信號復歸)
if(pPara->bOrderReset > 0)
m_IEC103PtlPara.bOrderReset = 1; // 命令復歸(復歸命令毋須確認,保護信號即可復歸)
if(pPara->bEventVirtualYX > 0)
m_IEC103PtlPara.bEventVirtualYX = 1; // 故障事項虛遙信
// 通用參數
if(pPara->byInitNum > 0)
m_IEC103PtlPara.byInitNum = pPara->byInitNum; // 初始化重傳次數
if(pPara->dwFrameOver > 0)
m_IEC103PtlPara.dwFrameOver = pPara->dwFrameOver; // 幀超時間隔,ms
if(pPara->dwQuery > 0)
m_IEC103PtlPara.dwQuery = pPara->dwQuery; // 總查詢間隔,s
if(pPara->wTimeOver > 0)
m_IEC103PtlPara.wTimeOver = pPara->wTimeOver; // 校時間隔
if(pPara->bCommAddr > 0 || pPara->bCommAddr == 0)
m_IEC103PtlPara.bCommAddr = pPara->bCommAddr;
if(pPara->byBHCPUAddr > 0)
m_IEC103PtlPara.byBHCPUAddr = pPara->byBHCPUAddr;
if(pPara->byCKCPUAddr > 0)
m_IEC103PtlPara.byCKCPUAddr = pPara->byCKCPUAddr;
//if(pPara->byBhResetFun > 0)
// m_IEC103PtlPara.byBhResetFun = pPara->byBhResetFun;
//if(pPara->byBhResetInf > 0)
// m_IEC103PtlPara.byBhResetInf = pPara->byBhResetInf;
//規約默認參數設置
void CIEC103_XUJIPtl::DafaultPtlPara(void)
{
// 保護遙信復歸
m_IEC103PtlPara.bOrdAfmReset = 0; // 確認復歸(復歸命令肯定確認時,保護信號復歸)
m_IEC103PtlPara.bOrderReset = 0; // 命令復歸(復歸命令毋須確認,保護信號即可復歸)
// 信息存儲
m_IEC103PtlPara.bEventVirtualYX = 0; // 故障事項虛遙信
// 通用參數
m_IEC103PtlPara.byInitNum = 1; // 初始化重傳次數
m_IEC103PtlPara.dwFrameOver = 2000; // 幀超時間隔,ms
m_IEC103PtlPara.dwQuery = 180; // 總查詢間隔,s
m_IEC103PtlPara.wTimeOver = 600; // 校時間隔,s
m_IEC103PtlPara.bCommAddr = 1; // 默認為1,才有cpu地址
m_IEC103PtlPara.byBHCPUAddr = 1; // 保護cpu地址,默認為1
m_IEC103PtlPara.byCKCPUAddr = 2; // 測控cpu地址,默認為2
//m_IEC103PtlPara.byBhResetFun = 0;
//m_IEC103PtlPara.byBhResetInf = 0;
}
//通道任務監視函數
BOOL CIEC103_XUJIPtl::WatchTask(TASK* &ptask, eTaskTyp tasktyp, BYTE byNodeID)
{
ptask = m_pCH->GetWaitingTask(tasktyp, byNodeID);
if (ptask)
return TRUE;
return FALSE;
}
//規約初始化
void CIEC103_XUJIPtl::InitPtl(void)
{
int i;
FlashPara103 * pflashpara = NULL;
pflashpara = (FlashPara103*)(m_pCH->m_PtlPara);
if(pflashpara)
FlashParaToPtlPara(pflashpara);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -