签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
下图中的程序是需要调用的一段编写好的子程序。假如此时 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
同感于这个问题 我用的315 2PN/DP ,FC函数块的 EN 使能条件断开 ,函数块里面的全局变量任然为1,导致设备撞机了,我想当然的认为一些保持信号会复位的,网上查了下资料,说全局变量保持原来的状态的。数据会是什么样,没试过,我估计也不会清零的。
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变量的值会变得随机呢?
好像也不是这个意思。out变量是没有初始值的,就等同一个没有执行的mov指令的输出端一样。你分析这个问题完全可以用mov来等价一个子程序。我又想说那句话了。
而你那Q线圈,子程序里面是由线圈驱动,有确定的值的。mov则无。这是区别。而不是布尔量的区别。
这个概念以后还真得好好去理解下,如果不想在停止调用子程序时出现输出保持、数据危险这样一种情况,有什么好办法可以避免,芳季大师能否指点一二。
需要条件调用的程序,呼之即来,挥之即去
引用4楼详细内容:
OUT变量是在运行过程中产生结果然后输出,在没有运行的时候,我是指子程序有调用,但是子程序里面的某
movw vw0 lw0-------假设lw0是一个out变量
指令没有执行。那么子程序结束的时候还是要给一个值给out变量交差的。这个时候哪来的值了。这个lw0较早前谁使用过,就留着了那个时候的值了。
如果当前唯有这个子程序使用过lw0,那么就会遗留着子程序上次调用时候的值。感觉好像是值被保留下来了。这就是很多人调用一次子程序可以用,调用两次,第二个就不能用了,的原因。
如果当前有多个其他子程序也使用了这个lw0,那么谁用过它,那就天知道了。所以这个时候感觉这个out变量就乱了。
用in/out变量解决。把保存的责任传到端口外的参数负责。如果这个参数也是一个外层子程序的in/out参数,那么外层就再传到更外层的父级程序负责。就像你这两级调用的情况。直至到外围遇到有全局(或者独享的变量)变量愿意装载这个变量,而不会受到别的影响。
这样,变量才得以保存下来。
引用5楼详细内容:
谢谢 芳季大师 不厌其烦的回答我的问题,早先也看过您不少的帖子和回答,还下载过您的库程序,其中有个“ALT指令”对我理解子程序也有帮助。只是自己入了这个坑,没办法,总得好好学习,有时间都会默默看看各位大神的帖子,感觉自己和你们的差距很大,有些概念只能是不明觉厉。路还长着呢,哈哈哈。。。。再次感谢您!
你的程序我就不看了,从你的文字客观分析,手册上都说的很明白,子程序可以不是每个周期都扫描的,所以在子程序里的定时器时基就不准确了。间接说,只要CPU扫描不到的网段,数据就刷新不了。没有刷新就意味着该保持的保持,值到CPU来改变这种状态。
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录