#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