有网友问我:“我在FB块里设置了参数类型为TIMER的输入参数TIM15。同样的数据类型为Timer的输入参数TIM1~TIM14的定时器是程序原有的,用起来没有问题。TIM15是我新增的,调用功能块时用T2作TIM15的实参,但是在FB里监控TIM15,它不动作。将它改为全局变量,例如T33就正常了。但不知道为什么?烦请廖老师帮忙分析下有那些可能影响的原因。”(我对原话做了些文字整理)。
我用仿真做了实验(见下图),接通两个定时器的线圈,的确看到T33的当前值不断减小,但是看不到TIM15的当前值和它的变化。
对计数器做类似的实验,也看不到计数器当前值的变化。FC里的定时器、计数器也有同样的问题。
问题到底出在哪里,是FB和FC里的定时器、计数器罢工了吗?
为了确认定时器、计数器是否罢工,我用MOVE指令将定时器TIM15的当前值传送到MW12,在定时器线圈通电时,看到TIM15的当前值从设定值开始不断减小(见下图),看来TIM15并没有罢工,只是在监控定时器线圈时看不到它的当前值而已。对计数器做同样的实验,也能证明FB里地址为参数类型COUNTER的计数器是能工作的。
值得注意的是TIM15是输入参数,它的功能是用来接收定时器的地址,它的输出位的状态不会自动地返回给调用FB的程序。需要在FB里创建一个数据类型为BOOL的输出参数,例如下图中的out1,用它来将TIM15输出位的状态返回给调用FB的程序。