回复:S7-1200 SCL 沿指令陷阱

已锁定

zhangli0

西门子1847工业学习平台

  • 帖子

    17143
  • 精华

    63
  • 被关注

    890

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

发布于 2020-09-16 19:02:10

6楼

展开查看
以下是引用sangshunyang在2020-09-15 12:16:26的发言 >楼主

近期做个项目,程序执行结果和预想的不同,主要是沿指令不按预想的去执行。因此单独把沿指令单独拿出来做个测试,项目用的是这样:


IF "Tag_2"  THEN    

         "R_TRIG_DB"(CLK := "Tag_2",

             Q => "Tag_3");


          IF "Tag_3" THEN

            "Tag_4":=TRUE  ;

        END_IF;

END_IF;


后改为 :

         "R_TRIG_DB"(CLK := "Tag_2",

           Q => "Tag_3");

IF "Tag_2"  THEN    

          IF "Tag_3" THEN

            "Tag_4":=TRUE  ;

        END_IF;

END_IF;

程序的本意是:"Tag_2" 接通的上升沿先做初始化处理,而后再处理其它逻辑,其它逻辑需要多个处理周期。实际上只有“Tag_2"第一次接通时逻辑处理结果正确。后把沿指令提到判断条件前,即判断语句的外面,程序运行正常。

原因分析:沿指令内部保存 CLK端信号的位,在执行该指令时改变。在IF语句中使用时, CLK 信号仅在第一次运行时与沿指令内部保存位不同。以后沿指令内部保存位与 CLK 信号都相同,所以沿指令就不会触发。

总结:

在SCL中使用 沿指令要保证每个周期都会扫描的该指令,在判断语句,或其它包围指令中使用沿指令要格外小心。




IF "Tag_2"  THEN    

         "R_TRIG_DB"(CLK := "Tag_2",

             Q => "Tag_3");


          IF "Tag_3" THEN

            "Tag_4":=TRUE  ;

        END_IF;

END_IF;

tag_2为1执行外上升沿检测的程序,tag2为0,则不检测上升沿程序了,而你的上升沿程序又是用tag_2触发的,那么上升沿程序能够检测到的永远是tag_2为1的状态。tag_3永远不会为1了。

而从你的逻辑中看tag2为1则最终tag_4为为1,tag_2为0,tag_4也没有变化还是为1,所以你的程序直接写成:

 IF "Tag_2" THEN

            "Tag_4":=TRUE  ;

END_IF;

其他的程序都可以直接删除了。

活到老,学到老!为了生活学习吧!
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15113条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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