王春艷
(東莞搜路研電子有限公司天津分公司,天津 300450)
為了確保產品質量,一臺制品會在生產線上多個工位進行各種性能測試,由于操作人員長時間勞作會產生身體疲勞或精神不集中等問題,造成產品在本工位未測試就流向下一個工位,或將本工位的不良品當成良品直接流向下一個工位,從而使不良品流向市場,給公司帶來重大損失。為了解決此問題,我們在VB.NET的環境下,結合WINDOWS API函數和ACCESS數據庫,利用公司的局域網絡開發了此生產線測試管理系統。經過一段時間的使用證明此系統不僅有效的防止人員誤操作造成的不良品流出,還可方便的對制品測試數據進行查詢追溯,加強了企業的管理。
測試系統通過掃描每個制品的ID來識別制品,并通過制品ID在ACESS數據庫中查詢相應的信息判斷制品的測試狀態。
為了區分每一臺制品,需要給每臺制品一個身份識別ID,此ID可通過條形碼或二維碼的形式打印在標簽上,并將其帖附在制品上。ID的組成可自己命名,但每一個ID必須惟一,不重復。
筆者所用的ID命名規則如下:制品名+生產日期+六位十六進制流水號。制品ID標簽圖片見圖1。

圖1 制品ID標簽
測試管理軟件安裝在生產線的測試電腦上,同時每臺電腦配備一個掃描槍用于掃描制品ID。使用時首先選擇當前工位,掃描制品ID。若當前工位為第一工位,測試管理軟件向測試程序發送一個開始信號,測試程序接收到信號后,開啟測試程序,測試結束后向測試管理軟件發送一個測試結束信號,測試管理軟件收到測試結束信號后,開始讀取測試結果并將其存入ACCESS數據庫,等待掃描新的ID。若當前工位不是第一工位,則掃描完制品ID后,測試管理軟件通過制品ID在ACCESS數據庫中進行信息檢索,根據檢索的信息判斷前一工位是否測試過并且結果OK,若未測試過或結果NG,則在程序界面上顯示NG及NG原因,提示操作者將該制品在前一工位重新投入測試或送去維修;若前一工位已測試并且結果OK,則接下來的流程同第一工位。此部分測試管理軟件的流程見圖2。
由上述原理可知,前一工位測試情況可由本工位進行檢查,那么最后一個工位如何進行檢測呢,為此在最后一工位增加了產品數量管理流程,通常生產線最后工位為外觀檢查或包裝,外觀檢查OK后,掃描ID,測試管理軟件根據制品ID找到其測試信息,判斷該制品的測試情況,若為OK,程序界面制品數量加一,若為NG,制品數量不變。當制品數量達到設定的包裝數量時,測試管理軟件自動清零,操作者可根據測試管理軟件顯示數量與實際數量對比來判斷該批制品里是否含有不良或漏測制品,從而阻止不良的流出。最后一工位的流程如圖3所示。

圖2 系統流程圖

圖3 最后工位系統流程圖
VB.NET是微軟公司推出的開發平臺,由于其具有易學易用、開發迅速的優點,已受到越來越多企業的青睞。[1]本測試管理軟件采用VB.NET平臺,結合API函數可實時讀取測試程序結果,并通過ACCESS數據庫進行數據保存,信息共享。
為實時獲取測試程序的測試數據和結果,采用了直接調用WINDOWS API函數的方法。API(Application Programming Interface)函數,是操作系統為程序開發人員提供的一組函數庫,通常包含在名為.DLL(Dynamic Link Library)的動態連接庫文件中[2]。雖然微軟不提倡在.Net平臺調用Windows API函數,但是在開發語言使用自帶函數或類庫不能解決問題時,調用Windows API函數往往是一種非常直接有效的解決方法。
調用API最常用的方法是通過使用Declare語句。使用時首先要確定調用的函數名稱及其參數、參數類型和返回值,以及包含該函數的DLL的名稱和位置。在本系統中用到的API函數如下[3]:
Declare Function GetClassName Lib”user32.dll”Alias“GetClassNameA”(ByValhwnd As Integer,ByVallpClassName As String,ByValnMaxCount as Integer) As Integer
功能:獲得一個窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配;
Declare Function FindWindowEx Lib”user32.dll”Alias“FindWindowExA”(ByVal hwnd1 As Integer,ByVal hwnd2 As Integer,ByVallpszl As String,ByVallpsz2 as String) As Integer
功能:查找子窗口,從排在給定的子窗口后面的下一個窗口開始;
Declare FunctionFindWindow Lib”user32.dll”Alias“FindWindowA”(ByVallpClassName As string,ByVallpWindowName as String) As Integer
功能:獲得指定窗口所屬的類的類名;
Declare Function SendMessage Lib”user32.dll”Alias“SendMessageA”(ByValhwnd As Integer,ByValwMsg as Integer,ByValwParam as Integer,ByVallParam As String) As Integer
功能:向對話框中的控件發送消息。
利用API函數獲取測試數據和結果的過程如下:首先根據FindWindow函數獲取測試程序窗口句柄,根據FindWindowEx函數獲取測試程序窗口的子窗口句柄,根據子窗口句柄和GetClassName函數獲取子窗口類型,找到要讀取數據的子窗口后,利用SendMessage函數獲取要讀取的數據,并存儲到ACCESS數據庫。
由于ACCESS是免費的數據庫,且具有開發靈活,速度快等優點,對于數據量和訪問用戶都不是特別大的情況下,是一種非常好的選擇。故此我們選擇具有嚴格數學概念的MicrosoftOfficeAccess 2010關系型數據庫。為了不同工位能夠實時共享所有數據,將設置好的數據庫利用數據庫拆分器拆分為前臺數據庫和后臺數據庫兩個部分。后臺數據庫只保留了表對象,放置在服務器電腦上,并設置為共享;前臺數據庫放在各工位的測試電腦上,它保留了除表之外的所有對象。將后臺數據庫映射到各工位電腦,前臺數據庫通過選擇數據源與后臺數據庫鏈接。
在測試制品前,要想查詢本制品在前一工位的測試情況,就需要利用VB.net語言訪問和讀取ACCESS數據庫。為了讓操作人員更直觀的看到最近的測試情況,數據管理軟件主界面上要直接顯示最近的測試信息。在實際應用開發中,經常用DataGridView1顯示數據庫查詢的內容。而vb.net在數據庫中查詢信息時,還需用到SQL語句來進行查詢。SQL即結構化查詢語言,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統[4]。例如,通過SQL語句查詢并顯示數據庫中的表在VB.NET窗體上,可用如下代碼實現:
Dim connectionStr As String=”Provider=Microsoft.ACE.OLEDB.12.0;Data Source=”&Application.StartupPath&”數 據庫.accdb;Persist Security Info=False;”‘連接到指定的數據庫
Me.DataGridView1.DataSource=Me.BindingSource1‘選擇數據源
Dim selectCommand As String=”SELECT * FROM 表1”‘查詢所需內容
Me.dataAdapter=New OleDbDataAdapter(selectCommand,connectionStr)
Dim commandBuilder As New OleDbCommandBuilder(Me.dataAdapter)
Dim table As New DataTable()
Table.Locale=System.Globalization.CultureInfo.InvariantCulture
Me.dataAdapter.fill(table)
Me.BindingSource1.DataSource=table
通過VB.net平臺結合WINDOWS API函數和ACCESS數據庫,利用局域網開發的生產線測試管理系統在生產過程中能有效的防止由于人為疏忽造成的不良品流出,同時由于系統具有數據保存,查詢等功能,方便了后期對數據的追溯,提高了企業的管理水平。