DB里面的位是什么性质的,DB1.DBX2.0与DB1.DBX2.1是两个独立的位,但是在如下的程序中却一起变化是怎么回事

程序如图所示,当我把db点换成其他的m点、q点时候是不存在这个问题的。只要换成db1里面的位,就会一起变化。是因为DB1里面的位有什么特殊性吗?

图片说明:

DB里面的位是什么性质的,DB1.DBX2.0与DB1.DBX2.1是两个独立的位,但是在如下的程序中却一起变化是怎么回事   

最佳答案

呵呵,你也遇到了我们曾经都遇到的问题。
那么,为什么会遇到这种情况呢?
原因在于:
1.在输出实参为M、I、Q、PQ时,FC输出形参(指针)指向实参实际存储地址,如果在FC中,没有对输出形参形成实质性操作,则形参指针所指向的实际存储区内容不会改变,对于参数传递过程而言,仅仅是调用时形参指向实参,调用结束时形参指针区域释放的一个过程。


 2.在输出实参为DB块时,FC开始调用时,先在V区为该形参分配一个存储区(可能是位,也可能是字节或其它,根据形参参数类型而定),每一次调用FC,根据调用FC时所传递的实参类型不同,为输出形参分配的V区区域可能不同,比如一个FC有一个位输入形参,一个位输出形参,在第一次调用时,实参分别是I0.0,DB0.DBX0.0,则为输出形参分配的V区为V20.1;第二次调用FC,实参分别为DB0.DBX0.1,DB0.DBX0.2,则为输出形参分配的V区为V20.2,原来的V20.1被输入形参所对应的实参DB0.DBX0.1内容所填充。如果第二次调用FC时,实参为M0.1,DB0.DBX0.2,则为输出形参分配的V区仍为V20.1。  其后,FC在实际运行时,针对输出形参(数据块)的处理其实都是在对该V区进行处理,在FC结束调用后,不管在FC中有没有对该V区进行实质性处理,该V区的内容均会被拷贝至另一个存储区,比如L区,该L区与实参区对应,但不在同一区,此时并一直等到本次OB循环结束,该L区内容都不会被拷贝至实参区,所以这个时候实参区的内容还不会有变化。

那么,怎么避免这种情况呢?有2个办法:
1.确保每次调用FC时,初始化所有OUTPUT参数。
2.把输出类型由OUTPUT改为IN/OUT参数。

不知道我说的你能不能理解,详情请参考我在百度文库上的文档。
http://wenku.baidu.com/view/7655e8f9770bf78a65295471.html
参考资料:http://wenku.baidu.com/view/7655e8f9770bf78a65295471.html

提问者对于答案的评价:
我试了一下你的方法确实可以。但是我还是不太明白,形参是一模一样的,指示赋值给实参的时候一个是DB里面的,一个是M点或者Q点。为什么就会不一样呢?如果形参的变化一样的话,不管实参是什么都应该是一样变化的啊。我在你的解释下理解出来的是M点和Q点也应该是那样变化。可是不是的,所以我想问是不是DB里面的和m点和Q点的选址方式不一样呢?

最佳答案作者回复:
是的,正是如此。FC对输出参数的处理方式上,DB和M、Q是不同的。具体可以参考文库文档。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc244172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月1日 下午11:08
下一篇 2018年12月1日 下午11:08

相关推荐