回复:【分享】子程序编写需要注意的一些问题

zwd2800396

  • 帖子

    78
  • 精华

    0
  • 被关注

    38

论坛等级:侠士

注册时间:2016-01-08

普通 普通 如何晋级?

发布于 2016-02-19 15:08:47

12楼

展开查看
以下是引用xsh401在2016-02-18 13:22:35的发言 >11楼

 

为什么将Out变量改为In_Out变量就OK 了,其实这是个非常非常常见的编程错误。

 

解释这个问题的机理,首先得了解S7-200 PLC中的 L 存储区的存储机制,具体可以参考系统手册 图4-3 。

如果一个子程序在OB 1 中被调用了多次,那么第一次调用和以后的N次调用占用的都是调用层级1 的L 区。被调用多次子程序其实使用的L 区都是同一个地址区域。


举一个启保停例子,编写一个SBR 1 用于控制电机启动、保持与停止,该子程序需要被多次调用。子程序如下:

假设这个子程序在OB1 中被调用了多次。第一个调用时,输入信号 start_buttom 为1 ,那么输出 run 为1 ,也就是L0.2 为 1 。

从第二个调用开始,即使输入信号start_buttom 即使为 0 ,但是由于L 0.2 为 1 (第一个调用让其为1 了),那么从第二个调用开始的输出也就同时为1 。


那为什么将 run 改为 inout 就 OK 了那,因为这样修改的话,run 同时也是一个输入信号,子程序被调用时,首先检查输入引脚的逻辑状态。


子程序多次调用有很多限制条件,注意一下可以避免很多调试时想不到的问题:


1、使用到的 L 变量,一定是先赋值再使用。

2、P , N 等沿指令不能使用

3、定时器、计数器不能使用

4、有些指令库,如果需要分配存储区的,也不能同时使用

5、置位,复位指令的使用要注意,也应把相应的引脚改为inout


11楼写的非常好,我第1次使用200smart时就犯了这种错误。在现场调试时出现各种问题。

有志者事竟成
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有9142条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。