摘要:本文表述了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年第十一期