恭喜,你发布的帖子
发布于 2020-09-16 19:02:10
6楼
近期做个项目,程序执行结果和预想的不同,主要是沿指令不按预想的去执行。因此单独把沿指令单独拿出来做个测试,项目用的是这样:
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;
其他的程序都可以直接删除了。
请填写推广理由:
分享
只看
楼主