发布于 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斑曾经说过,程序全扫描很重要,上面的情况如果程序是全扫描就不会有没问题。当时没有体会,现在真正的感受到了!