当前位置:文档之家› 基于RFID的仓库管理系统设计

基于RFID的仓库管理系统设计

摘要存储作为物流系统的一部分,它在原产地、消费地,或者在这两地之间存储管理物品,并且向管理者提供有关存储物品的状态、条件和处理情况等信息。

从物流发达国家来看,仓储在物流战略中的重要性日益提高,在物流管理中占据着核心的地位,并己成为供应链管理的核心环节。

供应链环境下的仓储管理涉及大量各类型的产品,同时对应的业务和结构比较复杂,对信息的准确性和及时性要求非常高。

目前,仓储管理通常使用条码标签或是人工仓储管理单据等方式。

但是条码的许多方面容易造成人为损失,使得现在国内的仓储管理始终存在着缺陷。

射频识别(RFID)技术是在无线电技术基础上,利用射频信号对静止或移动的物体进行自动识别和数据交换的技术。

RFID技术的优点使其在物料跟踪、运载工具和货架识别等要求非接触数据采集、交换和频繁改变数据,具有很大的发展潜力与前景。

本文针对传统的物流仓储管理存在的缺陷,利用RFID技术来解决传统物流仓储管理存在的问题,满足当前物流仓储管理的需要。

关键字:RFID,智能存储,信息技术前言物联网是新一代信息技术的重要组成部分。

其英文名称是“The Internet of things”。

顾名思义,“物联网就是物物相连的互联网”。

这有两层意思:第一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸扩展的网络;第二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信。

因此,物联网的定义是通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交换和通信,以实现对物品的智能化识别、定位、跟踪、监控和管理的一种网络。

射频技术(RFID)是一种世界上较为领先的自动识别技术,RFID射频识别是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无须人工干预,可工作于各种恶劣环境。

RFID技术可识别高速运动物体并可同时识别多标签,操作快捷方便。

RFID是一种突破性的技术:"第一,可以识别单个的非常具体的物体;第二,其采用无线电射频,可以透过外部材料读取数据;第三,可以同时对多个物体进行识读。

此外,储存的信息量也非常大。

目前该技术广范应用于以下领域,如身份识别、防伪、大型设备固定资产管理、药品物流识别、档案、车辆管理等诸多领域。

最基本的RFID系统由三部分组成:A、标签(有、无源):由耦合元件及芯片组成,每个标签具有唯一的电子编码,附着在物体上标识目标对象;B、读写器:读取(可以写入)标签信息的设备;C、天线:在标签和读取器间传递射频信号。

目录摘要关键字前言一.案例描述应用1.1系统特色及应用领域. (4)二.需求分析2.1.实验箱模块的选择 (5)2.2.开发语言的选择 (6)2.3.存储系统设计及分析 (8)三.整体描述和实现4.1.系统模块的连接 (9)4.2.系统模块的数据读写设计 (11)4.3.应用系统U I设计 (13)四.代码 (15)五.总结 (29)六.致谢 (30)参考文件 (31)一.案例描述1.1应用系统特色及应用领域信息的管理。

它不但增加了一天内处理货物的件数,还监看着这些货物的一切信息。

射频卡是贴在货物所通过的仓库大门边上,读写器和天线都放在叉车上,每个货物都贴有条码,所有条码信息都被存储在仓库的中心计算机里,该货物的有关信息都能在计算机里查到。

当货物被装走运往别地时,由另一读写器识别并告知计算机中心它被放在哪个拖车上。

这样管理中心可以实时地了解到已经生产了多少产品和发送了多少产品。

并可自动识别货物,确定货物的位置。

另外,从全球发展趋势来看,随着RFID相关技术的不断完善和成熟,RFID产业将成为一个新兴的高技术产业群,成为国民经济新的增长点。

因此,RFID技术有望成为推动现代物流加速发展的润滑剂。

二.需求分析:1、所有的设备均配备有唯一标识的RFID标签。

通过固定读写器和天线可以实现对货架上的所有设备进行进行实施的状态跟踪。

2、可通过手持机随时获取设备编码并查询设备相关信息。

3、可使用手持机在一定距离内对货架上的设备进行定位。

4、可以通过管理系统提供设备外借归还功能。

5、管理系统可以提供查询功能,可随时获知各设备的状态。

6、设备库房出入口配备有固定读写装置,当带有标签的设备在到达出入区域时,该设备的信息和进入时间将会被7、对于未办理外借手续的设备到达出入区域时,系统将会发出报警并记录。

8、系统配备有盘点功能,利用PDA可以实现对设备的快速盘点并生成盘点文件。

2.1实验箱模块的选择;高频RFID阅读器设计中选用高频阅读器模块,做基于高频RFID的实验室管理系统。

考虑到高频工作频率在3MHz~30MHz,典型频率为13.56MHz。

其工作范围比较大,性价比高,综合考虑采用高频RFID阅读器。

2.2开发语言的选择;Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。

VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。

比如,它允许用户进行远程调试,单步执行等。

还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。

其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。

这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。

Visual Studio 是微软公司推出的开发环境,Visual Studio 可以用来创建Windows 平台下的 Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office插件。

Visual Studio是目前最流行的Windows 平台应用程序开发环境。

Visual Studio 2008 包括各种增强功能,例如可视化设计器(使用 .NET Framework 3.5 加速开发)、对 Web 开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。

Visual Studio 2008 为开发人员提供了所有相关的工具和框架支持,帮助创建引人注目的、令人印象深刻并支持 AJAX 的Web应用程序。

[2]开发人员能够利用这些丰富的客户端和服务器端框架轻松构建以客户为中心的 Web应用程序,这些应用程序可以集成任何后端数据提供程序、在任何当前浏览器内运行并完全访问 ASP NET应用程序服务和 Microsoft 平台。

2.3存储系统设计及分析;SQL ServerSQL Server 是一个关系数据库管理系统。

它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本。

在Windows NT 推出后,Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了,Microsoft 将SQL Server 移植到Windows NT系统上,专注于开发推广SQL Server 的Windows NT 版本。

Sybase 则较专注于SQL Server在UNIX操作系统上的应用。

SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统,该版本继承了SQL Server 7.0 版本的优点,同时又比它增加了许多更先进的功能。

具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用。

三.整体描述和实现(在实验室搭建):3.1系统模块的连接3.2系统模块的数据读写设计1)建立数据库,2)建立信息存储表,3)通过DBMS连接SQL server,将开发软件vs2005通过ADO连接数据库,在系统中插入原始表,用来存储信息3.3应用系统UI设计1)系统流程分析根据物联网的结构定义和设备资产管理领域的实际情况,智能货架管理方案将根据功能划分为三层,即感知层、网络层和应用层,具体的系统结构如下图;如图所示,货架上各个设备均安装的RFID无源抗金属标签、货架上安装的固定读写器和天线组、PDA手持机、位于出入口的固定读写器及天线以及资产借还器组成了RFID智能货架管理系统,其工作原理和流程如下:2)系统UI设计四.代码// 课设.cpp : Defines the class behaviors for the application. //#include "RFID.h"#include " 智能货架.h"#include "智能货架Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////// //////////////////// CMyAppBEGIN_MESSAGE_MAP(CMyApp, CWinApp)//{{AFX_MSG_MAP(CMyApp)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////// //////////////////// CMyApp constructionCMyApp::CMyApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance }/////////////////////////////////////////////////////////// //////////////////// The one and only CMyApp objectCMyApp theApp;/////////////////////////////////////////////////////////// //////////////////// CMyApp initializationBOOL CMyApp::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from thefollowing// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endifCMyDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is// dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is// dismissed with Cancel}// Since the dialog has been closed, return FALSE so that we exit the// application, rather than start the application's message pump.return FALSE;}// 课设Dlg.cpp : implementation file//#include "stdafx.h"#include "课设.h"#include "课设Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////// //////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////// //////////////////// CMyDlg dialogCMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMyDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON4, OnButton4)//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON5, &CMyDlg::OnBnClickedButton5) END_MESSAGE_MAP()/////////////////////////////////////////////////////////// //////////////////// CMyDlg message handlersBOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CMyDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyDlg::OnButton4(){// TODO: Add your control notification handler code here// TODO: 在此添加控件通知处理程序代码UpdateData();m_srb1.Empty();m_srb2.Empty();m_srb3.Empty();m_srb4.Empty();m_srb5.Empty();m_srb6.Empty();m_srb7.Empty();UpdateData(FALSE);char cmd[256],reply[1024];if(!RFOn()){MessageBox(TEXT("RFID Filed On Failed"), 0, MB_ICONSTOP);return ;}if(hasTag()){strcpy(t22ipayloadbits,"0002");strcpy(t22spayload,"0");t22execcmd(WRITE_BASIC_MODE,cmd,reply);BOOL bok=TRUE;if(strstr(reply,"OK")){strcpy(t22ipayloadbits,"0224");t22execcmd(READ_SEQUE_START,cmd,reply);if(strstr(reply,"OK")){CString t1,t2;t1=reply;m_srb1=t1.Mid(7,8);m_srb2=t1.Mid(15,8);m_srb3=t1.Mid(23,8);m_srb4=t1.Mid(31,8);m_srb5=t1.Mid(39,8);m_srb6=t1.Mid(47,8);m_srb7=t1.Mid(55,8);}elsebok=FALSE;}elsebok=FALSE;if(!bok)AfxMessageBox(TEXT("Err"), MB_ICONSTOP, 0);}elseAfxMessageBox("There is no tag", MB_ICONSTOP, 0);RFOff();UpdateData(FALSE);}void CMyDlg::OnBnClickedButton5(){// TODO: 在此添加控件通知处理程序代码CWaitCursor wc;UpdateData();if(m_readeraddr.IsEmpty()){AfxMessageBox(TEXT("请输入读写器地址"), MB_ICONINFORMATION, 0);return ;}LPTSTR p = m_readeraddr.GetBuffer();char ccommno=*p;m_readeraddr.ReleaseBuffer();CString t;GetDlgItem(IDC_BTN_CONNECTTOREADER)->GetWindowText(t);if( TEXT("连接") == t){if(m_modsel != m_presel){if(!SetConfigInfo("HFExample",m_modsel))TRACE("Set HFExample Config info ERR\n");}DWORD newcom;newcom=_tcstoul(m_readeraddr,NULL,10);if(newcom != m_precom){if(!SetConfigInfo("HFExampleCom",newcom))TRACE("Set HFExampleCom Config info ERR\n");}if(m_modsel == 0) //网关模式{TCHAR _comm[10]={0};_stprintf_s(_comm ,9, TEXT("COM%c"),ccommno);CSelector seler(_comm);if(!seler.SelHF()){AfxMessageBox("HF模块未准备好", MB_ICONSTOP, 0);return ;}}if(!m_preader->ConnectToReader(m_readeraddr)){AfxMessageBox("连接失败", MB_ICONSTOP, 0);return ;}GetDlgItem(IDC_BTN_CONNECTTOREADER)->SetWindowText(TEXT( "断开"));GetDlgItem(IDC_BTN_CARDREAD)->EnableWindow(TRUE);GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);}else{if(m_preader->DisConnectFromReader()){GetDlgItem(IDC_BTN_CONNECTTOREADER)->SetWindowText(TEXT( "连接"));GetDlgItem(IDC_BTN_CARDREAD)->EnableWindow(FALSE);GetDlgItem(IDC_RADIO1)->EnableWindow();GetDlgItem(IDC_RADIO2)->EnableWindow();}}}五.总结通过对物流信息的课设,以及物流信息技术应用的基本情况的研究,我们发现,目前许多市场意识强的企业,已把物流作为提高市场竞争力和提升企业核心竞争力的重要手段,把现代先进的物流信息技术引入企业经营与管理之中,来提高经济效益。

相关主题