分享

西门子SCL编程实例——队列的实现算法

 lsgs001 2022-08-24 发布于江苏

队列是一种数据结构,它的特点是数据先入先出(First In First Out,简写为FIFO)。队列在工业现场使用得比较多,很多流水线数据都是采用队列这种数据结构进行处理。队列有三个基本动作:初始化、入队和出队;队列存储区一般采用链表或数组,多数PLC队列的实现都是采用数组(除了支持c语言的PLC外),通常将数组进行处理,使其成为环型存储区,从而方便队列的操作。今天这篇文章,给大家介绍下我使用SCL语言编写的队列函数FB5016_FIFO_Real,它将数组作为环型存储区,以实数作为数据类型,实现了队列的初始化、入队和出队的操作。

文章图片1

在博途环境下新建函数块FB5016_FIFO_Real,变量声明如下图所示:

文章图片2

其中:

  • initData:当该参数的值为真时,将队列初始化。内部上升沿信号处理;
  • putData:当该参数的值为真时,将数据data放入队列。内部上升沿信号处理;
  • getData:当该参数的值为真时,将从队列中取出一个数据。内部上升沿信号处理;
  • data:要入队的数据;
  • done:操作完成(该信号会保持);
  • error:操作出错;
  • dataQ:从队列中出来的数据;
  • counter:队列中数据的数量;
  • errCode:错误代码(1=存储区满,3=存储区空);
  • ringBufffer:使用不定长数组实现的环型存储区(不要在队列初始化完成后更改其上下限值);

由于代码比较长,我将其分区处理,如下面的图片所示:

//初始化

文章图片3

//存储区处理

文章图片4

//数据处理

文章图片5

//输出

文章图片6

在使用前,先进行初始化,然后再进行数据入队/出队的操作。

这个函数块我已经测试过了,如果你有任何问题,欢迎留言。下面是我在OB1中的测试代码,使用之前介绍的随机数生成函数:

文章图片7

与队列对应的另一种常用的数据结构是“栈”,栈的特点是数据先入后出,或者说数据后入先出。我会在后续给大家介绍实现栈的算法。

我的书《西门子S7-1200/1500 PLC SCL语言编程 ——从入门到精通》从硬件到软件,比较详细的介绍了SCL语言的编程,感兴趣的话可以点击下面的链接查看:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多