一. 先入先出是什么?
以下面的数组为例。
写入值:写入一个新的值11,数据放在【0】位。在写入12,放在【1】位。
读取值:先读取第一个存入的值,也就是11. 随后将12移动到【0】位,依次前移。
二. 程序
1. FB块
// 写/读脉冲 #Rtrig_Write(CLK:=#Write, Q=>#write_p); #Rtrig_Read(CLK:=#Read, Q=>#read_p); // 写入数据。 // 如果数据数小于10 IF #index <= 10 THEN // 错误字 #Error_ID := 16#0000; // 第一次,index=0.将新的值存入arr[0]。 然后index+1=1 // 第二次, index=1.将新的值存入arr[1]。 然后index+1=2 // 一次写请求,index+1.index就是数据的个数 IF #write_p THEN #Arr_Val[#index] := #New_Val; #index := #index + 1; END_IF; ELSE // 数组里的数据大于10,说明数据已经填满。报错误代码16#8001 #Error_ID := 16#8001; END_IF; // 读取数据 // 如果数据大于0(有数据) IF #index > 0 THEN IF #read_p THEN // 将数组里的第一个数据读取出来 #Read_Val := #Arr_Val[0]; // 所有的数据前移一个位 // 假设当前有3个数据,index=3。【【***以此为例***】】 // 现在读了一个数据,还需要移位2次。 FOR #i := 1 TO #index -1 DO // i=1, 数据第1位移动到0位 // i=2, 数据从第2位移动到第1位 #Arr_Val[#i - 1] := #Arr_Val[#i]; END_FOR; // 移位完成后,数组里的第三个位,arr[2]:=0; #Arr_Val[#index - 1] := 0; // index也需要减去1 #index := #index - 1; END_IF; ELSE // 数据为0,空数组 #Error_ID := 16#8002; END_IF;