吕苏环
(金川镍钴研究设计院自动化研究所,甘肃 金昌 737100)
在企业信息化建设过程中,ERP/MES/PCS三层架构已成为被广泛接受的企业信息集成问题解决方案[1]。MES提供从订单投入到产品完成整个生产活动所需的优化信息,运用及时、准确的信息,指导、启动、响应并记录工厂活动,从而对条件作出迅速的响应,以减少非增值活动、提高工厂运作过程的效率[2]。可见MES是提高企业生产制造管理能力行之有效的重要手段。
笔者所在团队承担多项国家、省级重点项目建设中信息化、自动化方面的研发、建设任务。在有色企业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.