来自西门子技术支持热线的故事:谁动了我的CFC管脚?

已锁定

西门子PA

官方工程师

  • 帖子

    40
  • 精华

    1
  • 被关注

    155

论坛等级:游侠

注册时间:2011-03-30

普通 普通 如何晋级?

来自西门子技术支持热线的故事:谁动了我的CFC管脚?

1906

0

2011-11-30 11:35:24

大家都清楚在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的一些原理,怪事也就不是怪事了……
这个故事到这里就告于段落了。更多精彩内容,请您关注西门子热线故事!
来自西门子技术支持热线的故事:谁动了我的CFC管脚? 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

DCS/SIMATIC PCS7

共有4374条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。