郑立熹,徐孙浩,张志胜,史金飞东南大学机械工程学院,南京(211189)E-mail:zlxzippo@126.com摘要:面临多品种变批量的现代电子制造趋势,封测程序的管理日益成为半导体封装测试过程中的瓶颈问题。结合电子制造业的发展要求,以某半导体封装企业封测分厂的封测程序管理需求为基础,设计了基于.NetRemoting和数据库技术的封测程序管理系统,实现了封测程序的文件传输和信息管理等功能。本系统能有效地实现程序文件的上传及下载,兼顾了程序传输的速度和程序管理的灵活性,能方便地存储和管理封测程序。实际运行表明,本系统的运行显著降低了封测程序信息丢失、调用出错及封测机中毒等生产事故,提高了生产自动化程度和管理规范性。关键词:.NETRemoting;文件传输;封测程序;信息管理中图分类号:TP3111.引言封测程序的传输和管理是半导体封测生产线上不可或缺的一环。普通的文件传输机和操作系统文件管理既不能及时响应多变的生产环境,亦不能对已有的程序资源进行妥善管理。本项目实施企业致力于信息化建设多年,目前已实现了管理层的信息化,但还有所欠缺,管理层与生产业务层的联系缺乏,应对变化的能力差,其中尤以封测程序管理最为混乱。半导体封测是大规模协同生产,生产各个部分都是密不可分,相互制约的,一个环节的能力下降会影响到其他环节,形成连锁效应[1]。虽然本企业封测机器先进,操作人员技能熟练,但是封测程序管理问题造成的生产瓶颈十分突出,填补这块短板势在必行。2.封测程序管理系统功能需求实时监测和有效控制是实施企业敏捷制造战略和实现车间生产敏捷化的基本技术手段,现已逐渐成为现代电子制造业的标志之一[2][3]。封测程序管理系统负责实现封测程序的管理与传输,是重要的半导体封测监控系统。结合以上要求和项目实施企业的生产需要,本封测程序管理系统应具有以下特征:1)分布性。车间是一个分布式系统,它要求各个分布节点有较强的自治能力。一个节点的自治能力下降不会影响到其他节点的正常运行。2)共享性。封测程序的共享性是本模块的性能基础。以往的文件传输机甚至直接用U盘等设备拷贝进行传输不能迅速定位需要下载的封测程序,速度缓慢且病毒等造成的安全性能严重。要求本模块能进行封测程序的快速传输,并开发可靠技术应对网络阻塞、IO性能下降等问题。1本项目得到江苏省科技支撑计划项目(BE2008019),江苏省“六大人才高峰”项目(2008144),东南大学优秀青年教师教学科研(200902)的资助。)安全性。安全问题包括封测程序的存储安全,信息安全及操作安全,在生产日益高速化的今天显得尤其严重,半导体封测为高技术行业,一次生产事故就可能导致数百万元的资产损失。要加强对封测程序的监控,手段包括每次操作时的系统判断、报错及日志记录。其中日志功能方便厂方及早发现流程漏洞和安全隐患,在出现事故时也能把责任明确到人。4)通用性。项目实施企业具有封测程序多(数以万计),封测机器数量多、类型复杂的特点,每种封测机都对应着数十种至数千种封测程序,每种封测程序都对应着数种版本。要求各种封测机、封测程序均能无差别使用本模块。3.封测程序管理系统总体设计3.1系统架构设计.NETRemoting提供了一种允许对象通过应用程序域与另一对象进行交互的框架[4],其通过信道(channel)来实现两个应用程序域之间对象的通信。.NetRemoting技术避免了传统的胖客户端对客户端机器要求高,数据安全性不高等弊端,亦避免了传统开发技术如DCOM等复杂且容易出错的缺点。较之在广域网使用广泛的WebService技术,在局域网中.NetRemoting速度更快,访问安全性能得到保证并且能实现比WebService技术更广泛的功能[5]。根据企业的现状,本封测程序管理系统采用基于.NetRemoting技术的软件体系架构,分别为数据访问层、业务逻辑层(又或成为领域层)、表示层。各层之间通过标准的通讯协议连接,通讯协议支持网络传递。当需要表现层程序进行更新或添加新版本的表示层程序时,不会影响到逻辑层和数据层,便于系统的功能扩展和升级。本测试程序架构设计要点如下:1)系统使用环境有办公室和封测车间两种。基于共享性及安全性的要求,两端相互间不能直接通讯,必须经由服务端(数据库)进行交互。在局域网中,使用TCP信道可满足防火墙要求,并极大的提高通信性能;2)系统应具备的主要功能如图1所示,可分为封测程序传输、信息维护、日志及结果获取四方面,但是四种功能不是简单孤立的,每种功能的运行均有可能触发其他功能;每种功能的人机界面均与逻辑运算相分离,通过.NetRemoting交由服务器处理,节省了客户端的大量资源用以保证封测生产线的高速运转。)远程对象采用值封送对象与引用封送对象两种。如测试程序(不仅是文件,亦包含文件信息)等被传输对象均作为值封送对象,在其类前面用Serializbael属性修饰或者实现sIerializalbe,可将其实例跨越应用程序或上下文边界通过值(本处为二进制值)进行传递。引用封送对象用以创建代理,对象的类继承MarshalByRefobjec类,当客户端在它自己的应用程序域中创建该MRB对象的实例时,.NTE框架在此应程序域中创建远程对象的代理对象,并引发对远程对象的调用。基于以上要点的封测程序管理系统总体架构如图2所示。图2系统总体架构Fig2Systemframework3.2测试程序的存储封测程序文件在服务器数据库上可以BLOB和BFILE两种形式进行储存。根据Oracle的技术文档,BLOB用以存储较大无结构的二进制数据;BFILE将二进制文件存储在数据库外办公室端生产线端,与封测机相连封测程序编写者管理层人员值班长操作员工表示层封测程序上传界面封测程序维护界面系统日志管理界面封测程序下载界面封测监视界面领域层封测程序传输功能类封测程序信息功能类系统日志功能类封测结果获取功能类数据访问层数据库.NetRemoting测试程序编写编程完毕上传程序至服务器储存测试程序文件及信息储存操作信息至数据库和本地文档生产线准备测试选用本程序是否正确下载程序删除测试机上其他程序开始测试测试完毕上传测试信息日志查询是提示出现错误并进入程序信息维护否检查本程序版本,正确性等是否提示出现错误并进入程序信息维护程序信息维护检查本程序版本,正确性等是否选择测试程序部的操作系统文件中,数据库中存放文件路径。BLOB同一管理程序文件及程序信息,同步性好。但是在本系统环境中,封测程序数量巨大,采用BLOB会造成数据库的臃肿不堪;另外由于封测程序种类繁多,大小差距很大,Oracle中封测程序表的存储参数不易配置,会时常发生行链接或行迁移极大的影响数据库性能。BFILE的同步性虽然弱于BLOB,但是本环境中程序文件都分类存储在各自固定文件夹中,设置合适权限可以保证安全性,本模块中程序文件在数据库存储形式选择的是BFILE。4.封测程序文件传输封测程序传输直接关系到生产线调度的快速性,其功能应该优先考虑。程序文件传输涉及到了大文件传输,网络阻塞和IO性能制约及文件批量传输几个问题,是本系统最为关键的功能。4.1大型封测程序上传封测程序种类繁多、大小不一。部分程序文件较大,一次性完全传输的连续传输时间长,出现网络故障造成传输中断的概率大。出现故障后再次传输又要重新上传整个文件,占用系统资源多。应对以上问题,将较大的文件分为数段,在最后一段设置结束符,逐段传输到服务器段再进行合并,并设置远程类状态量进行判断本次上传字节流是否属于分段传输型。为防止不同客户端同时向服务端上传封测程序导致误拼接情况,传输信息中应包括标识符(可采用客户端IP地址或者主机名)。4.2应对网络阻塞和服务器性能制约大量用户同时进行封测程序传输时会相互减缓上传速度,情况严重则会引起网络阻塞,造成通信的中断;另一方面大量用户同时进行封测程序传输也会引起数据库读写操作和服务器文件系统IO的峰值,在数据库引起闩锁热点竞争。以上两点都会极大的影响整个封测监控系统的性能。在传输远程类中设置状态变量,用以指示本实例是否正在被某个客户端使用中,其他客户端延迟访问。延迟访问的客户端以定时器轮询的方式,待网络空闲时进行封测程序的传输。同时在服务器接收到封测程序信息和程序字节流后先将其存入等待队列中,以内存作为缓冲。这样不论是在高访问量期间还是空闲期间,缓存中的数据持续平缓地写入数据库和文件系统,直至全部完成。以此平均了对数据库和服务器文件系统的访问量,占用缓存也不会过大。远程类中设置公有属性isTransport为状态量,每次客户端调用传输程序方法时都要先查询isTransport状态,结束前要设定其状态。isTransport状态有三种:1)空闲状态,此时任何现在访问本实例的客户端都可以立即处理其业务;2)忙碌状态,此时本实例正在被某客户端使用中,任何其他对本实例的访问企图都会被延迟。3)大程序文件分段传输状态,代表已上传了文件前几段,等待后续段的传输。程序传输远程类在服务器端注册为为SingleTon模式,此为有状态模式,将为所有客户状态量。服务器端注册文件传输远程类的代码为:RemotingConfiguration.RegisterWellKnownServiceType(GetType(RemProgramManager),_RemProgramManager.rem,WellKnownObjectMode.SingleCall)远程类的部分实现代码如下,其类图如图3所示:PublicClassRemProgramManagerInheritsMarshalByRefObjectPrivatetpCountAsInteger//队列中储存程序信息数量…PublicSubAddTPToArrayList(ByValtpAsTestProgram)...tpList.add(tp)//将程序信息写入动态数组中...EndSubPublicSubAddTPToDb()...ForEachtpIntplist//动态数组中逐元素写入数据库InserToDb(tp)tpCount-=1Next...EndSubEndClass+New()#Finalize()+AddTPToArrayList(intp:TestProgram)+MergePartition(innewPt:Byte,inexistPt:Byte):Byte+InserToDb()+AddTPToDb()-tpCount:Integer+tpList:ArrayList+isTransport:IntegerRemProgramManager图3封测程序上传远程类Fig3RemotingClassofUploading4.3程序文件批量上传有时数十种或数百种程序文件的相关信息大致相同,将其批量上传显然要在可操作性,资源节约性方面远远高于单个上传。建立一个专门的文件夹统一存放需要批量上传的程序。通常采用遍历本文件夹中文件将其转换为字节流填入队列然后逐个上传至服务器,这种方法在上传大批量程序时占用网络资源过大,极易引起网络阻塞。若采用先压缩本文件夹,再分段上传的方法,网络通信量仅占到传统方法的二分之一弱,极大的缓解了网络压力。使用类对批量上传文件夹进行压缩,部分代码如下所示:Private