西门子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://lf6-cdn-tos.bytescm.com/obj/cdn-static-resource/pgc/v2/pgc_tpl/static/image/commodity_buy_f2b4d1a.png); } 西门子S7-1200/1500 PLC SCL语言编程从入门到精通 ¥69 购买SCL语言完成西门子PLC数据队列的操作,即先入先出
例如:有一个扫码枪,扫码完成后的数据要求存入数组中,而后由其它指令来进行取数据,每次只能取走一个数据,而且要先存的先取走,并且随时可以再存入
1:新建一个FB块,SCL语言写,接口接口如下:
2:程序正文:
REGION 存数据
IF #启动填充 = TRUE AND #INDEX <#count THEN //#启动填充按钮为真时,
#INDEX := #INDEX + 1; //索引加1,索引的初始化值为0,
IF #INDEX <= #count THEN //索引小于等于存入的数组的最大长度
#数据数组[#INDEX] := #填充数据;//把填充的数据存入数组
END_IF;
END_IF;
#启动填充 := FALSE;//#启动填充按钮复位
END_REGION
REGION 取数据
IF #启动取出 = TRUE AND #INDEX >= 1 THEN //#启动取出按钮为真时,
#取出数据 := #数据数组[1]; //把数组的第一个元素取出
FOR #i := 1 TO #count - 1 DO //把数组内的数据向前移动一个位置
#数据数组[#i] := #数据数组[#i + 1];
END_FOR;
#数据数组[#INDEX] := -9999; // 把数组的最后一个元素给-9999,表示说明被取走一个
#INDEX := #INDEX - 1; //取走数据,把索引减1
END_IF;
#启动取出 := FALSE; //#启动取出按钮复位
END_REGION
3:开始写入数据
4:一共存入10个数据
5:开始取数据
6:取完后的数据地址写入-9999,表示数据已被取走
可以写入数据长度为10个,如果想要更长的数组,把count改为更长即可
相关问答
三菱plc编程队列怎么弄?
什么方式排序?如果按照时间先后的话容易,就是先选择的先执行一堆栈形式或者直接用计时器内的数字大小排序,如果按照字母顺序排序plc不太擅长做这个工作,倒是...
台达plc编程队列指令?
MPS为进栈指令,MRD为读栈指令,MPP为出栈指令。PLC中有11个存储运算中间结果的存储器,称之为栈存储器。进栈MPS指令就是将运算中间结果存入栈存储器,使用一...
plc先入先出怎么控制机械?
PLC(可编程逻辑控制器)可以通过先入先出(FIFO)逻辑来控制机械。FIFO是一种常用的队列数据结构,用于按照先进先出的原则处理数据。下面是一个简单的示例,展...
PLC模拟滤波的方法你了解吗?
[回答]7、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场...
PLC模拟滤波的方法你了解吗?
[回答]法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的...7、一...
atch指令是什么?
中断连接指令的操作:中断连接指令(ATCH)使中断事件(EVNT)与中断程序号码(INT)相联系,并启动中断事件。根据指定事件优先级组,PLC按照先来先服务的顺序对中断...
5.5精雕软件win8系统怎么安装-ZOL问答
方法一:购买《plc编程及应用》第四版,机械工业出版社的,随书附带光盘(即s7-200程序)。并且有安装详解。方法二,你下载这个,直接setup.exe就可以了。就是按照...
亮化定时器怎样清零?
要清零亮化定时器,可以执行以下步骤:1.停止定时器:首先,要停止当前正在运行的定时器。可以通过调用停止定时器的函数来实现,具体的函数名称和使用方法可能...
世界前十的开源操作系统?
Tizen,Linux基金会和LiMo基金会,联合英特尔和三星电子,共同开发的开源操作系统,它可以满足物联网设备生态系统(包括设备制造商、手机运营商、应用开发者、独...
跪求解答!!正规的立体仓库出租服务,立体仓库出租性价比高...
[回答]出租的高空车工作高度从10m-36m不等,广范应用于工程建设、厂房施工、厂房维护、市政、电力、路灯、通讯、园林、交通、工矿、工业安装、设备检修、...