呂蘇環(huán)
(金川鎳鈷研究設(shè)計(jì)院自動(dòng)化研究所,甘肅 金昌 737100)
在企業(yè)信息化建設(shè)過(guò)程中,ERP/MES/PCS三層架構(gòu)已成為被廣泛接受的企業(yè)信息集成問(wèn)題解決方案[1]。MES提供從訂單投入到產(chǎn)品完成整個(gè)生產(chǎn)活動(dòng)所需的優(yōu)化信息,運(yùn)用及時(shí)、準(zhǔn)確的信息,指導(dǎo)、啟動(dòng)、響應(yīng)并記錄工廠(chǎng)活動(dòng),從而對(duì)條件作出迅速的響應(yīng),以減少非增值活動(dòng)、提高工廠(chǎng)運(yùn)作過(guò)程的效率[2]??梢?jiàn)MES是提高企業(yè)生產(chǎn)制造管理能力行之有效的重要手段。
筆者所在團(tuán)隊(duì)承擔(dān)多項(xiàng)國(guó)家、省級(jí)重點(diǎn)項(xiàng)目建設(shè)中信息化、自動(dòng)化方面的研發(fā)、建設(shè)任務(wù)。在有色企業(yè)MES建設(shè)過(guò)程中,發(fā)現(xiàn)用戶(hù)普遍對(duì)庫(kù)房的合理利用和綜合調(diào)配、產(chǎn)品的快速出庫(kù)、銷(xiāo)售的快速響應(yīng)、庫(kù)存的及時(shí)盤(pán)點(diǎn)等庫(kù)房管理功能有著較高要求。
本文在充分研究了現(xiàn)有庫(kù)房管理技術(shù)手段及實(shí)現(xiàn)方法的基礎(chǔ)上,將PL/SQL過(guò)程語(yǔ)言應(yīng)用到自動(dòng)盤(pán)庫(kù)算法中,并通過(guò)實(shí)際應(yīng)用驗(yàn)證了該實(shí)現(xiàn)方法的可行性。
根據(jù)前期調(diào)研需求,本文著重通過(guò)以下幾個(gè)方面的設(shè)計(jì)保證庫(kù)房管理的先進(jìn)性、實(shí)用性。
①粉體、線(xiàn)板帶類(lèi)物料庫(kù)房,采用基于CODE128碼的無(wú)線(xiàn)條碼掃描技術(shù)[3]管理原料、產(chǎn)品、中間料及返料的出、入庫(kù)信息。條碼信息包括庫(kù)房、庫(kù)位、名稱(chēng)、規(guī)格、生產(chǎn)日期、質(zhì)量、班次、質(zhì)檢信息、供貨商、批號(hào)、數(shù)量、價(jià)格等。該信息便于庫(kù)房管理并可作為事故追溯依據(jù),同時(shí)為上層MES及ERP應(yīng)用系統(tǒng)提供自動(dòng)、實(shí)時(shí)的數(shù)據(jù)采集支撐。
②粉體類(lèi)庫(kù)房主要用于存放桶裝粉體,庫(kù)房?jī)?nèi)放置自動(dòng)堆垛倉(cāng)庫(kù)管理機(jī)器人臂[4],自動(dòng)進(jìn)行貨位分配輸送,同時(shí)自動(dòng)采集存儲(chǔ)物品貨位信息。這為上層MES及ERP應(yīng)用系統(tǒng)提供自動(dòng)、實(shí)時(shí)的數(shù)據(jù)支撐。
③庫(kù)存盤(pán)點(diǎn)主要分為年、月、季等不同頻次的盤(pán)庫(kù)操作,同時(shí)要求能夠?yàn)橛脩?hù)顯示當(dāng)前實(shí)時(shí)庫(kù)存詳情??紤]到信息化技術(shù)手段、實(shí)際系統(tǒng)負(fù)載及用戶(hù)需求,采用基于.NET的B/S三層架構(gòu)開(kāi)發(fā)模式[5],將盤(pán)庫(kù)算法抽象成公式固定在Oracle數(shù)據(jù)庫(kù)內(nèi)部的PL/SQL存儲(chǔ)過(guò)程[6]中。大數(shù)據(jù)量計(jì)算通過(guò)設(shè)定觸發(fā)器在系統(tǒng)空閑時(shí)自動(dòng)觸發(fā)執(zhí)行,其他耗時(shí)較少的操作則主要由客戶(hù)端應(yīng)用觸發(fā)執(zhí)行。這樣既可以充分利用數(shù)據(jù)庫(kù)內(nèi)部批處理執(zhí)行能力的快速性以及SQL語(yǔ)句封裝的安全性?xún)?yōu)點(diǎn),又可以充分保證一定的靈活性,與客戶(hù)端及時(shí)響應(yīng)。
條碼庫(kù)存管理體系的建立,使庫(kù)存管理流程變得更加清晰。物料入庫(kù)通過(guò)條形碼打印機(jī)打印該物料條碼信息標(biāo)志(名稱(chēng)、供應(yīng)商、數(shù)量、質(zhì)量、品位等);再通過(guò)條碼掃描器進(jìn)行數(shù)據(jù)采集,檢驗(yàn)后入庫(kù);然后利用條碼手持終端機(jī)掃描庫(kù)位、物料條碼,建立物料與庫(kù)位的對(duì)應(yīng)關(guān)系;最后更改相應(yīng)庫(kù)存信息。產(chǎn)品出庫(kù)根據(jù)提示物料的庫(kù)位,利用手持終端掃描庫(kù)位與條碼,驗(yàn)證無(wú)誤后進(jìn)行出庫(kù)操作,同時(shí)將手持終端采集的數(shù)據(jù)上傳至服務(wù)器,以更新庫(kù)存記錄。
采用條碼庫(kù)存管理體系后,規(guī)范的物料出入庫(kù)流程如圖1所示。
圖1 物料出入庫(kù)流程示意圖Fig.1 Flowchart of in-out warehousing of materials
對(duì)于庫(kù)存盤(pán)點(diǎn),通過(guò)調(diào)查分析,主要抽象成以下基本公式,具體如表1所示。
表1 自動(dòng)盤(pán)庫(kù)基本公式Tab.1 Basic formulae of automatic inventory checks
這樣,需要在Oracle數(shù)據(jù)庫(kù)中設(shè)定基本數(shù)據(jù)表,如表2所示。
表2 Oracle數(shù)據(jù)庫(kù)基本表Tab.2 Basic table of Oracle database
在基本表中,表列按照Sequence自增序列定義,數(shù)據(jù)存儲(chǔ)時(shí),將它們作為屬性字段同時(shí)存入。其中,F(xiàn)requency基表用于描述數(shù)據(jù)頻次序列值,如班、日、周、旬、月、季、年次數(shù)據(jù)等。Section基表用于描述物料類(lèi)別序列值,如原料(投入、庫(kù)存)、產(chǎn)品(產(chǎn)出、庫(kù)存)、中間料(投入、產(chǎn)出、庫(kù)存)以及其他物料類(lèi)別序列值(如金屬平衡量等)。StatisticsType基表用于描述數(shù)據(jù)所屬的統(tǒng)計(jì)屬性值,如庫(kù)存(入庫(kù)量、出庫(kù)量、庫(kù)存基量、凈庫(kù)存、階段庫(kù)存量)以及其他統(tǒng)計(jì)屬性值(如求和、平均、方差、平方、最大、最小、結(jié)存、付出等)。這些基本表數(shù)據(jù)字段均設(shè)計(jì)為Sequence自增序列屬性。因此,當(dāng)后期系統(tǒng)升級(jí)、屬性拓展時(shí),只需按照Oracle的Sequence序列增加即可,對(duì)之前已經(jīng)設(shè)定的屬性值沒(méi)有任何影響。
考慮庫(kù)存物料量大、出入庫(kù)較頻繁、頻次較多的盤(pán)點(diǎn)操作耗時(shí)較長(zhǎng)等特點(diǎn),設(shè)計(jì)了Oracle-PL/SQL存儲(chǔ)過(guò)程,如表3所示。各存儲(chǔ)過(guò)程之間的關(guān)系如圖2所示。
表3 PL/SQL主要存儲(chǔ)過(guò)程Tab.3 Main storage procedures of PL/SQL
在特定生產(chǎn)數(shù)據(jù)存儲(chǔ)表中,通過(guò)Daily_Clear_Store檢索并自動(dòng)計(jì)算出特定日期的日凈庫(kù)存完成量,并將其寫(xiě)回?cái)?shù)據(jù)庫(kù)中。
Month_Clear_Store利用Daily_Clear_Store計(jì)算出的日凈庫(kù)存值,計(jì)算出某月月凈庫(kù)存數(shù)據(jù),并將其寫(xiě)回?cái)?shù)據(jù)庫(kù)。
MonthToNow_Store利用Daily_Clear_Store計(jì)算出的日凈庫(kù)存值,計(jì)算出月初至當(dāng)月某日的凈庫(kù)存累積量,并將其寫(xiě)回?cái)?shù)據(jù)庫(kù)中。Year_Clear_Store、YearTo Now_Store等設(shè)計(jì)功能類(lèi)似。
最后Daily_Store_Balance依據(jù)上述各存儲(chǔ)過(guò)程提供的中間數(shù)據(jù),計(jì)算出庫(kù)存盤(pán)點(diǎn)的實(shí)際數(shù)據(jù),并將其寫(xiě)回?cái)?shù)據(jù)庫(kù)供前臺(tái)調(diào)用。
這樣,各存儲(chǔ)過(guò)程之間就會(huì)存在一定的順序性關(guān)聯(lián),因此需要定義名為Daily_Job的PL/SQL程序,統(tǒng)領(lǐng)各存儲(chǔ)過(guò)程的執(zhí)行順序。最后,通過(guò)定義Oracle數(shù)據(jù)庫(kù)的全局Job工作,就可以定時(shí)觸發(fā)Daily_Job程序,實(shí)現(xiàn)數(shù)據(jù)庫(kù)定時(shí)自動(dòng)盤(pán)庫(kù)的工作任務(wù)。
圖2 盤(pán)庫(kù)PL/SQL procedures關(guān)系示意圖Fig.2 Schematic diagram of PL/SQL Procedures
以Daily_Store_Balance為例,簡(jiǎn)要說(shuō)明盤(pán)庫(kù)算法的實(shí)現(xiàn)方法。
建立存儲(chǔ)過(guò)程后,首先定義相應(yīng)游標(biāo)csr_tagcode及變量V_DATE、V_STARTDAY等。其中,V_DATE為Date類(lèi)型,用于標(biāo)志日期變量,V_STARTDAY為number型,用于標(biāo)志生產(chǎn)月起始日。同時(shí)對(duì)數(shù)據(jù)庫(kù)中統(tǒng)計(jì)類(lèi)型為凈庫(kù)存的庫(kù)存數(shù)據(jù)(原料、產(chǎn)品、中間料)進(jìn)行distinct檢索,并將檢索結(jié)果作為游標(biāo)移動(dòng)依據(jù)。
接著為各變量賦初值。從系統(tǒng)函數(shù)dual中解析出傳入日期參數(shù)v_date中的年、月、日信息,并存入相應(yīng)變量 v_year、v_month、v_day。
依據(jù)上述變量及傳入?yún)?shù),計(jì)算年庫(kù)存量的起始時(shí)間和結(jié)束時(shí)間,分為如下兩種情況(假定傳入?yún)?shù)V_STARTDAY值為26,即生產(chǎn)月開(kāi)始日期為每月26日,下同)。如果當(dāng)前日期為當(dāng)年12月26日之后的某一天,則年起始時(shí)間取當(dāng)年12月26日,年結(jié)束時(shí)間取下一年12月26日,并存入變量v_startYearDate和v_endYearDate;否則統(tǒng)計(jì)時(shí)間段為前一年12月26日至當(dāng)年12月26日。
在計(jì)算月庫(kù)存基量的起始時(shí)間和結(jié)束時(shí)間時(shí),如果v_day<26,月統(tǒng)計(jì)時(shí)間段為前一月26日至當(dāng)月26日;否則統(tǒng)計(jì)時(shí)間段為當(dāng)月26日至下月26日。
在執(zhí)行具體算法之前,應(yīng)先確認(rèn)以下事項(xiàng):為確保每次生成時(shí)數(shù)據(jù)庫(kù)中數(shù)據(jù)的唯一性,如果之前已執(zhí)行過(guò)傳入?yún)?shù)相同的命令,則應(yīng)首先檢索數(shù)據(jù)庫(kù),并刪除當(dāng)日的日庫(kù)存量。
在上述變量賦值及準(zhǔn)備過(guò)程定義完畢后,進(jìn)入計(jì)算過(guò)程。打開(kāi)游標(biāo)進(jìn)入loop循環(huán)后,編寫(xiě)程序?qū)崿F(xiàn)算法如表4所示(累積量用T表示,庫(kù)存基量用B表示,庫(kù)存量用S表示)。
表4 當(dāng)日庫(kù)存量計(jì)算算法(部分)Tab.4 Calculation algorithms(partial)for the stock volumes of the day
將當(dāng)日日凈庫(kù)存記錄寫(xiě)入數(shù)據(jù)庫(kù)后,結(jié)束loop循環(huán),關(guān)閉游標(biāo)并提交命令。
在上述存儲(chǔ)過(guò)程定義完畢之后,除可以通過(guò)應(yīng)用程序事件觸發(fā)完成盤(pán)庫(kù)操作外,還可以規(guī)定在每日系統(tǒng)空閑時(shí)由數(shù)據(jù)庫(kù)自動(dòng)觸發(fā)。但這需要定義Oracle數(shù)據(jù)庫(kù)中的Job命令。Job程序可以設(shè)定Oracle數(shù)據(jù)庫(kù)每日凌晨4點(diǎn)自動(dòng)進(jìn)行系統(tǒng)盤(pán)庫(kù)操作。需要注意的是,interval變量須定義為T(mén)RUNC(SYSDATE+1)+4/24(時(shí)間間隔為24 h,next_sec為4點(diǎn))。
自系統(tǒng)投入運(yùn)行以來(lái),該企業(yè)的庫(kù)房管理達(dá)到了較高的自動(dòng)化水平。庫(kù)存數(shù)據(jù)實(shí)時(shí)顯示在各級(jí)管理層用戶(hù)桌面系統(tǒng)中,使出入庫(kù)操作、貨位擺放、庫(kù)存信息、庫(kù)房盤(pán)點(diǎn)等操作都變得方便快捷。尤其是原來(lái)需手工統(tǒng)計(jì)的盤(pán)庫(kù)工作,當(dāng)存儲(chǔ)數(shù)據(jù)量增大時(shí),采用計(jì)算機(jī)實(shí)現(xiàn)也會(huì)耗費(fèi)大量時(shí)間,影響用戶(hù)體驗(yàn);現(xiàn)在則由系統(tǒng)選擇每日訪(fǎng)問(wèn)量最少的時(shí)刻(一般凌晨)自動(dòng)計(jì)算生成。在降低人力成本、提高數(shù)據(jù)準(zhǔn)確性和及時(shí)性以及滿(mǎn)足用戶(hù)較好的交互體驗(yàn)等方面,該方法均體現(xiàn)出明顯的優(yōu)越性。
在該企業(yè)MES生產(chǎn)信息化項(xiàng)目建設(shè)過(guò)程中,通過(guò)庫(kù)房管理子系統(tǒng)的實(shí)施,一方面減輕了生產(chǎn)人員及調(diào)度人員的工作量,較大程度地提高了企業(yè)庫(kù)房管理效率;另一方面也為企業(yè)節(jié)約了管理費(fèi)用、提高了服務(wù)質(zhì)量,從而以信息化手段切實(shí)提高了企業(yè)的核心競(jìng)爭(zhēng)實(shí)力。該系統(tǒng)多次受到用戶(hù)和各相關(guān)部門(mén)的好評(píng)。
如今的倉(cāng)庫(kù)作業(yè)與庫(kù)存控制作業(yè)十分復(fù)雜多樣,傳統(tǒng)的靜態(tài)管理模式已無(wú)法保證企業(yè)資源的高效利用。本文以在某有色企業(yè)MES項(xiàng)目實(shí)踐過(guò)程中庫(kù)房管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)為例,詳細(xì)闡述了庫(kù)房管理系統(tǒng)實(shí)現(xiàn)中的若干問(wèn)題及實(shí)現(xiàn)方法。該設(shè)計(jì)思路在實(shí)際應(yīng)用中收到較好的效果,具有一定的參考價(jià)值及推廣意義。
[1]孫彥廣,陳靖屏.流程工業(yè)制造執(zhí)行系統(tǒng)[M].北京:化學(xué)工業(yè)出版社,2006:14 -15.
[2]寧波市企業(yè)信息化工作領(lǐng)導(dǎo)小組.工業(yè)企業(yè)信息化技術(shù)指導(dǎo)規(guī)范[M].北京:清華大學(xué)出版社,2007:64-68.
[3]劉志海,曾慶良,朱由鋒.條形碼技術(shù)與程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2009:141-150.
[4]徐正林,劉昌祺.自動(dòng)化立體倉(cāng)庫(kù)實(shí)用設(shè)計(jì)手冊(cè)[M].北京:北京中國(guó)物資出版社,2009:212-240.
[5]Eeles P,Gripps P.架構(gòu)實(shí)戰(zhàn)-軟件架構(gòu)設(shè)計(jì)的過(guò)程[M].蔡黃輝,譯.北京:機(jī)械工業(yè)出版社,2010:91-97.
[6]Rosenzweig B,Bakhimov E S.Oracle PL/SQL 實(shí)例精解[M].龔波,徐雅麗,譯.北京:機(jī)械工業(yè)出版社,2009:27-32.