RFID課程設(shè)計_第1頁
RFID課程設(shè)計_第2頁
RFID課程設(shè)計_第3頁
RFID課程設(shè)計_第4頁
RFID課程設(shè)計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 Central South UniversityRFID課程設(shè)計 學(xué)院: 信息科學(xué)與工程學(xué)院 班級: 學(xué)號: 導(dǎo)師: 前 言 目前,很多企業(yè)倉庫管理還是停留在手工操作的基礎(chǔ)上,這樣的傳統(tǒng)的倉庫管理,一般依賴于一個非自動化的、以紙張文件為基礎(chǔ)的系統(tǒng)來記錄、追蹤進(jìn)出的貨物,完全由人工實施倉庫內(nèi)部的管理,因此倉庫管理的效率極其低下,所能管理的倉庫規(guī)模也很小。隨著計算機(jī)的應(yīng)用普及,目前大多數(shù)企業(yè)的倉庫管理數(shù)據(jù)資料已開始采用計算機(jī)數(shù)據(jù)系統(tǒng)管理,但數(shù)據(jù)還是采用先紙張記錄、再手工輸入計算機(jī)的方式進(jìn)行采集和統(tǒng)計整理。這不僅造成大量的人力資源浪費(fèi),而且由于人為的因素,數(shù)據(jù)錄入速度慢、準(zhǔn)確率低。隨著企業(yè)規(guī)模的不

2、斷發(fā)展,倉庫管理的物資種類機(jī)數(shù)量在不斷增加、出入庫頻率劇增,倉庫管理作業(yè)也已十分復(fù)雜和多樣化,傳統(tǒng)的人工倉庫作業(yè)模式和數(shù)據(jù)采集方式已難以滿足倉庫管理的快速、準(zhǔn)確要求,嚴(yán)重影響了企業(yè)的運(yùn)行工作效率,成為制約企業(yè)發(fā)展的一大障礙。 目前RFID技術(shù)正在為供應(yīng)鏈領(lǐng)域帶來一場巨大的變革,以識別距離遠(yuǎn),快速,不易損壞,容量大等條碼無法比擬的優(yōu)勢,簡化繁雜的工作流程,有效改善供應(yīng)鏈的效率和透明度?;赗FID 的倉庫管理系統(tǒng)是在現(xiàn)有倉庫管理中引入RFID 技術(shù),對倉庫到貨檢驗、入庫、出庫、調(diào)撥、移庫移位、庫存盤點(diǎn)等各個作業(yè)環(huán)節(jié)的數(shù)據(jù)進(jìn)行自動化的數(shù)據(jù)采集,保證倉庫管理各個環(huán)節(jié)數(shù)據(jù)輸入的速度和準(zhǔn)確性,確保企業(yè)及

3、時準(zhǔn)確地掌握庫存的真實數(shù)據(jù),合理保持和控制企業(yè)庫存。通過科學(xué)的編碼,還可方便地對物品的批次、保質(zhì)期等進(jìn)行管理。利用系統(tǒng)的庫位管理功能,更可以及時掌握所有庫存物資當(dāng)前所在位置,有利于提高倉庫管理的工作效率。一、 實現(xiàn)目標(biāo)·在本方案中,速度、效率、正確率、信息的整合是重點(diǎn)追求的目標(biāo)。主要在于提高倉庫管理正確性、管理精度及操作的方便性; ·在倉庫管理系統(tǒng)中融入RFID技術(shù),應(yīng)用貨物包裝、貨位二種電子標(biāo)簽來輔助進(jìn)行倉庫管理,提高企業(yè)效率;·最小包裝單位管理,即存儲的每一最小包裝單位都有唯一標(biāo)示,為庫存精細(xì)管理提供支持;·記錄各種零部件入庫上架、進(jìn)出數(shù)量、位置等記

4、錄;在倉位標(biāo)簽中記錄零部件變動信息(種類、數(shù)量、等),以跟蹤倉庫貨物,提高入、出、存、移的正確率,減少在日常工作中對人的依賴性,降低人為失誤;·在移庫移倉管理上,倉管人員可根據(jù)電子標(biāo)簽進(jìn)行貨物快速定位并自動在系統(tǒng)中調(diào)整倉位;·在庫存盤點(diǎn)中,脫離單據(jù)提高盤點(diǎn)效率,不僅盤點(diǎn)庫存數(shù)量而且盤點(diǎn)位置并保證貨物與位置(倉位)對應(yīng)得正確率,并能在平時隨時進(jìn)行區(qū)域盤點(diǎn),在日常倉庫工作中保證庫存的正確,尤其可以在入出正常的時候進(jìn)行盤點(diǎn)工作;·有效區(qū)分實物庫存及列帳庫存,有效管理票、物時間差,方便倉庫與財務(wù)對賬。2、 系統(tǒng)構(gòu)成RFID系統(tǒng)由“RFID電子標(biāo)簽(RFID Tag)”、“

5、讀寫器(天線控制器)”、“PC等高級設(shè)備”這三要素構(gòu)成?!癛FID Tag”由可保存大量數(shù)據(jù)的IC芯片及天線構(gòu)成,根據(jù)“PC等高級設(shè)備”的指令,保存在RFID芯片中的數(shù)據(jù)可由“讀寫器”讀取或擦寫。(1)RFID電子標(biāo)簽內(nèi)置全球唯一ID,并擁有96bit/240Bit空間存儲用戶定制信息;防水,防油污;使用壽命長;讀取距離長,標(biāo)簽數(shù)據(jù)可以加密,且信息防篡改;標(biāo)簽可擦寫,可循環(huán)利用 (2)遠(yuǎn)距離讀寫器采用串口與電腦通信;RFID標(biāo)簽非接觸式的進(jìn)行讀取貨物信息,準(zhǔn)確率為98高。讀寫距離遠(yuǎn)標(biāo)準(zhǔn)、符合FCC條例;讀取性能可靠。(3)管理軟件倉庫系統(tǒng)管理軟件采用原有SAP管理軟件結(jié)合新WCS系統(tǒng),系統(tǒng)中標(biāo)

6、簽數(shù)據(jù)的讀寫、相關(guān)設(shè)備的控制以及與新倉庫管理軟件的數(shù)據(jù)接口通過采用國際先進(jìn)的RFID 中間件實現(xiàn)。RFID 中間件采用三層結(jié)構(gòu)體系,即虛擬硬件層、數(shù)據(jù)處理層和應(yīng)用接口層。1) 虛擬硬件層:通過虛擬硬件的方法實現(xiàn)對RFID 硬件設(shè)備的參數(shù)設(shè)定和操作管理。這一層,RFID 硬件控制器提供了對RFID 讀寫器以及其它RFID 設(shè)備的控制。具體有以下一些功能: · 支持RFID 設(shè)備的在線和離線兩種連接方式; ·RFID 硬件設(shè)備的驅(qū)動以及讀寫控制。2) 數(shù)據(jù)處理層:這一層實現(xiàn)了對數(shù)據(jù)的處理工作,對數(shù)據(jù)的處理工作通過RFID 數(shù)據(jù)控制器來實現(xiàn),應(yīng)用到了數(shù)據(jù)庫等,

7、RFID 數(shù)據(jù)控制器的作用是:·從RFID 硬件控制器讀取標(biāo)簽數(shù)據(jù);·將數(shù)據(jù)傳送給RFID 硬件控制器;·進(jìn)行數(shù)據(jù)格式的轉(zhuǎn)換、數(shù)據(jù)重組、過濾和分析等數(shù)據(jù)處理工作。3) 應(yīng)用接口層:應(yīng)用接口層是原有倉庫管理軟件與RFID 系統(tǒng)交互的通道。這一層的服務(wù)有RFID 前置服務(wù)、應(yīng)用集成服務(wù)以及EPC 信息服務(wù)。它們實現(xiàn)的功能為   RFID 前置服務(wù):為所有的RFID 控制器提供支持,擔(dān)當(dāng)了所有RFID 控制器的主控制器功能;üRFID 是整個倉庫RFID 管理系統(tǒng)的數(shù)據(jù)和網(wǎng)絡(luò)連接的中心點(diǎn);RFID 前置服務(wù)也擔(dān)負(fù)著對RFID 管理系統(tǒng)的業(yè)務(wù)

8、流程的監(jiān)控的功能(類似于EJB對象對業(yè)務(wù)邏輯的監(jiān)控);  RFID 前置服務(wù)也為用戶提供了http以及數(shù)據(jù)檢索等方法的支持;RFID 也擔(dān)當(dāng)之于應(yīng)用集成服務(wù)進(jìn)行數(shù)據(jù)交互服務(wù)的功能。三、實驗流程(1) 入庫流程功能要求·查詢功能·非計劃入庫輸入功能·上架單生成功能(越庫中轉(zhuǎn)采用虛擬庫位)·上架執(zhí)行功能·入庫單關(guān)閉功能基本步驟 第一步 到貨后倉庫驗收:事務(wù)員等待質(zhì)保人員驗收貨物后需要進(jìn)行產(chǎn)品品種、數(shù)量的核對。這部分工作可以由手持終端來完成的。首先將所有本次進(jìn)貨的單據(jù)、產(chǎn)品信息下載到手持終端中,手持終端將提示材料管理員輸入購貨單的號碼。材料

9、管理員首先識讀這個電子標(biāo)簽ID號,然后手持終端的系統(tǒng)判斷這個電子標(biāo)簽是否正確,如果不正確,系統(tǒng)立刻向材料管理員做出警示;如果正確,材料管理員再掃描所購材料單上的項目號,系統(tǒng)隨后檢查購貨單上的項目是否與實際進(jìn)貨相符。接著,材料管理員掃描物料規(guī)格信息、批次條碼和標(biāo)識號的電子標(biāo)簽等。這個標(biāo)識號唯一標(biāo)識購入的這件物料,作為一個最基本的信息用于以后所有的庫存管理環(huán)節(jié)中。如果有不符合訂貨要取的物料,系統(tǒng)將給出相應(yīng)的信息。同時需要將驗收后的相關(guān)信息如批次、數(shù)量、生產(chǎn)日期等傳送給RFID系統(tǒng);第二步 初始化貨物標(biāo)簽:計算機(jī)需要根據(jù)入數(shù)計算共需多少標(biāo)簽生成標(biāo)簽入庫指示清單,將根據(jù)入庫預(yù)報單中的供應(yīng)商代碼、貨物代

10、碼、訂單號、批次、數(shù)量(驗收后的實際數(shù)量)等按照最小庫存包裝單位寫入電子貨物標(biāo)簽(以便可跟蹤具體入庫包裝貨物的采購情況,當(dāng)然還要考慮標(biāo)簽容量,同時要記錄UID號,建立數(shù)據(jù)關(guān)聯(lián));同時根據(jù)規(guī)則指示入庫倉位:規(guī)則指如能互相替換的物料、經(jīng)常一起配套出庫的物料等盡可能放在一起(需要在基礎(chǔ)數(shù)據(jù)初始化中設(shè)置該規(guī)則),將指示的倉位同時寫入貨物標(biāo)簽,以利于上架時比對倉位是否放置正確;將含倉位指示的單據(jù)信息(倉位布置單)傳給手持終端;寫好信息的標(biāo)簽根據(jù)清單安裝到包裝貨物包裝上;第三步 上架確認(rèn)有如下兩種方式:根據(jù)指示上架確認(rèn):上架工查找倉位(掃描倉位標(biāo)簽,與入庫清單中的相同,則表示找到,也可以通過在標(biāo)簽上印刷倉

11、位號,人工查找),找到后將入庫貨物上架,掃描上架貨物電子標(biāo)簽,確認(rèn)該倉位上上架貨物正確,上架確認(rèn)完畢后在手持機(jī)中該標(biāo)簽序號的紀(jì)錄打上入庫標(biāo)記,防止重復(fù)確認(rèn)。入庫數(shù)據(jù)一般根據(jù)代碼、批次、質(zhì)檢日期(入庫日期)、質(zhì)檢標(biāo)準(zhǔn)、標(biāo)簽UID號等不同在系統(tǒng)中作不同記錄(即使在同一倉位上);由于UID號與貨物代碼、訂單號、數(shù)量關(guān)聯(lián),所以可以只比對倉位號、UID號;第四步 更新倉位標(biāo)簽:指用手持機(jī)更新倉位標(biāo)簽中當(dāng)前記載的該貨物編碼、數(shù)量。第五步 事務(wù)員將手持機(jī)中該單據(jù)入庫數(shù)據(jù)上傳至RFID系統(tǒng)中,完成庫存更新及入庫流水賬記錄。(2) 領(lǐng)料出貨流程功能要求·查詢功能·非計劃出庫輸入功能·

12、;揀貨單生成功能(越庫中轉(zhuǎn)采用虛擬庫位)· 揀貨單執(zhí)行功能· 出庫確認(rèn)功能(門式設(shè)備完成,連接PC終端)基本步驟第一步 生成揀貨單數(shù)據(jù):操作員在RFID系統(tǒng)中根據(jù)出庫單生成揀選單(倉位按出庫路線排列),含領(lǐng)料單號、揀選倉位、貨物代碼、供應(yīng)商代碼、批號、整包裝數(shù)量(整包裝指RFID管理的最小包裝單位)、散數(shù)散數(shù)與整包裝數(shù)為兩條紀(jì)錄即使同一倉位、同一貨物。倉位的揀選按照倉庫類型進(jìn)行先入先出控制(根據(jù)入庫日期、批次或質(zhì)檢日期等)。第二步 領(lǐng)料揀選:揀選工將揀選單下載到手持機(jī)中,通過掃描貨物標(biāo)簽,將掃描到的貨物標(biāo)簽倉位信息、代碼信息與揀選單中的比對,如一致,則表示揀選正確,分為:整

13、包裝取貨,則直接從揀選單的整包裝數(shù)量中扣除該標(biāo)簽中紀(jì)錄數(shù)量,同時該序號的標(biāo)簽在手持機(jī)中被打上標(biāo)記,防止重復(fù)掃描,該標(biāo)簽回收;拆零揀貨,則按照揀選單的散數(shù)確認(rèn),同時將散數(shù)從貨物標(biāo)簽記載的數(shù)量中扣除。第三步 更新倉位標(biāo)簽:指取貨后更新倉位標(biāo)簽中的該貨物的當(dāng)前數(shù)量。要求工作人員進(jìn)行寫貨位標(biāo)簽的操作,將更改后的貨物數(shù)據(jù)寫回到貨位標(biāo)簽。直至完成此貨位揀貨的全部操作;出庫確認(rèn):工作人員進(jìn)行出庫檢驗,掃描配送箱或容器上的電子標(biāo)簽(單號條碼、貨物條碼、數(shù)量條碼、客戶條碼等)或電子標(biāo)簽,確認(rèn)與配送單(出庫單一致),完成出庫的確認(rèn)工作(貝嶺成品庫可能需要,也是一般企業(yè)需要的最后一步)。最后,操作員將手持機(jī)中的揀選

14、確認(rèn)單數(shù)據(jù)上傳至RFID系統(tǒng)中,完成庫存更新及出庫流水賬記錄。成品庫可以根據(jù)揀選確認(rèn)結(jié)果打印出庫裝箱單(配送單)及外包裝電子標(biāo)簽。(3) 盤點(diǎn)流程功能要求·查詢功能·貨物盤點(diǎn)啟動功能·盤點(diǎn)執(zhí)行功能· 盤點(diǎn)差異查詢打印功能·盤點(diǎn)復(fù)核確認(rèn)功能基本步驟下載盤點(diǎn)數(shù)據(jù)至盤點(diǎn)機(jī)(即離線手持終端):掃描倉位標(biāo)簽:由于倉位標(biāo)簽中記載該倉位上所有貨物信息,平時可以隨時隨地通過掃描貨物標(biāo)簽及倉位標(biāo)簽,來快速盤點(diǎn)貨物的位置及數(shù)量是否正確;當(dāng)正式盤點(diǎn)時掃描貨物標(biāo)簽以標(biāo)簽中貨物的數(shù)量作理論數(shù)量(不顯示),人工盤點(diǎn)實物后在手持機(jī)上記錄實際數(shù)量;同時掃描過的貨物標(biāo)簽在手持終

15、端中做好標(biāo)記,防止重復(fù)掃描比對處理。(假設(shè)貨物標(biāo)簽中不記錄數(shù)量,由于對每一個貨位中的貨物,其數(shù)量在每次更改后都會記錄在貨位標(biāo)簽中,因此貨位標(biāo)簽中記錄的數(shù)據(jù)與系統(tǒng)后端數(shù)據(jù)庫中的數(shù)據(jù)是一致的。所以盤點(diǎn)工作流程可以為:(1)工作人員通過手持設(shè)備掃描貨位標(biāo)簽取得此貨位中貨物的理論數(shù)量(此數(shù)據(jù)不會顯示),然后系統(tǒng)將提示盤點(diǎn)員進(jìn)行下一步操作;(2)盤點(diǎn)員使用手持設(shè)備讀取貨物的標(biāo)簽或標(biāo)簽取得貨物編碼,盤點(diǎn)實物以后輸入其數(shù)量;(3)手持系統(tǒng)會將此數(shù)據(jù)與理論數(shù)量進(jìn)行核對,從而可以立刻獲得此倉位的貨物數(shù)量是否正確;)操作員根據(jù)初次盤點(diǎn)數(shù)據(jù)過濾出差異表:如果僅是倉位放置錯誤,數(shù)量正確,則根據(jù)情況決定是否需要調(diào)整(如

16、移倉);如果數(shù)量出現(xiàn)錯誤,則需要過濾出出錯的倉位、貨物列表以便復(fù)盤。盤點(diǎn)工根據(jù)差異表復(fù)盤:一般復(fù)盤需要手工盤點(diǎn),直至盤點(diǎn)結(jié)果得到確認(rèn)。事務(wù)員開立調(diào)整單:將實際盤點(diǎn)的結(jié)果傳輸?shù)絉FID系統(tǒng)中,經(jīng)確認(rèn)發(fā)現(xiàn)系統(tǒng)庫存與實際庫存發(fā)生不一致,若在ERP中需要調(diào)整履歷的,則直接在RFID中處理。若貨架中的每件貨物(庫存最小單位)上都貼RFID標(biāo)簽,要求每個貨位都有其專用的天線(智能貨架)。則可以:(1)在后端系統(tǒng)中開始一個新的盤點(diǎn)操作。(2)管理系統(tǒng)通過開啟指定貨位的專用天線,得到該貨位中實際存放的貨物的明細(xì)信息。(3)后端管理系統(tǒng)通過核對系統(tǒng)數(shù)據(jù)和實際數(shù)據(jù)完成對指定貨位的盤點(diǎn)。(4)其他模塊(系統(tǒng)維護(hù)及基

17、本信息處理)該模塊基本包括以下功能:·入出庫履歷查詢· 庫存查詢·庫存分布查詢·封倉管理因為某種原因,該庫位上貨物進(jìn)行封倉處理,不能進(jìn)行揀貨處理直至解封。·庫位查詢根據(jù)貨物查該貨物的庫位分布;根據(jù)庫位區(qū)域查該庫位區(qū)域中貨物的分布;·B/S結(jié)構(gòu)圖形化庫存、庫位查詢功能在內(nèi)部網(wǎng)絡(luò)中用瀏覽器方式加上用圖形化的表現(xiàn)方式展現(xiàn)倉庫中庫位、貨物的分布信息,方便各級人員查詢操作。·庫存成本計算、價格查詢功能·數(shù)據(jù)上下傳、同步功能· 基本信息維護(hù)模塊貨物基本信息、庫位信息、庫位、安全庫存設(shè)定、庫位最大存放量、庫位與貨物綁定

18、設(shè)置等只影響本系統(tǒng)的信息維護(hù)。·標(biāo)簽標(biāo)識打印功能打印標(biāo)簽標(biāo)識,與RFID封裝在一起,方便人工辨識,該標(biāo)識必須易于更換。·標(biāo)簽損壞處理功能當(dāng)貨物標(biāo)簽不能正常讀取時,系統(tǒng)支持重新生成新標(biāo)簽替換的功能。·與終端設(shè)備的接口通過專用接口及中間件完成與設(shè)備的集成。·身份認(rèn)證主要是人員角色定義,權(quán)限控制,登陸認(rèn)證等功能。4、 實驗源代碼Sale函數(shù)#include "stdafx.h"#include "SqlUtil.h"#include "Sales.h"#include <iostream>

19、#include <string>#include <cstring>#include <cstdlib>#include <iomanip>#include <cstdio>#include <ctime>#include <math.h>#include "CommandLib.h"using namespace std;SaleManager:SaleManager()sqlUtil=new ADOConn();sqlUtil->OnInitADOConn();cout<&

20、lt;"開始打開數(shù)據(jù)庫連接."<<endl;UHFreader=new CommandLib(".COM4");UHFreader->setUserFreq(902.750, 927.250, 0.500, -40, 0, 1, 400, 0x03);/*獲取RFID的EPC*/int SaleManager:getRfieEpc(unsigned char* &EPC,int* &EPCLen)unsigned char lenc = 0;unsigned char *tagInfo=0; int tagNum; /i

21、nt* EPCLen;int ret=1;while(!UHFreader->getInventory(EPC, tagNum, EPCLen);system("cls");cout<<"讀到"<<tagNum<<"張卡."<<endl;cout<<"len:"<<EPCLen0<<endl;for(int i=0;i<tagNum;i+)cout<<"第"<<i+1<&

22、lt;"張卡EPC號為: "for(int j=0;j<EPCLeni;j+)printf("%.2x ",EPCij);cout<<endl;return tagNum;/*添加物品*/bool SaleManager:addProduct()bool flag=false;unsigned char* EPC=0;int* EPCLen=0;int tagNum=this->getRfieEpc(EPC,EPCLen);_bstr_t sql=""char sqltmp200;char name50;cha

23、r buf20;float price;char EPCOne50;char birthday50;for(int i=0;i<tagNum;i+)cout<<"請輸入商品名:"<<endl;cin>>namecout<<"請輸入商品價格:"<<endl;cin>>buf;price=atof(buf);cout<<"生產(chǎn)日期:"<<endl;cin>>birthday; /*time_t now; time(&n

24、ow); struct tm tmTmp; localtime_s(&tmTmp,&now); sprintf_s(birthday,"%d-%d-%d %d:%d:%d.000n",tmTmp.tm_year+1900,tmTmp.tm_mon+1,tmTmp.tm_mday,tmTmp.tm_hour,tmTmp.tm_min,tmTmp.tm_sec);cout<<birthday<<endl;for(j=0;j<EPCLeni;j+)printf("%02x",EPCij);EPCOnej=EPCij

25、+48;*/sprintf_s(EPCOne,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",EPCi0,EPCi1,EPCi2,EPCi3,EPCi4,EPCi5,EPCi6,EPCi7,EPCi8,EPCi9,EPCi10,EPCi11)sprintf_s(sqltmp,"insert into product(EPC,name,price,pdate,num) values('%s','%s',%f,'%s',1)",EPCOne,name,pri

26、ce,birthday);/cout<<sqltmp<<endl;sql=_bstr_t(sqltmp);flag=this->sqlUtil->ExecuteSQL(sql);cout<<"執(zhí)行結(jié)束!"<<endl;if(flag)cout<<"插入數(shù)據(jù)成功!"<<endl;elsecout<<"插入數(shù)據(jù)失敗。"<<endl;return true;/*銷售物品*/bool SaleManager:saleProduct()c

27、har buf100;unsigned char* EPC=NULL;char EPCOne50;int* EPCLen=0;char name30;cout<<"請輸入售貨員的姓名:"<<endl;cin>>name;int tagNum=this->getRfieEpc(EPC,EPCLen);for(int i=0;i<tagNum;i+)sprintf_s(EPCOne,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",EPCi0,EPCi1,EP

28、Ci2,EPCi3,EPCi4,EPCi5,EPCi6,EPCi7,EPCi8,EPCi9,EPCi10,EPCi11);sprintf_s(buf,"select * from product where num=1 and EPC='%s'",EPCOne);_bstr_t sql=_bstr_t(buf);_RecordsetPtr rsp=sqlUtil->GetRecordSet(sql);this->showProductData(rsp);sprintf_s(buf,"insert into sale values(

29、9;%s','%s',getdate()",EPCOne,name);this->sqlUtil->ExecuteSQL(buf);sprintf_s(buf,"update product set num=0 where EPC='%s'",EPCOne);/cout<<buf<<endl;this->sqlUtil->ExecuteSQL(buf);cout<<"交易完成!"<<endl;return true;/*獲取當(dāng)前系統(tǒng)時

30、間*/void SaleManager:getCurrentDateTime(char* &dateTimeStr)time_t now; time(&now); / 定義兩個變量,存儲轉(zhuǎn)換結(jié)果 struct tm tmTmp; char stTmp50; localtime_s(&tmTmp,&now); sprintf_s(stTmp,"%d-%d-%d %d:%d:%d.000n",tmTmp.tm_year+1900,tmTmp.tm_mon+1,tmTmp.tm_mday,tmTmp.tm_hour,tmTmp.tm_min,tmT

31、mp.tm_sec); dateTimeStr=stTmp; memcpy(dateTimeStr,stTmp,sizeof(stTmp); cout<<"生成的日期是:"<<dateTimeStr<<endl; /*顯示商品庫存量*/bool SaleManager:displayProduct()_bstr_t sql="select * from product where num=1"_RecordsetPtr rsp=sqlUtil->GetRecordSet(sql);showProductData(

32、rsp);return true;void SaleManager:showProductData(_RecordsetPtr rsp)try rsp->MoveFirst();while(!rsp->adoEOF) string epc=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("EPC")->Value);string name=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("name")->Va

33、lue);string price=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("price")->Value);string birthday=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("pdate")->Value);cout<<"產(chǎn)品名:"<<name<<setw(2)<<"價格:"<<price<&

34、lt;setw(2)<<"生產(chǎn)日期:"<<birthday<<endl;rsp->MoveNext();catch (_com_error &e)cout << e.Description()<<endl;/*顯示銷售額*/bool SaleManager:displaySale()_bstr_t sql="select name,price,pdate from product where num=0"/_bstr_t sql1="select name,count(p

35、rice) from product where num =0 group by name"_RecordsetPtr rsp=sqlUtil->GetRecordSet(sql);/_RecordsetPtr rsp1=sqlUtil->GetRecordSet(sql1);cout<<"查詢結(jié)果:"<<endl;try rsp->MoveFirst();while(!rsp->adoEOF) string epc=(char*)(_bstr_t)(rsp->Fields->GetItem(_varia

36、nt_t("product.Epc")->Value);string name=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("name")->Value);string price=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("price")->Value);string saleDay=(char*)(_bstr_t)(rsp->Fields->GetItem(_varia

37、nt_t("saledate")->Value);string user=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("saleMan")->Value);string birthday=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("pdate")->Value);cout<<"產(chǎn)品名:"<<name<<setw(3)<<

38、;"價格:"<<price<<setw(3)<<endl;rsp->MoveNext();catch (_com_error &e)sqlUtil->ExitConnect();cout << e.Description()<<endl;/*try rsp1->MoveFirst();while(!rsp1->adoEOF) string name=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("name&qu

39、ot;)->Value);string price=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("sum(price)")->Value);cout<<"name:"<<name<<"price:"<<price<<endl;rsp1->MoveNext();catch (_com_error &e)sqlUtil->ExitConnect();cout << e.D

40、escription()<<endl;*/return true;/*顯示主菜單*/int SaleManager:displayMenu()printf("n*n");printf("* 主菜單 * * * n");printf("* 1.添加商品 | 2.銷售商品 * n");printf("* 3.查看商品 | 4.查看銷售 * n");printf("* 5.清空屏幕 | 6.退出程序 * n");printf("*n");int choice=0;cin

41、>>choice;return choice;接口函數(shù)/ COPYRIGHT NOTICE/ Copyright (c) 2011, 上海交通大學(xué) 物聯(lián)網(wǎng)實驗室 (版權(quán)聲明)/ All rights reserved./ file SerialPort.cpp / brief 串口通信類的實現(xiàn)文件/ 本文件為串口通信類的實現(xiàn)代碼/ version 1.0 / author 陳杰 / E-mail:chjie/ date 2011/04/19/ 修訂說明:/#include "stdafx.h"#include "SerialPort.h"#i

42、nclude <process.h>#include <iostream>using namespace std;/* 線程退出標(biāo)志 */ bool CSerialPort:s_bExit = false;/* heartBeat線程退出標(biāo)志 */bool CSerialPort:s_bHBExit = false;/* 當(dāng)串口無數(shù)據(jù)時,sleep至下次查詢間隔的時間,單位:秒 */ const UINT SLEEP_TIME_INTERVAL = 5;/char buffer100;char *buffer;int accum;/bool ocpMark;/bool

43、flag = false;/bool invFlag = false;CSerialPort:CSerialPort(const char *portName): m_hListenThread(INVALID_HANDLE_VALUE)/類給成員變量賦值/ if(pro_Flag!=0)/ return; m_hComm = INVALID_HANDLE_VALUE;/INVALID_HANDLE_VALUEm_hListenThread = INVALID_HANDLE_VALUE; o_eCode = 0; buffer = NULL;InitializeCriticalSection(

44、&m_csCommunicationSync); if (!InitPort(portName) if(5=o_eCode) OcpMark:instance()->setVal(true); cout << "initPort fail !" << endl;/ exit(-1);elsecout << "initPort success !" << endl;if (!OpenListenThread() cout << "OpenListenThread fail

45、!" << endl;else cout << "OpenListenThread success !" <<endl;CSerialPort:CSerialPort(void)/對應(yīng)構(gòu)造函數(shù),稱為析構(gòu)函數(shù),在對象銷毀時調(diào)用CloseListenTread();ClosePort(); delete buffer; OcpMark:instance()->setVal(false);DeleteCriticalSection(&m_csCommunicationSync);bool CSerialPort:Init

46、Port( const char *portName /*= 1*/,UINT baud /*= CBR_115200*/,char parity /*= 'N'*/, UINT databits /*= 8*/, UINT stopsbits /*= 1*/,DWORD dwCommEvents /*= EV_RXCHAR*/ )/* 臨時變量,將制定參數(shù)轉(zhuǎn)化為字符串形式,以構(gòu)造DCB結(jié)構(gòu) */ char szDCBparam50;sprintf_s(szDCBparam, "baud=%d parity=%c data=%d stop=%d", baud

47、, parity, databits, stopsbits);/* 打開指定串口,該函數(shù)內(nèi)部已經(jīng)有臨界區(qū)保護(hù),上面請不要加保護(hù) */ if (!openPort(portName)return false;/* 進(jìn)入臨界段 */ EnterCriticalSection(&m_csCommunicationSync);/* 是否有錯誤發(fā)生 */ BOOL bIsSuccess = TRUE; /* 在此可以設(shè)置輸入輸出的緩沖區(qū)大小,如果不設(shè)置,則系統(tǒng)會設(shè)置默認(rèn)值. * 自己設(shè)置緩沖區(qū)大小時,要注意設(shè)置稍大一些,避免緩沖區(qū)溢出 */*if (bIsSuccess )bIsSuccess

48、= SetupComm(m_hComm,10,10);*/* 設(shè)置串口的超時時間,均設(shè)為0,表示不使用超時限制 */COMMTIMEOUTS CommTimeouts; CommTimeouts.ReadIntervalTimeout = 0; CommTimeouts.ReadTotalTimeoutMultiplier = 3; CommTimeouts.ReadTotalTimeoutConstant = 2000; CommTimeouts.WriteTotalTimeoutMultiplier = 3; CommTimeouts.WriteTotalTimeoutConstant =

49、 2000;if ( bIsSuccess)bIsSuccess = SetCommTimeouts(m_hComm, &CommTimeouts);DCB dcb;if ( bIsSuccess )/ 將ANSI字符串轉(zhuǎn)換為UNICODE字符串DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, szDCBparam, -1, NULL, 0);wchar_t *pwText = new wchar_tdwNum ;if (!MultiByteToWideChar (CP_ACP, 0, szDCBparam, -1, pwText, dwNum

50、)bIsSuccess = TRUE;/* 獲取當(dāng)前串口配置參數(shù),并且構(gòu)造串口DCB參數(shù) */ bIsSuccess = GetCommState(m_hComm, &dcb) && BuildCommDCB(pwText, &dcb) ;/* 開啟RTS flow控制 */ dcb.fRtsControl = RTS_CONTROL_ENABLE; /* 釋放內(nèi)存空間 */ delete pwText;if ( bIsSuccess )/* 使用DCB參數(shù)配置串口狀態(tài) */ bIsSuccess = SetCommState(m_hComm, &dcb

51、);/* 清空串口緩沖區(qū) */PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);/* 離開臨界段 */ LeaveCriticalSection(&m_csCommunicationSync);return bIsSuccess=TRUE;bool CSerialPort:InitPort( const char *portName ,const LPDCB& plDCB )/* 打開指定串口,該函數(shù)內(nèi)部已經(jīng)有臨界區(qū)保護(hù),上面請不要加保護(hù) */ if (!openP

52、ort(portName)return false;/* 進(jìn)入臨界段 */ EnterCriticalSection(&m_csCommunicationSync);/* 配置串口參數(shù) */ if (!SetCommState(m_hComm, plDCB)return false;/* 清空串口緩沖區(qū) */PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);/* 離開臨界段 */ LeaveCriticalSection(&m_csCommunicationSync

53、);return true;void CSerialPort:ClosePort()/* 如果有串口被打開,關(guān)閉它 */if( m_hComm != INVALID_HANDLE_VALUE )CloseHandle( m_hComm );m_hComm = INVALID_HANDLE_VALUE;bool CSerialPort:openPort( const char *portName )/* 進(jìn)入臨界段 */ EnterCriticalSection(&m_csCommunicationSync);/* 打開指定的串口 */ m_hComm = CreateFileA(por

54、tName, /* 設(shè)備名,COM1,COM2等 */ GENERIC_READ | GENERIC_WRITE, /* 訪問模式,可同時讀寫 */ 0, /* 共享模式,0表示不共享 */ NULL,/* 安全性設(shè)置,一般使用NULL */ OPEN_EXISTING,/* 該參數(shù)表示設(shè)備必須存在,否則創(chuàng)建失敗 */ 0, 0); /* 如果打開失敗,釋放資源并返回 */ if (m_hComm = INVALID_HANDLE_VALUE | m_hComm = (HANDLE)-1) o_eCode = GetLastError();LeaveCriticalSection(&m_csCommunicationSync);/ cout<<"exit3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論