当前位置:网站首页>聊聊队列(FIFO)的应用
聊聊队列(FIFO)的应用
2022-07-22 23:10:00 【51CTO】

JZGKCHINA
工控技术分享平台
尊重原创 勿抄袭
勿私放其他平台
现场的模拟量信号跳动有点大,我想做个平均滤波程序处理一下,如何实现?
用户需要在PLC内记录一些历史数据,方便在触摸屏或SCADA上展示最近一定次数的操作数据,如何做比较简单?
。。。。。。
本文将从FIFO队列聊起,给出笔者在处理上述问题时的方法。其中涉及的算法未必是最简洁的,欢迎大家在评论里互动讨论。本文约1900字,预计阅读时间10分钟。
1. 什么是FIFO队列
FIFO(First Input First Output)队列,即先入先出队列。这种数据处理方式就类似于我们去检测点排队做核酸检测:队伍里第一个到达护士小姐姐那里的居民会是第一个从集中检测点走出来的人,小姐姐每检测完一位,整个队伍里所有的居民就向前挪动一个位置。(一般解释这个都用的是超市排队结账模型)
如果我们规定这个队列最多有N个人,并且有很多的居民正在广场上等着进入这个检测队列,每检测完一人则队伍出去一人并进来一人,则FIFO队列有以下特点:
(1) 队列中始终保持着N个数据元素;
(2) 队列中的数据元素包含最新的数据以及N-1个较老的数据;
利用以上两个特点,我们似乎可以搞点事情。
2. 利用FIFO队列做平均值滤波
回到开篇的第一个问题,我们经常会遇到现场的模拟量输入信号跳动的问题,在做完现场所有的屏蔽、接地、电源滤波、隔离之后,模拟量还是像看了一眼白云的隔壁吴老二一样发抖。

虽然很多PLC和模块都自带了滤波系数调节的功能,但有些时候仍无法满足我们的要求。这时我们就可能会需要自己对输入的模拟量数据进行平均滤波处理。
平均滤波的算法很简单:对过去一定时间的N个采样数据求和,结果除以N。那么过去的N个数据如何获得呢?
a. 最直接的办法:多个MOVE连续操作。在下例中,我们建立了DATA这个DWORD数组,里面包含5个数据,每次Trigger触发后,便把这些数据依次移动,最后把新的数值NEW_DATA赋值给DATA[0]。那么DATA中的5个数据即为最近的5个数据。可是,5个数据这么搞还可以,如果是50个或者500个数据该咋办啊?

上图为HORNER控制器Cscape软件基于变量的梯形图编程模式
b. 最简洁的办法:创建2个数组,首先把当前数组除第N个元素以外的其他元素MOVE到老数组从1到N的位置上,然后再从老的数组中把这N-1个元素放到当前数组的从1到N的位置上,最后把新的数值赋值给当前数组的第0元素。在下例中,我们创建了AI_NOW和AI_OLD这两个各包含10个元素的数组,变量AI为IO采集的模拟量当前值,通过下面的程序,数组AI_NOW中即为我们需要的10个最近的数据。同理,50个或者更多数据也可以按此进行处理。

上图为Emerson Rx3i PLC (原GE) Proficy Machine Edition软件的梯形图编程模式
c. 最省事的办法:很多PLC软件现在都包含类似的功能块,比如下图中的HORNER Cscape软件中的MULTISHIFT功能块,当EN触发一次,会使数组根据DIR代表的不同方向进行左移或右移1个或多个元素的操作。

上图为HORNER控制器Cscape软件IEC梯形图编程模式
注意1:在上述例子中,细心的你可能注意到,笔者采用的变量都是32位的DINT或者DWORD数据类型,但是很多PLC的模拟量输入都是16位INT有符号整型,为啥要把数据都变成32位呢?因为你在后面的累加求和时,16位INT的最大值只能到32767。如果运算过程中超过此值,有的PLC会导致本行程序不再执行,有的PLC会把运算结果只保留16位部分,有的PLC甚至直接会进入STOP状态。
注意2:后续的累加求和比较简单,数据少了直接加,数据多了可以在结构化文本里用For循环或者在梯形图里用指针间接寻址搞定。在累加之前,也可以对数据做一下处理,比如用冒泡法找出最大值和最小值,然后把剩下的数据求和后除以(N-2)。滤波算法各村有各村的高招,有兴趣可以百度一下。

注意3:考虑到PLC首次上电时数组中的数值可能全是0(数组采用非断电保持变量)或者是上次断电时的数值(数组采用断电保持变量),可以在PLC首次上电时用当前采集的模拟量实时值填充到数组内的所有元素中。
3. 利用FIFO队列做历史记录
回到开篇的第二个问题,客户需要我们在PLC内记录最近一定批次的操作或是产品的数据,每条数据包含多个变量,并且要在触摸屏上显示这些数据,如何做可以省点事?
我们假定需要保持最近20条记录,每条记录包含15个数据,那么我们建立了DATA和DATA_OLD这两个包含300个元素的数组,剩下的操作就和上文提到的基本一样了,不再赘述,只不过这里每次我们移动的是连续15个元素的数据。在触摸屏上对这些数据批量排布,就得到了类似下图的展示效果。其中序号01行的数据是从DATA[0]开始的最近一次记录数据,该表格是按时间倒序排列。

上图为AB 1769系列Logix5000软件的梯形图编程模式

上图为Proface触摸屏GP-Pro EX 4.08软件的组态画面
4. 写在最后
a. 笔者在上述例子中使用了多个品牌的软件做演示,主要是为了说明逻辑是相通的,和品牌关系不大。
b. 写这个的原由是因为前些天在三群的讨论中,有朋友问如何在PLC中判断偶数,于是有了如下回答:

我相信这个方法很多朋友都知道或者使用过,但于我而言确是没想到的。上文或有疏漏,惟希望对一些朋友也会有点帮助。
作 者 简 介
张伟宁
就职于浩纳尔(天津)自动化科技有限公司,负责美国HORNER一体化控制产品的应用和支持工作,对HORNER全系产品有深入了解。
边栏推荐
- Send benefits again! Calendar applet source code
- Flynk uses liststate to implement keyedstate
- Go concurrent programming basics: what is context
- Yaml syntax introduction and various data types
- Textview shows endless content implementation -- full display, partial display
- 小红书携手HMS Core,畅玩高清视界,种草美好生活
- 深入浅出地理解STM32中的中断系统——从原理到简单工程示例——保姆级教程
- How to realize synchronized
- Program environment and pretreatment
- Redistemplate pipeline use
猜你喜欢

物联网安装调试员丨让“智慧”生活早日来临

QgrapicsView实现画板

What if Alibaba cloud international forgets its member name or login password?

轻松带你走进turtle绘图的大门

Initializing, cleaning up and const decorating member functions of constructors

Go 并发编程基础:什么是上下文

PIP update a package
![[arxiv2022] grouptransnet: Group transformer Network for RGB - D Salient Object Detection](/img/be/534f92578f0d825f9b565c1785af18.png)
[arxiv2022] grouptransnet: Group transformer Network for RGB - D Salient Object Detection

Get a control width

c语言十进制数转二进制数
随机推荐
What's the use of volatile
Mria + RLOG 新架构下的 EMQX 5.0 如何实现 1 亿 MQTT 连接
appendToFile追加失败
Promise (I)
Go 并发编程基础:什么是上下文
30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验?
Object prototype of typescript object extension__ proto__ And prototype
JS regular delete the span tag and the content in the tag
什么是NFT?你不会还不知道吧!
Swift - red modifier
synchronized是如何實現的
又发福利!日历小程序源码
What level of futures company is founder metaphase? Is the account opening safe and reliable?
编写代码,多个字符从两端移动,向中间汇聚
程序员可能还是程序员,码农可能只能是码农了
深入浅出地理解STM32中的中断系统——从原理到简单工程示例——保姆级教程
flink使用ListState实现KeyedState
容器监控三剑客CAdvisor收集监控数据 + InfluxDB储存数据 + Granfana展示图表数据的简介
Golang中iota的正确用法
Redis 持久化操作 (RDB, AOF)