说实在的,这个程序总感觉编起来特别别扭,首先,不能使用 UC FC [XX]等程序块调用的指令,因为给出的应用是相同程序块的多次调用;其次是在程序块的接口参数中不能定以TIMER类型,例如控制对象使用FC编写,FC的接口参数如图3所示。
图3
使用OB1调用赋值时,只能赋值常数而不能是变量,如图4所示。
图4
所以FC的接口参数只能是INT类型变量,由于接口参数不能存储16指针,还必须通过temp临时变量进行中转,在FC中的编写的程序如图5所示。
图5
FC中的程序非常简单,如果输入TRIG1为1,使能定时器T[#T1_TEMP1] 10秒定时,定时器T[#T1_TEMP1] 为1,然后将结果传送到输出OUT1,10秒后计时停止,OUT1复位,等于TRIG1为1后,OUT1产生一个10秒的脉冲,相同程序,TRIG2为1后,OUT2产生一个5秒的脉冲。
然后调用该FC,参考图6。使用LOOP指令生成20次循环调用,每次使用的定时器号加1,这样FC的第一个定时器使用范围T1~T20,第二个定时器T100~T120。触发位和输出位使用了32位指针,为了显示方便,在程序中被屏蔽。
图6
程序编写的总体感觉:对所用指令都非常熟悉的情况下,花费时间大概1个多小时,而且程序结果不清晰。如果不是后续还有类似的应用,直接调用FC 二十遍反而更容易。这也是大多数工程师没有体验到的,要么没有遇到,要么次数少就直接调用了,我见到最多调用过一百多编的,并且接口参数还比较多,真是累眼睛呀。
基于对象的编程方式,一个对象使用FB进行控制比较方便。如果将上面的FC换为FB会怎么样呢?大家都知道调用FB块需要生成实例数据块,循环调用就不行了,不能只用一个实例数据块,所以只能使用UC或者CC调用,结果就是既没有接口参数也不生成实例数据块,只能使用全局变量进行数据交换,这样还使用什么FB块呀!总之就是繁琐。
1.2 存储器16位地址指针-S7-1500的处理方式
如果使用上面的编程方式,在S7-1500中也可以实现,主要是移植的考虑。如果重新编程肯定有更简单的方式。S7-1500中批量的处理都使用数组的方式,S7-300/400中使用的定时器(T)和计数器(C)由于在S7-1500不能作为数组中的数据元素,所以就不推荐使用了,取而代之的是IEC定时器和IEC计数器,它们可以在数据块中直接定义,参考图7。
图7
FC作为辅助功能,例如数据转换、控制对象调用前的预处理或者调用后的后期处理,也不支持批量调用,通常批量处理的是控制对象,控制对象使用FB编写,所以FB支持批量调用,可以作为数组的数据元素,参考图8。
图8
还是上面的应用,使用S7-1500,编写就变得非常简单,首先创建一个FB块,编写相关的控制程序,参考图9。
图9
然后在一个FB块中方循环调用该FB块,示例程序参考图10。
图10
可以看到使用S7-1500处理程序块的批量调用非常简单,并且数组的使用与编程语言无关。
----------------------------------------------------------------------------------------------------------
上一篇:【2】16位地址指针——从S7-300_400到S7-1500看变址寻址的改变系列故事之二
下一篇:【4】存储器32位地址指针——从S7-300_400到S7-1500看变址寻址的改变系列故事之四
汇总帖:技术Π活动故事、视频与案例分享汇总