?? iec103_xuji.cpp
字號(hào):
// 通道任務(wù)(復(fù)歸)
else if(WatchTask(pTask, taskChThree, byNodeID) && pTask)
{
/*
*
*=======================================================
* 描述 偏移量 占位空間
*-------------------------------------------------------
* 相應(yīng)數(shù)據(jù)總長(zhǎng)度 0~1 2
* **103數(shù)據(jù)幀總個(gè)數(shù)N 2~3 2
*-------------------------------------------------------
* **103數(shù)據(jù)幀1總長(zhǎng)度L1 4 1
* **103數(shù)據(jù)幀1 5~L1+5 L1
* **103數(shù)據(jù)幀2總長(zhǎng)度L2 L1+6 1
* **103數(shù)據(jù)幀2 L1+7~L1+7+8 L2
* **。。。 。。。 。。。
* **103數(shù)據(jù)幀2總長(zhǎng)度LN X 1
* **103數(shù)據(jù)幀N X~X+LN LN
*/
pTask->pbyBuff = g_pTaskDataBuff->QueryBuf(pTask->byDataBufIndex);//分配空間
if(pTask->pbyBuff == NULL)
return;
pTask->nDataBufLen = 0;
pTask->bWithDataF = TRUE;
if(SaveTaskRespFmt(buf - sizeof(LPDU_Vol_Head), len + 8, pTask))
{
pTask->eRespType = taskZF;
m_pCH->TaskResp(pTask);
//m_pCH->m_pTaskQue->UnLockTask();
}
}
}
// 通用數(shù)據(jù)傳輸
else
{
// 主動(dòng)傳送/測(cè)試模式(事項(xiàng)存儲(chǔ))
BOOL bStateChg = FALSE;
eDataSort data;
nIndex = GetnIndexbyFuninf(pIED, dataYx, pFmt->head.funInf);//先取實(shí)遙信的索引
data = dataYx;
if(nIndex == -1)
{
nIndex = GetnIndexbyFuninf(pIED, dataBhYx, pFmt->head.funInf);//取保護(hù)虛遙信索引
data = dataBhYx;
}
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
if(data == dataBhYx)
{
//存事項(xiàng)
BHEVENT_STRUCT bhevent;
bhevent.eDS=(eDataSource)m_pCH->m_ChConfig.eDS; // 數(shù)據(jù)源
bhevent.nIEDType=iedXUJI103; // 裝置類(lèi)型
bhevent.eEventType=dataBh; // 事項(xiàng)類(lèi)型()
bhevent.nEventNode=nIndex; // 事項(xiàng)點(diǎn)
bhevent.nNode=pIED->m_IEDConfig.byNodeID;
bhevent.nEventVal=0x10;
if(yxBit == 1)
bhevent.nEventVal = 0x01;
bhevent.nFunCode=bhevent.nEventVal;// 事項(xiàng)值
bhevent.TimeStamp.nMs = wb.bwUnion.wVal % 1000;
bhevent.TimeStamp.bySecond = wb.bwUnion.wVal / 1000;
bhevent.TimeStamp.byMinute = pFmt->tm.Minutes;
bhevent.TimeStamp.byHour = pFmt->tm.Hours;
bhevent.TimeStamp.byDay = sysTime.byDay;
bhevent.TimeStamp.byMonth = sysTime.byMonth;
bhevent.TimeStamp.nYear = sysTime.nYear;
memcpy(bhevent.byUserData, buf, len); //事項(xiàng)數(shù)據(jù)
bhevent.nUserDataLen = len; //記錄數(shù)據(jù)緩沖區(qū)長(zhǎng)度
m_pCH->m_pBhSoeQue->Add(bhevent);
if(!m_IEC103PtlPara.bEventVirtualYX)//參數(shù)設(shè)置,保護(hù)事項(xiàng)不需要轉(zhuǎn)成虛遙信
return;
}
// 遙信變位判別
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
if (nIndex >= 0)
{
if (byYXRecvVal != yxBit)
bStateChg = TRUE;
}
// 遙信存儲(chǔ)
if (nIndex >= 0)//設(shè)置遙信值
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事項(xiàng)存儲(chǔ)等待
if (bStateChg)
{
// 遙信變位存儲(chǔ)
// 事項(xiàng)存儲(chǔ)
EVENT_STRUCT bhent;
bhent.eDS = (eDataSource)m_pCH->m_ChConfig.eDS; // 數(shù)據(jù)源
bhent.eEventType = data; // 事項(xiàng)類(lèi)型(開(kāi)關(guān)類(lèi))
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 = wb.bwUnion.wVal % 1000;
bhent.TimeStamp.bySecond = wb.bwUnion.wVal / 1000;
bhent.TimeStamp.byMinute = pFmt->tm.Minutes;
bhent.TimeStamp.byHour = pFmt->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);
}
}
}
// 帶相對(duì)時(shí)間的時(shí)標(biāo)報(bào)文,在許繼103中是保護(hù)動(dòng)作事項(xiàng)報(bào)文
void CIEC103_XUJIPtl::Unpack_Asdu_2(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
ASDU_2_Fmt *pFmt = (ASDU_2_Fmt *)buf;
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
//調(diào)整數(shù)據(jù)值
WB_UNION wb;
wb.bwUnion.byVal[0] = pFmt->ret.byHigh;
wb.bwUnion.byVal[1] = pFmt->ret.byLow;
wb.bwUnion.byVal[0] = pFmt->fan.byHigh;
wb.bwUnion.byVal[1] = pFmt->fan.byLow;
CIED *pIED = pRunIed->pDevData;
if(pIED == NULL)
return;
eDataSort data;
int nIndex = GetnIndexbyFuninf(pIED, dataBhYx, pFmt->head.funInf);//取保護(hù)虛遙信索引
data = dataBhYx;
if(nIndex == -1)
return;
BYTE yxBit = (pFmt->dpi & 0x03) >> 1;//單點(diǎn)遙信
//存事項(xiàng)
BHEVENT_STRUCT bhevent;
bhevent.eDS=(eDataSource)m_pCH->m_ChConfig.eDS; // 數(shù)據(jù)源
bhevent.nIEDType=iedXUJI103; // 裝置類(lèi)型
bhevent.eEventType=dataBh; // 事項(xiàng)類(lèi)型()
bhevent.nEventNode=nIndex; // 事項(xiàng)點(diǎn)
bhevent.nNode=pIED->m_IEDConfig.byNodeID;
bhevent.nEventVal=0x10;
if(yxBit == 1)
bhevent.nEventVal = 0x01;
bhevent.nFunCode=bhevent.nEventVal;// 事項(xiàng)值
wb.bwUnion.byVal[0] = pFmt->tm.byHighMs;
wb.bwUnion.byVal[1] = pFmt->tm.byLowMs;
bhevent.TimeStamp.nMs = wb.bwUnion.wVal % 1000;
bhevent.TimeStamp.bySecond = wb.bwUnion.wVal / 1000;
bhevent.TimeStamp.byMinute = pFmt->tm.Minutes;
bhevent.TimeStamp.byHour = pFmt->tm.Hours;
bhevent.TimeStamp.byDay = sysTime.byDay;
bhevent.TimeStamp.byMonth = sysTime.byMonth;
bhevent.TimeStamp.nYear = sysTime.nYear;
memcpy(bhevent.byUserData, buf, len); //事項(xiàng)數(shù)據(jù)
bhevent.nUserDataLen = len; //記錄數(shù)據(jù)緩沖區(qū)長(zhǎng)度
m_pCH->m_pBhSoeQue->Add(bhevent);
if(!m_IEC103PtlPara.bEventVirtualYX)//參數(shù)設(shè)置,保護(hù)事項(xiàng)不需要轉(zhuǎn)成虛遙信
return;
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
// if(byYXRecvVal != yxbit)
{
//設(shè)置保護(hù)遙信狀態(tài)
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事項(xiàng)存儲(chǔ)
EVENT_STRUCT bhent;
bhent.eDS = (eDataSource)m_pCH->m_ChConfig.eDS; // 數(shù)據(jù)源
bhent.eEventType = data; // 事項(xiàng)類(lèi)型(開(kāi)關(guān)類(lèi))
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 = wb.bwUnion.wVal % 1000;
bhent.TimeStamp.bySecond = wb.bwUnion.wVal / 1000;
bhent.TimeStamp.byMinute = pFmt->tm.Minutes;
bhent.TimeStamp.byHour = pFmt->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);
}
}
// 被測(cè)值I格式
void CIEC103_XUJIPtl::Unpack_Asdu_3(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 帶相對(duì)時(shí)間的有時(shí)標(biāo)的被測(cè)值報(bào)文,在許繼103中,asdu4是保護(hù)事項(xiàng)報(bào)文,但不能轉(zhuǎn)成需搖信
void CIEC103_XUJIPtl::Unpack_Asdu_4(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
ASDU_Head *phead = (ASDU_Head *)buf;
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
//調(diào)整數(shù)據(jù)值
WB_UNION wb;
CIED *pIED = pRunIed->pDevData;
if(pIED == NULL)
return;
eDataSort data;
int nIndex = GetnIndexbyFuninf(pIED, dataBhYx, phead->funInf);//取保護(hù)虛遙信索引
data = dataBhYx;
if(nIndex == -1)
return;
//存事項(xiàng)
BHEVENT_STRUCT bhevent;
bhevent.eDS=(eDataSource)m_pCH->m_ChConfig.eDS; // 數(shù)據(jù)源
bhevent.nIEDType=iedXUJI103; // 裝置類(lèi)型
bhevent.eEventType=dataBh; // 事項(xiàng)類(lèi)型()
bhevent.nEventNode=nIndex; // 事項(xiàng)點(diǎn)
bhevent.nNode=pIED->m_IEDConfig.byNodeID;
bhevent.nEventVal=0x10;
//if(yxBit == 1)
// bhevent.nEventVal = 0x01;
bhevent.nFunCode=bhevent.nEventVal;// 事項(xiàng)值
bhevent.TimeStamp = sysTime;
memcpy(bhevent.byUserData, buf, len); //事項(xiàng)數(shù)據(jù)
bhevent.nUserDataLen = len; //記錄數(shù)據(jù)緩沖區(qū)長(zhǎng)度
m_pCH->m_pBhSoeQue->Add(bhevent);
}
// 標(biāo)識(shí)報(bào)文
void CIEC103_XUJIPtl::Unpack_Asdu_5(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 時(shí)間同步
void CIEC103_XUJIPtl::Unpack_Asdu_6(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 總查詢(xún)(召喚)結(jié)束
void CIEC103_XUJIPtl::Unpack_Asdu_8(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 通用分類(lèi)數(shù)據(jù)
void CIEC103_XUJIPtl::Unpack_Asdu_10(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
TASK *pTask = NULL;
CIED *pIED = pRunIed->pDevData;
BYTE byNodeID = pIED->m_IEDConfig.byNodeID;
Task103 &task = m_IEC103Data.m_task103;
ASDU_10_Head *pHead = (ASDU_10_Head *)buf;
// 1) 召喚定值 2) 召喚模擬量
if((WatchTask(pTask, taskAskBhdz, byNodeID) ||
WatchTask(pTask, taskAskBhYc, byNodeID)) && pTask)
{
GenerReadDesc &genRead = task.genRead;
if(1 == task.wStep&&!pTask->bWithDataF)//分配空間
{
pTask->pbyBuff = g_pTaskDataBuff->QueryBuf(pTask->byDataBufIndex);
pTask->nDataBufLen=0;
pTask->bWithDataF = TRUE;
}
if(pTask->pbyBuff == NULL)
return;
SaveTaskRespFmt(buf - sizeof(LPDU_Vol_Head), len + 8, pTask);
if (0 == pHead->ngd.cont)
{
task.wStep ++;
if (genRead.grpCnt >= genRead.grpNum)
{
if(pTask->eTaskType == taskAskBhdz)
pTask->eRespType = taskRespBhdz;
else if(pTask->eTaskType == taskAskBhYc)
pTask->eRespType = taskRespBhYc;
m_pCH->TaskResp(pTask);
//m_pCH->m_pTaskQue->UnLockTask();
if(pHead->ngd.cont)//還有后續(xù)數(shù)據(jù)幀
pTask->eStatus = tsWaiting;
}
}
}
// 3) 修改定值
else if(WatchTask(pTask, taskCmdModifyBhdz, byNodeID) && pTask)
{
GenerWriteDesc &genWrite = task.genWrite;
ModifyProtSettingHead *pProtSetHead = (ModifyProtSettingHead *)(pTask->pbyBuff);
// 數(shù)據(jù)校驗(yàn) // 改變發(fā)送計(jì)數(shù)器
if (44 == pHead->head.cot)
{
task.wStep ++;
if (genWrite.wSendFmtCnt >= pProtSetHead->fmtNum)
{
pTask->eRespType = taskAck;
m_pCH->TaskResp(pTask);
if(pHead->ngd.cont)//還有后續(xù)數(shù)據(jù)幀
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
}
else
{
pTask->eRespType = taskNAck;
m_pCH->TaskResp(pTask);
if(pHead->ngd.cont)//還有后續(xù)數(shù)據(jù)幀
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
}
// 4) 修改定值組號(hào)
else if(WatchTask(pTask, taskCmdSetBhdzGroup, byNodeID) && pTask)
{
if (M_NEG_GENWR == pHead->head.cot)
pTask->eRespType = taskNAck;
else
pTask->eRespType = taskAck;
m_pCH->TaskResp(pTask);
if(pHead->ngd.cont)//還有后續(xù)數(shù)據(jù)幀
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
// 5) 修改定值 // 6) 修改組號(hào) // 7)取消修改定值 // 8)取消修改組號(hào)
else if((WatchTask(pTask, taskCmdEnableBhdz, byNodeID) ||
WatchTask(pTask, taskCmdCancelBhdz, byNodeID) ||
WatchTask(pTask, taskCmdEnableBhdzGroup, byNodeID) ||
WatchTask(pTask, taskCmdCancelBhDzGroup, byNodeID)) &&
pTask)
{
if (M_NEG_GENWR == pHead->head.cot)
pTask->eRespType = taskNAck;
else
pTask->eRespType = taskAck;
m_pCH->TaskResp(pTask);
if(pHead->ngd.cont)//還有后續(xù)數(shù)據(jù)幀
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
// 7) 通道轉(zhuǎn)發(fā)任務(wù)
else if(WatchTask(pTask,taskChThree, byNodeID) && pTask)
{
GenerWriteDesc &genWrite = task.genWrite;
if(1 == task.wStep)//分配存儲(chǔ)數(shù)據(jù)空間
{
pTask->pbyBuff = g_pTaskDataBuff->QueryBuf(pTask->byDataBufIndex);
pTask->nDataBufLen = 0;
pTask->bWithDataF = TRUE;
}
if(pTask->pbyBuff == NULL)
return;
SaveTaskRespFmt(buf - sizeof(LPDU_Vol_Head), len + 8, pTask);
if (0 == pHead->ngd.cont)
{
task.wStep ++;
if (genWrite.wSendFmtCnt >= genWrite.wSendNum)
{
pTask->eRespType = taskZF;
m_pCH->TaskResp(pTask);
if(pHead->ngd.cont)//還有后續(xù)數(shù)據(jù)幀
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
}
/* BYTE *pbyData = pTask->pbyBuff;
WORD *pwLen = (WORD *)pbyData;
WORD *pwFmtCnt = (WORD *)(pbyData + 2);
ASDU_Head *pTaskHead = (ASDU_Head *)(pbyData + genWrite.wSendPos + 1);
bool bRespond = false;
// 召喚定值
if (21 == pTaskHead->type)
{
if (0 == pHead->ngd.cont)
bRespond = true;
}
// 修改定值
else if (10 == pTaskHead->type)
{
bRespond = true;
}
if (bRespond)
{
BYTE byAsduLen = pbyData[genWrite.wSendPos ++];
genWrite.wSendPos += byAsduLen;
genWrite.wSendFmtCnt ++;
if (genWrite.wSendFmtCnt >= *pwFmtCnt)
{
pTask->eRespType = taskZF;
m_pCH->TaskResp(pTask);
m_pCH->m_pTaskQue->UnLockTask();
}
}
*/ }
//2005-01-31 RenJG 增加南自廠103規(guī)約特殊處理 --start
else if((WatchTask(pTask, taskCmdYkSelect, byNodeID) ||
WatchTask(pTask, taskCmdYkExecute, byNodeID) ||
WatchTask(pTask, taskCmdYkCancel, byNodeID)) && pTask)
{
if (pIED->m_IEDConfig.usIEDType/* == NANZI_SYS_ID*/)
{
// 否定應(yīng)答
/* if (0x29 == pHead->head.cot)
{
TaskBufYKAct *pRespTask = (TaskBufYKAct *)(task.pTask->baRespBuf.GetData( ));
if (pRespTask->byRtn == act_right)
pRespTask->byRtn = act_wrong;
else
pRespTask->byRtn = fj_wrong;
}
task.pTask->status = responded;
*/}
}
//2005-01-31 RenJG 增加南自廠103規(guī)約特殊處理 --end
}
// 通用分類(lèi)標(biāo)識(shí)
void CIEC103_XUJIPtl::Unpack_Asdu_11(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 被記錄的擾動(dòng)表
void CIEC103_XUJIPtl::Unpack_Asdu_23(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 擾動(dòng)數(shù)據(jù)傳輸準(zhǔn)備就緒
void CIEC103_XUJIPtl::Unpack_Asdu_26(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 被記錄的通道傳輸準(zhǔn)備就緒
void CIEC103_XUJIPtl::Unpack_Asdu_27(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 帶標(biāo)志的狀態(tài)變位的傳輸準(zhǔn)備就緒
void CIEC103_XUJIPtl::Unpack_Asdu_28(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 帶標(biāo)志的狀態(tài)變位傳輸
void CIEC103_XUJIPtl::Unpack_Asdu_29(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 傳輸擾動(dòng)值
void CIEC103_XUJIPtl::Unpack_Asdu_30(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 擾動(dòng)數(shù)據(jù)傳輸結(jié)束
void CIEC103_XUJIPtl::Unpack_Asdu_31(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 帶時(shí)標(biāo)的被測(cè)量值III
void CIEC103_XUJIPtl::Unpack_Asdu_32(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 帶時(shí)標(biāo)的被測(cè)量值IV
void CIEC103_XUJIPtl:
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -