📄 basedi.c
字号:
/////////////////////////////////////////////////////////////////////////////////////
// 程序名: BaseDI.c
// 开入量处理部分
/////////////////////////////////////////////////////////////////////////////////////
#include "BaseVariable.h"
VOID PulseRoutine1(DISTRU *p);
VOID PulseRoutine2(DISTRU *p);
VOID PulseRoutine3(DISTRU *p);
VOID PulseRoutine4(DISTRU *p);
VOID YXRoutine1(DISTRU *p);
VOID YXRoutine2(DISTRU *p);
VOID YXRoutine3(DISTRU *p);
VOID YXRoutine4(DISTRU *p);
VOID YXRoutine5(DISTRU *p);
VOID YXRoutine6(DISTRU *p);
VOID YXRoutine7(DISTRU *p);
VOID YXRoutine8(DISTRU *p);
VOID YXRoutine9(DISTRU *p);
VOID THRoutine(DISTRU *p);
VOID BSCHRoutine(DISTRU *p);
VOID JXRoutine(DISTRU *p);
VOID TWRoutine(DISTRU *p);
VOID YKYXRoutine(DISTRU *p);
VOID STRoutine(DISTRU *p);
VOID HWRoutine(DISTRU *p);
VOID FGRoutine(DISTRU *p);
VOID DIUnused(DISTRU *p);
VOID YXSub(DISTRU *p);
VOID DLSub(DISTRU *pDISTRU, UNSIGNED uDPI);
VOID DI_Handle_Initialize(VOID);
VOID DI_Handle_Routine(VOID);
extern UNSIGNED THWXN_Flag;
UNSIGNED PulseCounter[PULSENUM]; //电度脉冲计数
UNSIGNED Revert_Flag; //复归标志
UNSIGNED Switchin_buf; //开入位
DISTRU DIChn[DI_Number] =
{
{"脉冲开入1","脉冲开入1动作","脉冲开入1返回", 0, 0, 9, PulseRoutine1}, //脉冲1
{"脉冲开入2","脉冲开入2动作","脉冲开入2返回", 0, 0, 9, PulseRoutine2}, //脉冲2
{"脉冲开入3","脉冲开入3动作","脉冲开入3返回", 0, 0, 9, PulseRoutine3}, //脉冲3
{"脉冲开入4","脉冲开入4动作","脉冲开入4返回", 0, 0, 9, PulseRoutine4}, //脉冲4
{"遥信1","遥信1动作","遥信1返回", 151, 43, 20, YXRoutine1}, //开入1:开关1侧刀闸
{"遥信1","遥信2动作","遥信2返回", 152, 43, 20, YXRoutine2}, //开入2:开关1侧地刀
{"遥信3","遥信3动作","遥信3返回", 153, 43, 20, YXRoutine3}, //开入3:开关2侧刀闸
{"遥信4","遥信4动作","遥信4返回", 154, 43, 20, YXRoutine4}, //开入4:开关2驳氐盯
{"遥信5","遥信5动作","遥信5返回", 155, 43, 20, YXRoutine5}, //开入5:旁路刀闸
{"遥信6","遥信6动作","遥信6返回", 164, 41, 20, YXRoutine6}, //开入6:压力闭锁跳合
{"遥信7","遥信7动作","遥信7返回", 165, 41, 20, YXRoutine7}, //开入7:压力闭锁合
{"遥信8","遥信8动作","遥信8返回", 166, 41, 20, YXRoutine8}, //开入8:压力闭锁跳
{"遥信9","遥信9动作","遥信9返回", 167, 41, 20, YXRoutine9}, //开入9:压力异常
{"弹簧未蓄能","弹簧未蓄能动作","弹簧未蓄能返回", 168, 41, 20, THRoutine}, //弹簧未蓄能
{"闭锁重合闸","闭锁重合闸动作","闭锁重合闸返回", 0, 0, 20, BSCHRoutine}, //闭锁重合闸
{"检修状态","检修状态动作","检修状态返回", 0, 0, 20, JXRoutine}, //检修状态
{"跳位","跳位动作","跳位返回", 150, 43, 20, TWRoutine}, //跳位
{"遥控允许","遥控允许动作","遥控允许返回", 163, 41, 20, YKYXRoutine}, //遥控允许
{"手跳","手跳动作","手跳返回", 149, 43, 20, STRoutine}, //手跳
{"合位","合位动作","合位返回", 150, 43, 20, HWRoutine}, //合位
{"复归","复归动作","复归返回", 0, 0, 20, FGRoutine}, //复归
{"未用开入1","备用开入1动作","备用开入1返回", 0, 0, 20, DIUnused},
{"未用开入2","备用开入2动作","备用开入2返回", 0, 0, 20, DIUnused},
{"未用开入3","备用开入3动作","备用开入3返回", 0, 0, 20, DIUnused},
{"未用开入4","备用开入4动作","备用开入4返回", 0, 0, 20, DIUnused},
{"未用开入5","备用开入5动作","备用开入5返回", 0, 0, 20, DIUnused},
{"未用开入6","备用开入6动作","备用开入6返回", 0, 0, 20, DIUnused},
{"未用开入7","备用开入7动作","备用开入7返回", 0, 0, 20, DIUnused},
{"未用开入8","备用开入8动作","备用开入8返回", 0, 0, 20, DIUnused},
{"未用开入9","备用开入9动作","备用开入9返回", 0, 0, 20, DIUnused},
{"未用开入10","备用开入10动作","备用开入10返回", 0, 0, 20, DIUnused},
{"未用开入11","备用开入11动作","备用开入11返回", 0, 0, 20, DIUnused}
};
/***********************************************************************************/
/* 开入变化检测 */
/***********************************************************************************/
VOID Swiinput_Handle(UNSIGNED Index)
{
static UNSIGNED Switchin_Flag = 0;
register UNSIGNED *p,iThisTime,iLastTime,iTwoTime,iBit,j;
register DISTRU *pp = DIChn;
p = &SoftTime.DI[Index];
iThisTime = *p ^ Switchin_buf; //本次变化标志
iLastTime = Switchin_Flag; //上次变化标志
iTwoTime = iThisTime | iLastTime; //标志或
if (iTwoTime)
{
for (j = 0,iBit = 0x1; j < DI_Number; j++,pp++,iBit <<= 1)
{
if (iTwoTime & iBit)
{
if (iLastTime & iBit)
{
if (iThisTime & iBit)
{
if(++pp->counter >= pp->counter_set)
{
Switchin_buf ^= iBit;
Switchin_Flag &= ~iBit;
pp->state = (Switchin_buf & iBit) == 0 ? 1 : 0 ;
(*(pp->proutine))(pp);
}
}
else
if(--pp->counter == 0)Switchin_Flag &= ~iBit;
}
else
{
Switchin_Flag |= iBit;
pp->counter = 2;
pp->time = Index;
}
}
}
}
}
/***********************************************************************************/
/* 填遥信报告 */
/***********************************************************************************/
REPORT YxReport;
VOID YXSub(DISTRU *pDISTRU)
{
register REPORT *pREPORT = &YxReport;
register SOE *pSOE = &pREPORT->pro_report_soe;
register CHAR *pCHAR1,*pCHAR2;
register UNSIGNED i;
if(pDISTRU->state)
{
pSOE->pSOE_name = pDISTRU->on_name;
pCHAR1 = pDISTRU->on_name;
}
else
{
pSOE->pSOE_name = pDISTRU->off_name;
pCHAR1 = pDISTRU->off_name;
}
pCHAR2 = pSOE->SOE_name;
for (i = 0; i < SOE_NAME; i++, *pCHAR2++ = *pCHAR1++);
pSOE->SOE_Inf = pDISTRU->inf;
if (pDISTRU->asdu == 41)
pSOE->DPI = pDISTRU->state;
else
pSOE->DPI = pDISTRU->state + 1;
i = SoftTime.HourMinuteSec[pDISTRU->time];
pSOE->Hour = i >> 24;
pSOE->Minute = (i >> 16) & 0xff;
pSOE->Millionsecond = i & 0xffff;
i = SoftTime.YearMonthDay[pDISTRU->time];
pSOE->Year = (i >> 16) & 0xff;
pSOE->Month = (i >> 8) & 0xff;
pSOE->Day = i & 0xff;
pREPORT->pro_report_flag = pDISTRU->asdu;
pREPORT->mmi_flag = MMIPICKUP;
Fill_Report(&YxReport);
}
/***********************************************************************************/
/* 填遥信报告 */
/***********************************************************************************/
VOID DLSub(DISTRU *pDISTRU,UNSIGNED uDPI)
{
register REPORT *pREPORT = &YxReport;
register SOE *pSOE = &pREPORT->pro_report_soe;
register CHAR *pCHAR1,*pCHAR2;
register UNSIGNED i;
if(pDISTRU->state)
{
pSOE->pSOE_name = pDISTRU->on_name;
pCHAR1 = pDISTRU->on_name;
}
else
{
pSOE->pSOE_name = pDISTRU->off_name;
pCHAR1 = pDISTRU->off_name;
}
pCHAR2 = pSOE->SOE_name;
for (i = 0; i < SOE_NAME; i++, *pCHAR2++ = *pCHAR1++);
pSOE->SOE_Inf = pDISTRU->inf;
pSOE->DPI = uDPI + 1;
i = SoftTime.HourMinuteSec[pDISTRU->time];
pSOE->Hour = i >> 24;
pSOE->Minute = (i >> 16) & 0xff;
pSOE->Millionsecond = i & 0xffff;
i = SoftTime.YearMonthDay[pDISTRU->time];
pSOE->Year = (i >> 16) & 0xff;
pSOE->Month = (i >> 8) & 0xff;
pSOE->Day = i & 0xff;
pREPORT->pro_report_flag = 43;
pREPORT->mmi_flag = MMIPICKUP;
Fill_Report(&YxReport);
}
/***********************************************************************************/
/* 电度脉冲开入1 */
/***********************************************************************************/
VOID PulseRoutine1(DISTRU *pDISTRU)
{
if (pDISTRU->state) PulseCounter[0]++;
}
/***********************************************************************************/
/* 电度脉冲开入2 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -