恭喜,你发布的帖子
发布于 2021-07-08 15:04:09
6楼
核心 第一 记录数据的数量 第二 FIFO 还是LIFO 。
FUNCTION_BLOCK FB77
TITLE = 'FIFO'
//
// FIFO 队列功能
//
VERSION: '1.0'
AUTHOR: baikai
NAME: FIFO
FAMILY: use_group
know_how_protect
CONST
load_cout:= 11; //总记录数据量 Z2FN 是要求5个 此处改为6
END_CONST
VAR_INPUT
WriteReq:BOOL; // 写请求
ReadReq :BOOL; // 读请求
New_value:INT:=0; // 需要写入的数据
MODE:BOOL; //= false FIFO = true LIFO
END_VAR
VAR_IN_OUT
Last_WriteReq:BOOL;
Last_ReadReq:BOOL;
END_VAR
VAR_OUTPUT
Index :INT; // 压入数据的个数记录
Read_value:INT:=0; // 读取出来的数据
stop_write:BOOL; // 停止写入
stop_read:BOOL; // 停止读取
END_VAR
VAR
WriteReq_P:BOOL; // 写请求上升沿
ReadReq_P :BOOL; // 读请求上升沿
store:ARRAY[1..load_cout ] OF INT;
num:INT;
END_VAR
//压栈处理
//当堆栈指针<= 数组上限值(本例位10 个数据) ,则在写入数据请求满足是,对数据进行压栈处理.
WriteReq_P:= WriteReq AND NOT Last_WriteReq;
Last_WriteReq:= WriteReq;
IF Index >= load_cout THEN
stop_write:= true;
ELSE
stop_write:= false;
END_IF;
IF NOT stop_write THEN
IF WriteReq_P THEN
store[Index]:= New_value;
Index := Index + 1;
END_IF;
END_IF;
//出栈处理
//在读出数据请求满足是, 判断堆栈指针是否大于数组下限值,
//当大于下限值,对数据进行出栈处理.
ReadReq_P:= ReadReq AND NOT Last_ReadReq;
Last_ReadReq:= ReadReq;
IF Index <= 0 THEN
stop_read:=true;
ELSE
stop_read:=false;
END_IF;
IF NOT stop_read THEN
IF ReadReq_P THEN
IF NOT MODE THEN
Read_value:= store[load_cout-Index]; //FIFO
ELSIF MODE THEN
Read_value:= store[Index]; //LIFO
END_IF;
Index:= Index -1 ;
END_IF;
ELSE
FOR num:= 0 TO load_cout-1 BY 1 DO //当读完数据 后 存储区域清零
store[num]:= 0;
Read_value:= store[num];
END_FOR;
END_IF;
END_FUNCTION_BLOCK
请填写推广理由:
分享
只看
楼主