求大神进行程序解读,测试中,上升沿执行正常,下降沿无法执行。实在找不出问题

#Weight_fodder_Present := #Weight_Present_total – #Weight_Wipe;

"R_TRIG_DB"(CLK:="自动投喂标志",
            Q=>#temp_1);
IF #temp_1=1 THEN
    #m := 0;
    #L := #Weight_fodder_Present;
    FOR #i := 0 TO "VARIANT_PROCESS".Feeding_No_total-1 DO
        #n := "VARIANT_PROCESS".Feeding_No_sequence[#i];
        #m := #m + "VARIANT_PROCESS".Weight_Feeding_1to18[#n-1];//将投喂量进行累加
    END_FOR;
    #weight_feeding_Present_total := #m; //当前需要投喂的总重量
    IF #weight_feeding_Present_total > #Weight_fodder_Present THEN//如果缺料就进行报警和缺料处理
        "Control_Status".本次投喂物料不足报警 := 1;
        #weight_Lacking_Present := #weight_feeding_Present_total – #Weight_fodder_Present;
    ELSE                                           
        "Control_Status".本次投喂物料不足报警 := 0;
        #weight_Lacking_Present := 0;
    END_IF;
END_IF;

(*"F_TRIG_DB_1"(CLK:="自动投喂标志",
            Q=>#temp_2);*)

#temp_2:=#last_status_1&(NOT "自动投喂标志" );
#last_status_1 := "自动投喂标志";

IF #temp_2 = 1 THEN
    //投喂完本次后总投喂量的偏差值
    #Weight_total_diffrence := #L – #Weight_fodder_Present – #weight_feeding_Present_total;
    "Control_Status".本次投喂物料不足报警 := 0;
    #weight_Lacking_Present := 0;
END_IF;

//检测开始投喂的上升沿
"R_TRIG_DB_3"(CLK:=#Begin_Feeding_Status,
              Q=>#temp_3);
//检测到开始进行投喂,将当前的重量记忆
IF #temp_3=1 THEN
    #n_weight_feeding_before := #Weight_fodder_Present;
    "Control_Status".Blanking_Close := 0;
    "Control_Status".Blanking_Open := 1;   //自动开启下料标志
END_IF;
//检测开始投喂的下降沿,用于本池号投喂结束的参数处理
(*"F_TRIG_DB_4"(CLK:=#Begin_Feeding_Status,
              Q=>#temp_4);*)

#temp_4 := #last_status_2 & (NOT #Begin_Feeding_Status);
#last_status_2 := #Begin_Feeding_Status;

//本次投喂量的误差数值
IF #temp_4=1 THEN
    #Weight_n_diffrence:= #n_weight_feeding_before-#Weight_fodder_Present-"VARIANT_PROCESS".Weight_Feeding_1to18["VARIANT_PROCESS".Feeding_No_Now-1];
END_IF;
//通过重量控制停止下料
IF #Begin_Feeding_Status=1 THEN
    #a :=#n_weight_feeding_before – #Weight_fodder_Present;//已经下料量
    #n_weight_left := ("VARIANT_PROCESS".Weight_Feeding_1to18["VARIANT_PROCESS".Feeding_No_Now-1] – #a);
    //如果下料超过本次投喂量就关闭下料
    IF #a>=("VARIANT_PROCESS".Weight_Feeding_1to18["VARIANT_PROCESS".Feeding_No_Now-1]-#weight_adjust) THEN
       "Control_Status".Blanking_Open := 0;
        "Control_Status".Blanking_Close := 1;  
        "Control_Status".Fan_Close := 1;    
    END_IF;
    
END_IF;

问题补充:
都用的临时变量,为什么上升沿好使呢?接口图片如下

最佳答案

把接口列出来,看下。
我怀疑是#last_status_1,#last_status_2是临时变量
因为临时变量不能保持,#last_status_1,#last_status_2保存不了上次的状态,把它们替换为外部的M点,或者FB里的静态变量应该就可以了。

补充:
因为你上升沿用的那个变量是先赋值后使用的,是有意义的值。
而你下降沿那一段:
#temp_4 := #last_status_2 & (NOT #Begin_Feeding_Status);
#last_status_2 := #Begin_Feeding_Status;
last_status_2是先使用的,last_status_2如果是静态变量其值是垃圾值,更多的情况直接就是0,所以#last_status_2保存不了#Begin_Feeding_Status的状态。
明白了吗?

提问者对于答案的评价:
非常感谢

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc128151.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年5月29日 下午5:52
下一篇 2017年5月29日 下午5:52

相关推荐