关键技术: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/W