您现在所在的是:

PLC论坛

回帖:10个,阅读:1069 [上一页] [1] [2] [下一页]
2289
非烟
文章数:558
年度积分:53
历史总积分:2289
注册时间:2018/3/28
发站内信
发表于:2018/10/30 11:08:18
#0楼
标签:MES、PLC、堆栈、指针


某基地在设计MES现场调度模块时,架构了一个部署在车间现场的IT PLC,作为MES与ME PLC通讯的中间介质,用于处理握手信号并缓存业务数据。

此调度模块要实现以下业务数据的缓存:订单缓存、过站记录缓存、在制品队列缓存。其中订单缓存用于上线,过站记录缓存用于物料拉动,在制品队列缓存用于防错。

缓存的意义是为了防止应用系统环境(应用服务器/数据库/OPC/消息队列服务器)对现场(OEM PLC)作业的影响,毕竟PLC层面的交互要稳定及时得多。

从IT的层面来说,用数据库做队列和堆栈设计是非常容易的,通常通过一个过滤条件再加一个排序条件就可以从数据库中检索数据并加载到内存。

但是用PLC做缓存堆栈会受到诸多限制,尤其是要考虑扫描周期和掉电保持数据容量的影响。

比较方便实现的一个做法是:建立一个数组,按照先进先出的规则对数据进行处理,每次更新数据时对数组里的数据用FOR循环进行MOVE。但是当数据长度较大时(如缓存120个订单),并且数据类型以字符型为主时,这种操作对扫描周期会造成较大影响。


本文描述了另一种建立堆栈的方式:利用双指针构建。

首先我们在DB块里建立如下表所示的堆栈结构:

附件 image.jpg
附件 image.jpg


下表建立了WO1/WO2/WO3/WO4这4个订单的堆栈:

附件 image.jpg
附件 image.jpg

当WO1下发成功后,且又从MES接收到新订单WO5后,可用的订单序列是WO2/WO3/WO4/WO5,堆栈结构如下表所示:

附件 image.jpg
附件 image.jpg

从表格可以看到,首订单指针已经下跳了一格,由1变成2,而末订单指针则由4跳回了1。

首订单的寻址算法为:

首订单偏移量 = HEAD + (P1 - 1) * STEP

代入上表值,即90 = 10 + (2-1) * 80

当WO2下发成功后,将首订单指针指向WO3(P1=P1+1,当P1=5时重置P1=1),并将有效订单个数QTY-1:

附件 image.jpg
附件 image.jpg

下一个订单WO3的寻址算法为:

170 = 10 + (3-1) + 80

堆栈里订单的逻辑序列为:WO3/WO4/WO5

此时订单的有效个数QTY=3,小于最大缓存数量4,因此允许从MES接收新订单WO6,WO6写入位置的寻址算法为:

末订单偏移量 = HEAD + P2 * STEP // P2 < 4



末订单偏移量 = HEAD  // P2 = 4

代入上表值,即90 = 10 + 1*80

写入新订单数据后,将P2下移一位,P2 = P2 + 1,当P2 = 5时,将P2复位成1。

然后将有效订单个数QTY+1,如下表如示:

附件 image.jpg
附件 image.jpg

经由上述方法,即在数据块里建立了一个由P1和P2这两个指针界定的订单队列,并用HEAD/STEP/P1/P2进行寻址,用QTY判断要不要接收新订单。

可以另外编写两个FC,分别用于实现订单下发和订单接收。

这种方法由于使用指针进行寻址,无需对堆栈进行MOVE操作,因此对CPU扫描周期的影响较小。

但是这种方法的缺点是:当现场出现异常作业时,容易出现指针混乱,从而引发业务数据混乱。应对的方法是:每次作业都和MES进行同步,并且记录日志进行追踪。


转帖:用双指针实现PLC堆栈设计
作者tallrain
8377
fujifa
文章数:2941
年度积分:63
历史总积分:8377
注册时间:2014/2/10
发站内信
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
发表于:2018/10/30 13:52:10
#1楼
既然是DB块,那么就是西门子的PLC了。

西门子有直接实现堆栈结构的功能块啊。
附件 image.jpg

HAVE FUN!
此帖发自手机工控论坛
2289
非烟
文章数:558
年度积分:53
历史总积分:2289
注册时间:2018/3/28
发站内信
发表于:2018/10/30 14:04:07
#2楼
这里讲的是另外一种办法,利用双指针构建堆栈。。。。
37891
cvlsam 版主
文章数:12470
年度积分:502
历史总积分:37891
注册时间:2001/12/22
发站内信
2018论坛贡献奖
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011论坛贡献奖
2011国庆活动
2010论坛杰出贡献奖
发表于:2018/10/30 15:12:30
#3楼
以下是引用非烟2018/10/30 14:04:07的发言:
这里讲的是另外一种办法,利用双指针构建堆栈。。。。

堆栈一直是双指针,一个栈顶指针,一个栈底指针表情
12757
蛇会大学
文章数:4693
年度积分:262
历史总积分:12757
注册时间:2015/12/14
发站内信
2018论坛分享达人
发表于:2018/10/30 22:21:23
#4楼
你们说的是什么?是LPS那类指令?
8018
蜀中之首
文章数:5230
年度积分:50
历史总积分:8018
注册时间:2018/5/27
发站内信
发表于:2018/10/31 15:49:25
#5楼
控制好指针就可以了
附件 image.jpg

这是不久前做的一个数据处理,数据由3个字编码,数据指针用D500间接地址控制。
取数区D0
数据被取走,整个数据块前移“一步”
D500-#3,同时判断min=1

新数据进来,放在D500间址
D500+#3,同时判断是否越界,越界标志阻值新数据进来
4980
MIC小赖
文章数:1582
年度积分:62
历史总积分:4980
注册时间:2015/9/16
发站内信
发表于:2018/10/31 21:41:10
#6楼
我记得。。。有很现成的指令的呀
12332
逍遥的久鸣
文章数:4532
年度积分:416
历史总积分:12332
注册时间:2017/3/6
发站内信
2018论坛热心网友
发表于:2018/11/1 12:11:25
#7楼
感觉好复杂,一脸懵逼的感觉!
此帖发自手机工控论坛
4179
fmsh12
文章数:734
年度积分:53
历史总积分:4179
注册时间:2013/6/6
发站内信
发表于:2018/11/2 15:40:29
#8楼
指针是不是用在那种很复杂的程序里,占用内存少
8018
蜀中之首
文章数:5230
年度积分:50
历史总积分:8018
注册时间:2018/5/27
发站内信
发表于:2018/11/2 16:27:22
#9楼
回复 #8楼 fmsh12
不要考虑内存大小,主要是控制线路不能乱
对于堆栈指令不熟悉,可以按实际要求自己编出符合控制要求的程序
我前边说的是比较简单要求的数据处理
前年弄过一个20台PLC数据随机交换,最后方案是将数据区分成二大块,然后是各自的CPU整合数据,有点是程序一致。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

93.6006