直播课堂
HOME
直播课堂
正文内容
plc编程队列教程 西门子SCL编程实例——队列的实现算法
发布时间 : 2024-11-24
作者 : 小编
访问数量 : 23
扫码分享至微信

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

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

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

其中:

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

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

//初始化

//存储区处理

//数据处理

//输出

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

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

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

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

#pgc-card .pgc-card-href { text-decoration: none; outline: none; display: block; width: 100%; height: 100%; } #pgc-card .pgc-card-href:hover { text-decoration: none; } /*pc 样式*/ .pgc-card { box-sizing: border-box; height: 164px; border: 1px solid #e8e8e8; position: relative; padding: 20px 94px 12px 180px; overflow: hidden; } .pgc-card::after { content: " "; display: block; border-left: 1px solid #e8e8e8; height: 120px; position: absolute; right: 76px; top: 20px; } .pgc-cover { position: absolute; width: 162px; height: 162px; top: 0; left: 0; background-size: cover; } .pgc-content { overflow: hidden; position: relative; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); } .pgc-content-title { font-size: 18px; color: #222; line-height: 1; font-weight: bold; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pgc-content-desc { font-size: 14px; color: #444; overflow: hidden; text-overflow: ellipsis; padding-top: 9px; overflow: hidden; line-height: 1.2em; display: -webkit-inline-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .pgc-content-price { font-size: 22px; color: #f85959; padding-top: 18px; line-height: 1em; } .pgc-card-buy { width: 75px; position: absolute; right: 0; top: 50px; color: #406599; font-size: 14px; text-align: center; } .pgc-buy-text { padding-top: 10px; } .pgc-icon-buy { height: 23px; width: 20px; display: inline-block; background: url(https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/pgc/v2/pgc_tpl/static/image/commodity_buy_f2b4d1a.png); } 西门子S7-1200/1500 PLC SCL语言编程从入门到精通 ¥69 购买

博图基本算法学习--顺序队列的PLC编程实现

一、顺序队列原理

概述:队列也是用于做数据处理,在队列的一端对数据项进行存入操作,称为入队,在队列的另一端对数据项进行取出操作,称之为出队,符合先进先出的特性。

头指针:用于指向队列里第一个元素的位置,也就是下次要出队元素所在的位置。

尾指针:用于指向队列里最后一个元素的后一个位置,也就是下次入队元素要存放的位置。

满队:尾指针已超出队尾位置。

空队:队列里没有元素或者所有元素都被取出。

入队:入队一次,向队列内存入一个元素,同时尾指针后移一个位置。队列处于满队状态时,不能入队。

出队:出队一次,从队列内取出一个元素,同时头指针后移一个位置。队列处于空队状态时,不能出队。

二、顺序队列程序设计

1、入队程序设计

流程设计:

1)检查是否有入队命令

如果有,则接着判断入队条件,即队列是否处于满队状态;

如果没有入队命令,则结束程序。

2)判断队列是否处于满队状态

如果是,则进入入队异常处理;

如果不是,则进入入队操作。

3)入队操作

向队列中存入元素;尾指针后移。

4)入队异常处理

输出故障状态和状态代码。

2、出队程序设计

流程设计:

1)检查是否有出队命令

如果有,则接着判断出队条件,即队列是否处于空队状态;

如果没有出队命令,则结束程序。

2)判断队列是否处于空队状态

如果是,则进入出队异常处理;

如果否,则进入出队操作。

3)出队操作

从队列中取出元素;头指针后移。

4)出队异常处理

输出故障状态和状态代码。

3、复位程序设计

复位功能:当需要清空队列空间,重新使用时,则进行复位操作。

流程设计:

检查是否有复位命令:如果有,复位头指针和尾指针;如果没有,则结束程序。

4、整体程序设计

三、顺序队列程序块与代码

1、程序接口设计

输入:

Push:入队命令,触发入队操作Pop:出队命令,触发出队操作reset:复位命令,触发复位操作

输入输出:

item:入队/出队元素,数据项变量quene:队列空间,采用数组进行存储

输出:

error:故障状态,当入队或出队异常时,error=truestatus:状态代码,当入队或出队异常时,显示相应代码

2、入队程序代码

满队状态判断:

队列数组:ARRAY【0..n】尾指针:i满队状态:i>=n+1

3、出队程序代码

空队状态判断

队列数组:ARRAY【0..n】头指针:i尾指针:j空队状态:i=j

四、改进队列

1、改进队列的原理

顺序队列面临的问题:

基本顺序队列,使用尾指针指向存入元素位置,使用头指针指向取出元素位置。按照队列的先进先出特性,每次元素出队列后,头指针后移,直至头指针=尾指针,表示空队状态。此时,之前的出队元素所占空间虽然被释放,但是空闲的存储空间却无法被继续使用,造成顺序队列的存储空间的浪费。

因而,需要对顺序队列进行改进,保证元素出队操作后,将队列元素整体前移到队头,占用之前移出元素后空闲的空间。这样尾指针也会随之前移,保证队列的使用效率。

因为,每次出队操作后,均将队列元素整体迁移至队头,故而出队的元素始终在队头位置,无需再使用头指针指向取出元素的位置。所以,在改进程序时,只保留一个指针,即尾指针指向存入元素位置即可。

2、出队程序的改进设计

队列元素是连续的区域,对于连续区域的整体移动在PLC程序里可以使用块移动指令,也可以使用循环语句逐个移动元素达到整体移动的目标。

五、总结

相关问答

plc排队程序怎么写?

PLC排队程序的编写需要依据具体的实际应用需求,以下提供一个简单的示例:1.定义变量:定义一个整型数组Queue,用于存储排队顾客的编号,定义一个整型变量Count...

PLC模拟输入滤波的方法有哪些?

[回答]6、限幅平均滤波法A、方法:相当于“限幅滤波法”“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融...

PLC模拟输入滤波的方案你知道吗?

[回答]6、限幅平均滤波法A、方法:相当于“限幅滤波法”“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融...

西门子PLC的ATCH中断指令使用?

中断连接指令(ATCH)将中断事件EVNT与中断程序号INT相关联,并使能该中断事件。在激活一个中断程序前,必须在中断事件和该事件发生时希望执行的那段程序间建立...

PLC软件为什么自己很难下载和安装成功?

一句话来回复都是因为利益,简单一个字-钱!关于安装问题:PLC我以前安装过,都要破解这破解那,要是舍得花钱,都是正版的,哪有这么多事!因为对于每一个用户...上一...

stl基本指令的用途?

STL(StandardTemplateLibrary)是一个包含许多常用实用工具的程序库,用于C++编程语言。它包括了各种容器(例如向量、队列、栈、集合和映射等)以及标准算法...

诸位朋友 有没有谁了解,企业团队建设培训?

[回答]团队建设的核心精神,简单来说就是要有大局意识、服务精神。尊重个人的兴趣和成就。核心是协同合作,最高境界是全体成员的向心力、凝聚力,反映的是个...

emqt16是什么模块?

该模块有16个输出通道,每个通道可以接收24VDC的信号,重量为186克,功耗为1.7W。详细来说,EMQT16是西门子PLC的一种数字量输出模块,用于将PLC接收到的信号输...

STEP7V5.5SP2和Wincc可不可以安装在同一台win764系统下?...

安装的时候不需要设置,等你实际运用了,和PLC连的时候,再选择不同的连接方式有用(0)回复要安装WINCC前,先找到与之对应版本的SQL数据库。一。安装对应版本S...

帮个忙诸位老表,可以推荐一下,东凤机械手无序抓取报价,机...

[回答]通过重写爬虫的调度器,默认的调度器是:scrapy.core.scheduler.Scheduler所有的请求都会进入调度器的queue队列中,如果想让爬虫不间断爬取,就想办法...

 都汶高速车祸  阿甘骑士 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部