抖音粉丝群1
『7x24小时有问必答』

AI浪潮下的计算机行业——从业者现状与未来展望
【背景】有一个自复位按钮和灯,按下按钮后灯亮,松开则灭,但是按钮连续按下超3S后,灯一直亮。此时再按一下,灯灭。【思路】看似需求非常简单,其实涉及定时器、上升沿触发、辅助状态知识。问AI,确实可以给出一堆代码,但代码复杂且测试结果偏离预期,于是决定采用经典状态机思路实现。灯的状态实际只有两种 那就是亮和灭;那么就看两种状态之间怎么实现切换?第一层思维是状态为灯灭时,如果按下按钮,状态变为灯亮,此时如果松开按钮,状态变为灯灭,这样已经实现了最简单的点动效果。模拟行车控制完全可以。
第二层思维是考虑延时,灯亮时,如果此时发现前面按的时间超过了3S,即使此时按钮松开,仍然保持灯亮状态。那怎么让灯再灭哪?不能一直亮下去吧?且看第三层。第三层思维是即使“前一次按的时间不足3S”成为实际记录,但借助一个辅助Bool量,让这个条件变为FALSE。那这个辅助Bool量怎么实现哪?可以在“前一次按的时间3S”时,如果察觉按钮上升沿,则清算一下,即否定“前一次按的时间3S”,从而仍然履行上面的状态机模式。
// 计时器控制 - 按钮按下时开始计时Timer(IN := Button, PT := T#3S);Rtrig01(CLK:=BUTTON,Q=>);//按钮上升沿检测IF Timer.Q THEN        TimerTriggered:=1;//一旦按压时间足够,变量赋TRUE;END_IF
IF TimerTriggered=1  AND Rtrig01.Q THEN//即使前面按的时间超过3S,但是此时按钮上升沿可以让其失效         TimerTriggered:=0; END_IF

CASE curState OF
0://灯灭状态
Light:=0;//灯灭IF  Button AND NOT TimerTriggered  THEN        curState:=1;//切换到灯亮状态END_IF
1://灯亮状态
Light:=1;//灯亮IF NOT Button AND  NOT TimerTriggered THEN        curState:=0;//切换到灯灭状态END_IF



END_CASE

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?获取邀请码

x
主题回复
倒序浏览

580查看1回复

Fusky 2025-7-17 09:32:16
VAR
        bButton:BOOL;
        ton1:TON;
        blighton:BOOL;
        blighton1:BOOL;
        blighton2:BOOL;
        R_trig1:Standard.R_TRIG;
        state:INT:=0;
END_VAR
//第一种情况,点动;
blighton1:=bButton;

//第二种情况,按下3秒常亮,再按下熄灭;
ton1(IN:=bButton,PT:=T#3S);
R_trig1(CLK:=bButton);
IF ton1.Q THEN
        blighton2:=TRUE;
END_IF
IF  R_trig1.Q AND  blighton2 =1  THEN
        blighton2:=FALSE;
END_IF;

//灯亮输出赋值
blighton:=blighton1 OR blighton2;

(用状态机和上面这个程序效果是一样的)
发新帖
您需要登录后才可以回帖 登录 | 获取邀请码

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

Copyright 2010-2015. All rights reserved. 

微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码