控制算法要求如下:
用一按钮控制三组(或三个)灯,以达到控制灯的亮度。由 PLC 组成一个控制器,每按一次按钮增加一组灯亮;三组灯全亮后,每按一次按钮,灭一组灯;如果按下按钮的时间超过2s,则灯全灭。
输入/输出元件及控制功能表:
动作逻辑说明(通俗版):
按钮控制三组灯动作逻辑
状态转换图:
状态顺序表(先亮先灭)
核心编程思路
本程序需要实现两个核心功能:
1.短按切换:检测按钮上升沿(按下后松开瞬间),状态值按预设顺序变化
2.长按复位:检测按钮按下持续时间,超过2秒则强制归零
关键点:
使用状态值(0~6的特定序列)来管理当前灯的组合
使用定时器检测长按
使用上升沿检测短按
状态切换在按钮松开时执行(防止按住时连续跳变)
这是一个经典的单按钮多功能控制案例,包含短按循环切换和长按复位的功能。我们来完整实现这个程序。
200 SMART PLC 程序(西门子)
网络 1:按钮按下检测与长按定时
// :按钮按下时启动长按定时器
网络 2:短按脉冲生成(松开时触发)
// :按钮松开瞬间产生短按脉冲
网络 3:长按复位处理
// :长按超过2秒,全部熄灭
网络 4:状态切换逻辑(核心)
// :短按时状态值按预设序列切换
// 根据当前状态值决定下一个状态
网络 5:输出映射(状态值转换为输出)
// :根据状态值VB0控制对应的输出
// 状态值 = 0:全灭
// 状态值 = 1:只有L1亮
// 状态值 = 3:L1、L2亮
// 状态值 = 7:全亮
// 状态值 = 6:L2、L3亮(L1灭)
// 状态值 = 4:只有L3亮
优化版程序(使用查表法)
// ========== 优化版:查表法,代码更简洁 ==========
// 网络1:建立状态输出对应表(首次扫描执行一次)
LD SM0.1 // 首次扫描周期
MOVB 1600, VB100 // 状态0:全灭 MOVB 1601, VB101 // 状态1:L1亮 MOVB 1603, VB102 // 状态2:L1+L2亮 MOVB 1607, VB103 // 状态3:全亮 MOVB 1606, VB104 // 状态4:L2+L3亮 MOVB 1604, VB105 // 状态5:L3亮 // 网络2:按钮按下检测与定时
LD I0.0
TON T37, 20 // 2秒长按检测
// 网络3:长按复位
LD T37
MOVB 0, VB0 // 状态指针归零
R T37, 1
// 网络4:短按状态切换(使用递增方式)
LD I0.0
ED // 松开按钮
AN T37 // 不是长按
LPS
INCB VB0 // 状态指针+1
LPP
LDB>= VB0, 6 // 超过最大状态值(0~5共6个状态)
MOVB 0, VB0 // 回到0
// 网络5:查表输出
LD SM0.0
MOVB VB0, AC0 // 状态值放入累加器
MOVB *(&VB100 + AC0), QB0 // 从表中取出对应的输出值写入QB0
变量表汇总:
状态与输出对应表;
调试步骤:
1.初始状态:上电后三组灯全灭
2.短按测试:
第1次短按(按下后松开):L1亮
第2次短按:L1、L2亮
第3次短按:全亮
第4次短按:L2、L3亮(L1灭)
第5次短按:只有L3亮
第6次短按:全灭
循环重复
3:长按测试:
任意状态下按住按钮不放,超过2秒
所有灯立即全灭,状态归零
4.边界测试:
快速连按:每次只变化一次状态
按住不放:不会连续跳变
常见问题排查:
本例 个人观点 ,内容仅供参考,请仔细甄别。
END
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!