程序概况
目的:输入 #启动信号 加 #总分钟数, 输出 时分秒 倒计时,倒计时结束输出一个完成信号。
思路:输入总分钟数换算成总秒数,分别计算时、分、秒。使用自带时钟存储器进行每秒-1计算,总秒数为0时,输出完成信号。
程序编写
变量设置
Input
StartSignal: BOOL; // 启动信号(上升沿触发)
TotalMinutes: INT; // 输入总分钟数(1-1440)
Output
Hours: INT; // 剩余小时
Minutes: INT; // 剩余分钟
Seconds: INT; // 剩余秒
DoneSignal: BOOL; // 完成信号
Static
TotalSeconds: DINT; // 总秒数计算(1440*60>INT取值范围,故使用DINT)
PrevStartSignal: BOOL := FALSE;// 启动信号上升沿检测
程序主体
// 检测启动信号上升沿
IF #StartSignal AND NOT #PrevStartSignal THEN
#TotalSeconds := #TotalMinutes*60 ; // 分钟转秒
#DoneSignal := FALSE; // 复位完成信号
#StartSignal := FALSE; // 复位启动信号
END_IF;
#PrevStartSignal := #StartSignal;
#P := "Clock_1Hz" AND NOT #P_last;
#P_last := "Clock_1Hz";
IF NOT #DoneSignal AND #TotalSeconds > 0 THEN
// 倒计时逻辑
IF #P THEN
#TotalSeconds := #TotalSeconds - 1;
// 时分秒转换
#Hours := #TotalSeconds / 3600;
#Minutes := (#TotalSeconds MOD 3600) / 60;
#Seconds := #TotalSeconds MOD 60;
// 完成信号触发
IF #TotalSeconds <= 0 THEN
#DoneSignal := TRUE;
#Hours := 0;
#Minutes := 0;
#Seconds := 0;
END_IF;
END_IF;
END_IF;
初始化:
- 当
#StartSignal
为真时,程序开始初始化。 - 计算
#TotalSeconds:= #TotalMinutes*60 总秒数
。 - 初始化
#DoneSignal := FALSE; #StartSignal := FALSE;
时钟存储器上升沿指令#P := "Clock_1Hz" AND NOT #P_last; #P_last := "Clock_1Hz";
定时器逻辑:
- 当
#P 信号触发且总秒数>0且完成信号为假时
,触发递减操作。 - 递减
#TotalSeconds := #TotalSeconds - 1;
。 - 更新输出 时钟 数值:
#Hours := #TotalSeconds / 3600
#Minutes := (#TotalSeconds MOD 3600) / 60
#Seconds := #TotalSeconds MOD 60
- 如果
#TotalSeconds
减到0,则设置#DoneSignal
为真,并停止定时器。
输出控制:
- 实时更新 时钟 数值,用于显示当前的倒计时时间。
- 当
#DoneSignal
为真时,输出完成信号,可以用于触发后续操作。
界面制作
触摸屏变量设置
在HMI变量中创建一个倒计时的变量表,在其中输入所需的变量,与PLC侧变量进行相关联。
防止输入分钟数输入错误,限制数值上下限,0-1440,24H即可。
手动模式画面制作
- 倒计时设置,选用元素 - IO域;动画关联 分钟数输入变量
- 启动按钮,选用元素 - 按钮 ;事件 - 单击,置位位 启动按钮
- 倒计时展示,选用元素 - IO域;动画关联 时,分,秒变量
- 完成信号,选用基本对象 - 圆;动画-外观,关联完成信号,为真时红色,为假时绿色。
效果展示
感谢您的耐心阅读和支持。愿您的每一天都充满阳光和快乐,不断追寻自己的梦想与目标。