北岛夜话
原创工业智能控制领域(PLC、单片机/嵌入式、机器人、通信、机器视觉)的技术及经验分享。
文章478 浏览5397835

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

上一篇文章我们介绍了队列这种数据结构及实现队列的算法。今天这篇文章,我们来介绍下栈(stack)。

cover.png

栈也是一种数据结构,它的特点是数据后入先出(Last In First Out,LIFO)或者说是先入后出,意思是一样的。栈有三个基本动作:初始化、入栈和出栈。接下来给大家介绍下我使用SCL语言编写的栈函数FB5018_Stack_Real,它以不定长数组作为存储区,以实数作为数据类型,实现了栈的初始化、入栈和出栈的操作。

在博途环境下新建函数块FB5018_Stack_Real,声明变量如下:

FB_Variables.png

其中:

  • init:当该参数的值为真时,将栈初始化,内部上升沿信号处理;

  • push:当该参数的值为真时,将数据data入栈,内部上升沿信号处理;

  • pop:当该参数的值为真时,将数据出栈到dataQ,内部上升沿信号处理;

  • data:要入栈的数据;

  • done:操作完成(该信号会保持,当操作出错后会复位);

  • error:操作出错;

  • dataQ:从栈中出来的数据;

  • counter:栈中数据的数量;

  • errCode:错误代码(1=存储区满,3=存储区空);

  • buffer:不定长数组,要操作的数据源;

  • statStackPointer:栈指针(静态变量);

说明:由于初始化、入栈和出栈的动作均采用上升沿信号处理,为了便于观察,每次操作完成后done信号会保持,若操作出错后会复位。

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

//初始化

code_初始化.png

//栈信号判断

code_栈信号.PNG

//数据处理

code_数据处理.png

//输出

code_输出.PNG

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

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

OB1.png

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

取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论

牛年到,祝福到!

祝愿大家在新的一年里,身体健康,工作顺利,财运滚滚,牛年大吉!

×