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

栈(Stack)指令——基于汇川AM系列控制器的结构化文本语言编程

上一篇文章介绍了队列指令,其特点是:数据先进先出。今天这篇文章来介绍下栈,其特点是:数据后进先出。

cover.png

启动InoProShop,新建工程,采用AM522-0808TN控制器,名为为“demo”。

选中设备树节点“PLC逻辑”→“应用(Application)”,单击右键,在弹出的菜单中选择“添加对象”→“全局变量列表”,添加全局变量列表“GVL0”,在其中声明变量如下图所示:

1.png

其中:

  • arrStack:实数数组,用于存放栈数据;

  • startPush:布尔型,入栈;

  • pushRisingEdge:布尔型,入栈上升沿;

  • pushRisingEdgeHF:布尔型,入栈上升沿辅助变量;

  • startPop:布尔型,出栈;

  • popRisingEdge:布尔型,出栈上升沿;

  • popRisingEdgeHF:布尔型,出栈上升沿辅助变量;

  • valueOut:实数,出栈的数据;

右键单击“应用(Application)”,在弹出的菜单中选择“添加对象”→“程序组织单元”。在弹出的对话框中选择“功能块”,语言选择“结构化文本”,命名为“stack_test”,在其变量声明区声明变量如下图所示:

2.png

其中:

  • tmpValue:实数,为临时生成的随机数;

  • statStackNum:无符号整数,为静态变量,表示栈中的数据量;

在代码编辑器编写代码如下图所示:

3.png

其中:

  • 为了防止数据被循环写入,使用了沿信号。包括入栈的上升沿和出栈的上升沿;

  • StackPush指令用于将数据写入到栈中,In是要写入的数据,InOut是入栈数据的首地址。例程中arrStack[0]表示从数组的索引0开始写入数据。Size是数据的长度(以字节为单位),Num是栈中的数据数量(可读可写);

  • StackLIFO指令将数据从栈中取出。“LIFO”是英文“Last In First Out”的缩写,表示后进的数据先取出。InOut是出栈数据的首地址,Size是数据长度(以字节为单位),Num是栈中的数据数量(可读可写);

  • 入栈数据的首地址与出栈数据的首地址最好相同。比如例程中都是arrStack[0]。我测试过,如果出栈数据的首地址写作arrStack[1],则第一次出栈的数据为0,第二次才能出栈顶的数据。arrStack[0]中的数据将丢失;

  • 指令列表中还提供了一个类似队列的出栈指令StackFIFO。“FIFO”是英文“Fisrt In First Out”的缩写,表示先进的数据先出。我们一般理解栈这种数据结构的特点是“数据后进先出”,所以一般使用StackLIFO指令;

编写完成后在主程序中调用该函数,测试其功能,可正常实现数据的存入及取出,如下图所示:

4.png

好了,关于汇川AM系列控制器的栈指令就先介绍到这里。

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


取消

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

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

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

发表评论