技术论坛

在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?

作者 主题

经验值: 600
发帖数: 31
精华帖: 0
主题:【求助】在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 楼主 2019-08-19 15:11:33

下图中的程序是需要调用的一段编写好的子程序。假如此时 I2.1=ON,Q0.2=ON,AQW96=27648,整个程序其他地方没有修改Q0.2与AQW96的地方。如果某一时刻 I2.1=OFF,Q0.2与AQW96的值该如何变化。

因手头上没有PLC所以也没条件自己测试,还望各位老师可以帮我醍醐灌顶。


下图是调用的子程序




 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1579392&b_id=64&s_id=0&num=9

游士

经验值: 224
发帖数: 7
精华帖: 0
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 1楼 2019-08-19 15:38:21

同感于这个问题  我用的315 2PN/DP ,FC函数块的 EN 使能条件断开 ,函数块里面的全局变量任然为1,导致设备撞机了,我想当然的认为一些保持信号会复位的,网上查了下资料,说全局变量保持原来的状态的。数据会是什么样,没试过,我估计也不会清零的。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 2楼 2019-08-19 17:25:30

2.1 OFF的话Q就会保持最后的状态。96可能不然。


另外说一下,我发现你子程序里面的LW6的值有点危险,碍于没知道你全部LW6有关的程序。这里只能说危险。当LW6前面的触点off之后,沿用我上面的话,LW6会保持最后状态。但是这是个out变量,是没有最后状态的,所以这个LW6将会有可能是任何不可控的值。这个与Q稍有不同。同时,AQW96也是一个同理的危险对象。

说来话长,无法醍醐灌顶。当你真的发现有异于你想象的时候,回来聊。

试着再说一句,看你能延伸到哪里去用。

mov指令不执行的时候,输出的值可以是任意值。


 
以下网友喜欢您的帖子:

  

经验值: 600
发帖数: 31
精华帖: 0
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 楼主 3楼 2019-08-19 21:18:14
以下是引用芳季在2019-08-19 17:25:30的发言 >2楼

2.1 OFF的话Q就会保持最后的状态。96可能不然。


另外说一下,我发现你子程序里面的LW6的值有点危险,碍于没知道你全部LW6有关的程序。这里只能说危险。当LW6前面的触点off之后,沿用我上面的话,LW6会保持最后状态。但是这是个out变量,是没有最后状态的,所以这个LW6将会有可能是任何不可控的值。这个与Q稍有不同。同时,AQW96也是一个同理的危险对象。

说来话长,无法醍醐灌顶。当你真的发现有异于你想象的时候,回来聊。

试着再说一句,看你能延伸到哪里去用。

mov指令不执行的时候,输出的值可以是任意值。

这个感觉理解不了,芳季大神的意思是这样的吗:调用子程序(程序1)时,如果突然停止调用,且之后没有调用。当其他子程序(程序2)嵌套了这个没有被调用的子程序(程序1);且把这个子程序(程序1)的OUT变量接口,引用为自身(程序2)的OUT变量类型。则这个程序(程序2)的OUT变量接口输出的值是以子程序(程序1)被停止调用时所保存的接口变量的值作为计算的值。
所以  以上图第一个程序为例:当还有一个相似结构的网络段,但AQW96,变为AQW98,当这个相似的子程序被调用时,AQW98的值会变得不确定。

是不是这么理解的?

还有问题就是为什么不调用子程序时非BOOL变量的值会变得随机呢?



 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 4楼 2019-08-20 07:17:00

好像也不是这个意思。out变量是没有初始值的,就等同一个没有执行的mov指令的输出端一样。你分析这个问题完全可以用mov来等价一个子程序。我又想说那句话了。

而你那Q线圈,子程序里面是由线圈驱动,有确定的值的。mov则无。这是区别。而不是布尔量的区别。


 
以下网友喜欢您的帖子:

  

经验值: 600
发帖数: 31
精华帖: 0
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 楼主 5楼 2019-08-20 11:06:47
以下是引用芳季在2019-08-20 07:17:00的发言 >4楼

好像也不是这个意思。out变量是没有初始值的,就等同一个没有执行的mov指令的输出端一样。你分析这个问题完全可以用mov来等价一个子程序。我又想说那句话了。

而你那Q线圈,子程序里面是由线圈驱动,有确定的值的。mov则无。这是区别。而不是布尔量的区别。

这个概念以后还真得好好去理解下,如果不想在停止调用子程序时出现输出保持、数据危险这样一种情况,有什么好办法可以避免,芳季大师能否指点一二。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 6648
发帖数: 786
精华帖: 9
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 6楼 2019-08-20 11:44:54

需要条件调用的程序,呼之即来,挥之即去




一切皆有可能
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 7楼 2019-08-20 15:17:19
以下是引用Z雨生在2019-08-20 11:06:47的发言 >5楼

这个概念以后还真得好好去理解下,如果不想在停止调用子程序时出现输出保持、数据危险这样一种情况,有什么好办法可以避免,芳季大师能否指点一二。

以下是引用芳季在2019-08-20 07:17:00的发言 >4楼:好像也不是这个意思...

引用4楼详细内容:

好像也不是这个意思。out变量是没有初始值的,就等同一个没有执行的mov指令的输出端一样。你分析这个问题完全可以用mov来等价一个子程序。我又想说那句话了。

而你那Q线圈,子程序里面是由线圈驱动,有确定的值的。mov则无。这是区别。而不是布尔量的区别。

OUT变量是在运行过程中产生结果然后输出,在没有运行的时候,我是指子程序有调用,但是子程序里面的某

movw vw0 lw0-------假设lw0是一个out变量

指令没有执行。那么子程序结束的时候还是要给一个值给out变量交差的。这个时候哪来的值了。这个lw0较早前谁使用过,就留着了那个时候的值了。

如果当前唯有这个子程序使用过lw0,那么就会遗留着子程序上次调用时候的值。感觉好像是值被保留下来了。这就是很多人调用一次子程序可以用,调用两次,第二个就不能用了,的原因。

如果当前有多个其他子程序也使用了这个lw0,那么谁用过它,那就天知道了。所以这个时候感觉这个out变量就乱了。

用in/out变量解决。把保存的责任传到端口外的参数负责。如果这个参数也是一个外层子程序的in/out参数,那么外层就再传到更外层的父级程序负责。就像你这两级调用的情况。直至到外围遇到有全局(或者独享的变量)变量愿意装载这个变量,而不会受到别的影响。

这样,变量才得以保存下来。


 
以下网友喜欢您的帖子:

  

经验值: 600
发帖数: 31
精华帖: 0
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 楼主 8楼 2019-08-20 20:08:51
以下是引用芳季在2019-08-20 15:17:19的发言 >7楼

OUT变量是在运行过程中产生结果然后输出,在没有运行的时候,我是指子程序有调用,但是子程序里面的某

movw vw0 lw0-------假设lw0是一个out变量

指令没有执行。那么子程序结束的时候还是要给一个值给out变量交差的。这个时候哪来的值了。这个lw0较早前谁使用过,就留着了那个时候的值了。

如果当前唯有这个子程序使用过lw0,那么就会遗留着子程序上次调用时候的值。感觉好像是值被保留下来了。这就是很多人调用一次子程序可以用,调用两次,第二个就不能用了,的原因。

如果当前有多个其他子程序也使用了这个lw0,那么谁用过它,那就天知道了。所以这个时候感觉这个out变量就乱了。

用in/out变量解决。把保存的责任传到端口外的参数负责。如果这个参数也是一个外层子程序的in/out参数,那么外层就再传到更外层的父级程序负责。就像你这两级调用的情况。直至到外围遇到有全局(或者独享的变量)变量愿意装载这个变量,而不会受到别的影响。

这样,变量才得以保存下来。

以下是引用Z雨生在2019-08-20 11:06:47的发言 >5楼:这个概念以后还真得...

引用5楼详细内容:

这个概念以后还真得好好去理解下,如果不想在停止调用子程序时出现输出保持、数据危险这样一种情况,有什么好办法可以避免,芳季大师能否指点一二。

以下是引用芳季在2019-08-20 07:17:00的发言 >4楼:好像也不是这个意思...

引用4楼详细内容:

好像也不是这个意思。out变量是没有初始值的,就等同一个没有执行的mov指令的输出端一样。你分析这个问题完全可以用mov来等价一个子程序。我又想说那句话了。

而你那Q线圈,子程序里面是由线圈驱动,有确定的值的。mov则无。这是区别。而不是布尔量的区别。

谢谢 芳季大师 不厌其烦的回答我的问题,早先也看过您不少的帖子和回答,还下载过您的库程序,其中有个“ALT指令”对我理解子程序也有帮助。
只是自己入了这个坑,没办法,总得好好学习,有时间都会默默看看各位大神的帖子,感觉自己和你们的差距很大,有些概念只能是不明觉厉。路还长着呢,哈哈哈。。。。
再次感谢您!


 
以下网友喜欢您的帖子:

  
游侠

经验值: 366
发帖数: 65
精华帖: 0
回复:在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?


只看楼主 9楼 2019-08-30 19:35:48

你的程序我就不看了,从你的文字客观分析,手册上都说的很明白,子程序可以不是每个周期都扫描的,所以在子程序里的定时器时基就不准确了。间接说,只要CPU扫描不到的网段,数据就刷新不了。没有刷新就意味着该保持的保持,值到CPU来改变这种状态。


 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
在子程序调用时,如果突然停止调用,out类型的接口变量的值怎么变化?
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。