S7-200子程序中使用L区(临时变量/局部变量)编写程序实现电机启保停功能,子程序多次调用时,输出异常

S7-200中编写程序实现电机启动,保持,停止功能
子程序中局部变量中定义:启动和停止为输入类型,电机启动定义为输出类型
子程序中程序仅写了启保停回路
子程序调用多次时,实际上不该启动的电机启动了
问题出在哪儿了?

最佳答案

左共解释的很好了,我这有个补充:
首先大家可以看一个关于S7-200的官方FAQ:
在S7-200的子程序中使用局部变量类型 OUT 和 TEMP 时需要注意什么?
https://support.industry.siemens.com/cs/cn/zh/view/7116338

从中可以得知几个重要信息:
1.
如果使用 LAD 或 FBD 编程,局部存储器的最后四个字节为 STEP 7 Micro/WIN 保留。 
如果在 STEP 7 Micro/WIN 中的同一级嵌套里调用多个子程序,那么这些子程序使用相同的局部存储器。 当使用变量类型 OUT 和 TEMP 时,这些局部地址从相同嵌套级别的前一子程序取值。 
注:那左工描述的“那么当主程序第二次调用该子程序时,开辟临时存储空间,但是此时的存储空间与第一次调用时开辟的不一定一致",其实如果是相同嵌套级别的,那可以确定使用的是同一临时变量区。也就是说如果一个子程序在OB 1 中被调用了多次,那么第一次调用和以后的N次调用占用的都是调用层级1 的L 区。被调用多次子程序其实使用的L 区都是同一个地址区域。临时区存储机制可以参考附件截图。

2.如果不初始化临时变量,相同嵌套级别的上一次被调用的子程序中的值会被保持。这样会导致问题,特别是在边沿信号检测时。 ZHCYS遇到的也是类似的问题。

3.当子程序被调用时,局部数据类型 IN 和 TEMP 不被初始化和删除。 
但是,局部数据类型 IN 和 IN_OUT 在子程序开始调用时被定义为分配的值或全局变量。 
所以使用时把OUT变量声明为IN_OUT会解决类似子程序调用出错的问题。
参考资料:S7-200 系统手册,全球技术资源FAQ

图片说明:

S7-200子程序中使用L区(临时变量/局部变量)编写程序实现电机启保停功能,子程序多次调用时,输出异常  

提问者对于答案的评价:
大家回答的都很好,很受启发!但是只能有一个最佳答案,谢谢@左转和@芳季

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年5月28日 上午12:22
下一篇 2017年5月28日 上午12:22

相关推荐