?? iec103_sf.cpp
字號:
#include "IEC103_SF.h"
namespace IEC103Ptl_SF
{
//初始化節(jié)點(diǎn)運(yùn)行參數(shù)
BOOL CIEC103_SFPtl::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為空,則動態(tài)分配內(nèi)存,并把其賦值給規(guī)約數(shù)據(jù)中的參數(shù)
pDevRun = new RealRunIED;//規(guī)約退出是要釋放
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->bQuryEnd = FALSE;
pDevRun->bGenGroupQury = FALSE;
pDevRun->bDdQury = FALSE;
pDevRun->nASDU5Cnt = 0;
pDevRun->step = eInitStart;
int i = 0; //初始化自定義參數(shù)--組號與類型
USERPARA para;
for (i=0; i<IED_USER_SIZE;i++)
{
GinGrouptoType* ptype = &pDevRun->Grouptotype[i];
ptype->gintype = (eGinGroupType)0;
ptype->gingroup = 0;
if (pIED->GetDataPara(dataUserPara,0,i,(void*)¶))
{
ptype->gintype = (eGinGroupType)para.wUPara0;
ptype->gingroup = para.wUPara1;
//printf("ptype->gintype = %d,para.wUPara0 = %d\n",ptype->gintype,para.wUPara0);
//printf("ptype->gingroup = %d,para.wUPara1 = %d\n",ptype->gingroup,para.wUPara1);
}
}
return bRtn;
}
// 得到 fun+inf=>nIndex 的映射關(guān)系
int CIEC103_SFPtl::GetnIndexbyFuninf(CIED *pIED, eDataSort datatype, FunInf &funInf)
{
//printf("datatype = %d,fun = %d,inf = %d\n",datatype,funInf.fun,funInf.inf);
int nIndex = -1;
int nSize = 0, i = 0,j;
//得到fun+inf對應(yīng)的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(i=0; i<pIED->m_IEDConfig.nBhAcLoopNum; i++)
{
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;
}
//根據(jù)IED、數(shù)據(jù)類型和數(shù)據(jù)點(diǎn)號得到fun+inf
BOOL CIEC103_SFPtl::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;
}
//得到通用分類服務(wù)組個(gè)數(shù)和各個(gè)通用分類服務(wù)組號
void CIEC103_SFPtl::GetGininf(CIED *pIED, TASK* pTask, eDataSort datatype, BYTE &byGrpnum, BYTE* pbyGrpID)
{
switch(datatype)
{
case dataBhAc: //保護(hù)模擬量
{
byGrpnum = pTask->iUserData[0]; //得到要召喚的模擬量包含的通用分類服務(wù)組個(gè)數(shù)
for(BYTE i=0; i<byGrpnum; i++)
pbyGrpID[i] = pTask->iUserData[i+1];//把數(shù)據(jù)區(qū)中得通用分類組號考到pbyGrpID中
}
break;
case dataSetting:
{
byGrpnum = pTask->iUserData[2]; //得到要召喚的定值組包含的通用分類服務(wù)組個(gè)數(shù)
for(BYTE i=0; i<byGrpnum; i++)
pbyGrpID[i] = pTask->iUserData[i+3];//把數(shù)據(jù)區(qū)中得通用分類組號考到pbyGrpID中
}
break; //保護(hù)定值
default:
break;
}
}
//得到定值組個(gè)數(shù)
BYTE CIEC103_SFPtl::GetSettingGrpNum(CIED *pIED, TASK* pTask)
{
BYTE byNum = 0;
byNum = pTask->iUserData[1]; //所有的定值組個(gè)數(shù)
return byNum;
}
//得到保護(hù)定值組號gin
//pTask->iUserData[0]:要設(shè)置的定值組號;pTask->iUserData[1]:組號; pTask->iUserData[2]:條目號
void CIEC103_SFPtl::GetProtSetGrpGin(TASK* pTask, GIN &gin)
{
gin.group = pTask->iUserData[1];
gin.entry = pTask->iUserData[2];
}
//得到保護(hù)復(fù)歸fun+inf
void CIEC103_SFPtl::GetProtResetFuninf(TASK* pTask, FunInf &funinf)
{
funinf.fun = pTask->iUserData[0];
funinf.inf = pTask->iUserData[1];
}
//從規(guī)約參數(shù)中得到保護(hù)復(fù)歸fun+inf以及地址
BOOL CIEC103_SFPtl::GetProtResetFuninfFromPara(RealRunIED *pDevRun,FunInf &funinf,BYTE &addr)
{
USERPARA para;
CIED *pIED = pDevRun->pDevData;
if(!pIED)
return FALSE;
if(!pIED->GetDataPara(dataUserPara,0,0,(void*)¶))
return FALSE;
funinf.fun = para.wUPara0; //FUN
funinf.inf = para.wUPara1; //INF
addr = para.wUPara2; //(選擇)單元地址或者廣播地址
return TRUE;
}
//存儲相應(yīng)任務(wù)數(shù)據(jù)幀
/*
*
*=======================================================
* 描述 偏移量 占位空間
*-------------------------------------------------------
* 相應(yīng)數(shù)據(jù)總長度 0~1 2
* **103數(shù)據(jù)幀總個(gè)數(shù)N 2~3 2
*-------------------------------------------------------
* **103數(shù)據(jù)幀1總長度L1 4 1
* **103數(shù)據(jù)幀1 5~L1+5 L1
* **103數(shù)據(jù)幀2總長度L2 L1+6 1
* **103數(shù)據(jù)幀2 L1+7~L1+7+8 L2
* **。。。 。。。 。。。
* **103數(shù)據(jù)幀2總長度LN X 1
* **103數(shù)據(jù)幀N X~X+LN LN
*/
BOOL CIEC103_SFPtl::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_SFPtl::SaveCeKongYaoXin(RealRunIED *pRunIed, FunInf funInf,BYTE yxBit, TIME_4 tm)
{
eDataSort data;
CIED *pIED = pRunIed->pDevData;
int nIndex = GetnIndexbyFuninf(pIED, dataYx, funInf);//先取實(shí)遙信的索引;
data = dataYx;
if(nIndex == -1)
{
nIndex = GetnIndexbyFuninf(pIED, dataBhYx, funInf);//取保護(hù)虛遙信索引
data = dataBhYx;
}
if (nIndex >= 0)
{
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
if(byYXRecvVal != yxBit)
{
//設(shè)置遙信值
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事項(xiàng)存儲
EVENT_STRUCT bhent;
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
bhent.eDS = (eDataSource)m_pCH->m_ChConfig.eDS; // 數(shù)據(jù)源
bhent.eEventType = data; // 事項(xiàng)類型(開關(guān)類)
bhent.nEventNode = nIndex; // 事項(xiàng)點(diǎn)
bhent.nEventVal = 0x10; // 事項(xiàng)值
if(yxBit == 1)
bhent.nEventVal = 0x01;
bhent.nNode = pIED->m_IEDConfig.byNodeID;// 設(shè)備節(jié)點(diǎn)
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_SFPtl::SaveCeKongYaoXin(RealRunIED *pRunIed, FunInf funInf,BYTE yxBit)
{
//int iCnt = 1; printf("已經(jīng)進(jìn)入SaveCeKongYaoXin函數(shù):%d\n",iCnt);
eDataSort data;
CIED *pIED = pRunIed->pDevData;
int nIndex = GetnIndexbyFuninf(pIED, dataYx, funInf);//先取實(shí)遙信的索引;
//printf("nIndex = %d\n",nIndex);
data = dataYx;
if(nIndex == -1)
{
nIndex = GetnIndexbyFuninf(pIED, dataBhYx, funInf);//取保護(hù)虛遙信索引
data = dataBhYx;
}
if (nIndex >= 0)
{
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
if(byYXRecvVal != yxBit)
{
//設(shè)置遙信值
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事項(xiàng)存儲
EVENT_STRUCT bhent;
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
bhent.eDS = (eDataSource)m_pCH->m_ChConfig.eDS; // 數(shù)據(jù)源
bhent.eEventType = data; // 事項(xiàng)類型(開關(guān)類)
bhent.nEventNode = nIndex; // 事項(xiàng)點(diǎn)
bhent.nEventVal = 0x10; // 事項(xiàng)值
if(yxBit == 1)
bhent.nEventVal = 0x01;
bhent.nNode = pIED->m_IEDConfig.byNodeID;// 設(shè)備節(jié)點(diǎn)
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_SFPtl::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;
}
//參數(shù)轉(zhuǎn)換函數(shù),從flash參數(shù)轉(zhuǎn)換為規(guī)約參數(shù)
void CIEC103_SFPtl::FlashParaToPtlPara(FlashPara103 * pPara)
{
//先調(diào)用默認(rèn)參數(shù)
DafaultPtlPara();
// 保護(hù)遙信復(fù)歸
if(pPara->bOrdAfmReset > 0)
m_IEC103PtlPara.bOrdAfmReset = 1; // 確認(rèn)復(fù)歸(復(fù)歸命令肯定確認(rèn)時(shí),保護(hù)信號復(fù)歸)
if(pPara->bOrderReset > 0)
m_IEC103PtlPara.bOrderReset = 1; // 命令復(fù)歸(復(fù)歸命令毋須確認(rèn),保護(hù)信號即可復(fù)歸)
if(pPara->bEventVirtualYX > 0)
m_IEC103PtlPara.bEventVirtualYX = 1; // 故障事項(xiàng)虛遙信
// 通用參數(shù)
if(pPara->byInitNum > 0)
m_IEC103PtlPara.byInitNum = pPara->byInitNum; // 初始化重傳次數(shù)
if(pPara->dwFrameOver > 0)
m_IEC103PtlPara.dwFrameOver = pPara->dwFrameOver; // 幀超時(shí)間隔,ms
if(pPara->dwQuery > 0)
m_IEC103PtlPara.dwQuery = pPara->dwQuery; // 總查詢間隔,s
if(pPara->wTimeOver > 0)
m_IEC103PtlPara.wTimeOver = pPara->wTimeOver; // 校時(shí)間隔
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->bGenSelect > 0)
m_IEC103PtlPara.bGenSel = pPara->bGenSelect;
//if(pPara->byBhResetFun > 0)
// m_IEC103PtlPara.byBhResetFun = pPara->byBhResetFun;
//if(pPara->byBhResetInf > 0)
// m_IEC103PtlPara.byBhResetInf = pPara->byBhResetInf;
}
//規(guī)約默認(rèn)參數(shù)設(shè)置
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -