📄 alarm.c
字号:
//返 回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void JudgeBypassAlarmStatus(unsigned char uchChannel)
{
if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0xff)
{
return;
}
else if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0x00)
{
AlarmModule.uchAlarmStatus[uchChannel - 1] &= 0x00;
}
else if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0x01)
{
AlarmModule.uchAlarmStatus[uchChannel - 1] &= 0xf9;
}
else if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0x02)
{
AlarmModule.uchAlarmStatus[uchChannel - 1] &= 0xf6;
}
else
{
return;
}
}
//----------------------------------------------------------------------------------------------------------------
//函数名称:void AlarmIOControl(unsigned char uchChannel, unsigned char uchAlarmStatus, unsigned char uchOKStatus)
//功 能:由各种状态的判断得到报警控制输出供三冗余或43使用
//输入参数:通道号,报警状态、 OK状态
//返 回:无
//完成日期:4/12/2007
//----------------------------------------------------------------------------------------------------------------
void AlarmIOControl(unsigned char uchChannel, unsigned char uchAlarmStatus, unsigned char uchOKStatus)
{
if (uchOKStatus == 1)
{
SetNotOKIOControl(uchChannel);
}
else if ( uchOKStatus == 0 )
{
if (uchAlarmStatus == 0x00)
{
SetOKIOControl(uchChannel);
}
else if ((uchAlarmStatus == 0x04) || (uchAlarmStatus == 0x02))
{
SetAlertIOControl(uchChannel);
}
else if ((uchAlarmStatus == 0x0c) || (uchAlarmStatus == 0x03))
{
SetDangerIOControl(uchChannel);
}
}
}
//--------------------------------------------------------------------------------------
//函数名称:void SetPercentValueALM(unsigned char uchChannel, int iMeasurePercent)
//功 能:设置测量的比例值到报警模块
//输入参数:通道号
//返 回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void SetPercentValueALM(unsigned char uchChannel, int iMeasurePercent)
{
if (iMeasurePercent >= 5940)
{
iMeasurePercent = 5940;
}
else if (iMeasurePercent <= -1250)
{
iMeasurePercent = -1250;
}
else
{
;
}
AlarmModule.iMeasurePercent[uchChannel - 1] = iMeasurePercent;
}
//--------------------------------------------------------------------------------------
//函数名称:void SetAlertTypeStatusALM(unsigned char uchChannel, unsigned char uchAlertType)
//功 能:将报警类型的状态设置到报警模块中,以供报警类选择使用
//输入参数:通道号,报警类型
//返 回:无
//完成日期:4/16/2007
//作 者:佟文杰
//---------------------------------------------------------------------------------------
void SetAlertTypeStatusALM(unsigned char uchChannel, unsigned char uchAlertType)
{
AlarmModule.uchAlertTypeStatus[uchChannel - 1] = uchAlertType;
}
//--------------------------------------------------------------------------------------
//函数名称:void SetAfreshConfigFlagAlarm(unsigned char uchChannel,unsigned char AfreshConfigFlag)
//功 能:将重新配置参数的标志设置到报警模块
//输入参数:通道号,重新配置参数的标志
//返 回:无
//完成日期:4/16/2007
//作 者:佟文杰
//---------------------------------------------------------------------------------------
void SetAfreshConfigFlagAlarm(unsigned char uchChannel,unsigned char AfreshConfigFlag)
{
AlarmModule.uchAfreshConfigFlag[uchChannel - 1] = AfreshConfigFlag;
}
//--------------------------------------------------------------------------------------
//函数名称:void AlarmModuleProcess(void)
//功 能:报警模块数据的处理
//输入参数:通道号
//返 回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void AlarmModuleProcess(unsigned char uchChannel)
{
StopHeartBeat();
SetHeartbeatALM(uiHeartbeatValue);
StartHeartBeat();
switch(AlarmModule.uchChannelType[uchChannel - 1])
{
case 13: //加速度输入 加速度输出
case 14: //加速度输入 速度输出
case 15: //加速度输入 位移输出
case 16: //速度输入 速度输出
case 17: //速度输入 位移输出
case 18: //位移输入 位移输出
case 21: //涡流+速度 输出复合式振动
case 22: //LVDT输入 机壳膨胀输出
case 28: //HHH
if (AlarmModule.uchEnable[uchChannel - 1] == 0)
{
OutputCurrentValue(uchChannel, 400);
AlarmIOControl(uchChannel, 0x00, 0); //通道Disable 通道OK,无报警0x00 输出4mA
AlarmModule.uchLEDAlarmStatus[uchChannel - 1] = 0x00;
SetAlarmStatusMain(uchChannel, 0x00);
SetAlarmStatusCOMM(uchChannel, 0x00);
}
else if (AlarmModule.uchOKStatus[uchChannel - 1] != 0)
{
JudgeAlarmStatus(uchChannel);
JudgeBypassAlarmStatus(uchChannel); //20080313
OutputCurrentValue(uchChannel, 300); //通道不OK,输出3mA
SetAlarmStatusMain(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);
AlarmIOControl(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1], 1);
SetAlarmStatusCOMM(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);
AlarmModule.uchLEDAlarmStatus[uchChannel - 1] = AlarmModule.uchAlarmStatus[uchChannel - 1];
}
else if (AlarmModule.uchOKStatus[uchChannel - 1] == 0)
{
JudgeAlarmStatus(uchChannel);
JudgeBypassAlarmStatus(uchChannel);
if (AlarmModule.uchAfreshConfigFlag[uchChannel - 1] == 0)
{
if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 1)
{
OutputCurrentValue(uchChannel, (((float)AlarmModule.iMeasurePercent[uchChannel - 1] * 16) / 50 + 400));
}
}
else if (AlarmModule.uchAfreshConfigFlag[uchChannel - 1] == 1)
{
AlarmModule.uchAfreshConfigStartOutCurrentCount[uchChannel - 1]++;
if (AlarmModule.uchAfreshConfigStartOutCurrentCount[uchChannel - 1] == 5)
{
AlarmModule.uchAfreshConfigFlag[uchChannel - 1] = 0;
AlarmModule.uchAfreshConfigStartOutCurrentCount[uchChannel - 1] = 0;
}
}
else
{
if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 1)
{
OutputCurrentValue(uchChannel, (((float)AlarmModule.iMeasurePercent[uchChannel - 1] * 16) / 50 + 400));
}
}
//配置参数后的电流抑制
AlarmModule.uchLEDAlarmStatus[uchChannel - 1] = AlarmModule.uchAlarmStatus[uchChannel - 1];
AlarmIOControl(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1], 0);
SetAlarmStatusMain(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);
SetAlarmStatusCOMM(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);
}
AlarmModule.uchResetStatus[uchChannel - 1] = 0; //清除复位状态
break;
default:
break;
}
AlarmLEDControl(AlarmModule.uchLEDAlarmStatus[1] || AlarmModule.uchLEDAlarmStatus[0]); //最后根据报警状态控制报警灯
}
//--------------------------------------------------------------------------------------
//函数名称:void HaveHotResetProcess(unsigned char uchChannel)
//功 能:有热复位时处理数据
//输入参数:通道号
//返 回:无
//---------------------------------------------------------------------------------------
void HaveHotResetAlarmProcess(unsigned char uchChannel)
{
AlarmLEDControl(AlarmModule.uchLEDAlarmStatus[1] || AlarmModule.uchLEDAlarmStatus[0]);
OutputCurrentValue(uchChannel, (((long)AlarmModule.iMeasurePercent[uchChannel - 1] * 16) / 50 + 400));
}
//--------------------------------------------------------------------------------------
//函数名称:void InitAlarmModuleSoftPara(void)
//功 能:初始化报警模块的参数
//输入参数:无
//返 回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void InitAlarmModuleSoftPara(void)
{
AlarmModule.uchResetStatus[0] = 0;
AlarmModule.uchResetStatus[1] = 0;
AlarmModule.uchAlarmStatus[0] = 0;
AlarmModule.uchAlarmStatus[1] = 0;
AlarmModule.uchAlertTypeStatus[0] = 1; //默认报警类型的形式位当前测量形式
AlarmModule.uchAlertTypeStatus[1] = 1;
AlarmModule.uchChannelNotoktoOkFlag[0] = 1;
AlarmModule.uchChannelNotoktoOkFlag[1] = 1;
AlarmModule.uchLEDAlarmStatus[1] = 0;
AlarmModule.uchLEDAlarmStatus[0] = 0;
AlarmModule.uchAfreshConfigFlag[0] = 0;
AlarmModule.uchAfreshConfigFlag[1] = 0;
AlarmModule.uchAfreshConfigStartOutCurrentCount[0] = 0;
AlarmModule.uchAfreshConfigStartOutCurrentCount[1] = 0;
}
//--------------------------------------------------------------------------------------------------
//函数名称:void DelayChannelNotoktoOK(unsigned char uchChannel)
//功 能:由心跳值计算通道从NOTOK到OK状态,延时10ms
//输入参数:通道号
//返 回:无
//完成日期:4/16/2007
//--------------------------------------------------------------------------------------------------
void DelayChannelNotoktoOK(unsigned char uchChannel)
{
unsigned int xdata uiHeartbeatcount[2];
if ((AlarmModule.uchLastChannelOK[uchChannel - 1] != 0) && (AlarmModule.uchOKStatus[uchChannel - 1] == 0))
// && (AlarmModule.uchDelayStart[uchChannel - 1] == 0))
{
// AlarmModule.uchDelayStart[uchChannel - 1] = 1;
StopHeartBeat();
AlarmModule.uiHeartBeatBAK[uchChannel - 1] = uiHeartbeatValue;
StartHeartBeat();
AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] = 0;
}
if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 0)
{
StopHeartBeat();
if (uiHeartbeatValue >= AlarmModule.uiHeartBeatBAK[uchChannel - 1])
{
uiHeartbeatcount[uchChannel - 1] = uiHeartbeatValue - AlarmModule.uiHeartBeatBAK[uchChannel - 1];
}
else
{
uiHeartbeatcount[uchChannel - 1] = 65535 - AlarmModule.uiHeartBeatBAK[uchChannel - 1] + uiHeartbeatValue ;
}
StartHeartBeat();
if (uiHeartbeatcount[uchChannel - 1] > 500)
{
AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] = 1;
}
else
{
AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] = 0;
}
// if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 1)
// {
// AlarmModule.uchDelayStart[uchChannel - 1] = 0;
// }
}
AlarmModule.uchLastChannelOK[uchChannel - 1] = AlarmModule.uchOKStatus[uchChannel - 1];
SetNotOKToOKFlag(uchChannel,AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1]);
}
//--------------------------------------------------------------------------------------------------
//函数名称:void InitAlarmModuleHeartBeatPara(void)
//功 能:初始化报警模块心跳应用的参数
//输入参数:无
//返 回:无
//--------------------------------------------------------------------------------------------------
void InitAlarmModuleHeartBeatPara(void)
{
unsigned int xdata i;
for (i=0; i<2; i++)
{
// AlarmModule.uchDelayStart[i] = 0;
AlarmModule.uiHeartBeatBAK[i] = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -