西门子这一点比其他的PLC都灵活,FB的DB作为FB的变量的固定存放地址,而Temp则是有系统分配临时区L地址。比如:存在FC1,FC2两个功能,它们都有两个Temp,那么当调用FC1时,系统分配L区域地址给FC1的Temp,如分配了LB0,LB1,那么当FC1调用完成后,系统认为LB0,LB1已经不需要,但是西门子的系统不会对临时区进行清零,只是继续分配,当调用FC2时,系统将LB0,LB1重新分配给FC2的Temp,此时如果不遵循先赋值后使用的准则,那么FC2的Temp使用的值将是FC1的Temp的值。 临时变量可以用于所有块中 (OB, FC, FB)。当块执行的时候它们被用来临时存储数据,当退出该块时这些数据将丢失。因此, 在PLC扫描运行时, FC块中的临时变量TEMP不能自锁!
如果FC块, 请你使用全局变量(标志位和数据块)来存储数据,实现自锁! 如果FB块, 除了全局变量之外, 你也可以使用静态变量来存储数据,实现自锁! TEMP变量不能自锁的原因显而易见:
每个扫描周期开始时,TEMP变量的值并不像Q或M那样可以保持上个周期的值。除非明确对其赋值,否则它的值是不确定的。 我使用TEMP只有一个原则: 第一次出现某个TEMP变量,必须是对其赋值(或线圈刷新)的写指令,而不能是读指令。 如果出现问题,建议使用STAT变量替代。 对TEMP的认识都有问题! 我的建议是做逻辑不用TEMP,只在做运算是用TEMP,会省去很多麻烦 |