?? iec103_xuji.cpp
字號:
//m_pCH->m_pTaskQue->LockTask();
break;
case taskChThree:
{// 通道任務
bRtn = ChanTask(pTask, pDevRun);
// if(bRtn)
// m_pCH->m_pTaskQue->LockTask();
}
break;
default: // 其他類型任務不支持
pTask->eStatus = tsNull;
break;
}
if (!bRtn && tsNull != pTask->eStatus)
{
// 召喚1級數據
BYTE byCode = CallClass2_code;
if (pDevRun->acd)
byCode = CallClass1_code;
PackLPDU_Fix(pTask->byDestNodeID, byCode);
bRtn = TRUE;
}
}
return bRtn;
}
// 通道任務 - 校時
BOOL CIEC103_XUJIPtl::SendAdjustTime103(TASK* pTask)
{
ASDU_6_Fmt *pFmt = (ASDU_6_Fmt *)(m_IEC103Data.m_bySend + sizeof(LPDU_Vol_Head));
memset(pFmt, 0, sizeof(ASDU_6_Fmt));
pFmt->head.type = 6;
pFmt->head.vsq.vsq = 0x81;
pFmt->head.cot = 8;
pFmt->head.addr = 0xff;
pFmt->head.fun = 0xff;
pFmt->head.inf = 0;
TIME_STRUCT st;
g_pMainApp->GetSystime(&st);
pFmt->dataTime.year = st.nYear % 100;
pFmt->dataTime.month = st.byMonth;
pFmt->dataTime.bay = st.byDay;
pFmt->dataTime.week = 0;
pFmt->dataTime.time.Hours = st.byHour;
pFmt->dataTime.time.Minutes = st.byMinute;
WORD wtmp = st.bySecond * 1000 + st.nMs;
pFmt->dataTime.time.byLowMs = lobyte(wtmp);
pFmt->dataTime.time.byHighMs = hibyte(wtmp);
LPDU_Vol_Head *pHead = (LPDU_Vol_Head *)m_IEC103Data.m_bySend;
memset(pHead, 0, sizeof(LPDU_Vol_Head));
pHead->head1 = pHead->head2 = 0x68;
pHead->len1 = pHead->len2 = ASDU6Fmt_LEN + 2;
pHead->ctrl.funcode = NoReply_code;
pHead->ctrl.prm = 1;
pHead->addr = 0xff;
m_IEC103Data.m_wSendNum = sizeof(LPDU_Vol_Head) + ASDU6Fmt_LEN;
m_IEC103Data.m_bySend[m_IEC103Data.m_wSendNum ++] = SumMod(m_IEC103Data.m_bySend + 4, pHead->len1);
m_IEC103Data.m_bySend[m_IEC103Data.m_wSendNum ++] = 0x16;
pTask->eStatus = tsSuccess;
return TRUE;
}
BOOL CIEC103_XUJIPtl::SendAdjustTime103(BYTE byaddr)
{
ASDU_6_Fmt *pFmt = (ASDU_6_Fmt *)(m_IEC103Data.m_bySend + sizeof(LPDU_Vol_Head));
memset(pFmt, 0, sizeof(ASDU_6_Fmt));
pFmt->head.type = 6;
pFmt->head.vsq.vsq = 0x81;
pFmt->head.cot = 8;
pFmt->head.addr = byaddr;
pFmt->head.fun = 0xff;
pFmt->head.inf = 0;
TIME_STRUCT st;
g_pMainApp->GetSystime(&st);
pFmt->dataTime.year = st.nYear % 100;
pFmt->dataTime.month = st.byMonth;
pFmt->dataTime.bay = st.byDay;
pFmt->dataTime.week = 0;
pFmt->dataTime.time.Hours = st.byHour;
pFmt->dataTime.time.Minutes = st.byMinute;
WORD wtmp = st.bySecond * 1000 + st.nMs;
pFmt->dataTime.time.byLowMs = lobyte(wtmp);
pFmt->dataTime.time.byHighMs = hibyte(wtmp);
LPDU_Vol_Head *pHead = (LPDU_Vol_Head *)m_IEC103Data.m_bySend;
memset(pHead, 0, sizeof(LPDU_Vol_Head));
pHead->head1 = pHead->head2 = 0x68;
pHead->len1 = pHead->len2 = ASDU6Fmt_LEN + 2;
if(byaddr == 0xff)
pHead->ctrl.funcode = NoReply_code;
else
pHead->ctrl.funcode = SendCon_code;
pHead->ctrl.prm = 1;
pHead->addr = byaddr;
m_IEC103Data.m_wSendNum = sizeof(LPDU_Vol_Head) + ASDU6Fmt_LEN;
m_IEC103Data.m_bySend[m_IEC103Data.m_wSendNum ++] = SumMod(m_IEC103Data.m_bySend + 4, pHead->len1);
m_IEC103Data.m_bySend[m_IEC103Data.m_wSendNum ++] = 0x16;
return TRUE;
}
//遙控命令組幀
BOOL CIEC103_XUJIPtl::PackYaoKong(TASK *pTask, RealRunIED *pDevRun)
{
Task103& task = m_IEC103Data.m_task103;
YK_COMMAND* pYkCom = (YK_COMMAND *)(pTask->iUserData);
if(!pYkCom || !pDevRun)
return FALSE;
CIED *pIED = pDevRun->pDevData;
if(!pIED)
return FALSE;
BOOL bChk = FALSE;
if (0 == task.wStep)
{
task.wStep ++;
FunInf funInf;
if(!GetFunInf(pDevRun->pDevData, dataYk, pYkCom->byYkNode, funInf))// 遙控命令fun+inf
return FALSE;
YK_PARA para;
if(!pIED->GetDataPara(dataYk,0,pYkCom->byYkNode,(void*)¶))
return FALSE;
DCC dcc = {0};
switch(pTask->eTaskType)
{
case taskCmdYkSelect: //遙控選擇
dcc.se = 1;
if(pYkCom->byAction == yk_PrevH)
{
dcc.dcs = 2;
bChk = TRUE;
}else if(pYkCom->byAction == yk_PrevF)
{
dcc.dcs = 1;
bChk = TRUE;
}
break;
case taskCmdYkExecute: //遙控執行
if (pYkCom->byAction == yk_exec )
{
dcc.dcs = (m_IEC103Data.m_OldCmd.dcc).dcs; // 動作類型
bChk = TRUE;
}
break;
case taskCmdYkCancel: //遙控撤銷
if (pYkCom->byAction == yk_cancel) {
dcc.dcs = (m_IEC103Data.m_OldCmd.dcc).dcs; // 動作類型描述
dcc.se = 1;
dcc.act = 1;
bChk = TRUE;
}
break;
default:
break;
}
if (!bChk)
return bChk;
// 記錄動作類型描述
m_IEC103Data.m_OldCmd.dcc = dcc;
// 組幀
ASDU_64_Fmt *pFmt = (ASDU_64_Fmt *)(m_IEC103Data.m_bySend + sizeof(LPDU_Vol_Head));
pFmt->head.type = 64;
pFmt->head.vsq.vsq = 0x81;
pFmt->head.cot = 12;
pFmt->head.addr = para.nReserved0;//分cpu地址號
pFmt->head.funInf = funInf;
pFmt->dcc = dcc;
pFmt->rii = m_IEC103Data.m_bySin ++;
m_IEC103Data.m_wSendNum = sizeof(ASDU_64_Fmt);
PackLPDU(pTask->byDestNodeID, SendCon_code);
}
return bChk;
}
//召喚保護模擬量
//召喚保護模擬量,pTask->iUserData數組中填放數據說明
// 0 1.....
// 要召喚模擬量組包含的 通用分類組號
// 通用分類組個數
BOOL CIEC103_XUJIPtl::PackCallProtMea(TASK *pTask, RealRunIED *pDevRun)
{
Task103 &task = m_IEC103Data.m_task103;
GenerReadDesc &genRead = task.genRead;
if (0 == task.wStep)
{
// 沒有保護模擬量,則不進行組幀命令
if(pDevRun->pDevData->m_IEDConfig.nBhAcLoopNum <= 0)
{
return FALSE;
}
// InitTaskRespBuf(pTask);
genRead.grpCnt = 0;
GetGininf(pDevRun->pDevData, pTask, dataBhAc, genRead.grpNum, genRead.readGrp);
}
return PackGenerReadCmd(pTask, pDevRun);
}
//召喚保護定值
//召喚保護定值,pTask->iUserData數組中填放數據說明
// 0 1 2 3.....
//召喚定值組號 定值組總個數 要召喚定值組包含的 通用分類組號
// 通用分類組個數
BOOL CIEC103_XUJIPtl::PackCallProtSetting(TASK *pTask, RealRunIED *pDevRun)
{
Task103 &task = m_IEC103Data.m_task103;
GenerReadDesc &genRead = task.genRead;
if (0 == task.wStep)
{
BYTE byReadID = pTask->iUserData[0]; //得到要召喚的定值組號
BOOL bChk = FALSE;
if (pDevRun->pDevData->m_IEDConfig.nDzNum > 0)
{
// 召喚的定值組號
if (0xff == pTask->iUserData[0])
byReadID = 0;
BYTE bySettingGrpNum = GetSettingGrpNum(pDevRun->pDevData, pTask);
if (byReadID < bySettingGrpNum)
{
//InitTaskRespBuf(pTask);
genRead.grpCnt = 0;
GetGininf(pDevRun->pDevData, pTask, dataSetting, genRead.grpNum, genRead.readGrp);
bChk = TRUE;
}
}
if (!bChk)
return FALSE;
}
return PackGenerReadCmd(pTask, pDevRun);
}
//修改保護定值
/*
*PackModifyProtSetting - 修改保護定值組幀
* 固定格式
* 描述 偏移量 占位空間
*-------------------------------------------------------
* 相應數據總長度 0~1 2
* **103數據幀總個數N 2~3 2
*/
BOOL CIEC103_XUJIPtl::PackModifyProtSetting(TASK *pTask, RealRunIED *pDevRun)
{
Task103 &task = m_IEC103Data.m_task103;
GenerWriteDesc &genWrite = task.genWrite;
//BYTE byAddr = pDevRun->pDevData->m_IEDConfig.byNodeAddr;
BYTE byAddr = 0;
if(m_IEC103PtlPara.bCommAddr)
byAddr = m_IEC103PtlPara.byBHCPUAddr;
else
byAddr = pDevRun->pDevData->m_IEDConfig.byNodeAddr;
if(!pTask->bWithDataF || pTask->pbyBuff == NULL)//沒有用戶附加數據,直接返回
return FALSE;
ModifyProtSettingHead *pProtSetHead = (ModifyProtSettingHead *)(pTask->pbyBuff);
BYTE byLinkLen = 0;
if (0 == task.wStep)
{
genWrite.wSendFmtCnt = 0;
genWrite.wSendPos = 4;
genWrite.rii = m_IEC103Data.m_bySin ++;
// 去除第一組的定值組號
byLinkLen = *(pTask->pbyBuff + genWrite.wSendPos);
genWrite.wSendPos += 1;
genWrite.wSendFmtCnt ++;
}
if (task.wStep % 2 == 0)
{
if(task.wStep != 0)
{
byLinkLen = *(pTask->pbyBuff + genWrite.wSendPos);
genWrite.wSendPos += 1;
genWrite.wSendFmtCnt ++;
}
memcpy(m_IEC103Data.m_bySend, pTask->pbyBuff + genWrite.wSendPos, byLinkLen);
genWrite.wSendPos += byLinkLen;
task.wStep ++;
ASDU_10_Head *pFmtHead = (ASDU_10_Head *)(m_IEC103Data.m_bySend + sizeof(LPDU_Vol_Head));
pFmtHead->head.type = 10;
pFmtHead->head.vsq.vsq = 0x81;
pFmtHead->head.cot = 40;
pFmtHead->head.addr = byAddr;
pFmtHead->head.fun = 254;
pFmtHead->head.inf = (genWrite.wSendFmtCnt == pProtSetHead->fmtNum) ?250 : 249;
pFmtHead->rii = genWrite.rii;
pFmtHead->ngd.count = (task.wStep / 2) % 2;
pFmtHead->ngd.cont = (genWrite.wSendFmtCnt != pProtSetHead->fmtNum);
m_IEC103Data.m_wSendNum = byLinkLen - 8;
PackLPDU(pTask->byDestNodeID, SendCon_code);
return TRUE;
}
return FALSE;
}
//確認保護定值
BOOL CIEC103_XUJIPtl::PackEnableProtSetting(TASK *pTask, RealRunIED *pDevRun)
{
return PackGenerExec(pTask, pDevRun, TRUE);
}
//取消修改保護定值
BOOL CIEC103_XUJIPtl::PackCancelProtSetting(TASK *pTask, RealRunIED *pDevRun)
{
return PackGenerExec(pTask, pDevRun, FALSE);
}
//設置保護定值組
BOOL CIEC103_XUJIPtl::PackModifyProtSettingGroup(TASK *pTask, RealRunIED *pDevRun)
{
//BYTE byAdd = pDevRun->pDevData->m_IEDConfig.byNodeAddr;
BYTE byAddr = 0;
if(m_IEC103PtlPara.bCommAddr)
byAddr = m_IEC103PtlPara.byBHCPUAddr;
else
byAddr = pDevRun->pDevData->m_IEDConfig.byNodeAddr;
Task103 &task = m_IEC103Data.m_task103;
if (0 == task.wStep)
{
task.wStep ++;
ASDU_10_Head *pHead = (ASDU_10_Head *)(m_IEC103Data.m_bySend + sizeof(LPDU_Vol_Head));
pHead->head.type = 10;
pHead->head.vsq.vsq = 0x81;
pHead->head.cot = 40;
pHead->head.addr = byAddr;
pHead->head.fun = 254;
pHead->head.inf = 249;
pHead->rii = m_IEC103Data.m_bySin ++;
pHead->ngd.cont = pHead->ngd.count = 0;
pHead->ngd.num = 1;
ASDU_10_Item *pItem = (ASDU_10_Item *)(pHead + 1);
GIN gin;
GetProtSetGrpGin(pTask, gin);
pItem->gin = gin;
pItem->gdd.byDataTyp = 3;
pItem->gdd.byDataSize = 1;
pItem->gdd.num = 1;
pItem->gdd.cont = 0;
pItem->kod = 1;
pItem->byVal = pTask->iUserData[0];
m_IEC103Data.m_wSendNum = sizeof(ASDU_10_Head) + sizeof(ASDU_10_Item);
PackLPDU(pTask->byDestNodeID, SendCon_code);
return TRUE;
}
return FALSE;
}
//確認設置的保護定值組
BOOL CIEC103_XUJIPtl::PackEnableProtSettingGroup(TASK *pTask, RealRunIED *pDevRun)
{
return PackGenerExec(pTask, pDevRun, TRUE);
}
//取消修改保護定值組
BOOL CIEC103_XUJIPtl::PackCancelProtSettingGroup(TASK *pTask, RealRunIED *pDevRun)
{
return PackGenerExec(pTask, pDevRun, FALSE);
}
// 保護復歸
BOOL CIEC103_XUJIPtl::PackProtRes(TASK *pTask, RealRunIED *pDevRun)
{
BYTE byAdd = pDevRun->pDevData->m_IEDConfig.byNodeAddr;
BOOL bRtn = FALSE;
Task103 &task = m_IEC103Data.m_task103;
if (0 == task.wStep)
{
ASDU_20_Fmt *pFmt = (ASDU_20_Fmt *)(m_IEC103Data.m_bySend + sizeof(LPDU_Vol_Head));
pFmt->head.type = 20;
pFmt->head.vsq.vsq = 0x81;
pFmt->head.cot = 20;
FunInf funinf;
BYTE bycpuaddr;
if(!GetProtResetFuninfFromPara(pDevRun,funinf,bycpuaddr))
return FALSE;
pFmt->head.addr = bycpuaddr;
pFmt->head.funInf = funinf;
pFmt->dco = Off_dco;
pFmt->rii = m_IEC103Data.m_bySin ++;
m_IEC103Data.m_wSendNum = sizeof(ASDU_20_Fmt);
PackLPDU(pTask->byDestNodeID, SendCon_code);
task.wStep ++;
bRtn = TRUE;
ResetBhYx(pTask,pDevRun);
}
return bRtn;
}
//對保護裝置虛搖信信號進行復歸
void CIEC103_XUJIPtl::ResetBhYx(TASK *pTask, RealRunIED *pDevRun)
{
CIED *pIED = pDevRun->pDevData;
int nBhYxNum = pIED->m_IEDConfig.nBhNum;
for(int i=0; i<nBhYxNum; i++)
{
pIED->SetDataRecvVal(dataBhYx,0,i,0);
}
}
// 通道任務
//任務區結構描述
//---------------------------------
// 總長度 0~1 2
// 幀個數 2~3 2
// 第1幀長度 4 1
// 第1幀 5 L+5
BOOL CIEC103_XUJIPtl::ChanTask(TASK *pTask, RealRunIED *pDevRun)
{
Task103 &task = m_IEC103Data.m_task103;
GenerWriteDesc &genWrite = task.genWrite;
BYTE *pbyData = pTask->pbyBuff;
if(!pTask->bWithDataF || pbyData == NULL)//沒有附加數據
return FALSE;
WORD *pwLen = (WORD *)pbyData;
WORD *pwFmtCnt = (WORD *)(pbyData + 2);
genWrite.wSendNum = *(WORD *)(pbyData + 2);
BYTE byAsduLen = 0;
ASDU_Head *pHead = NULL;
if (0 == task.wStep)
{
genWrite.wSendFmtCnt = 0;
genWrite.wSendPos = 4;
genWrite.rii = m_IEC103Data.m_bySin ++;
byAsduLen = pbyData[genWrite.wSendPos];
genWrite.wSendPos++;
genWrite.wSendFmtCnt++;
pHead = (ASDU_Head *)(pbyData + genWrite.wSendPos);
// 復歸命令
if (C_GRC_NA_3 == pHead->type)
{
//task.pTask->status = timeOut;
}
else if (10 == pHead->type || 21 == pHead->type)
;//InitTaskRespBuf(pTask);
}
if (task.wStep % 2 == 0)
{
// 鏈路數據
if(task.wStep != 0)
{
byAsduLen = pbyData[genWrite.wSendPos];
genWrite.wSendPos++;
genWrite.wSendFmtCnt++;
pHead = (ASDU_Head *)(pbyData + genWrite.wSendPos);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -