近期做个项目,程序执行结果和预想的不同,主要是沿指令不按预想的去执行。因此单独把沿指令单独拿出来做个测试,项目用的是这样:
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中使用 沿指令要保证每个周期都会扫描的该指令,在判断语句,或其它包围指令中使用沿指令要格外小心。