回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?

四书五经

  • 帖子

    762
  • 精华

    58
  • 被关注

    30

论坛等级:侠圣

注册时间:2005-12-23

普通 普通 如何晋级?

发布于 2010-05-29 11:49:55

62楼

谈一下我的想法,不对之处希望大家指正!
一年前也遇到过这样的问题,当时的情况是编写了一个控制3UF7的通用功能块,因为3UF7全部挂在342-5上,所以就通过DB块与3UF7进行通讯.
功能块输出参数填的是DB地址,在功能块中用S/R指令对DB地址进行操作.当时的情况是当第一个FC调用有输出的时候,后面的FC调用的输出也会有效,当时可吓了一跳,后面的3UF7相当于都不受控了.后面把S/R指令改S/R触发器,用线圈输出,就没有问题了.
重新考虑这个问题,结合前面的讨论,我觉得FC的参数传递是分情况的.首先,传递给FC的参数不是数据,而是地址.FC里面维护了一系列参数指针,这个指针是区指针,当你的参数是M区、I区,Q区的时候,参数指针直接指向这些区域。当你的参数是常数,带绝对地址的DB寻址,复杂数据类型,ANY数据类型的时候,因为区指针不能指向DB,所以编译器会把这些参数首先复制到V区,然后区域指针再指向V区,这也正好能够理解为什么区域指针里会有V区.
再结合上面遇到的问题,因为输出参数在DB区,相当于输出先输出到V区,然后再输出到实际的DB。而程序中使用的是S/R指令,这样当第一个功能条件满足,执行S/R指令,通过V区最后输出到DB,执行正常。
而后面的FC调用条件并没有满足,S/R并没有执行。但V区的值可能还是以前的值(不确定的值),编译器仍然会在FC的调用以后,把V区的值复制到输出。这样就会出现虽然执行条件并没有满足,当仍然有输出的情况。
记得以前Z斑曾经说过,程序全扫描很重要,上面的情况如果程序是全扫描就不会有没问题。当时没有体会,现在真正的感受到了!
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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