有程序如下
if(yaban_State == ON)
{
Lcd_DispHZStr(8 * 4, (i) * 24, "投入", (i + 1 == invert) ? 1 : 0);
}
else
{
Lcd_DispHZStr(8 * 4, (i) * 24, "退出", (i + 1 == invert) ? 1 : 0);
}
if (p->ya_ban ==OFF)
{
return;
}
else
{
if (UIx > p->dingzhi)
{
pRTdata->begin_time_Flg = ON;/* 开始计时 */
}
else
{
pRTdata->begin_time_Flg = OFF;/*停止计时 */
}
if (pRTdata->time_count > (uint16_t)(p->yanshi *1000.0f))
{
pRTdata->begin_time_Flg =OFF;
if (UIx > p->dingzhi)
{
pRTdata->pro_out_Flg = SET;/**保护输出 */
}
}
}
上面第一段程序关于压板状态的判断, 当 yaban_State != 0N 时,压板状态会显示“退出”, 正常情况来讲,按照第二段程序的逻辑写法,一定会执行如下 return 吗? 答案是不一定!!!
if (p->ya_ban ==OFF)
{
return;
}
如果因为某种原因导致改变了 yaban_State 压板变量的值,使得其既不等于ON 也不等于OFF,此时呈现的效果就是 压板状态是“退出” 但if (p->ya_ban ==OFF)
逻辑不成立,导致执行的是压板投入状态的逻辑。
正确的写法应该是
if(yaban_State == OFF)
{
Lcd_DispHZStr(8 * 4, (i) * 24, "退出", (i + 1 == invert) ? 1 : 0);
}
else
{
Lcd_DispHZStr(8 * 4, (i) * 24, "投入", (i + 1 == invert) ? 1 : 0);
}
if (p->ya_ban ==OFF)
{
return;
}
else
{
if (UIx > p->dingzhi)
{
pRTdata->begin_time_Flg = ON;/* 开始计时 */
}
else
{
pRTdata->begin_time_Flg = OFF;/*停止计时 */
}
if (pRTdata->time_count > (uint16_t)(p->yanshi *1000.0f))
{
pRTdata->begin_time_Flg =OFF;
if (UIx > p->dingzhi)
{
pRTdata->pro_out_Flg = SET;/**保护输出 */
}
}
}
或者
if(yaban_State == ON)
{
Lcd_DispHZStr(8 * 4, (i) * 24, "投入", (i + 1 == invert) ? 1 : 0);
}
else
{
Lcd_DispHZStr(8 * 4, (i) * 24, "退出", (i + 1 == invert) ? 1 : 0);
}
if (p->ya_ban ==ON)
{
if (UIx > p->dingzhi)
{
pRTdata->begin_time_Flg = ON;/* 开始计时 */
}
else
{
pRTdata->begin_time_Flg = OFF;/*停止计时 */
}
if (pRTdata->time_count > (uint16_t)(p->yanshi *1000.0f))
{
pRTdata->begin_time_Flg =OFF;
if (UIx > p->dingzhi)
{
pRTdata->pro_out_Flg = SET;/**保护输出 */
}
}
}
else
{
return;
}
以上两种(因为保护功能宁可被无故打开,也不能被无故关掉,所以对于保护来说还是尽量按照第一种)写法, 即使 yaban_State
被意外改变,既不等于ON也不等于OFF,在显示和保护判断上呈现的是一致的逻辑。