我们可以验证这个结论,即通过修改DB1.DBX2.0的值,可以直接改变输出参数RS_result(M100.2),而不论OB1中是否对RS_result(M100.2)进行了置位操作,如图5所示。
图5
既然我们已经分析出问题出现在FB块上,那么这个问题如何解决呢?
我们知道对于FB功能块,除了IN、OUT类型接口参数,还有一个IN_OUT类型接口参数。对于IN_OUT类型的接口参数,在调用执行时首先将实参读入,然后进行逻辑运算,Zui后再将逻辑运算的结果传递给实参进行输出。可见相对于OUT类型接口参数而言,IN_OUT类型接口参数是要先读入实际参数的值,这样就可以保持上面的逻辑运算结果不会因为FB块的调用执行而被修改。
所以我们可以将FB1作如下修改,如图6所示。
图6 FB1
图7 修改后在OB1中调用FB1
修改程序后进行测试,结果与预想的一致,即可以通过Set_trig(M100.0)、Rset_tri(M100.1)对RS_result(M100.2)进行置位、复位操作,如图8所示
图8
现在我们简单总结一下:FB功能块在调用时,外部实际参数通过输入、输出和输入/输出接口传递给其背景数据块对应的地址。在FB内部,程序直接操作背景数据块地址进行逻辑运算。对于FB功能块的使用我们要特别注意参数传递的规则。这些规则很隐蔽,一般不易引起我们的重视。并且在出现问题时,如果不了解这些规则那就真的是“猜的中开头,猜不中结尾”,出错成为新常态了。