在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代码实例

codesys Runtime与操作系统对接 codesys Runtime与操作系统对接 前提条件: 软硬件:装有codesys3.5.16软件及python3.0(python需要将exe路径添加到环境变量)以上版本电脑 一、创建库 1.新建库工程 2.默认库工程介绍,里面文件可以全部删除自定义即可,也可利用标准库结构 3.添加数据结构及实现;若是内部(IEC)实现直接在下面实现即可;外部使用C或者C++实现需要右击选择属性选中“外部实现” 4.双击“工程信息”进行设置 4.1默认信息如下: 4.2库类别路径为安装codesys路径下的 阅读详情
AI摘要

本文详细介绍了队列数据结构的基本概念,包括其FIFO工作原理,以及如何使用C++和Codesys的ST语言实现链表队列,包括push、pop、front、rear等操作。还提供了Codesys中的动态数组和指针使用的实例。

请添加图片描述

一、 队列定义

队列是一种先入先出(FIFO——first in first out)线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
在这里插入图片描述

二、队列实现

实现队列,我们可以使用链表,链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。蓝色箭头显示单个链接列表中的结点是如何组合在一起的
在这里插入图片描述
用链表实现队列相对数组实现队列的优点是能节约空间,没有浪费的空间节点。

三、 队列设计

我们分别采用c++和codesys中st语言进行实现链表队列

(1) C++ 语言实现

功能如下

  • Push(value) : 向队列中插入一个元素,成功返回true
  • pop():从队列中删除一个元素,成功返回true
  • Front():从队列头部获取元素,如果队列是空,返回false
  • Rear():从队列尾部获取元素,如果队列为空,返回false
  • Empty(): 检测队列是否为空,为空返回true
  • Size():获得队列节点个数,返回个数


typedef int DataElement;//用户自定义的数据

typedef struct QueueElement//队列元素
{
    DataElement  mdata;//用户自定义的数据
    QueueElement* next;//指向下一个节点
 }QueueElement;
 
//通过链表实现队列
class ListCircleQueue
{
public:
    ListCircleQueue() {};
    ~ListCircleQueue() {};
private:
    QueueElement* pHead = 0;//
    QueueElement* pTail = 0;//队尾指针
public:
bool push(DataElement _data) 
    {
     // 申请一个结点空间
        QueueElement* pTemp = (QueueElement*)malloc(sizeof(QueueElement));
         pTemp->mdata = _data;// 申请一个结点空间
         pTemp->next = 0;// 结点的next设为NULL
          if (Empty()) // 判断队头和队尾是否为空,用于第一次入队
          {
             pHead = pTemp; // 判断队头和队尾是否为空,用于第一次入队
             pTail = pTemp;
          }
          else
         {
          pTail->next = pTemp;// 让pTemp成为当前尾部的下一结
           pTail = pTemp;// 尾部指针指向pTemp
         }
         return true;
     }
     bool pop() 
    {
        if (Empty())
            return false;
        if (pHead->next == 0)// 判断队列是否就1个,如果只有一个 ,移除后队列为空 
        {
            pHead = 0;
            pTail = 0;  
        }
        else
        {
          QueueElement* pTemp = pHead;
          pHead = pHead->next;//移动头部指针
          delete(pTemp);//清除移除的内存空前
        }
        return true;
    };
     bool Front(DataElement &_data)
     {
       if (pHead != 0)
       {
          _data = pHead->mdata;//返回头部数据
          return true;
       }
       else
         return false;
     }
      bool Rear(DataElement& _data)
      {
        if (pTail != 0)
        {
           _data = pTail->mdata;//返回尾部数据
            return true;
        }
         else
            return false;
      }
     //返回节点个数
     int Size()
     {
         int iSize  = 0;
         QueueElement* pTemp = pHead;
         while (pTemp != 0)
          {
             iSize = iSize + 1;
             pTemp = pTemp->next;
          }
        return iSize;
     }
     //判断队列是否为空
     bool Empty()
     {
       if ((pHead == 0) && (pTail == 0))
          return true;
       else
         return false;
     }
}

示例如下
在这里插入图片描述

(2) Codesys 实现
  • 编程软件: Codesys V3.5 SP17
  • 运行设备:PC电脑
  • 编程语言: ST ST 掌握如何创建动态数组 之New的使用;以及指针的灵活使用

定义结构体

//队列操作的数据
TYPE ListQueueElement :
STRUCT
	mData : BaseElement;
	pNext : POINTER TO ListQueueElement;
END_STRUCT
END_TYPE

其中 BaseElement 是一个别名,其定义如下,这里BaseElement 是用户自定义数据(比如结构体),采用别名是方便替换。

TYPE BaseElement : INT; END_TYPE

定义功能块(FUNCTION_BLOCK): ListQueue,实现如下函数

  • Push(value) : 向队列中插入一个元素,成功返回true
  • pop():从队列中删除一个元素,成功返回true
  • Front():从队列头部获取元素,如果队列是空,返回false
  • Rear():从队列尾部获取元素,如果队列为空,返回false
  • Empty(): 检测队列是否为空,为空返回true
  • Size():获得队列节点个数,返回个数

示例如下

PROGRAM PLC_PRG
VAR	
	t : ListQueue;
END_VAR

VAR
	bInit :BOOL:= FALSE;
	isize : INT;
	ivar1: ARRAY[0..10] OF BaseElement;
END_VAR
IF bInit = FALSE THEN 
	
bInit := TRUE;

t.Push(11);//入队 ,返回TRUE
t.Push(22);//入队 ,返回TRUE
t.Push(33);//入队 ,返回TRUE
isize := t.Size();//返回3
t.Front(_data =>ivar1[0]);//返回11
t.Pop(); //从循环队列中删除一个元素,成功返回true
t.Front(_data =>ivar1[1]);//返回22

END_IF

在这里插入图片描述

四、 Codesys代码下载

请添加图片描述

别再手动管理数据了!用Codesys循环队列FIFO优化你的ST程序(附完整代码) 本文详细介绍了如何使用Codesys循环队列FIFO优化ST程序,提升工业自动化系统中的数据处理效率。通过实战案例和完整代码示例,展示了循环队列在内存管理、性能提升和代码简化方面的显著优势,特别适用于高频数据采集和命令队列等工业场景。 阅读详情

相关推荐

CODESYS开发教程12-任务配置

这是一篇写给新手的关于CODESYS开发环境的小白教程,一看就懂......

halps的专栏 7579

基于Codesys用ST语言实现循环队列FIFO数据结构详细说明+代码实例

队列是一种先入先出(FIFO——first in first out)线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

codesys01的博客 2993

Codesys之ST编程基础-1.初识Codesys与ST

ST(Structured Text)是针对自动化系统的高级文本编程语言。ST使用了高级语言的许多传统特性,包括:变量、操作符和控制流程语句。其语法类似于C语言。C语言是面向过程的编程语言,而ST文本是面向对象的编程语言。

刺客 6279

02 CODESYS应用基础之ST语言语法基础

CODESYS、ST语言

小王的博客 7万+

移位和堆栈指令FIFO在包装物流行业应用(ST代码算法解析)

关于移位指令的应用大家可以参看其它博文:SMART PLC动作流程类控制算法(移位指令应用)_RXXW_Dor的博客-优快云博客非标机器和多工位检测类设备,机构里存在大量流程动作、怎么样去编写方便维护、同一时刻可能会有多工序处于激活状态,单独用有限状态机编程很难完成,本文主要描述思路算法部分,程序部分主要代码会给出梯形图和ST代码 移位指令:移位指令将输入值(IN)的位值右移或左移N位,然后将结果装载到(OUT参数)指定的存储地址单元,大部分移位指令的IN和OUT参数会写同一个存储单元,这样就在一个存储单

RXXW_Dor的博客 1125

大疆 DJI Mobile SDK实战指南——从零构建Android示例开发环境

本文提供了一份详尽的DJI Mobile SDK Android开发环境搭建实战指南。文章手把手教你从注册开发者账号、获取App Key,到配置Android Studio、下载官方示例代码,最终成功运行DJI官方Android示例程序,帮助开发者快速入门无人机应用开发,避开常见编译与依赖问题。

weixin_29188043的博客 275

CodeSys中调用C语言写的动态库

假如我们需要在CodeSys的编程环境中使用我们自己的功能,比如:用第三方的IO板卡通讯、PDF文件生成、相机采集图像并处理等等一些复杂的功能,那就可以使用CodeSys提供的功能,通过C语言动态库接口来实现。这里简单记录一下如何创建能够被CodeSys识别的C语言动态库。有了这个接口,只要我们对OpenCV、相机驱动库等进行封装,然后提供对应的操作函数给接口,就可以实现PLC的视觉检测功能。完美。【CodeSys V3.5创建一个编译库】

joyopirate的博客 1万+

合规批量下载美国上市公司年报数据的一些经验和总结

本文总结了使用Python脚本批量下载和处理美国上市公司SEC报告的技术经验。通过CIK代码查询SEC EDGAR系统,生成特定日期和报告类型的URL,并使用Selenium和Requests库下载报告内容。流程包括数据获取、文件下载、Excel处理和多线程优化,确保高效处理几百条数据。关键技术挑战包括SEC访问限制、动态网页内容和数据完整性,解决方案包括设置合规的User-Agent、使用Selenium模拟浏览器行为以及错误日志记录。最佳实践包括模块化设计、多线程优化和严格遵守SEC合规性。该自动化流程

jyfool的博客 1636

ST语言基于Codesys3.5的线性表结构(ADT)移植

待更新

wkwk7600的博客 2214

ISP——坏点矫正(Defective Pixel Correction,DPC)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、出现原因二、坏点分类三、矫正方法动态矫正1.PINTO算法2.梯度法3.DPC和demosaic结合法4.行检测法 一、出现原因 1.感光元件芯片自身工艺技术瑕疵造成以及长期使用造成的瑕疵; 2.光线采集存在缺陷; 二、坏点分类 1.hot pixel: 固定保持较高的像素值,一般呈现为画面高亮的点; 2.dead pixel: 固定保持较低的像素值,一般在画面中呈现为暗点; 3.noise pixel:信号强度随光照呈现的.

qq_41939460的博客 9422

移远EC20模块USB模式切换的底层逻辑与驱动适配探秘

本文深入探讨了移远EC20模块USB模式切换的底层逻辑与驱动适配机制,详细解析了AT命令控制下的USB0与WWAN0模式差异。通过分析USB协议栈、内核驱动框架及网络子系统的交互,提供了模式切换的完整操作流程和常见问题解决方案,助力开发者优化4G通信模块在嵌入式设备中的稳定连接。

cc789的博客 845

在Codesys用ST语言基于链表实现栈LIFO数据结构详细说明+代码实例

栈是一种后进先出(LIFO——last in first out)线性表,它只允许在表的后端(tail)进行插入(push)和删除(pop)操作。

codesys01的博客 509

智能垃圾桶改造指南:树莓派+垃圾分类模型部署全记录(含数据集获取)

本文提供了一份详尽的智能垃圾桶DIY改造指南,核心是利用树莓派部署轻量化的YOLOv8垃圾分类模型。内容涵盖从数据集获取、模型训练与OpenVINO量化优化,到硬件组装、电路连接及软件集成的全流程,旨在帮助创客和爱好者以低成本实现一个能自动识别垃圾并分类的AIoT原型系统。

k6l7m8n9的博客 509

CodeSys平台ST语言编程

CodeSys是有德国的Smart Software Solution GmbH公司开发的,简称3s公司,⽬前最⾼版本为CodeSys V3.5版本。CoDeSys 包括 PLC 编程、可视化 HMI、安全 PLC、控制器实时核、现场总线及运动控制,是⼀个完整的⾃动化软件。它从架构上基本上可以分为三层,应⽤开发层,通信层和设备层。CodeSys实时核作⽤使⽤CodeSys RTE技术,在windows系统中安装PLC CodeSys软件,使得电脑变成⼀台⾼性能的可编程的控制器。数组是有序。

dream熊的博客 9015

从VBA到Python:探索CODE V API在MTF数据分析中的跨语言实践

本文详细介绍了如何从VBA转向Python,利用CODE V API实现MTF数据分析的高效工作流。通过Python的科学计算库和现代API设计,光学工程师可以大幅提升数据处理和可视化效率,实现自动化报告生成和性能优化。

weixin_29239661的博客 441

YOLO26涨点改进 | 独家创新、损失函数改进篇 | TGRS 2025顶刊 | 带来AIoU小目标涨点损失函数,增强了目标检测中对边界框形状和尺寸的敏感度,适合复杂场景和小物体检测中有效涨点

AIoU损失函数通过自适应形状感知和尺寸敏感加权机制,有效解决了YOLO26原生损失函数在小目标检测中的缺陷。实验结果表明,AIoU损失函数在多个数据集上均取得了显著的性能提升,尤其在小目标检测和多任务场景下表现突出。自适应形状感知,对形状差异较大的目标给予更大惩罚,提高边界框拟合精度尺寸敏感加权,对小目标的宽高比例差异给予更大权重,增强模型对小目标特征的学习能力梯度连续性好,即使在IoU=0时仍能提供有效的梯度更新,解决小目标梯度消失问题。

qq_36130719的博客 159

玩转CODESYS 入门篇(一)-- 认识CODESYS

目前codesys + EtherCAT驱动 做运动控制很有优势。现在总线式运动控制基本都是这种配置。 Codesys 号称PLC界的安卓,国内造PLC的 基本都用Codesys内核了。 如:汇川 ,合信, 和利时,英威腾, 台达。 包括国外的: 倍福TC2 施耐德Somachine 力士乐 等等都是Codesys 直观的讲codesys是一个已经写好了运动控制和通讯的软件PLC。 例如:树苺派刷一个Codesys的Runtime应用就可以用Codesys编程当PLC跑程序了...

木牛的博客 10万+

手把手实现3D肺结节检测:基于Faster R-CNN的从CT处理、训练到部署的五步代码级实战与避坑指南

亲爱的同学,当你能完整实现“3D Faster R-CNN肺部结节检测系统”,你会发现医学影像AI的毕设课题充满挑战与成就感。我们围绕3D Faster R-CNN模型,从数据处理、模型搭建到实验验证,一步步带你打造一个能精准检测肺部结节的智能系统,让你的毕设既体现技术深度,又能为肺部疾病早期诊断贡献实用价值。是专为3D医学影像设计的目标检测模型,能在三维CT数据中自动定位、识别肺部结节——这一课题兼具“临床价值”和“技术挑战性”,是毕设的优质选择,能充分展现你的工程能力和科研敏感度。

LXY_LOVE36的博客 308

Codesys写入CSV的方法(非excel)

前文已经介绍了CODESYS读取CSV数据的方法,能够读取,当然可以写入,本文主要介绍CODESYS将数据写入CSV的方法,其原理先将需要的数据拼接,转换成CSV字符序列需要的字符串,再通过写入指令,将数据写到CSV文件中

qq_19979629的博客 4885

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例

栈是一种后进先出(LIFO——last in first out)线性表,它只允许在表的后端(tail)进行插入(push)和删除(pop)操作。

codesys01的博客 1596

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python进阶2—SQLite数据库技术

SQL(结构化查询语言)是一种通用数据库查询语言。SQL具有数据定义、数据操作和数据控制功能,可以完成数据库的全部工作。SQL语言使用时只需要用告诉计算机“做什么”,而不需要告诉它“怎么做”。SQL语言有两种使用方式,一是直接以命令方式交互使用;二是嵌入到C/C++、Python等主语言中使用。本章我们通过学习Python中的第三方库SQLite来掌握一些SQL的基本语句,以及运用Python来操作数据库的方法。

HkSwaggyD的博客 3620

Codesys数据结构(2):标准数据类型

这里的标准指的是IEC61131-3,也就是说下面的数据类型是Codesys符合这个标准的数据类型,IEC 61131-3是由国际电工委员会所制定IEC 61131标准的第3部分,用于规范可编程逻辑控制器(PLC),DCS,IPC,CNC和SCADA的编程系统的标准,应用IEC 61131-3标准已经成为工业控制领域的趋势。在PLC方面,编辑软件只需符合IEC 61131-3国际标准规范,便可借由符合各项标准的语言架构,进而能建立任何人皆可了解的程序—《百度百科》。

codesys01的博客 7797

c语言codesys编程,CODESYS2.3部分功能块源代码算法移植C源代码共享希...

本帖最后由 jiang887786 于 2015-1-16 11:54 编辑首先,我要说的是我读书少,表达意思不准确如有疑问请在下面的楼层提问。网上我没有搜索到类似的源代码,估计这是第一帖。由于功能块较多我不可能一次性全部发表&说明完整,可能以后我会陆续的发在下面的楼层。此功能块的原作者不知道是谁,呵呵。我只是根据IEC6113-3的标准ST语言改写成C语言。(当然,我不会C++,如果会的...

weixin_42511832的博客 3711

CodeSys通过C函数接口调用Qt

假如想要在函数中使用Qt或者第三方库(比如opencv等),可以在其自动生成的makefile文件中设置好相应的参数。这样操作之后,在include对应的头文件后,就可以在函数中使用opencv、Qt了。,了解如何创建一个能够被codesys调用的动态库。1.将编译器由c改成c++2.使能opencv库。建议先查看之前的文章。

joyopirate的博客 1951

【数据结构】队列的实现

数据结构 队列的实现

m0_59292239的博客 1990

Codesys ST语言实战:用链表手搓一个FIFO队列,告别数组浪费空间

本文详细介绍了如何在Codesys ST语言中使用链表实现高效的FIFO队列,解决传统数组实现中的空间浪费和溢出风险问题。通过动态内存管理和指针操作,实现按需分配和O(1)时间复杂度的入队出队操作,显著提升工业控制场景下的内存利用率。

weixin_28678831的博客 135
上一篇: 在Codesys用ST语言基于链表实现栈LIFO数据结构详细说明+代码实例
下一篇: 基于Codesys用ST语言实现循环队列FIFO数据结构详细说明+代码实例
林磊教育
博客等级 码龄3年 405粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值