WinCC批次設計-基於用戶歸檔


 什么是批次

   葯品是一批一批的生產,批次用於區分葯品的不同生產批。一個生產批次包括以下信息:批次名、產品名、產品規格、所使用的配方、其他設定參數以及批次的開始時間和結束時間,另外還有生產過程中記錄的數據。

  以上數據並不全部存儲在一起,而是在數據庫中分成多個表存儲。大致會分為配方、過程數據、批次、事件這樣幾個表。配方是某一種類型產品的生產參數,過程數據記錄生產過程中實時的數據,批次表記錄批次相關的信息以及未包括在配方中的設定參數,而批次的開始時間和結束時間記錄在事件表中。事件表是以時間為序的一個序列,通過查詢這個序列可以得到批次的開始時間和結束時間。

 

如何記錄一個批次

基於以下設計的批次存儲於用戶歸檔。用戶歸檔的本質是一個數據庫。批次表的定義如下:

Batch
字段 類型 描述
BatchName 字符串 批次名
BatchType 數字(整型) 批次類型
ProductName 字符串 產品名
ProductType 字符串 產品規格
RecipeID 字符串 配方ID
parameter1   參數1
parameter2   參數2
parameterN   參數N

向用戶歸檔中添加數據需通過參數變量和控制變量。如果一個WinCC程序中管理了多台設備,則每台設備對應的變量名要加上設備前綴,這里用“XX_”代替。批次的用戶歸檔中參數變量如下,除了XX_RecipeID和XX_BatchType外都是外部變量:

Batch用戶歸檔參數變量
變量名 類型 描述
XX_BatchName 文本變量8位字符集 批次名
XX_BatchType 無符號的8位值 批次類型
XX_ProductName 文本變量8位字符集 產品名稱
XX_ProductType 文本變量8位字符集 產品規格
XX_RecipeID 文本變量8位字符集 配方ID
XX_parameter1   非配方生產參數,這里用parameter指代,實際按需命名。
XX_parameter2   非配方生產參數,這里用parameter指代,實際按需命名。
XX_parameterN   非配方生產參數,這里用parameter指代,實際按需命名。

批次的用戶歸檔中控制變量如下:

Batch用戶歸檔控制變量
變量名 類型
XX_UA_Batch_ID 有符號的32位值
XX_UA_Batch_Job 有符號的32位值
XX_UA_Batch_Field 文本變量8位字符集
XX_UA_Batch_Value 文本變量8位字符集

關於如何使用控制變量操作用戶歸檔,以及封裝的操作函數,詳見《WinCC配方設計-基於用戶歸檔》中的“如何用控制變量操作用戶歸檔”,這里不再介紹。

批次表中帶有一些參數的記錄,這些參數可能是批次開始前的設置值,例如設定產量、生產速度,也可能是批次結束時記錄的生產結果,例如實際產量、不合格數。實際操作過程中,可能先輸入批次,再設定參數和配方,起初記錄的批次可能只有批次名,其他字段的數據都是空值,所以在批次生產結束時,需要再更新一次批次表中的記錄,以記錄最終的生產結果。

批次表中不能出現兩個重復的批次,記錄批次前要用SQL查詢是否已存在同名批次,不存在則新建記錄,否則更新同名的批次。記錄批次函數的代碼如下:

Function RecordBatch(prefix, DSN)
    dim BatchName
    BatchName = HMIRuntime.Tags(prefix& "BatchName").Read

    if Trim(BatchName) = "" then '如果批次名為空,則不記錄批次
        RecordBatch = -1
        Exit Function
    end if 

    Dim cnn, rs, SQL
    Set cnn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    '檢查是否存在同名批次
    SQL = "select BatchName from "& DSN &" where BatchName = '" & BatchName & "' "
    ConnectDatabase cnn,rs,SQL
    If rs.recordcount>0 Then
        RecordBatch = Update_UA(prefix& "UA_Batch", "BatchName", BatchName)
    else
        RecordBatch = Insert_UA(prefix& "UA_Batch")
    end if
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
End Function

  

如何記錄一個事件

事件數據庫也基於用戶歸檔存儲。事件表定義如下:

Event
字段 類型 描述
EventTime 時間日期 時間戳
BatchName 字符串 批次名
BatchType 數字(整型) 批次類型
EventMsg 字符串 事件消息
StartLogFlag 數字(整型) 開始記錄標志
UserName 字符串 登錄用戶
HMIUserName 字符串 設備登錄用戶
ProductionState 數字(整型) 生產狀態

向事件數據庫寫入數據需要通過參數變量和控制變量進行。每台設備要有如下一組對應Event用戶歸檔的變量,如果一個WinCC程序中管理了多台設備,則每台設備對應的變量名要加上設備前綴,這里用“XX_”代替。

有些變量建立在WinCC內部,在變量作用域中標為“內部”,有些變量來自PLC,在變量作用域中標為“外部”。

Event用戶歸檔參數變量
變量名 類型 描述 變量作用域
XX_EventTime  日期/時間  觸發事件時將用腳本寫入當前的時間戳。 內部
XX_BatchName 文本變量8位字符集 批次名,與批次表共用外部變量。 外部
XX_BatchType 無符號的8位值  批次類型,與批次表共用變量。 外部或內部
XX_EventMsg  文本變量8位字符集 事件消息  內部
XX_StartLogFlag  二進制變量  開始記錄標志 外部或內部
@CurrentUserName  文本變量16位字符集 當前WinCC登錄的用戶名,系統中自帶,不需建立,也不需要前綴。  內部
XX_HMICurrentUser 文本變量16為字符集 設備上觸摸屏上登錄的用戶。 外部
XX_ProductionState 無符號的8位值  設備的生產狀態。 外部

操作用戶歸檔還需要一組控制變量控制變量如下:

Event用戶歸檔控制變量
變量名 類型
XX_UA_Event_ID 有符號的32位值
XX_UA_Event_Job 有符號的32位值
XX_UA_Event_Field 文本變量8位字符集
XX_UA_Event_Value 文本變量8位字符集

使用用戶歸檔操作函數,定義記錄事件函數,代碼如下:

Function RecordEvent(prefix, eventMsg)
	dim SWDT, utcTime
	Set SWDT = CreateObject("WbemScripting.SWbemDateTime")
	SWDT.SetVarDate Now, True
	utcTime = SWDT.GetVarDate (False)
	HMIRuntime.Tags(prefix& "EventTime").Write utcTime
	HMIRuntime.Tags(prefix& "EventMsg").Write eventMsg
	RecordEvent = Insert_UA(prefix& "UA_Event")
End Function

 

參數:

  • prefix:設備的前綴,例如“XX_”。
  • eventMsg:需要記錄的事件。

返回值:

  •  0:記錄成功。
  • -1:記錄失敗。

 

何時觸發事件和批次的記錄

在開始生產時,設備中會有某個指示啟停的變量被置1,結束生產時則被置0。如果有多種批次類型,每個批次類型有不同的啟停變量。在VBS全局動作中,把這些變量做為觸發器,當變量改變就會觸發執行一段代碼,這段代碼調用StartEndCycle()函數,該函數內再調用RecordEvent()和RecordBatch()函數。

假設有3個批次類型,對應的變量名如下:

批次啟停變量
變量名 描述
XX_StartFlag1 批次類型1啟動變量
XX_StartFlag2 批次類型2啟動變量
XX_StartFlag3 批次類型3啟動變量

將不同的批次類型對應的類型標志、變量名、事件消息添加到數組,對數組遍歷,使用相同的代碼依次檢查每個啟停變量,然后觸發事件和批次記錄。全局VBS動作中的代碼如下:

'File Name:XX_StartEndCycle
Function action
    If HMIRuntime.Tags("@ServerName").Read <> HMIRuntime.Tags("@LocalMachineName").Read Then
        Exit Function
    End If
    
    'BatchType, TagName, StartMsg, EndMsg
    Dim batchItems
    batchItems = Array(_ 
        Array(1,"StartFlag1",TranslateText("開始類型1批次記錄", 2052),TranslateText("結束類型1批次記錄", 2052)),_
        Array(2,"StartFlag2",TranslateText("開始類型2批次記錄", 2052),TranslateText("結束類型2批次記錄", 2052)),_
        Array(3,"StartFlag3",TranslateText("開始類型3批次記錄", 2052),TranslateText("結束類型3批次記錄", 2052))_
        )
    Call StartEndCycle("XX_", batchItems)
End Function

  

StartEndCycle()代碼如下:

Sub StartEndCycle( prefix, batchItems )
    If Trim(HMIRuntime.Tags( prefix & "BatchName" ).read) = "" Then '如果批次名為空,則退出函數
        HMIRuntime.Tags( prefix & "BatchType" ).Write 0
        Exit Sub
    end if 

    Dim batchItem
    For Each batchItem In batchItems
        If Not TagQcIsBad(prefix & batchItem(1)) Then
            If HMIRuntime.Tags( prefix & batchItem(1) ).Read = 1 Then       '檢查觸發變量是否為1
                HMIRuntime.Tags( prefix & "BatchType" ).Write batchItem(0)  '設置批次類型
                HMIRuntime.Tags( prefix & "StartLogFlag").Write 1
                Call RecordEvent( prefix, batchItem(2) )                    '記錄事件
                Call RecordBatch( prefix, "UA#"&prefix&"Batch" )
            else
                If HMIRuntime.Tags( prefix & "BatchType" ).Read = batchItem(0) Then   '檢查是否是該批次類型
                    HMIRuntime.Tags( prefix & "StartLogFlag" ).Write 0
                    Call RecordEvent( prefix, batchItem(3) )                '記錄事件
                    Call RecordBatch( prefix, "UA#"&prefix&"Batch" )
                    HMIRuntime.Tags( prefix & "BatchType" ).Write 0
                End If
            End If 
        End If 
    Next
End Sub

  

批次操作流程

  1. 開始生產一批葯之前,首先給制葯設備輸入這批葯的批次號、產品名稱、產品規格,以及輸入生產的參數和配方。輸入批次號時需通過程序查詢批次表中是否存儲同名的批次,不能有兩個重名的批次號。以上內容的輸入不分先后順序,在開始生產之前都可以修改。這時輸入的內容並未記入數據庫。

  2. 設備開始生產之前可能需要試機,這段時間需保持批次啟停指示變量為0,設備應運行在調試模式;或者設計為手動啟停批次,使得機器的運轉啟停不影響批次的啟停。完成試機之后,將設備轉為自動運行模式,機器啟動以后批次指示變量置為1;需手動啟動批次的,則在設備的操作屏上點擊“啟動批次”按鈕,將批次啟停指示變量置1。

  3. 批次啟停指示變量改變后,WinCC的全局動作中的代碼將被觸發,從而記錄批次和事件。此時數據庫中還沒有這個批次的記錄,代碼將在批次數據庫中新建一條記錄,把批次號、產品名稱、配方等內容記錄到數據庫。同時向事件數據庫中新增一條數據,記錄了批次開始的時間戳。

  4. 在正常生產時,不應再編輯批次號、產品名稱等內容,須要通過代碼限制界面中的內容輸入。

  5. 完成生產之后,隨着生產結束自動將批次啟停指示變量置為0,或者在設備操作屏上點擊“結束批次”手動將變量設為0。

  6. 批次啟停指示變量的變化將再次觸發全局VBS動作。批次函數中的代碼將查詢到批次數據庫中已存在這個批次號的記錄,然后更新數據庫中這個批次的內容,最終把批次結果的參數寫入到數據庫中。而事件數據庫中將再新增一條數據,記錄批次結束的時間戳。

  7. 為了避免生產完之后設備調試時意外覆蓋之前的批次記錄,應在生產完之后手動清空批次變量中的值,空的批次不會被記錄到數據庫,輸入重名的批次名也不被程序允許。

 

 

批次輸入界面

批次輸入界面如下:

 

控件輸出值綁定的變量 

產品名稱、產品規格、產品批號和當前配方都是“輸入/輸出域”控件,在控件的“輸出值”屬性處分別綁定了變量:ProductName, ProductType, BatchName, RecipeID。示例如下圖:

生產狀態是文本列表控件,“輸出值”屬性綁定了變量ProdutionState,如下:

  以上變量都沒有添加變量前綴“XX_”,因為會通過畫面窗口控件調用這個畫面,在畫面窗口的屬性中添加前綴,畫面的所有變量將自動帶上前綴。

啟動批次后禁止操作控件

灰色的文本控件代表只讀,而白色的控件代表可讀寫。產品名稱、產品規格和產品批號三個控件在未啟動批次時可編輯,批次啟動以后不能被編輯,並且控件顏色變為灰色。批次清空按鈕也只能在批次未運行時可按下,批次運行時按鈕將被禁用。

在控件的“允許操作員控制”屬性中,設置動態對話框,當前StartLogFlag為0時將改屬性設為“是”,為1時設為“否”。

 

 在產品名稱、產品規格和產品批號三個控件的“背景顏色”屬性中設置動態對話框,當StartLogFlag為0時為白色,為1時為灰色。

 

 

輸入批次號

 點擊產品批號“輸入/輸出域”控件后,彈出對話框要求輸入產品批號,然后對輸入的批號檢查是否重復。

Sub OnClick(ByVal Item)                
    Dim BatchName
    BatchName = Trim(Inputbox(TranslateText("請輸入產品批號:",2052),TranslateText("輸入框",2052),Item.OutputValue))
    If BatchName<>"" Then
        If FindDuplicateBatchName("UA#XX_Batch",BatchName)=0 Then
            HMIRuntime.tags("BatchName").Write BatchName
        End If
    End If
End Sub

  

檢查重復批次的代碼如下:

Function FindDuplicateBatchName(UAName,BatchName)
    FindDuplicateBatchName = 0
    Dim cnn, rs, SQL
    Set cnn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    SQL = "select BatchName from "&UAName&" where BatchName='" & BatchName & "'"
    ConnectDatabase cnn,rs,SQL
    
    If rs.recordcount>0 Then
        Msgbox TranslateText("產品批號重復!", 2052)
        FindDuplicateBatchName = 1
    End If
    rs.Close
    cnn.Close
End Function

  

如何查詢批次

未完待續...

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM