2016年5月27日

用双指针实现PLC堆栈设计

  
关键技术:PLC 堆栈
关键算法:指针

某基地在设计MES现场调度模块时,架构了一个部署在车间现场的IT PLC,作为MESME 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/WO44个订单的堆栈:
偏移量
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接收新订单WO6WO6写入位置的寻址算法为:
末订单偏移量 = 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

经由上述方法,即在数据块里建立了一个由P1P2这两个指针界定的订单队列,并用HEAD/STEP/P1/P2进行寻址,用QTY判断要不要接收新订单。
可以另外编写两个FC,分别用于实现订单下发和订单接收。
这种方法由于使用指针进行寻址,无需对堆栈进行MOVE操作,因此对CPU扫描周期的影响较小。
但是这种方法的缺点是:当现场出现异常作业时,容易出现指针混乱,从而引发业务数据混乱。应对的方法是:每次作业都和MES进行同步,并且记录日志进行追踪。



2016年5月15日

诗画江南,山水庭院

我的电脑桌面是一张自己拍的照片,从阳台望出去,远处山丘起伏满眼翠绿。朋友们都问我是在哪儿拍的风景,我说这是我家开窗见山所看到的风景,朋友们都羡慕不已。

寓居庭院深深小区已有多年,我也越来越爱这个美丽的家园。虽然每天到滨江上班要开一个小时的车,但是每当晚上回到小区,总是感觉脚步越来越慢,心情越来越放松,感觉只有这里才能让自己真正地平静下来。

作为一个新杭州人,我爱杭州的诗画江南,而庭院就是一个小小的杭州。随意行走,到处都可遇见美丽的风景。

庭院有山。虽然是小小的小山丘,但是错落起伏花繁叶茂,夏夜会偶遇萤火虫,深秋了也有桂香。

庭院有河。小小的桃花河环绕着整个小区,经常有白鹭栖息,幸运的话还能遇见翠鸟。

有时周末闲暇,我会驾车往后面的山里走,开上个四五公里,就进入了中泰的山区,这里到处种满了龙井绿茶,也有水稻小麦,农民家养的鸡鸭山羊在路边慢悠悠地走着。

往另一个方向老余杭开个四五公里,就来到了南湖边。这里有个南湖公园,有大片的草坪可以踢球、放风筝、露营,还划出个专门的区域用来自助烧烤。春天,湖边有大片大片的油菜花。夏天,有不少人围着湖边的水洼钓鱼。冬天,有不少的候鸟在这里过冬,带上望远镜可以远远地观看。

走得更远一些,一两个小时的自驾车范围之内,有临安青山湖、天目峡谷、富阳新沙岛、安吉竹海,都是以山水闻名的休闲好去处。静则观山,动则戏水,随兴所至,都是风景。

每当我从外面的景区回来,回到小区,走到阳台上眺望远处的群山,或者在河边信步行走,我都会觉得依然走在风景里,游在山水间,而庭院,就是我山水之间的美丽家园。



 



 

2016年5月9日

PLC单边通信在MES中的应用


MES现场控制的应用中,出于以下原因,会考虑在生产现场架设IT PLC
1.       通过松耦合的架构,减少对现场实时控制的影响。
2.       把握手和大部分位信号的处理转移到现场控制层,减少OPC的负载。
3.       缓存部分数据在IT PLC,减少对MES服务器实时响应的依赖。
一旦有了IT PLC,就要考虑IT PLCOEM PLC之间的通信。
MES实施的实践中,通常IT系统的规划要晚于OEM控制的规划,同时,IT系统要处理的业务逻辑也仅仅占OEM PLC总业务的10%~20%,因此往往在IT介入的时候,OEM PLC的架构已基本定型,留给IT并没有太多技术选择。
同时,为了减少双方的相互影响,明确界定双方的责任线,往往会要求双方硬件隔离、网络隔离、通信隔离、数据隔离。
比如说,双方会有各自的PLCHMI,实现硬件隔离。
OEM PLC通过CPU PN口组建OEM网络,然后通过CP卡接入IT PLC网络,以实现网络隔离。
要求IT PLC尽可能走单边通信,减少对OEM PLC通信的影响,从而实现通信隔离。
OEM PLC定义专门的数据交换区,用于双方交换数据,从而实现数据隔离。

下面从单边通信需要的角度出发,阐述一下常见的几种IT PLCOEM PLC的通信方式。
方式1:通过Coupler组态通信
IT PLCOEM PLC通过PN/PN Coupler进行组态,通过硬件自动把一方的Input/Output映射成另一方的Output/Input
优点:通过硬件实现,稳定可靠,无须编程。
缺点:需要占用双方的CPU PN口组网,只能通过I/O区域传输数据,数据容量1KB

方式2:通过i-Device组态通信
可以把OEM PLC作为i-Device组态为IT PLCI/O设备,组态后自动把一方的Input/Output区域映射成另一方的Output/Input区域。
优点:通过硬件实现,稳定可靠,无须编程。
缺点:需要占用双方的CPU PN口组网,只能通过I/O区域传输数据,数据容量1KB,必须使用博图V13以上版本进行组态。

方式3:使用Put/Get进行单边通信
启用OEM PLC CPU的保护属性允许来自远程对象的PUT/GET通信访问,这样IT PLC就可以通过PUT/GET指令实现对OEM PLC的远程单向读写,同时,OPC服务器也通过单边通信实现对OEM PLC的远程监控和管理。
优点:单边通信,OEM PLC无须组态、无须编程,可以通过CP卡组网。
缺点:IT PLC需要编程,数据容量较小(300通信160字节,和1500通信880字节)

方式4:双边通信
双方通过工业以太网进行双边通信,协议包括TCP/ISO-ON-TCP/UDP等多种方式,指令也有多种选择。
优点:可以通过CP卡组网,支持工业以太网,数据容量大(USEND/URCV通过PN口可最大发送64KB数据,通过CP卡可最大发送32KB数据)
缺点:需要双方组态,需要双方编程。

下表列出了几种通信方式的比较:
 
通过Coupler组态
通过i-Device组态
Put/Get单边通信
双边通信
网络
ProfiNet
ProfiNet
EtherNet
EtherNet
能否通过CP卡通信
N
N
Y
Y
组态方式
双边
双边
单边
双边
通信协议
N/A
N/A
S7
TCP/ISO/UDP
通信指令
N/A
N/A
Put/Get
BSEND/BRCV
USEND/URCV
TSEND/TRCV
数据区间
I/O
I/O
M/DB
M/DB
是否需要编程
N
N
Y
Y
数据容量
1 KB
1 KB
160 B
32 KB/64 KB