堆栈介绍

堆栈是一种特殊,仅在表尾或表头进行插入(入栈)或者删除(出栈)操作的线性表
image.png

建立栈区

1、首先建立一个UDT文件,该UDT包含了你堆栈元素里面需要保存的任务数据或者报文
2、创建FB块,建立入栈REQ、出栈REQ、入栈数据、出栈数据等接口
3、在FB的static中创建ARRAY OF”UDT”数组类型的栈区及栈元素读/写指针,这两个建议选择断电保持,如选择了断电保持,那么需注意”UDT”类型的数据长度及栈区的元素总数,以防止CPU存储寄存器不足。

队列介绍

队列一般分为先入先出(FIFO)以及先入后出两种方式,先入先出降维来说就是去奶茶店买奶茶,先排的先买,后排的后买,先入后出则反过来。大多数情况下,我们都以先入先出(FIFO)为主要的队列执行方式

队列方法编写:

1、入队(入栈)

1、首先外部写入入栈数据(数据类型要与栈区数据类型一致)
2、给入栈REQ信号。
3、通过判断入栈数据的可靠性来确认该数据是否能够入栈,如数据来源无问题,则入栈成功,如数据来源错误,则跳转ALARM程序段并退出。
程序如下:
image.png
测试结果如下:
写入一个ID为“AA”的任务并模拟入栈。
入栈完成后,入栈完成BOOL为TRUE,任务总数变为1
image.png
image.png
我们再连续写入3个人任务,分别为“AA”“BB”“CC”,入栈完成后,效果如下
image.png
image.png

2、出队(出栈)

1、首先外部给入出栈REQ(上升沿)。
2、如果当前有任务且出栈接口的数据类型一致,则进行出栈作业(将栈区[1]赋值给出栈数据)。
3、出栈完成后所有栈区内任务左移,如当前栈区无任务,则跳转ALARM程序段并退出。
程序如下:
image.png
测试结果如下:
image.png
image.png
image.png

排序介绍

排序就是将所有栈区内的元素根据某种规则进行排序,例如将10个大小不一的数字替代为10个堆元素,利用这10个数字从大到小或者从小到大的规则进行排序。再将这10个数字替换回10个堆元素。

排序方法编写:

1、我们先在UDT内植入一个数据类型为int、名称为“Priority(优先级)”的变量。该变量的作用就是用来进行排序的判定条件。
2、在外部输入入栈数据时给定该数据的优先级,即赋值给“Priority”。
3、处理完“Priority”的入栈数据再入栈,入栈完成后通过对其他栈区元素的比较进行排序(示例程序默认优先级从小到大排列)。
程序如下:
image.png
测试结果如下:
手动写入7个任务,Priority随机在3-7之间给定,效果如下:
image.png

结论

堆栈排序在无论是对多任务处理层面或者报文交互层面有着极其重要的作用,该方法可以绕过程序扫描规则,来直接对所有任务进行把控,在项目上没有上位只有PLC进行控制的情况下,用堆栈排序会使实用性大大增加。本篇文章也只是基于博途如何实现堆栈排序,对于有上位控制的情况而言,建议只在上位进行任务及报文的处理。(毕竟上位强于任务处理,PLC强于动作控制)

附加

删除元素(指定出栈)

当我们想删掉栈内的某个任务时,我们可以通过录入将要删除的任务ID进行删除元素操作,这个操作可以方便我们管理栈
例如我们以上图中的栈区为例,给定“删除任务ID”-“AA”和“任务删除REQ”,操作完成后,栈区内的“AA”任务将删除且后续任务左移
image.png
image.png