许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  CODESYS先入先出FIFO功能块怎么写?思路分享给你

CODESYS先入先出FIFO功能块怎么写?思路分享给你

阅读数 5
点赞 0
article_banner

功能块变量声明

代码块


FUNCTION_BLOCK FIFO
VAR_INPUT
 Enable :BOOL;
 Autounload :BOOL;  //满栈自动移除队列尾部数据,队列头部数据区写入新数据选择开关	
 Load : BOOL;       //入栈
 Unload :  BOOL;    //出栈
 Destroy  :  BOOL;    //销毁队列
 ElementSize  :INT;
 Length :DINT;      //列队数组长度
 LoadValue:   POINTER TO DWORD;    //入栈数据地址(使用ADR获取该数据地址)
 UnloadValue:   POINTER TO DWORD;  //出栈数据地址(使用ADR获取该数据地址)
 FirstElement:  POINTER TO DWORD;  //列队数据首地址(使用ADR获取该数据地址)
END_VAR
VAR_INPUT
  Done:BOOL;         //完成信号
  Full:BOOL;         //满栈
  Empty :BOOL;       //空栈	
END_VAR
VAR
 i,j:      DINT;
 Size:    UDINT;                  //列队数据首地址字节长度  
 Position:INT;   
 DestPointer:  POINTER TO DWORD;  //目标指针
 SourcePointer:  POINTER TO DWORD;//源数据指针
 R_TRIG_Load : Standard.R_TRIG;
 R_TRIG_Unload : Standard.R_TRIG;
END_VAR

      复制成功
     
     
     
     

功能块程序

代码块


R_TRIG_Load(CLK:=Load,);
R_TRIG_Unload (CLK:=Unload,);
ElementSize:= Position;
Size :=  SIZEOF(FirstElement^);
//如果Autounload为TRUE,当满栈时自动将队列尾部数据写入出栈数据区,同时新待入栈数据将写入队列头部数据区
IF Full AND Autounload AND R_TRIG_Load.Q THEN
   SourcePointer := FirstElement + ((Position - 1) * Size);  
   UnloadValue^ := SourcePointer^;
   Position := Position - 1;
END_IF;
//入列
IF R_TRIG_Load.Q AND (Position < Length) THEN
   Done := FALSE;
   FOR i := (Position) TO 1  BY -1 DO
      DestPointer := FirstElement + (i * Size);        
      SourcePointer := FirstElement + ((i-1) * Size);
      DestPointer^ := SourcePointer^;
   END_FOR;
   FirstElement^ := LoadValue^;
   Position := Position + 1;
   Done := TRUE;
END_IF;
//出列
IF R_TRIG_Unload.Q AND (Position > 0) THEN
   Done := FALSE;
   SourcePointer := FirstElement + ((Position - 1) * Size);
   UnloadValue^ := SourcePointer^;
   SourcePointer^ := 0;
   Position := Position - 1;
   Done := TRUE;
END_IF;
//空列队
IF Position = 0 THEN
   Empty := TRUE;
ELSE
   Empty := FALSE;
END_IF;
//列队满
IF Position < Length THEN
   Full := FALSE;
ELSE
   Full := TRUE;
END_IF;	
//销毁队列
IF Destroy AND Position>0 THEN
   Done := FALSE;
   FOR j := 0 TO Length  BY 1 DO
      DestPointer := FirstElement + (j * Size);
      SourcePointer := FirstElement + ((j-1) * Size);
      DestPointer^ :=0;
   END_FOR;	
   Position:=0;
END_IF

      复制成功
     
     
     
     

CODESYS PLC_PRG 变量声明

代码块


PROGRAM PLC_PRG
VAR
 AddElement:  BOOL;         //添加元素
 RemoveElement:  BOOL;      //移出元素
 Autounload :BOOL;         //自动卸载	
 Autounload_HMI :BOOL;         //自动卸载
 Reset_HMI:BOOL;            //销毁队列
 FIFO:  FIFO;               //实例化FIFO功能块
 Value:  DINT;             //入列数据
 Buffer:  ARRAY[0..15] OF DINT; //列队数组
 Unload: DINT;                //出栈数据
 
 FIFO_REAL:  FIFO_REAL;               //实例化FIFO_REAL功能块 
 Value_REAL: REAL;             //入列数据
 Buffer_REAL:  ARRAY[0..15] OF REAL ; //列队数组
 Unload_REAL: REAL;                //出栈数据
END_VAR

      复制成功
     
     
     
     

CODESYS PLC_PRG 程序中FIFO功能块调用

代码块


FIFO(
	Enable:= TRUE, 
	Autounload:= Autounload AND Autounload_HMI , 
	Load:= AddElement OR GVL.Push, 
	Unload:=RemoveElement OR GVL.Pop , 
	Destroy :=GVL.Reset OR Reset_HMI,
	Length:= 16, 
	LoadValue:=ADR(Value) ,      //取待入列数据地址,以便传给功能块内部对应需求指针
	UnloadValue:= ADR(Unload) , 
	FirstElement:=ADR(Buffer[0]), 
	Done:= , 
	Full:= , 
	Empty:= );
	
      复制成功
     
     
     
     



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空