作者 | 主题 |
---|---|
sangshunyang 侠圣 经验值: 4333 发帖数: 612 精华帖: 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 侠客 经验值: 696 发帖数: 94 精华帖: 0 |
1楼 2020-09-15 12:26:26
主题:回复:S7-1200 SCL 沿指令陷阱 这个坑我也踩过,没有把握的,我一般都先编写一段做个测试,没有问题后面再这么编写 |
RENHQ 至圣 经验值: 70615 发帖数: 12697 精华帖: 60 |
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 侠圣 经验值: 4333 发帖数: 612 精华帖: 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 至圣 经验值: 19057 发帖数: 2487 精华帖: 1 |
4楼 2020-09-16 16:04:39
主题:回复:S7-1200 SCL 沿指令陷阱 不错学习中 |
zhangli0 至圣 经验值: 45460 发帖数: 16391 精华帖: 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 至圣 经验值: 79012 发帖数: 19753 精华帖: 383 |
8楼 2020-09-16 23:11:15
主题:回复:S7-1200 SCL 沿指令陷阱 我觉得楼主的结论很有问题。 SCL本就没有边沿指令,SCL本来就不适合做负载逻辑运算。 逻辑程序全扫描,是PLC编程的一个基本要点,无论编程语言是啥。 编写逻辑程序还是梯形图最强大,SCL应该靠拢梯形图才对呀! 楼主的SCL程序编出问题,据说是梯形图的思路,那梯形图原本就是有问题的。
Zane
注册自动化系统工程师
Always save before download
|