二、步骤
1、明确需求
系统之间对接最重要的是先弄清楚具体需求,MES系统中需要读取到关键流程的开始时间和最终结束时间,我们从灭菌柜PLC中能获取的信息则是这些模式切换的变量状态(开关变量),由此可以明确知道事情可为,关键点就是将两个时间点取到并且存储下来(由于MES从数据库中拉取数据并非瞬间完成的事情,所以在下个流程开始前,我们需要将上个流程的时间点保持下来),故需要创建一些内部时间变量来临时存储取到的时间信息(作为MES取值的中转站)。
2、实现思路
根据需求可以明确需要创建的时间变量,如表1TEND_C01 | 程序结束时间 |
TGZEND_C01 | 干燥结束时间(等于程序结束时间) |
TGZSTAR_C01 | 干燥开始时间 |
time0_C01 | 中间变量 |
time1_C01 | 中间变量 |
TMD_C01 | 脉动开始时间 |
TMJEND_C01 | 灭菌结束时间(等于排气开始时间) |
TMJSTAR_C01 | 灭菌开始时间 |
TSW_C01 | 升温开始时间 |
表1
其中由于灭菌结束信号等于排气开始信号,故采用一个时间来表达即可,干燥结束后意味着程序结束,故同样使用一个变量;
要实现目的的关键还是如何读取状态变化时的系统时间,这里可以直接调用读取系统时间的变量NoW()即可。
考虑到SCADA画面中还要显示出各个流程的状态,此时如果能把不同状态的多个BOOL型变量转换到同一个数值型变量中会不会在做画面的时候更省事些呢?在写脚本的时候可以顺手为之。
3、程序编写
首先是定义变量
Dim A,B,C,D,E,F,G,TM,TD
Dim MD,SW,MJSTAR,MJEND,GZSTAR,GZEND,TEND
'临时变量
Set A = HMIRuntime.Tags("36S_C02F_MD") '脉动阶段,表示设备开机
Set B = HMIRuntime.Tags("36S_C02F_SW") '升温阶段
Set C = HMIRuntime.Tags("36S_C02F_MJ") '灭菌阶段
Set D = HMIRuntime.Tags("36S_C02F_PQ") '排气阶段
Set E = HMIRuntime.Tags("36S_C02F_GZ") '干燥阶段
Set F = HMIRuntime.Tags("36S_C02F_JS") '程序结束阶段
Set G = HMIRuntime.Tags("PROCESS_C01") '每个阶段对应相应的值,脉动1,升温2,灭菌3,排气4,干燥5,程序结束6
Set TM = HMIRuntime.Tags("time0_C01") '中间变量,记录实时时间
Set TD = HMIRuntime.Tags("time1_C01")
Set MD = HMIRuntime.Tags("TMD_C01") '脉动开始时间
Set SW = HMIRuntime.Tags("TSW_C01") '升温开始时间
Set MJSTAR = HMIRuntime.Tags("TMJSTAR_C01") '灭菌开始时间
Set MJEND = HMIRuntime.Tags("TMJEND_C01") '灭菌结束时间,等于排气开始时间
Set GZSTAR = HMIRuntime.Tags("TGZSTAR_C01") '干燥开始时间
Set GZEND = HMIRuntime.Tags("TGZEND_C01") '干燥结束时间,等于程序结束时间
Set TEND = HMIRuntime.Tags("TEND_C01") '程序结束时间
其次是处理数据前要读取系统中的变量
A.Read
B.Read
C.Read
D.Read
E.Read
F.Read
G.Read
MD.Read
SW.Read
MJSTAR.Read
MJEND.Read
GZSTAR.Read
GZEND.Read
TEND.Read
然后则是进行状态判断和赋值
If A.Value Or B.Value Or C.Value Or D.Value Or E.Value Or F.Value Then '不同数值代表不同阶段
G.Value = A.Value * 1 + B.Value * 2 + C.Value * 3 + D.Value * 4 + E.Value * 5 + F.Value * 6
Else
G.Value = 0
End If
G.Write
If A.Value Then
TD = NoW()
MD.Write FormatDatetime(TD)
End If
MD.Read
If B.Value Then
TD = NoW()
SW.Write FormatDatetime(TD)
End If
SW.Read
If C.Value Then
TD = NoW()
MJSTAR.Write FormatDatetime(TD)
End If
MJSTAR.Read
If D.Value Then
TD = NoW()
MJEND.Write FormatDatetime(TD)
End If
MJEND.Read
If E.Value Then
TD = NoW()
GZSTAR.Write FormatDatetime(TD)
End If
GZSTAR.Read
If F.Value Then
TD = NoW()
GZEND.Write FormatDatetime(TD)
TEND.Write FormatDatetime(TD)
End If
GZEND.Read
TEND.Read
此时将表1中的信息反馈给MES工程师即可,当然每当下次流程开始的时候,上一个流程存储的时间信息都会被覆盖掉,想必很少会因为这种情况导致数据丢失。另外MES系统需要的其他参数信息如灭菌温度的变量也要提供出来,这种本身就是从设备中直接采集的数据就无需多说了,MES可以直接从SCADA数据库中进行调用。
三、总结
脚本编写并不复杂,第一次做的时候还在想该怎么用脚本读取系统时间,但后来发现自己是多想了,毕竟有专门可以调用时间的变量。此次操作的重点和比较花时间的还是和MES工程师讨论如何通讯以及需要哪些数据上面。