📄 basedo.c
字号:
/////////////////////////////////////////////////////////////////////////////////////
// 程序名: BaseDO.c
// 开出量处理部分
/////////////////////////////////////////////////////////////////////////////////////
#include "BaseVariable.h"
UNSIGNED Switchout_buf = 0x3fff; //继电器开出缓存
UNSIGNED CtrlOutBuf = 0x7; //控制输出缓存: d0_运行灯, d1_485OE, d2_清看门狗, d3_液晶背光
DOSTRU DOChn[DO_Number]; //开出
VOID Switch_Output_on(UNSIGNED chn);
VOID Switch_Output_off(UNSIGNED chn);
VOID Ctrl_Output_on(UNSIGNED chn);
VOID Ctrl_Output_off(UNSIGNED chn);
VOID DO_Logic(VOID);
/***********************************************************************************/
/* 控制动作 */
/***********************************************************************************/
VOID Ctrl_Output_on(UNSIGNED chn)
{
register UNSIGNED *p = &CtrlOutBuf;
register OPTION old_preempt;
old_preempt = NU_Change_Preemption(NU_NO_PREEMPT); //不再切换任务,避免被其他任务打断,造成误动
*p &= ~(1 << chn);
*pCTRLPORT = *p;
NU_Change_Preemption(old_preempt); //可以切换任务
}
/***********************************************************************************/
/* 控制返回 */
/***********************************************************************************/
VOID Ctrl_Output_off(UNSIGNED chn)
{
register UNSIGNED *p = &CtrlOutBuf;
register OPTION old_preempt;
old_preempt = NU_Change_Preemption(NU_NO_PREEMPT); //不再切换任务,避免被其他任务打断,造成误动
*p |= (1 << chn);
*pCTRLPORT = *p;
NU_Change_Preemption(old_preempt); //可以切换任务
}
/***********************************************************************************/
/* 控制取反 */
/***********************************************************************************/
VOID Ctrl_Output_reverse(UNSIGNED chn)
{
register UNSIGNED *p = &CtrlOutBuf;
register OPTION old_preempt;
old_preempt = NU_Change_Preemption(NU_NO_PREEMPT); //不再切换任务,避免被其他任务打断,造成误动
*p ^= (1 << chn);
*pCTRLPORT = *p;
NU_Change_Preemption(old_preempt); //可以切换任务
}
/***********************************************************************************/
/* 开出动作 */
/***********************************************************************************/
VOID Switch_Output_on(UNSIGNED chn)
{
register DOSTRU *p = &DOChn[chn];
register UNSIGNED *pbuf = &Switchout_buf;
register OPTION old_preempt;
old_preempt = NU_Change_Preemption(NU_NO_PREEMPT); //不再切换任务,避免被其他任务打断,造成误动
*pbuf &= ~(1 << chn);
*pDOPORT = *pbuf;
p->clock = TMD_System_Clock;
p->state = 0x1;
NU_Change_Preemption(old_preempt); //可以切换任务
}
/***********************************************************************************/
/* 开出返回 */
/***********************************************************************************/
VOID Switch_Output_off(UNSIGNED chn)
{
register DOSTRU *p = &DOChn[chn];
register UNSIGNED *pbuf = &Switchout_buf;
register OPTION old_preempt;
old_preempt = NU_Change_Preemption(NU_NO_PREEMPT); //不再切换任务,避免被其他任务打断,造成误动
*pbuf |= 1 << chn;
*pDOPORT = *pbuf;
p->state = 0x0;
NU_Change_Preemption(old_preempt); //可以切换任务
}
/***********************************************************************************/
/* 继电器返回和标志返回 */
/***********************************************************************************/
VOID DO_Logic()
{
register PROTECT *protect;
register DOSTRU *p;
register CHECK *check;
register UNSIGNED i, j, k;
*pDOPORT = Switchout_buf;
protect = PRO_Created_Protect_List; //保护列表指针
for (j = 0, k = 0; j < PRO_Total_Protect; j++, protect = protect->pro_link_next)
{
if (protect->pro_startup_flag && protect->pro_trip)
{
k = 1;
break;
}
}
p = &DOChn[QDJ];
if(p->state)
{
if (!k && (TMD_System_Clock - p->clock >= 1000) && (Switchout_buf & 0x1ffe) == 0x1ffe) //启动继电器的返回
QdjBack();
}
else
{
if(k) Qdj();
}
protect = PRO_Created_Protect_List; //保护列表指针
for (j = 0, k = 0; j < PRO_Total_Protect; j++, protect = protect->pro_link_next)
{
if (protect->pro_pickup_flag && protect->pro_trip)
{
k = 1;
break;
}
}
p = &DOChn[TZJ];
if (p->state)
{
if(!k && TMD_System_Clock - p->clock >= 200) //跳闸继电器的返回
TzjBack();
}
else
{
if(k) Tzj();
}
p = &DOChn[HZJ];
if (p->state && TMD_System_Clock - p->clock >= 200) //重合闸继电器的返回
HzjBack();
p = &DOChn[YTJ];
if (p->state && TMD_System_Clock - p->clock >= 200) //遥跳继电器的返回
YtjBack();
p = &DOChn[YHJ];
if (p->state && TMD_System_Clock - p->clock >= 200) //遥合继电器的返回
YhjBack();
p = &DOChn[GXJ];
if (p->state && TMD_System_Clock - p->clock >= 200) //报警信号继电器的返回
GxjBack();
p = &DOChn[FGJ];
if (p->state && TMD_System_Clock - p->clock >= 200) //复归继电器的返回
{
FgjBack();
check = CHK_Created_Check_List; //以下判断是否需要继续发报警信号
for (j = 0; j < CHK_Total_Check; j++, check = check->chk_link_next) //判断是否有告警未返回
{
if (check->pickup_flag)
{
Qdj(); //如果告警未返回,再次发告警信号
Gxj();
break;
}
}
protect = PRO_Created_Protect_List; //保护列表指针
for (j = 0, k = 0; j < PRO_Total_Protect; j++, protect = protect->pro_link_next)
{
if (protect->pro_pickup_flag && !protect->pro_trip)
{
Qdj();
Gxj();
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -