呂蘇環
(金川鎳鈷研究設計院自動化研究所,甘肅 金昌 737100)
在企業信息化建設過程中,ERP/MES/PCS三層架構已成為被廣泛接受的企業信息集成問題解決方案[1]。MES提供從訂單投入到產品完成整個生產活動所需的優化信息,運用及時、準確的信息,指導、啟動、響應并記錄工廠活動,從而對條件作出迅速的響應,以減少非增值活動、提高工廠運作過程的效率[2]??梢奙ES是提高企業生產制造管理能力行之有效的重要手段。
筆者所在團隊承擔多項國家、省級重點項目建設中信息化、自動化方面的研發、建設任務。在有色企業MES建設過程中,發現用戶普遍對庫房的合理利用和綜合調配、產品的快速出庫、銷售的快速響應、庫存的及時盤點等庫房管理功能有著較高要求。
本文在充分研究了現有庫房管理技術手段及實現方法的基礎上,將PL/SQL過程語言應用到自動盤庫算法中,并通過實際應用驗證了該實現方法的可行性。
根據前期調研需求,本文著重通過以下幾個方面的設計保證庫房管理的先進性、實用性。
①粉體、線板帶類物料庫房,采用基于CODE128碼的無線條碼掃描技術[3]管理原料、產品、中間料及返料的出、入庫信息。條碼信息包括庫房、庫位、名稱、規格、生產日期、質量、班次、質檢信息、供貨商、批號、數量、價格等。該信息便于庫房管理并可作為事故追溯依據,同時為上層MES及ERP應用系統提供自動、實時的數據采集支撐。
②粉體類庫房主要用于存放桶裝粉體,庫房內放置自動堆垛倉庫管理機器人臂[4],自動進行貨位分配輸送,同時自動采集存儲物品貨位信息。這為上層MES及ERP應用系統提供自動、實時的數據支撐。
③庫存盤點主要分為年、月、季等不同頻次的盤庫操作,同時要求能夠為用戶顯示當前實時庫存詳情??紤]到信息化技術手段、實際系統負載及用戶需求,采用基于.NET的B/S三層架構開發模式[5],將盤庫算法抽象成公式固定在Oracle數據庫內部的PL/SQL存儲過程[6]中。大數據量計算通過設定觸發器在系統空閑時自動觸發執行,其他耗時較少的操作則主要由客戶端應用觸發執行。這樣既可以充分利用數據庫內部批處理執行能力的快速性以及SQL語句封裝的安全性優點,又可以充分保證一定的靈活性,與客戶端及時響應。
條碼庫存管理體系的建立,使庫存管理流程變得更加清晰。物料入庫通過條形碼打印機打印該物料條碼信息標志(名稱、供應商、數量、質量、品位等);再通過條碼掃描器進行數據采集,檢驗后入庫;然后利用條碼手持終端機掃描庫位、物料條碼,建立物料與庫位的對應關系;最后更改相應庫存信息。產品出庫根據提示物料的庫位,利用手持終端掃描庫位與條碼,驗證無誤后進行出庫操作,同時將手持終端采集的數據上傳至服務器,以更新庫存記錄。
采用條碼庫存管理體系后,規范的物料出入庫流程如圖1所示。

圖1 物料出入庫流程示意圖Fig.1 Flowchart of in-out warehousing of materials
對于庫存盤點,通過調查分析,主要抽象成以下基本公式,具體如表1所示。

表1 自動盤庫基本公式Tab.1 Basic formulae of automatic inventory checks
這樣,需要在Oracle數據庫中設定基本數據表,如表2所示。

表2 Oracle數據庫基本表Tab.2 Basic table of Oracle database
在基本表中,表列按照Sequence自增序列定義,數據存儲時,將它們作為屬性字段同時存入。其中,Frequency基表用于描述數據頻次序列值,如班、日、周、旬、月、季、年次數據等。Section基表用于描述物料類別序列值,如原料(投入、庫存)、產品(產出、庫存)、中間料(投入、產出、庫存)以及其他物料類別序列值(如金屬平衡量等)。StatisticsType基表用于描述數據所屬的統計屬性值,如庫存(入庫量、出庫量、庫存基量、凈庫存、階段庫存量)以及其他統計屬性值(如求和、平均、方差、平方、最大、最小、結存、付出等)。這些基本表數據字段均設計為Sequence自增序列屬性。因此,當后期系統升級、屬性拓展時,只需按照Oracle的Sequence序列增加即可,對之前已經設定的屬性值沒有任何影響。
考慮庫存物料量大、出入庫較頻繁、頻次較多的盤點操作耗時較長等特點,設計了Oracle-PL/SQL存儲過程,如表3所示。各存儲過程之間的關系如圖2所示。

表3 PL/SQL主要存儲過程Tab.3 Main storage procedures of PL/SQL
在特定生產數據存儲表中,通過Daily_Clear_Store檢索并自動計算出特定日期的日凈庫存完成量,并將其寫回數據庫中。
Month_Clear_Store利用Daily_Clear_Store計算出的日凈庫存值,計算出某月月凈庫存數據,并將其寫回數據庫。
MonthToNow_Store利用Daily_Clear_Store計算出的日凈庫存值,計算出月初至當月某日的凈庫存累積量,并將其寫回數據庫中。Year_Clear_Store、YearTo Now_Store等設計功能類似。
最后Daily_Store_Balance依據上述各存儲過程提供的中間數據,計算出庫存盤點的實際數據,并將其寫回數據庫供前臺調用。
這樣,各存儲過程之間就會存在一定的順序性關聯,因此需要定義名為Daily_Job的PL/SQL程序,統領各存儲過程的執行順序。最后,通過定義Oracle數據庫的全局Job工作,就可以定時觸發Daily_Job程序,實現數據庫定時自動盤庫的工作任務。

圖2 盤庫PL/SQL procedures關系示意圖Fig.2 Schematic diagram of PL/SQL Procedures
以Daily_Store_Balance為例,簡要說明盤庫算法的實現方法。
建立存儲過程后,首先定義相應游標csr_tagcode及變量V_DATE、V_STARTDAY等。其中,V_DATE為Date類型,用于標志日期變量,V_STARTDAY為number型,用于標志生產月起始日。同時對數據庫中統計類型為凈庫存的庫存數據(原料、產品、中間料)進行distinct檢索,并將檢索結果作為游標移動依據。
接著為各變量賦初值。從系統函數dual中解析出傳入日期參數v_date中的年、月、日信息,并存入相應變量 v_year、v_month、v_day。
依據上述變量及傳入參數,計算年庫存量的起始時間和結束時間,分為如下兩種情況(假定傳入參數V_STARTDAY值為26,即生產月開始日期為每月26日,下同)。如果當前日期為當年12月26日之后的某一天,則年起始時間取當年12月26日,年結束時間取下一年12月26日,并存入變量v_startYearDate和v_endYearDate;否則統計時間段為前一年12月26日至當年12月26日。
在計算月庫存基量的起始時間和結束時間時,如果v_day<26,月統計時間段為前一月26日至當月26日;否則統計時間段為當月26日至下月26日。
在執行具體算法之前,應先確認以下事項:為確保每次生成時數據庫中數據的唯一性,如果之前已執行過傳入參數相同的命令,則應首先檢索數據庫,并刪除當日的日庫存量。
在上述變量賦值及準備過程定義完畢后,進入計算過程。打開游標進入loop循環后,編寫程序實現算法如表4所示(累積量用T表示,庫存基量用B表示,庫存量用S表示)。

表4 當日庫存量計算算法(部分)Tab.4 Calculation algorithms(partial)for the stock volumes of the day
將當日日凈庫存記錄寫入數據庫后,結束loop循環,關閉游標并提交命令。
在上述存儲過程定義完畢之后,除可以通過應用程序事件觸發完成盤庫操作外,還可以規定在每日系統空閑時由數據庫自動觸發。但這需要定義Oracle數據庫中的Job命令。Job程序可以設定Oracle數據庫每日凌晨4點自動進行系統盤庫操作。需要注意的是,interval變量須定義為TRUNC(SYSDATE+1)+4/24(時間間隔為24 h,next_sec為4點)。
自系統投入運行以來,該企業的庫房管理達到了較高的自動化水平。庫存數據實時顯示在各級管理層用戶桌面系統中,使出入庫操作、貨位擺放、庫存信息、庫房盤點等操作都變得方便快捷。尤其是原來需手工統計的盤庫工作,當存儲數據量增大時,采用計算機實現也會耗費大量時間,影響用戶體驗;現在則由系統選擇每日訪問量最少的時刻(一般凌晨)自動計算生成。在降低人力成本、提高數據準確性和及時性以及滿足用戶較好的交互體驗等方面,該方法均體現出明顯的優越性。
在該企業MES生產信息化項目建設過程中,通過庫房管理子系統的實施,一方面減輕了生產人員及調度人員的工作量,較大程度地提高了企業庫房管理效率;另一方面也為企業節約了管理費用、提高了服務質量,從而以信息化手段切實提高了企業的核心競爭實力。該系統多次受到用戶和各相關部門的好評。
如今的倉庫作業與庫存控制作業十分復雜多樣,傳統的靜態管理模式已無法保證企業資源的高效利用。本文以在某有色企業MES項目實踐過程中庫房管理系統的設計與實現為例,詳細闡述了庫房管理系統實現中的若干問題及實現方法。該設計思路在實際應用中收到較好的效果,具有一定的參考價值及推廣意義。
[1]孫彥廣,陳靖屏.流程工業制造執行系統[M].北京:化學工業出版社,2006:14 -15.
[2]寧波市企業信息化工作領導小組.工業企業信息化技術指導規范[M].北京:清華大學出版社,2007:64-68.
[3]劉志海,曾慶良,朱由鋒.條形碼技術與程序設計[M].北京:清華大學出版社,2009:141-150.
[4]徐正林,劉昌祺.自動化立體倉庫實用設計手冊[M].北京:北京中國物資出版社,2009:212-240.
[5]Eeles P,Gripps P.架構實戰-軟件架構設計的過程[M].蔡黃輝,譯.北京:機械工業出版社,2010:91-97.
[6]Rosenzweig B,Bakhimov E S.Oracle PL/SQL 實例精解[M].龔波,徐雅麗,譯.北京:機械工業出版社,2009:27-32.