技术论坛

 S7-1200 SCL 沿指令陷阱

返回主题列表
作者 主题
sangshunyang
侠圣

经验值: 4092
发帖数: 565
精华帖: 4
楼主    2020-09-15 12:16:26
主题:S7-1200 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;


后改为 :

         "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中使用 沿指令要保证每个周期都会扫描的该指令,在判断语句,或其它包围指令中使用沿指令要格外小心。




mackle
侠客

经验值: 673
发帖数: 94
精华帖: 0
1楼    2020-09-15 12:26:26
主题:回复:S7-1200 SCL 沿指令陷阱

这个坑我也踩过,没有把握的,我一般都先编写一段做个测试,没有问题后面再这么编写

RENHQ
至圣

经验值: 68887
发帖数: 12218
精华帖: 59
2楼    2020-09-15 14:28:44
主题:回复:S7-1200 SCL 沿指令陷阱

感觉有点复杂吧

上升沿产生的条件就是输入是TRUE,你这个感觉这样改就完了

         "R_TRIG_DB"(CLK := "Tag_2",

           Q => "Tag_3"); 

       IF "Tag_3" THEN

            "Tag_4":=TRUE  ;

        END_IF;

没必要再判断Tag_2了啊感觉


另外这个不是陷阱,只是你没理解沿指令的执行逻辑

第一段程序,当tag2第一次来上升沿的时候应该能正确执行,但是后面再来tag3就没有输出了吧,因为你前面加了tag2的判断,沿指令里面记录tag2上一个周期状态的存储区域,复位不了,所以后面tag3就不会有输出了

Q群:https://jq.qq.com/?k=9BDuEgf6
sangshunyang
侠圣

经验值: 4092
发帖数: 565
精华帖: 4
3楼    2020-09-15 19:31:03
主题:回复:S7-1200 SCL 沿指令陷阱

这是一个 顺序控制逻辑中的一部分,原程序是STEP1   STEP2    STEP3 等把每步的控制写在一起,层次感比较清晰,本意是在刚进入步后的一个周期做初始化操作,在该步后面还有许多东西处理,这些逻辑要满足一定的条件才会转向下一步。调试时出现问题,单独按照原程序结构测试沿指令


源程序如下:

    #R_TRIG_开始称重(CLK := #step[3] AND #放料阀关闭到位,

                 Q => #flag[8]);

    #R_TRIG_平台到顶是上升沿(CLK := #上升到位 AND #吹气 = FALSE,

                     Q => #flag[9]);

IF #step[3] THEN

    #放料阀打开 := FALSE;

    #放料阀关闭 := TRUE;

    

    //放料阀关闭到位后把称重插板全部打开

    IF ( #flag[9] OR #flag[18] ) AND #放料阀关闭到位 THEN

        #大插板打开 := TRUE;

        #大插板关闭 := FALSE;

        #中插板打开 := TRUE;

        #中插板关闭 := FALSE;

        #小插板打开 := TRUE;

        #小插板关闭 := FALSE;

        #flag[18] := FALSE;

    END_IF;

    //第一分支  差料特别多的情况下。  

    IF #flag[5] THEN

        IF #当前重量 > #大插板关闭值 THEN

            #大插板打开 := FALSE;

            #大插板关闭 := TRUE;

            #flag[5] := FALSE;

            #flag[10] := TRUE;

        END_IF;

    END_IF;

    

    IF #flag[10] THEN

        IF #当前重量 > #中插板关闭值 THEN

            #中插板打开 := FALSE;

            #中插板关闭 := TRUE;

            #flag[10] := FALSE;

            #flag[11] := TRUE;

        END_IF;

    END_IF;

    

    IF #flag[11] THEN

        IF #当前重量 > #小插板关闭值 THEN

            #小插板打开 := FALSE;

            #小插板关闭 := TRUE;

            #flag[11] := FALSE;

            #step[4] := TRUE;

            #step[3] := FALSE;

        END_IF;

    END_IF;

    //第二分支  差料一包多的情况下。  

    IF #flag[6] THEN

        IF #当前重量 > #大插板关闭值 THEN

            #大插板打开 := FALSE;

            #大插板关闭 := TRUE;

            #flag[6] := FALSE;

            #flag[12] := TRUE;

        END_IF;

    END_IF;

    

    IF #flag[12] THEN

        IF #当前重量 > #中插板关闭值 THEN

            #中插板打开 := FALSE;

            #中插板关闭 := TRUE;

            #flag[12] := FALSE;

            #flag[13] := TRUE;

        END_IF;

    END_IF;

    

    IF #flag[13] THEN

        IF #当前重量 > #小插板关闭值 THEN

            #小插板打开 := FALSE;

            #小插板关闭 := TRUE;

            #flag[13] := FALSE;

            #step[4] := TRUE;

            #step[3] := FALSE;

        END_IF;

    END_IF;

    

    //第三分支  差料特别少的情况下。  

    IF #flag[7] THEN

        IF #当前重量 > #大插板关闭值 THEN

            #大插板打开 := FALSE;

            #大插板关闭 := TRUE;

            #flag[7] := FALSE;

            #flag[14] := TRUE;

        END_IF;

    END_IF;

    

    IF #flag[14] THEN

        IF #当前重量 > #中插板关闭值 THEN

            #中插板打开 := FALSE;

            #中插板关闭 := TRUE;

            #flag[14] := FALSE;

            #flag[15] := TRUE;

        END_IF;

    END_IF;

    

    IF #flag[15] THEN

        IF #当前重量 > #小插板关闭值 THEN

            #小插板打开 := FALSE;

            #小插板关闭 := TRUE;

            #flag[15] := FALSE;

            #step[4] := TRUE;

            #step[3] := FALSE;

        END_IF;

    END_IF;    

END_IF;


黑猫警长W
至圣

经验值: 18377
发帖数: 2409
精华帖: 1
4楼    2020-09-16 16:04:39
主题:回复:S7-1200 SCL 沿指令陷阱

不错学习中

zhangli0
至圣

经验值: 43065
发帖数: 15747
精华帖: 61
6楼    2020-09-16 19:02:10
主题:回复:S7-1200 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;

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

活到老,学到老!为了生活学习吧!
Zane
至圣

经验值: 76200
发帖数: 19331
精华帖: 377
8楼    2020-09-16 23:11:15
主题:回复:S7-1200 SCL 沿指令陷阱

我觉得楼主的结论很有问题。


SCL本就没有边沿指令,SCL本来就不适合做负载逻辑运算。


逻辑程序全扫描,是PLC编程的一个基本要点,无论编程语言是啥。


编写逻辑程序还是梯形图最强大,SCL应该靠拢梯形图才对呀!


楼主的SCL程序编出问题,据说是梯形图的思路,那梯形图原本就是有问题的。

Zane 注册自动化系统工程师 Always save before download
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。