📄 iec103_xuji.cpp
字号:
// 通道任务(复归)
else if(WatchTask(pTask, taskChThree, byNodeID) && pTask)
{
/*
*
*=======================================================
* 描述 偏移量 占位空间
*-------------------------------------------------------
* 相应数据总长度 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
*/
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();
}
}
}
// 通用数据传输
else
{
// 主动传送/测试模式(事项存储)
BOOL bStateChg = FALSE;
eDataSort data;
nIndex = GetnIndexbyFuninf(pIED, dataYx, pFmt->head.funInf);//先取实遥信的索引
data = dataYx;
if(nIndex == -1)
{
nIndex = GetnIndexbyFuninf(pIED, dataBhYx, pFmt->head.funInf);//取保护虚遥信索引
data = dataBhYx;
}
TIME_STRUCT sysTime;
g_pMainApp->GetSystime(&sysTime);
if(data == dataBhYx)
{
//存事项
BHEVENT_STRUCT bhevent;
bhevent.eDS=(eDataSource)m_pCH->m_ChConfig.eDS; // 数据源
bhevent.nIEDType=iedXUJI103; // 装置类型
bhevent.eEventType=dataBh; // 事项类型()
bhevent.nEventNode=nIndex; // 事项点
bhevent.nNode=pIED->m_IEDConfig.byNodeID;
bhevent.nEventVal=0x10;
if(yxBit == 1)
bhevent.nEventVal = 0x01;
bhevent.nFunCode=bhevent.nEventVal;// 事项值
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); //事项数据
bhevent.nUserDataLen = len; //记录数据缓冲区长度
m_pCH->m_pBhSoeQue->Add(bhevent);
if(!m_IEC103PtlPara.bEventVirtualYX)//参数设置,保护事项不需要转成虚遥信
return;
}
// 遥信变位判别
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
if (nIndex >= 0)
{
if (byYXRecvVal != yxBit)
bStateChg = TRUE;
}
// 遥信存储
if (nIndex >= 0)//设置遥信值
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事项存储等待
if (bStateChg)
{
// 遥信变位存储
// 事项存储
EVENT_STRUCT bhent;
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 = 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);
}
}
}
// 带相对时间的时标报文,在许继103中是保护动作事项报文
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);
//调整数据值
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);//取保护虚遥信索引
data = dataBhYx;
if(nIndex == -1)
return;
BYTE yxBit = (pFmt->dpi & 0x03) >> 1;//单点遥信
//存事项
BHEVENT_STRUCT bhevent;
bhevent.eDS=(eDataSource)m_pCH->m_ChConfig.eDS; // 数据源
bhevent.nIEDType=iedXUJI103; // 装置类型
bhevent.eEventType=dataBh; // 事项类型()
bhevent.nEventNode=nIndex; // 事项点
bhevent.nNode=pIED->m_IEDConfig.byNodeID;
bhevent.nEventVal=0x10;
if(yxBit == 1)
bhevent.nEventVal = 0x01;
bhevent.nFunCode=bhevent.nEventVal;// 事项值
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); //事项数据
bhevent.nUserDataLen = len; //记录数据缓冲区长度
m_pCH->m_pBhSoeQue->Add(bhevent);
if(!m_IEC103PtlPara.bEventVirtualYX)//参数设置,保护事项不需要转成虚遥信
return;
BYTE byYXRecvVal = pIED->GetDataRecvVal(data,0,nIndex);
// if(byYXRecvVal != yxbit)
{
//设置保护遥信状态
pIED->SetDataRecvVal(data,0,nIndex,yxBit);
// 事项存储
EVENT_STRUCT bhent;
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 = 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);
}
}
// 被测值I格式
void CIEC103_XUJIPtl::Unpack_Asdu_3(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 带相对时间的有时标的被测值报文,在许继103中,asdu4是保护事项报文,但不能转成需摇信
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);
//调整数据值
WB_UNION wb;
CIED *pIED = pRunIed->pDevData;
if(pIED == NULL)
return;
eDataSort data;
int nIndex = GetnIndexbyFuninf(pIED, dataBhYx, phead->funInf);//取保护虚遥信索引
data = dataBhYx;
if(nIndex == -1)
return;
//存事项
BHEVENT_STRUCT bhevent;
bhevent.eDS=(eDataSource)m_pCH->m_ChConfig.eDS; // 数据源
bhevent.nIEDType=iedXUJI103; // 装置类型
bhevent.eEventType=dataBh; // 事项类型()
bhevent.nEventNode=nIndex; // 事项点
bhevent.nNode=pIED->m_IEDConfig.byNodeID;
bhevent.nEventVal=0x10;
//if(yxBit == 1)
// bhevent.nEventVal = 0x01;
bhevent.nFunCode=bhevent.nEventVal;// 事项值
bhevent.TimeStamp = sysTime;
memcpy(bhevent.byUserData, buf, len); //事项数据
bhevent.nUserDataLen = len; //记录数据缓冲区长度
m_pCH->m_pBhSoeQue->Add(bhevent);
}
// 标识报文
void CIEC103_XUJIPtl::Unpack_Asdu_5(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 时间同步
void CIEC103_XUJIPtl::Unpack_Asdu_6(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 总查询(召唤)结束
void CIEC103_XUJIPtl::Unpack_Asdu_8(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 通用分类数据
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)//还有后续数据帧
pTask->eStatus = tsWaiting;
}
}
}
// 3) 修改定值
else if(WatchTask(pTask, taskCmdModifyBhdz, byNodeID) && pTask)
{
GenerWriteDesc &genWrite = task.genWrite;
ModifyProtSettingHead *pProtSetHead = (ModifyProtSettingHead *)(pTask->pbyBuff);
// 数据校验 // 改变发送计数器
if (44 == pHead->head.cot)
{
task.wStep ++;
if (genWrite.wSendFmtCnt >= pProtSetHead->fmtNum)
{
pTask->eRespType = taskAck;
m_pCH->TaskResp(pTask);
if(pHead->ngd.cont)//还有后续数据帧
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
}
else
{
pTask->eRespType = taskNAck;
m_pCH->TaskResp(pTask);
if(pHead->ngd.cont)//还有后续数据帧
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
}
// 4) 修改定值组号
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)//还有后续数据帧
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
// 5) 修改定值 // 6) 修改组号 // 7)取消修改定值 // 8)取消修改组号
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)//还有后续数据帧
pTask->eStatus = tsWaiting;
//m_pCH->m_pTaskQue->UnLockTask();
}
// 7) 通道转发任务
else if(WatchTask(pTask,taskChThree, byNodeID) && pTask)
{
GenerWriteDesc &genWrite = task.genWrite;
if(1 == task.wStep)//分配存储数据空间
{
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)//还有后续数据帧
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规约特殊处理 --start
else if((WatchTask(pTask, taskCmdYkSelect, byNodeID) ||
WatchTask(pTask, taskCmdYkExecute, byNodeID) ||
WatchTask(pTask, taskCmdYkCancel, byNodeID)) && pTask)
{
if (pIED->m_IEDConfig.usIEDType/* == NANZI_SYS_ID*/)
{
// 否定应答
/* 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规约特殊处理 --end
}
// 通用分类标识
void CIEC103_XUJIPtl::Unpack_Asdu_11(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 被记录的扰动表
void CIEC103_XUJIPtl::Unpack_Asdu_23(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 扰动数据传输准备就绪
void CIEC103_XUJIPtl::Unpack_Asdu_26(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 被记录的通道传输准备就绪
void CIEC103_XUJIPtl::Unpack_Asdu_27(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 带标志的状态变位的传输准备就绪
void CIEC103_XUJIPtl::Unpack_Asdu_28(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 带标志的状态变位传输
void CIEC103_XUJIPtl::Unpack_Asdu_29(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 传输扰动值
void CIEC103_XUJIPtl::Unpack_Asdu_30(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 扰动数据传输结束
void CIEC103_XUJIPtl::Unpack_Asdu_31(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 带时标的被测量值III
void CIEC103_XUJIPtl::Unpack_Asdu_32(BYTE* buf, BYTE len, RealRunIED *pRunIed)
{
}
// 带时标的被测量值IV
void CIEC103_XUJIPtl:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -