
如图所示,计数器设定值为3,当“start”置1后,两个定时器循环工作,当循环次数等于3,即计数器实际值等于3时,Tag_27为1。为什么循环没有停止,只有当计数器等于4后,循环停止?循环次数为什么是4次,而不是三次?
补充:当第三次循环结束,计数器当前值为3,Tag_27已经为1。第一个计时器IN为0,为什么会进入第四次循环?

补充:当第三次循环结束,计数器当前值为3,Tag_27已经为1。第一个计时器IN为0,为什么会进入第四次循环?
关注引自免费微信小程序:皆我百晓生
从描述来看,问题的核心在于理解为何计数器的实际值达到设定值+1(这里是4)时,循环才停止,而非在达到设定值(这里是3)时就停止。这通常与计数器的工作原理有关,尤其是在涉及到上升沿触发的场景。
在博途V15(TIA Portal V15)中,计数器(CTU)的逻辑设计是基于事件的,具体到此例,是基于定时器完成信号的上升沿进行计数。每当一个定时器完成,计数器检测到其输入端(IN)由0变1的上升沿,计数值增加1。因此,要理解为什么循环次数为4次,我们需要深入分析计数器的工作流程:
如果目标是在计数器达到设定值时停止循环,可以调整计数器的设定值(PV)为循环次数减1,或者在软件逻辑中添加额外的条件检查,确保在CV达到PV时停止进一步的计数动作。例如,在CTU之后添加一个比较指令(如CMP),用来比较CV和PV的值,一旦相等,通过控制逻辑停止后续的定时器启动。
// 假设PV设定为3,目标是在计数器达到3时停止
// 使用比较指令(CMP)实现
VAR
cmpResult: BOOL;
END_VAR
// 计数器逻辑
CTU Q:= Tag_27, IN:= Tag_25, PV:= 3, CV:= Tag_29, R:= Tag_24;
// 比较CV和PV的值
cmpResult := Tag_29 = 3; // 直接比较,无需CMP指令,假设Tag_29为CV
// 控制逻辑,当CV达到PV时,停止定时器
IF cmpResult THEN
Tag_25 := FALSE; // 禁止定时器启动
END_IF
这样,一旦计数器的当前值等于设定值,Tag_25将被置为0,阻止新的定时器启动,从而在计数器达到期望的循环次数时停止整个过程。