内容 | 摘要:本文表述了WinCC中实现自动倒班管理及切换的实现方法,可以应用于需要倒班及班报表的WinCC报表系统。关键词:WinCC;报表;倒班;班报表
1 引言
在使用WinCC实现的自定义报表系统中,因为生产管理的需要,报表需要做到按班报表,即班报表。在《锅炉自动抄表系统实现——一种WinCC实现自定义报表的方法》一文中,作者曾经简略提到的实现班组信息管理的方法,即使用WinCC的用户管理器,值班班组在完成交接班时,则用自己班组的账户登录,而值班期间的运行数据连同帐号信息则会被同步存入数据库,在进行报表查询时,以相应的账户名称作为过滤条件,则可以查询得到相应的班组工作报表。
文中介绍的上述思路确实很容易实现,不需要编程工作就可以达到目的。从简单应用来说很实用,但细究下来存在的缺陷也很明显:
(1)过于依赖于人工操作过程。班组在交接班的同时,必须在电脑终端准时进行登录用户的切换。如果一次忙乱疏忽,交班班组未注销,接班班组帐号也未登录,那么就会产生数据记录的混乱,在最终报表中这种混乱也会体现出来。
(2)影响正常的用户权限管理。如果在生产过程中,需要 对不同级别的用户有不同的权限区分,不同用户在登录时需要使用各自的用户帐号,虽然可以每个用户名名称可以用班组名作为前缀表示, 但仍不可避免会带来影响。比如登录帐户切换失败,管理员帐户登录等。
(3)扩展到多台WinCC工作站困难。
(4)拥有报表功能的程序,如果要从单机运行扩展到实现C/S结构及冗余架构的多用户程序时,这种登录用户的标记方式也带来混乱。
针对此问题,本文提出了在WinCC程序中实现自动倒班管理的实现方法。而我们在做工程项目时,是不可能按照一种固定的倒班模式去做编程实现的。首先,你在设计阶段不可能准确了解到工厂的倒班规划,并且一个公司随着运行阶段不同,也有可能对倒班方案及作息时间进行调整。况且,针对每种不同的倒班规划单独做系统设计,除工作量极大以外,可重复利用性也太差。所以我们必须做出一种能够自动适应各种不同倒班规划的自动倒班系统。
分析倒班管理问题,其实包含了两个方面:
(1)作息制度
每天24个小时,分成几个不同的轮值时间段,即平常说的白班、中班、夜班等具体的上下班时间。对于不是24小时满运转的工厂,应该还有停产的时间段,都应该是属于作息制度的范畴。而具体时间段上白班、夜班的称谓也有所不同,主要依循各行业的习惯定义。
(2)倒班计划
视行业不同,劳动强度不同,与每日运转班次数量对应的班组数量为基础,再加上若干个调休班组构成整个值班的班组团队。比如每日三个运转班次,加上两个轮休班次构成五班三运转的体系。然后还根据环境和习惯,约定的每过一定时间段,比如2天到一周,进行一次倒班的轮转。每个班组会有一个固定的代号名称, 如A、B、C、D、E或者中文序列的甲、乙、丙、丁等。
2 WinCC中的实现
首先,在WinCC中进入用户归档,建立名为TimeRule(作息时间表)的归档,并在其中依次建立域Shift(班次号),Name(班次名称),StartTime (上班时间),EndTime(下班时间),其中上班时间与下班时间的格式建立时选择“文本”格式,建立完成后回过来修改为日期/时间格式,如图1所示。因为对归档的访问均将通过数据库手段实现,所以归档的类型选择为无通讯,建立的各个域也不绑定WinCC变量。
图1 WniCC 中用户归档图
这样就建立了作息时间表的空模板,可以在用户归档的模块中,通过修改运行状态数据的方式,将一套真正的时间表输入,也可以在运行中在运行界面上由客户来操作输入和修改,如图2所示。
图2 运行界面
然后同样在用户归档中建立倒班计划的模板:建立名为Rota的归档,名称为“倒班计划”。在归档中依次建立域:ThisDay(日期)以及Shift_1,2,3,4,5,6最多可以容许一天内设置6个值班班次。在正常小于6个班次的情况下,多余的班次作为备用或标注休班班次。而如果特殊场合超过6个,则需要在设计状态修改模板。MARK域为备用,可用于标注备注信息等,程序中无用,如图3所示。
图3 倒班计划模板
倒班计划模板的归档Rota同样不需要WinCC变量接口,类型为“无通讯”由于倒班计划模板中的倒次定义Shift_1等为固定的所以在前面的作息时间表中定义时必须同样的格式。
在WinCC项目中建立一个倒班计划管理的画面,ShiftPlan.pdl,画面中放置两个UA控件,分别指向上述两个归档,作为用户使用期间的接口,可以设计调整作息时间,更重要的是必须定期根据生产的调度安排,将将来一段时期的倒班计划输入到系统中。画面运行以后如图4所示。
图4 倒班计划管理画面
运行中,用户层面需要注意的事项:
(1)班组作息时间表如需改动,需在改动当天完成,当场生效,不能预约。如不能接受改动时刻带来的混乱,应当增加手动倒班的机制,在改动时间表期间关闭自动倒班切换。
(2)时间表中的时间可以有盲区,但不可以有重叠。
(3)如有盲区,即无人值班的状态,如果WinCC在运行中,查询到的当前班次和当值班组都为空,系统中用NN表示。
(4)如需要有重叠,即某个时间段需要有2个班组同时当值,则重叠部分必须切开定义为一个单独的班次,然后在倒班计划中通过定义2个当值班组实现搭接。
(5)由于语法限制,一天中的最晚时间以23:59:59表示。
(6)如班次计划需要跨0点值班,则需要将这两部分班次定义切开为2段,然后在倒班计划表中,相邻的2天中的相应班次中指定同一个当值班组。系统运行中,不会出现班组换班的提示。
(7)倒班计划表中的数据有过期计划与未来计划,可以通过选择框,实现过滤显示。
(8)用户可以手动输入编辑方式输入新的计划安排及删除旧的过期计划。
(9)用户也可以用导入数据的方法,先在EXCEL中建立新的倒班计划表,用CSV文件格式保存,然后导入到WinCC中。具体的数据格式可以先在UA中导出数据,然后按照格式编辑即可。之后,最重要的是脚本编程,用全局脚本或者启动画面的属性中建立循环脚本,每秒执行一次查询,读取当前时间对应的班次,以及当天相应班次所对应的轮值的班组。
本文的实现是在主画面中放置一个空白的子窗口,子窗口中调用画面shiftwork.pdl,而shiftwork画面的显示属性中编制VBS脚本如下:
Function Visible_Trigger(ByVal Item)
On Error Resume Next
'为提前进行自动换班,将表调前15S
Dim S
S=DateAdd("S",15,Now)
Dim T5m
T5m=Split( SQLTimeFormat(S)," ",-1,1)
Dim HH
'每30分钟执行一次值班判断
'HH=Minute(T5m(1))\30
HH=Minute(T5m(1))
HMIRuntime.Trace vbCrLf & "time15s="& T5m(0) & " " & T5m(1)& " HH=" & HH
If HMIRuntime.Tags("HalfHour").read(0) <> HH Then
'
HMIRuntime.Trace vbCrLf & "on 30min"
Dim ShiftName
ShiftName=Split( GetShiftName(T5m(1)),",",-1,1)
Dim Turn
Turn=GetTurn(T5m(0),ShiftName(0))
If Turn<>HMIRuntime.Tags("班次").read(0) Then
HMIRuntime.Tags("班次").Write Turn
MsgBox ("到换班时间了,下一个班次:" & ShiftName(0)&
"/"&ShiftName(1) & vbCrLf & "当值班组为:" & Turn)
End If
' HMIRuntime.Trace vbCrLf & "30min end "
End If
HMIRuntime.Tags("HalfHour").Write HH
End Function
运行思路:
(1)脚本每1S运行一次,每次运行检查当前时间,但为减少系统负担,每30分钟进行班组运行状态查询,其它时候均跳过。
(2)为保证换班时整点时刻记录的报表中班组信息为接班班组,将系统时间加15S,进行查询,即电脑中提前15S提醒换班。
(3)GetShiftName函数得到了当前时间应对应的班次代号和名称,GetTurn函数查询了当前日期指定班次对应的当值班组。如和当前班次变量不同,则说明到了换班时间切换到当值班组,并对话框提示,如图5所示。
图5 换班时间对话框
3 结论
通过UA中的数据库管理功能,实现了倒班管理,并实现自动倒班切换。
本文实现的过程是结合《万泉河WinCC完美报表例程V2.0》的升级过程实现的。对例程感兴趣的读者可以从网络上搜索关键字“万泉河”“WinCC”“完美报表”等搜索到更多信息。
完美报表例程V2的升级内容,除了自动倒班功能之外,还增加了EXCEL格式的导出功能。能够将自定义报表的内容直接输出到EXCEL格式的文件,文件格式用模板已设置好,生成后即可以直接打印。
摘自《自动化博览》2011年第十一期 |