大家都清楚在PCS 7中大多使用CFC编程语言,自己制作一个FB块或FC块应用在CFC中,也仿佛家常便饭,很普通的事儿。这里这个故事就是一个在CFC中使用自定义的FC块时出现的“离奇”现象。
曾经有一个热线客户反映他的CFC程序运行有问题,并反复表述说:“奇怪、奇怪、很奇怪!”。经过简单的对话,我了解到是客户在CFC中调用了一个自定义的FC块,FC块本身没有问题,以前STEP 7梯形图编程时经常这样用,结果这个块在CFC里调用时就出现了不正常的现象——管脚的输出值不正确。客户表示这个FC块很简单,我于是根据他的表述也做了简单的实验,并且在自己的电脑上复现了客户所说的“怪事”。
下面一段简单的FC程序:

这里我简单解释一下这段程序。当M 100.0 = 0时,执行三个赋值操作,给事先定义好的三个输出管脚;当M 100.0 = 1时,不进行赋值操作,也就是保持上次的数据。
看起来,这个程序“似乎”没有任何问题。于是进一步,我在CFC中调用这个块,并进行了在线的测试。结果正如客户所说,很奇怪!
当M 100.0 = 0时,一切都正常,管脚输出也正确。如下图所示。

但当M 100.0 = 1时,管脚输出并没有像预先设计的那样保持输出值,而是出现了一些“随机值”。如下图所示。

于是,我终于明白客户所说的“怪事”就是指的这个现象。
但是,其实这个现象并不是什么“怪事”,事实是由于编程不够严谨所至。
FC块在输出在M 100.0 = 1时,并没有给输出赋值。在STEP 7的梯形图编程时,直接引用绝对地址,当然也不会出现什么问题。在PCS 7的CFC编程时,会将临时变量写入Pool DB中,FC的管脚输出值并不使用绝对地址,而是取自于CFC编译时生成的Pool DB。下图截取了这段程序。

由于当M 100.0 = 1时,示例中的FC不会给临时变量(输出管脚)赋值,而该临时变量在同一OB中很可能参与了其他程序的运算,程序就会将临时变量之前的值写入Pool DB中,就是我们看到的所谓“随机值”,最终导致了CFC程序错误执行的怪现象。
那么,我们如何来解决这个问题呢?
方法很多,最简单的方法是我们可以将其设计为一个FB块(如下图所示)。因为FB块在CFC调用时管脚输出来自于自身的背景DB块,也就是一个绝对地址,这样就能避免上述问题。

在CFC中调用,可以看到FB块的管脚一切“正常”。如下图所示。

其实,理解了CFC的一些原理,怪事也就不是怪事了……
这个故事到这里就告于段落了。更多精彩内容,请您关注西门子热线故事!