回复:请教大家个短期数据记录显示的问题

已锁定

askab

  • 帖子

    405
  • 精华

    5
  • 被关注

    34

论坛等级:侠圣

注册时间:2005-07-24

黄金 黄金 如何晋级?

发布于 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





















大家同行,you ok ? me !
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54755条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。