用双指针实现PLC堆栈设计

关键技术:PLC 堆栈

关键算法:指针

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

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

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

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

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

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

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

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


偏移量


TAG


TAG长度


备注


0


HEAD


2


订单起始位


2


STEP


2


订单数据长度


4


P1


2


首订单指针


6


P2


2


末订单指针


8


QTY


2


有效订单个数


10


ORDER1


80


订单1


90


ORDER2


80


订单2


170


ORDER3


80


订单3


250


ORDER4


80


订单4

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


偏移量


TAG


TAG长度



备注


0


HEAD


2


10


订单起始位


2


STEP


2


80


订单数据长度


4


P1


2


1


首订单指针


6


P2


2


4


末订单指针


8


QTY


2


4


有效订单个数


10


ORDER1


80


WO1


订单1


90


ORDER2


80


WO2


订单2


170


ORDER3


80


WO3


订单3


250


ORDER4


80


WO4


订单4

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


偏移量


TAG


TAG长度



备注


0


HEAD


2


10


订单起始位


2


STEP


2


80


订单数据长度


4


P1


2


2


首订单指针


6


P2


2


1


末订单指针


8


QTY


2


4


有效订单个数


10


ORDER1


80


WO5


订单4


90


ORDER2


80


WO2


订单1


170


ORDER3


80


WO3


订单2


250


ORDER4


80


WO4


订单3

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

首订单的寻址算法为:

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

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

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


偏移量


TAG


TAG长度



备注


0


HEAD


2


10


订单起始位


2


STEP


2


80


订单数据长度


4


P1


2


3


首订单指针


6


P2


2


1


末订单指针


8


QTY


2


3


有效订单个数


10


ORDER1


80


WO5


订单3


90


ORDER2


80


WO2


已下发订单


170


ORDER3


80


WO3


订单1


250


ORDER4


80


WO4


订单2

下一个订单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,如下表如示:


偏移量


TAG


TAG长度



备注


0


HEAD


2


10


订单起始位


2


STEP


2


80


订单数据长度


4


P1


2


3


首订单指针


6


P2


2


2


末订单指针


8


QTY


2


4


有效订单个数


10


ORDER1


80


WO5


订单3


90


ORDER2


80


WO6


新接收订单,队列位置4


170


ORDER3


80


WO3


订单1


250


ORDER4


80


WO4


订单2

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

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

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

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

时间: 2024-10-12 17:34:01

用双指针实现PLC堆栈设计的相关文章

PLC控制设计的基本步骤

1.对控制系统的控制要进行详细了解 在进行PLC控制设计之前,首先要详细了解其工艺过程和控制要求,应采取什么控制方式,需要哪些输入信号,选用什么输入元件,哪些信号需输出到PLC外部,通过什么元件执行驱动负载:弄清整个工艺过程各个环节的相互联系:了解机械运动部件的驱动方式,是液压.气动还是电动,运动部件与各电气执行元件之间的联系:了解系统的控制方式是全自动还是半自动的,控制过程是连续运行还是单周期运行,是否有手动调整要求,等等.另外,还要注意哪些量需要监控.报警.显示,是否需要故障诊断,需要哪些保

PLC梯形图设计

交通灯控制 在如下图的场景中,打开SW1开关后,交通灯控制器开始工作,关闭SW1则控制器停止工作. SW2为控制模式选择开关: 当SW2为关闭状态时,绿灯.黄灯.红灯依次亮,具体时序为:绿灯亮100秒,闪5秒(每秒亮灭一次),黄灯亮5秒,红灯亮100秒. 当SW2为打开状态后,路口变为夜间模式,一直亮红灯,当有行人按下PB1按钮时,10秒钟后转为绿灯,绿灯持续30秒后继续保持红灯亮. 检验可实现要求功能 输送带控制 输送带场景如下图: 打开SW1开关后,开始供应一个新的工件,工件放置到输送带上后

传感器技术参数专业术语详解-一帆PLC培训

(1)灵敏度:输出增量与所加的负荷增量之比.通常每输入1V电压时额定输出的mV.本公司产品与其它公司产品配套时,其灵敏系数必须一致. (2)滞后:滞后的通俗意思是:逐级施加负荷再依次卸下负荷时,对应每一级负荷,理想情况下应有一样的读数,但事实上下一致,这不一致的程度用滞后误差这一指标来表示.国标中是这样来计算滞后误差的:传感器的滞后误差(H)按下式计算:H=ΔθH/θn×100%.ΔθH--同一试验点上3次行程实际输出信号值的算术平均与3次上行程实际输出信号值的算术平均之间的最大差值(mv).

矿用PLC电网综合保护器专用无线数传电台

引言 对煤矿进行安全.可靠.经济.合理地供电,是保证煤矿安全生产,提高煤矿经济效益的基本条件. 这其中应用于矿井下的电网综合保护器发挥了至关作用,主要保障矿井下供电系统的过流保护,漏电保护,接地保护.一般矿井下的电网综合保护器是由基于PLC来设计的,分为高压端PLC电网综合保护器和低压端的PLC电网综合保护器,高低压端要进行联动通讯,确保整个系统用电安全. 一:矿用PLC电网综合保护器无线传输的应用        传统高压电网综合保护器和低压电网综合保护器之间进行联动通讯是通过RS485有线方式

freeRTOS 笔记

freeRTOS目录结构如下图所示: FreeRTOS | +-- Source  FreeRTOS内核代码文件 |   |+-- include          FreeRTOS内核代码头文件 |   |+-- Portable         处理器特定代码 |   |  |+--Compiler x     支持编译器x的所有移植包 |   |  |+--Compiler y     支持编译器y的所有移植包 |   |  |+--MemMang        内存堆实现范例 每个支持的

ASP.NET Core Security Data Protection

Introduction to Data Protection 数据保护简介 Web应用程序经常需要存储安全敏感数据.Windows为桌面应用程序提供了DPAPI,但是并不适用于Web应用程序.ASP.NET核心数据保护堆栈提供了使用加密API的简易方法,开发者可以用以保护数据,包括密钥管理和交换. ASP.NET核心数据保护堆栈设计用户长期替代ASP.NET 1.x-4.x中的<machineKey>元素.该堆栈设计解决就密码堆栈的很多缺点,同时为现代应用程序可能遇到的大多数案例提供解决方案

毕业设计课题大全

标题: 交换机端口数据流量信息采集方法评述(1人) 目的: 本题目意在通过检索"截获交换机封包"的相关资料,研究对交换机端口流量进行实时监测的手段和方法及实现的原理. 内容:论文要求分析交换机内部封包的交换和计数原理,进而探查如何通过局域网络监测交换机端口的实时流量信息. 参考资料:思科CCNA和CCNP认证教材,及相关参考资料 计算机专业毕业设计题目大全 http://blog.renren.com/share/250527820/12343150865 重点考虑: 5.电子邮件服务

FreeRTOS系列第2篇---FreeRTOS入门指南【转】

转自:http://blog.csdn.net/zhzht19861011/article/details/49819309 版权声明:本文为博主原创文章,未经博主允许不得转载.联系邮箱:[email protected] 目录(?)[-] 查找相关文档页 获取RTOS源代码 FreeRTOS源码目录结构 编译工程 运行演示例程 FreeRTOS可以被移植到很多不同架构的处理器和编译器.每一个RTOS移植都附带一个已经配置好的演示例程,可以方便快速启动开发.更好的是,每个演示例程都附带一个说明网

V 10 glusterfs

glusterfs,GNU cluster file system,创始人Anand Babu Periasamy,目标:代替开源Lustre和商业产品GPFS,glusterfs是什么: cloud storage: 分布式文件系统(POSIX兼容): elasticity(flexibility adapt to growth/reduction,add,delete volumes&users without disruption): 无中心架构(无元数据server),eliminate