Skip to main content


 

引言

在嵌入式系统和 PLC 编程中,数据的管理和处理是至关重要的。循环队列作为一种高效的数据存储结构,能够有效地解决数据流动中的问题。本文将介绍 PLC 功能块FB_CircularQueue,该功能块实现了一个简单而高效的循环队列,支持数据的写入和读取操作,并提供队列状态信息。通过深入分析其代码和应用场景,我们将更好地理解循环队列在工业自动化中的应用价值。


 

1

   

程序代码及介绍

下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):

FUNCTION_BLOCK FB_CircularQueue
VAR_INPUT    
    DataIn : REAL;         // 输入数据    
    WriteCmd : BOOL;       // 写入命令    
    ReadCmd : BOOL;        // 读取命令    
    QueueSize : INT := 10; // 队列大小
END_VAR
VAR_OUTPUT    
    DataOut : REAL;        // 输出数据    
    QueueCount : INT;      // 队列中数据个数    
    QueueFull : BOOL;      // 队列满    
    QueueEmpty : BOOL;     // 队列空
END_VAR
VAR    
    Queue : ARRAY[1..10] OF REAL; // 存储数据的数组    
    WriteIndex : INT := 1;        // 写入指针    
    ReadIndex : INT := 1;         // 读取指针    
    Count : INT := 0;             // 当前队列中数据个数    
    LastWrite : BOOL;             // 上次写入命令状态    
    LastRead : BOOL;              // 上次读取命令状态
END_VAR
// 写入数据
IF WriteCmd AND NOT LastWrite AND NOT QueueFull THEN    
    Queue[WriteIndex] := DataIn;    
    WriteIndex := WriteIndex MOD QueueSize + 1;    
    Count := Count + 1;
END_IF
// 读取数据
IF ReadCmd AND NOT LastRead AND NOT QueueEmpty THEN    
    DataOut := Queue[ReadIndex];    
    ReadIndex := ReadIndex MOD QueueSize + 1;    
    Count := Count - 1;
END_IF
// 更新队列状态
QueueFull := (Count >= QueueSize);
QueueEmpty := (Count <= 0);
QueueCount := Count;
LastWrite := WriteCmd;
LastRead := ReadCmd;

 

2

   

功能解析

输入变量

  • DataIn:输入数据,类型为实数(REAL)。

  • WriteCmd:写入命令,布尔值(BOOL),用于指示是否执行写入操作。

  • ReadCmd:读取命令,布尔值(BOOL),用于指示是否执行读取操作。

  • QueueSize:队列大小,默认为 10,可以根据需要进行调整。

输出变量

  • DataOut:输出数据,类型为实数(REAL),包含从队列中读取的数据。

  • QueueCount:当前队列中数据的个数,类型为整数(INT)。

  • QueueFull:队列是否已满的状态,布尔值(BOOL)。

  • QueueEmpty:队列是否为空的状态,布尔值(BOOL)。

内部变量

  • Queue:用于存储数据的数组,实现循环队列。

  • WriteIndex 和 ReadIndex:分别表示写入和读取的位置。

  • Count:记录队列中当前数据的数量。

  • LastWrite 和 LastRead:用于防止重复的写入和读取操作。


 

3

   

代码逻辑详解

写入数据

  • 当有写入命令且上一次没有写入操作,并且队列未满时,将输入数据存储到当前的写入位置。

  • 更新写入指针WriteIndex,使用取模操作实现循环,以确保指针在队列的范围内。

  • 增加数据计数Count

读取数据

  • 当有读取命令且上一次没有读取操作,并且队列不为空时,从当前的读取位置获取数据。

  • 更新读取指针ReadIndex,同样使用取模操作实现循环。

  • 减少数据计数Count

更新队列状态

  • 根据当前的数据计数更新队列是否满和是否空的状态。


 

4

   

应用场景

功能块具有广泛的应用场景,尤其适合以下几种情况:

数据采集:在实时监控系统中,循环队列可以接收来自传感器或设备的数据流,并保证数据的顺序性和连续性。

信号处理:在控制系统中,循环队列可以用于暂存输入信号,避免在信号处理时出现丢失。

任务调度:在多任务系统中,循环队列可以用于维护待处理任务的列表,确保任务按照先进先出的原则执行。

缓冲区管理:在通信系统中,循环队列可以作为数据缓冲区,有效管理数据的发送与接收。


 

5

   

拓展思考

随着技术的进步和应用场景的不断拓展,循环队列的实现和功能也可以考虑进一步优化:

动态队列大小:允许用户在运行时动态调整队列的大小,而不仅限于固定大小,以适应不同数据流量的需求。

多种读取策略:扩展队列功能,支持不同的读取策略,如随机读取或优先级读取,满足更多复杂应用的需求。

错误处理机制:增加对写入和读取过程中可能出现的错误(如超出范围、空队列读取等)的处理,提高系统的健壮性。

性能优化:在数据量大或者频率高的情况下,优化队列的写入与读取算法,提升响应速度和处理能力。


 

总结

本文详细介绍了 PLC 功能块FB_CircularQueue的设计与实现,分析了其输入输出结构、核心代码逻辑及应用场景。通过有效管理数据的写入和读取,该功能块为工业自动化中的数据处理提供了灵活、可靠的解决方案。随着技术的不断发展,循环队列的应用将会越来越广泛,推动各类系统向更高的效率和智能化发展。

图片

你来出题 我来答图片图片图片

欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。

图片

往期回顾


 

每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比

每周一个编程小例子:记录设备运行时间

每周一个编程小例子:基于长按检测的启动控制系统

每周一个编程小例子:探秘 PLC 数据记录功能块

每周一个编程小例子:心跳检测与 PLC 应用

每周一个编程小例子:斜坡发生器

每周一个编程小例子:旋转速度计算

每周一个编程小例子:计算 PLC 循环周期|例程需求征集!

每周一个编程小例子:如何优雅的分割字符串

每周一个编程小例子:带反馈的阀门控制程序

每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块

每周一个编程小例子:曲线加减速的控制应用

每周一个编程小例子:轻松去除字符串前导字符

每周一个编程小例子:根据阈值更新输入

每周一个编程小例子:官方模拟量输入处理模块

每周一个编程小例子:主从电机的时序控制

每周一个编程小例子:基于一阶滞后滤波的优化方案

每周一个编程小例子:16 进制到浮点数的神奇转换

每周一个编程小例子:PLC 长按控制程序

每周一个编程小例子:PLC 程序实现多位整数拆分

每周一个编程小例子:流量累积计算器

每周一个编程小例子:用于连锁的电机标准控制模块

每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用

每周一个编程小例子:自定义种子生成随机数

每周一个编程小例子:可调时间的脉冲生成器

每周一个编程小例子:带滤波的标准模拟量输入功能块

每周一个编程小例子:使用 PLC 将字符串转换为日期格式

每周一个编程小例子:PLC 配方管理

每周一个编程小例子:比较两个 DB 块(STL)

每周一个编程小例子:如何使用 PLC 实现数组逆序

每周一个编程小例子:流量累计与批次控制

每周一个编程小例子:自定义循环执行控制程序

每周一个编程小例子:步进控制功能块

每周一个编程小例子:PLC 权重比例分配器

每周一个编程小例子:数字量输入组监控

每周一个编程小例子:实时数据分析

每周一个编程小例子:PLC 多轴同步控制的理解与应用

每周一个编程小例子:PLC 波形生成器 (正弦 方波 三角波)

每周一个编程小例子:模拟量信号报警

每周一个编程小例子:组合数概率的实现

每周一个编程小例子:多传感器信号融合与优化方案

每周一个编程小例子:监控模拟信号的健康状态

每周一个编程小例子:PLC 程序实现模拟信号的线性校准

每周一个编程小例子:智能报警过滤器:优化报警系统的 PLC 程序

每周一个编程小例子:使用 PLC 程序让灯光呼吸

每周一个编程小例子:自适应性滤波器:动态调整以平衡响应与稳定性

每周一个编程小例子:卡尔曼滤波器在自动化中的简单应用

每周一个编程小例子:多模式定时器

每周一个编程小例子:基于 PLC 的编码器速度计算器

每周一个编程小例子:电机顺序启动与停止程序

每周一个编程小例子:电梯控制程序

每周一个编程小例子:自动门控制系统

每周一个编程小例子:智能停车场计数系统

每周一个编程小例子:智能照明控制系统

每周一个编程小例子:变频器控制

每周一个编程小例子:比例阀控制

每周一个编程小例子:脉冲输出的灵活控制

每周一个编程小例子:计算移动平均值

每周一个编程小例子:速率限制器

每周一个编程小例子:线性插值法线性化感器

图片

2026年8月