恭喜,你发布的帖子
发布于 2023-03-30 15:51:39
5楼
谢谢回复
==============================================================
你的要求不就是fifo的功能吗?按照先到先入队列的规则,把托盘信息保存到队列中,那么队列的第一个位置就是先进入炉子的托盘的信息。
(*托盘1*)
"R_TRIG_DB_1"(CLK:="tray_in_1");
IF "R_TRIG_DB_1".Q THEN//把托盘1的数据写道队列中的第一个不为0的位置
FOR #ii := 0 TO 3 DO
IF "burn_FIFO_db".trays_inf[#ii].tray_datas1 <> 0 THEN
"burn_FIFO_db".trays_inf[#ii].tray_datas1 := "tray_in_1_data"; // Statement section IF
EXIT;
END_IF;
// Statement section FOR
;
END_FOR;
// Statement section IF
;
END_IF;
(*托盘2*)
"R_TRIG_DB_2"(CLK:="tray_in_2");
IF "R_TRIG_DB_2".Q THEN//把托盘1的数据写道队列中的第一个不为0的位置
FOR #ii := 0 TO 3 DO
IF "burn_FIFO_db".trays_inf[#ii].tray_datas1 <> 0 THEN
"burn_FIFO_db".trays_inf[#ii].tray_datas1 := "tray_in_2_data";
// Statement section IF
EXIT;
END_IF;
// Statement section FOR
;
END_FOR;
// Statement section IF
;
END_IF;
(*托盘3*)
"R_TRIG_DB_3"(CLK:="tray_in_3");
IF "R_TRIG_DB_3".Q THEN//把托盘1的数据写道队列中的第一个不为0的位置
FOR #ii := 0 TO 3 DO
IF "burn_FIFO_db".trays_inf[#ii].tray_datas1 <> 0 THEN
"burn_FIFO_db".trays_inf[#ii].tray_datas1 := "tray_in_3_data";
// Statement section IF
EXIT;
END_IF;
// Statement section FOR
;
END_FOR;
// Statement section IF
;
END_IF;
(*
先入炉的肯定先出炉,所以有出炉信号,则队列中的数据前移一个地址,最后补0
*)
"R_TRIG_DB_4"(CLK:="tray_out");
IF "R_TRIG_DB_4".Q THEN
FOR #ii := 0 TO 2 DO
"burn_FIFO_db".trays_inf[#ii].tray_datas1 := "burn_FIFO_db".trays_inf[#ii + 1].tray_datas1// Statement section FOR
;
END_FOR;
"burn_FIFO_db".trays_inf[3].tray_datas1 := 0; // Statement section IF
;
END_IF;
不知道这个代码你是否能够读得懂?第一次有了触发信号,则寻找队列中第一个位置为0(没有保存数据的位置),把当前数据保存到当前位置。有了出炉信号,则队列中的数据前移,末尾补0
数据结构和db定义见下图
==============================================================
请填写推广理由:
分享
只看
楼主