RFID课程设计.docx
- 文档编号:11671688
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:36
- 大小:52.48KB
RFID课程设计.docx
《RFID课程设计.docx》由会员分享,可在线阅读,更多相关《RFID课程设计.docx(36页珍藏版)》请在冰豆网上搜索。
RFID课程设计
CentralSouthUniversity
RFID
课程设计
学院:
信息科学与工程学院
班级:
学号:
导师:
前言
目前,很多企业仓库管理还是停留在手工操作的基础上,这样的传统的仓库管理,一般依赖于一个非自动化的、以纸张文件为基础的系统来记录、追踪进出的货物,完全由人工实施仓库内部的管理,因此仓库管理的效率极其低下,所能管理的仓库规模也很小。
随着计算机的应用普及,目前大多数企业的仓库管理数据资料已开始采用计算机数据系统管理,但数据还是采用先纸张记录、再手工输入计算机的方式进行采集和统计整理。
这不仅造成大量的人力资源浪费,而且由于人为的因素,数据录入速度慢、准确率低。
随着企业规模的不断发展,仓库管理的物资种类机数量在不断增加、出入库频率剧增,仓库管理作业也已十分复杂和多样化,传统的人工仓库作业模式和数据采集方式已难以满足仓库管理的快速、准确要求,严重影响了企业的运行工作效率,成为制约企业发展的一大障碍。
目前RFID技术正在为供应链领域带来一场巨大的变革,以识别距离远,快速,不易损坏,容量大等条码无法比拟的优势,简化繁杂的工作流程,有效改善供应链的效率和透明度。
基于RFID的仓库管理系统是在现有仓库管理中引入RFID技术,对仓库到货检验、入库、出库、调拨、移库移位、库存盘点等各个作业环节的数据进行自动化的数据采集,保证仓库管理各个环节数据输入的速度和准确性,确保企业及时准确地掌握库存的真实数据,合理保持和控制企业库存。
通过科学的编码,还可方便地对物品的批次、保质期等进行管理。
利用系统的库位管理功能,更可以及时掌握所有库存物资当前所在位置,有利于提高仓库管理的工作效率。
一、实现目标
·在本方案中,速度、效率、正确率、信息的整合是重点追求的目标。
主要在于提高仓库管理正确性、管理精度及操作的方便性;
·在仓库管理系统中融入RFID技术,应用货物包装、货位二种电子标签来辅助进行仓库管理,提高企业效率;
·最小包装单位管理,即存储的每一最小包装单位都有唯一标示,为库存精细管理提供支持;
·记录各种零部件入库上架、进出数量、位置等记录;在仓位标签中记录零部件变动信息(种类、数量、等),以跟踪仓库货物,提高入、出、存、移的正确率,减少在日常工作中对人的依赖性,降低人为失误;
·在移库移仓管理上,仓管人员可根据电子标签进行货物快速定位并自动在系统中调整仓位;
·在库存盘点中,脱离单据提高盘点效率,不仅盘点库存数量而且盘点位置并保证货物与位置(仓位)对应得正确率,并能在平时随时进行区域盘点,在日常仓库工作中保证库存的正确,尤其可以在入出正常的时候进行盘点工作;
·有效区分实物库存及列帐库存,有效管理票、物时间差,方便仓库与财务对账。
二、系统构成
RFID系统由“RFID电子标签(RFIDTag)”、“读写器(天线+控制器)”、“PC等高级设备”这三要素构成。
“RFIDTag”由可保存大量数据的IC芯片及天线构成,根据“PC等高级设备”的指令,保存在RFID芯片中的数据可由“读写器”读取或擦写。
(1)RFID电子标签
内置全球唯一ID,并拥有96bit/240Bit空间存储用户定制信息;防水,防油污;使用寿命长;读取距离长,标签数据可以加密,且信息防篡改;标签可擦写,可循环利用
(2)远距离读写器
采用串口与电脑通信;RFID标签非接触式的进行读取货物信息,准确率为98高。
读写距离远标准、符合FCC条例;读取性能可靠。
(3)管理软件
仓库系统管理软件采用原有SAP管理软件结合新WCS系统,系统中标签数据的读写、相关设备的控制以及与新仓库管理软件的数据接口通过采用国际先进的RFID中间件实现。
RFID中间件采用三层结构体系,即虚拟硬件层、数据处理层和应用接口层。
1)虚拟硬件层:
通过虚拟硬件的方法实现对RFID硬件设备的参数设定和操作管理。
这一层,RFID硬件控制器提供了对RFID读写器以及其它RFID设备的控制。
具体有以下一些功能:
·支持RFID设备的在线和离线两种连接方式;
·RFID硬件设备的驱动以及读写控制。
2)数据处理层:
这一层实现了对数据的处理工作,对数据的处理工作通过RFID数据控制器来实现,应用到了数据库等,RFID数据控制器的作用是:
·从RFID硬件控制器读取标签数据;
·将数据传送给RFID硬件控制器;
·进行数据格式的转换、数据重组、过滤和分析等数据处理工作。
3)应用接口层:
应用接口层是原有仓库管理软件与RFID系统交互的通道。
这一层的服务有RFID前置服务、应用集成服务以及EPC信息服务。
它们实现的功能为
RFID前置服务:
为所有的RFID控制器提供支持,担当了所有RFID控制器的主控制器功能;
üRFID是整个仓库RFID管理系统的数据和网络连接的中心点;RFID前置服务也担负着对RFID管理系统的业务流程的监控的功能(类似于EJB对象对业务逻辑的监控);
RFID前置服务也为用户提供了http以及数据检索等方法的支持;RFID也担当之于应用集成服务进行数据交互服务的功能。
三、实验流程
(1)入库流程
功能要求
·查询功能
·非计划入库输入功能
·上架单生成功能(越库中转采用虚拟库位)
·上架执行功能
·入库单关闭功能
基本步骤
第一步到货后仓库验收:
事务员等待质保人员验收货物后需要进行产品品种、数量的核对。
这部分工作可以由手持终端来完成的。
首先将所有本次进货的单据、产品信息下载到手持终端中,手持终端将提示材料管理员输入购货单的号码。
材料管理员首先识读这个电子标签ID号,然后手持终端的系统判断这个电子标签是否正确,如果不正确,系统立刻向材料管理员做出警示;如果正确,材料管理员再扫描所购材料单上的项目号,系统随后检查购货单上的项目是否与实际进货相符。
接着,材料管理员扫描物料规格信息、批次条码和标识号的电子标签等。
这个标识号唯一标识购入的这件物料,作为一个最基本的信息用于以后所有的库存管理环节中。
如果有不符合订货要取的物料,系统将给出相应的信息。
同时需要将验收后的相关信息如批次、数量、生产日期等传送给RFID系统;
第二步初始化货物标签:
计算机需要根据入数计算共需多少标签生成标签入库指示清单,将根据入库预报单中的供应商代码、货物代码、订单号、批次、数量(验收后的实际数量)等按照最小库存包装单位写入电子货物标签(以便可跟踪具体入库包装货物的采购情况,当然还要考虑标签容量,同时要记录UID号,建立数据关联);同时根据规则指示入库仓位:
规则指如能互相替换的物料、经常一起配套出库的物料等尽可能放在一起(需要在基础数据初始化中设置该规则),将指示的仓位同时写入货物标签,以利于上架时比对仓位是否放置正确;将含仓位指示的单据信息(仓位布置单)传给手持终端;写好信息的标签根据清单安装到包装货物包装上;
第三步上架确认有如下两种方式:
根据指示上架确认:
上架工查找仓位(扫描仓位标签,与入库清单中的相同,则表示找到,也可以通过在标签上印刷仓位号,人工查找),找到后将入库货物上架,扫描上架货物电子标签,确认该仓位上上架货物正确,上架确认完毕后在手持机中该标签序号的纪录打上入库标记,防止重复确认。
入库数据一般根据代码、批次、质检日期(入库日期)、质检标准、标签UID号等不同在系统中作不同记录(即使在同一仓位上);由于UID号与货物代码、订单号、数量关联,所以可以只比对仓位号、UID号;
第四步更新仓位标签:
指用手持机更新仓位标签中当前记载的该货物编码、数量。
第五步事务员将手持机中该单据入库数据上传至RFID系统中,完成库存更新及入库流水账记录。
(2)领料出货流程
功能要求
·查询功能
·非计划出库输入功能
·拣货单生成功能(越库中转采用虚拟库位)
·拣货单执行功能
·出库确认功能(门式设备完成,连接PC终端)
基本步骤
第一步生成拣货单数据:
操作员在RFID系统中根据出库单生成拣选单(仓位按出库路线排列),含领料单号、拣选仓位、货物代码、供应商代码、批号、整包装数量(整包装指RFID管理的最小包装单位)、散数[散数与整包装数为两条纪录即使同一仓位、同一货物]。
仓位的拣选按照仓库类型进行先入先出控制(根据入库日期、批次或质检日期等)。
第二步领料拣选:
拣选工将拣选单下载到手持机中,通过扫描货物标签,将扫描到的货物标签仓位信息、代码信息与拣选单中的比对,如一致,则表示拣选正确,分为:
整包装取货,则直接从拣选单的整包装数量中扣除该标签中纪录数量,同时该序号的标签在手持机中被打上标记,防止重复扫描,该标签回收;拆零拣货,则按照拣选单的散数确认,同时将散数从货物标签记载的数量中扣除。
第三步更新仓位标签:
指取货后更新仓位标签中的该货物的当前数量。
要求工作人员进行写货位标签的操作,将更改后的货物数据写回到货位标签。
直至完成此货位拣货的全部操作;
出库确认:
工作人员进行出库检验,扫描配送箱或容器上的电子标签(单号条码、货物条码、数量条码、客户条码等)或电子标签,确认与配送单(出库单一致),完成出库的确认工作(贝岭成品库可能需要,也是一般企业需要的最后一步)。
最后,操作员将手持机中的拣选确认单数据上传至RFID系统中,完成库存更新及出库流水账记录。
成品库可以根据拣选确认结果打印出库装箱单(配送单)及外包装电子标签。
(3)盘点流程
功能要求
·查询功能
·货物盘点启动功能
·盘点执行功能
·盘点差异查询打印功能
·盘点复核确认功能
基本步骤
下载盘点数据至盘点机(即离线手持终端):
扫描仓位标签:
由于仓位标签中记载该仓位上所有货物信息,平时可以随时随地通过扫描货物标签及仓位标签,来快速盘点货物的位置及数量是否正确;当正式盘点时扫描货物标签以标签中货物的数量作理论数量(不显示),人工盘点实物后在手持机上记录实际数量;同时扫描过的货物标签在手持终端中做好标记,防止重复扫描比对处理。
(假设货物标签中不记录数量,由于对每一个货位中的货物,其数量在每次更改后都会记录在货位标签中,因此货位标签中记录的数据与系统后端数据库中的数据是一致的。
所以盘点工作流程可以为:
(1)工作人员通过手持设备扫描货位标签取得此货位中货物的理论数量(此数据不会显示),然后系统将提示盘点员进行下一步操作;
(2)盘点员使用手持设备读取货物的标签或标签取得货物编码,盘点实物以后输入其数量;
(3)手持系统会将此数据与理论数量进行核对,从而可以立刻获得此仓位的货物数量是否正确;)
操作员根据初次盘点数据过滤出差异表:
如果仅是仓位放置错误,数量正确,则根据情况决定是否需要调整(如移仓);如果数量出现错误,则需要过滤出出错的仓位、货物列表以便复盘。
盘点工根据差异表复盘:
一般复盘需要手工盘点,直至盘点结果得到确认。
事务员开立调整单:
将实际盘点的结果传输到RFID系统中,经确认发现系统库存与实际库存发生不一致,若在ERP中需要调整履历的,则直接在RFID中处理。
若货架中的每件货物(库存最小单位)上都贴RFID标签,要求每个货位都有其专用的天线(智能货架)。
则可以:
(1)在后端系统中开始一个新的盘点操作。
(2)管理系统通过开启指定货位的专用天线,得到该货位中实际存放的货物的明细信息。
(3)后端管理系统通过核对系统数据和实际数据完成对指定货位的盘点。
(4)其他模块(系统维护及基本信息处理)
该模块基本包括以下功能:
·入出库履历查询
·库存查询
·库存分布查询
·封仓管理
因为某种原因,该库位上货物进行封仓处理,不能进行拣货处理直至解封。
·库位查询
根据货物查该货物的库位分布;
根据库位区域查该库位区域中货物的分布;
·B/S结构图形化库存、库位查询功能
在内部网络中用浏览器方式加上用图形化的表现方式展现仓库中库位、货物的分布信息,方便各级人员查询操作。
·库存成本计算、价格查询功能
·数据上下传、同步功能
·基本信息维护模块
货物基本信息、库位信息、库位、安全库存设定、库位最大存放量、库位与货物绑定设置等只影响本系统的信息维护。
·标签标识打印功能
打印标签标识,与RFID封装在一起,方便人工辨识,该标识必须易于更换。
·标签损坏处理功能
当货物标签不能正常读取时,系统支持重新生成新标签替换的功能。
·与终端设备的接口
通过专用接口及中间件完成与设备的集成。
·身份认证
主要是人员角色定义,权限控制,登陆认证等功能。
四、实验源代码
Sale函数
#include"stdafx.h"
#include"SqlUtil.h"
#include"Sales.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include"CommandLib.h"
usingnamespacestd;
SaleManager:
:
SaleManager()
{
sqlUtil=newADOConn();
sqlUtil->OnInitADOConn();
cout<<"开始打开数据库连接..."< UHFreader=newCommandLib("\\\\.\\COM4"); UHFreader->setUserFreq(902.750,927.250,0.500,-40,0,1,400,0x03); } /* 获取RFID的EPC */ intSaleManager: : getRfieEpc(unsignedchar**&EPC,int*&EPCLen) { unsignedcharlenc=0; unsignedchar*tagInfo=0; inttagNum; //int*EPCLen; intret=1; while(! UHFreader->getInventory(EPC,tagNum,EPCLen)); system("cls"); cout<<"读到"< cout<<"len: "< for(inti=0;i { cout<<"第"< "; for(intj=0;j printf("%.2x",EPC[i][j]); cout< } returntagNum; } /* 添加物品 */ boolSaleManager: : addProduct() { boolflag=false; unsignedchar**EPC=0; int*EPCLen=0; inttagNum=this->getRfieEpc(EPC,EPCLen); _bstr_tsql=""; charsqltmp[200]; charname[50]; charbuf[20]; floatprice; charEPCOne[50]; charbirthday[50]; for(inti=0;i { cout<<"请输入商品名: "< cin>>name cout<<"请输入商品价格: "< cin>>buf; price=atof(buf); cout<<"生产日期: "< cin>>birthday; /*time_tnow; time(&now); structtmtmTmp; localtime_s(&tmTmp,&now); sprintf_s(birthday,"%d-%d-%d%d: %d: %d.000\n",tmTmp.tm_year+1900,tmTmp.tm_mon+1,tmTmp.tm_mday,tmTmp.tm_hour,tmTmp.tm_min,tmTmp.tm_sec); cout< for(j=0;j { printf("%02x",EPC[i][j]); EPCOne[j]=EPC[i][j]+48; }*/ sprintf_s(EPCOne,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",EPC[i][0],EPC[i][1],EPC[i][2],EPC[i][3],EPC[i][4],EPC[i][5],EPC[i][6],EPC[i][7],EPC[i][8],EPC[i][9],EPC[i][10],EPC[i][11]) sprintf_s(sqltmp,"insertintoproduct(EPC,name,price,pdate,num)values('%s','%s',%f,'%s',1)",EPCOne,name,price,birthday); //cout< sql=_bstr_t(sqltmp); flag=this->sqlUtil->ExecuteSQL(sql); cout<<"执行结束"< if(flag) { cout<<"插入数据成功"< }else { cout<<"插入数据失败。 。 。 "< } } returntrue; } /* 销售物品 */ boolSaleManager: : saleProduct() { charbuf[100]; unsignedchar**EPC=NULL; charEPCOne[50]; int*EPCLen=0; charname[30]; cout<<"请输入售货员的姓名: "< cin>>name; inttagNum=this->getRfieEpc(EPC,EPCLen); for(inti=0;i { sprintf_s(EPCOne,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",EPC[i][0],EPC[i][1],EPC[i][2],EPC[i][3],EPC[i][4],EPC[i][5],EPC[i][6],EPC[i][7],EPC[i][8],EPC[i][9],EPC[i][10],EPC[i][11]); sprintf_s(buf,"select*fromproductwherenum=1andEPC='%s'",EPCOne); _bstr_tsql=_bstr_t(buf); _RecordsetPtrrsp=sqlUtil->GetRecordSet(sql); this->showProductData(rsp); sprintf_s(buf,"insertintosalevalues('%s','%s',getdate())",EPCOne,name); this->sqlUtil->ExecuteSQL(buf); sprintf_s(buf,"updateproductsetnum=0whereEPC='%s'",EPCOne); //cout< this->sqlUtil->ExecuteSQL(buf); } cout<<"交易完成"< returntrue; } /* 获取当前系统时间 */ voidSaleManager: : getCurrentDateTime(char*&dateTimeStr) { time_tnow; time(&now); //定义两个变量,存储转换结果 structtmtmTmp; charstTmp[50]; localtime_s(&tmTmp,&now); sprintf_s(stTmp,"%d-%d-%d%d: %d: %d.000\n",tmTmp.tm_year+1900,tmTmp.tm_mon+1,tmTmp.tm_mday,tmTmp.tm_hour,tmTmp.tm_min,tmTmp.tm_sec); dateTimeStr=stTmp; memcpy(dateTimeStr,stTmp,sizeof(stTmp)); cout<<"生成的日期是: "< } /* 显示商品库存量 */ boolSaleManager: : displayProduct() { _bstr_tsql="select*fromproductwherenum=1"; _RecordsetPtrrsp=sqlUtil->GetRecordSet(sql); showProductData(rsp); returntrue; } voidSaleManager: : showProductData(_RecordsetPtrrsp) { try{ rsp->MoveFirst(); while(! rsp->adoEOF) { stringepc=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("EPC"))->Value); stringname=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("name"))->Value); stringprice=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("price"))->Value); stringbirthday=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("pdate"))->Value); cout<<"产品名: "< (2)<<"价格: "< (2)<<"生产日期: "< rsp->MoveNext(); } } catch(_com_error&e) { cout< } } /* 显示销售额 */ boolSaleManager: : displaySale() { _bstr_tsql="selectname,price,pdatefromproductwherenum=0"; //_bstr_tsql1="selectname,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RFID 课程设计