梁 林,沈明霞,*,彭增起,陳士進,吳海娟,王 衛,劉超超,諶啟亮
(1.南京農業大學工學院,江蘇南京210031; 2.南京農業大學農業部農畜產品加工與質量控制重點開放實驗室,江蘇南京210095)
基于串口通信的肉牛企業標簽打印系統的研究和設計
梁 林1,沈明霞1,*,彭增起2,陳士進1,吳海娟1,王 衛1,劉超超1,諶啟亮2
(1.南京農業大學工學院,江蘇南京210031; 2.南京農業大學農業部農畜產品加工與質量控制重點開放實驗室,江蘇南京210095)
介紹了現代肉牛企業信息管理系統中實用的串口通信技術和條碼標簽打印技術。在Visual C++6.0環境中用Microsoft Communication Control控件實現計算機與電子秤的串口通信,使計算機得到牛胴體或牛胴體分割肉的重量信息。然后利用Code128B條碼規則實現重量、質量等級等信息的編碼,并通過標簽打印機把編碼得到的條碼打印出來。
電子秤,串口通信,Microsoft Communication Control,條碼,Code128
近些年來,我國的食品安全問題層出不窮,每年頻頻出現的重大食品安全事件,不僅嚴重影響了人們的身體健康,造成了巨額的財產損失,而且也影響到了中國的經濟發展、食品出口、社會穩定等一系列問題[1]。食品安全危機被認為是現代“溯源性”生產系統發展的直接動力,早在19世紀,“溯源性”生產系統就被應用于動物及動物產品的生產[2]。2000年末,歐洲肉類出口集團(EMEG)實施了新的“牛肉標簽法”[3],歐盟基于新的“牛肉標簽法”推出了牛肉“溯源性”生產系統,下游生產商及消費者可根據該系統下生產的肉食品所提供的條形碼進行相關信息的全方面檢查和考證[4],確保該肉食品的安全和優質。我國現代農業(肉牛)產業技術體系也越來越關注肉牛屠宰場追溯管理系統、屠宰場信息管理系統和牛肉分級系統的研究。獲取牛胴體或牛胴體切塊重量信息的串口通信技術和條形碼打印技術能很好的應用到上述系統中,并能得到廣泛的推廣應用。條形碼技術能有效地結合ERP(企業資源規劃系統,Enterprise Resource Planning System)等管理信息系統,不僅可以對食品從生產到流通進行全程追蹤,也可以僅就流通環節或某一區域食品流通情況進行全面追蹤并且可以幫助企業提高運作效率及管理水平[5]。這些技術的推廣能推動肉牛屠宰加工企業的生產技術和現代質量管理系統的建立和完善。
系統硬件組成框圖如圖1所示,其中電子秤的稱重儀表與計算機是通過RS-232C標準的串行接口連接,計算機與條碼打印機是通過USB接口連接。計算機利用與稱重儀表間串口通信接收并顯示重量數據,然后把重量數據和其它待編碼信息編碼成條碼字符串,最后利用條碼打印機把條碼和廠家信息等打印到標簽紙上。

圖1 系統硬件組成框圖Fig.1 Hardware composition of the system
現代肉牛產業技術體系里,企業管理系統的重要組成部分是牛胴體和牛胴體切塊產品信息的管理,在這樣的生產管理系統中,牛胴體和牛胴體分割肉的重量信息是必不可少的[6]。電子秤作為現代計量設備,在我國工業、商業及其它行業得到了廣泛的普及應用,牛胴體和牛胴體切塊重量數據的獲得也離不開電子秤。然而在實際稱重過程中,僅靠電子秤自身管理、控制,其局限性日益突出。如果能把電子秤的數據傳至計算機處理,利用其強大的管理和控制功能,不僅可拓展電子秤的應用范圍,而且其性能價格比、安全可靠性、控制靈活性、操作簡易性、人機交互性、管理自動化均將獲得極大的提高[7],所以越來越多的用戶希望經電子秤計量之后的商品重量直接送至計算機進行管理[8]。通過電子秤與裝有企業管理系統的計算機之間的串口通信可以實現牛胴體和牛胴體切塊重量數據的傳送。
計算機獲得的牛胴體或牛胴體切塊重量信息以及牛肉質量等級信息、追蹤溯源信息可以保存到企業信息管理數據庫,并且需要把這些信息編碼成條碼再通過條碼打印機打印到標簽紙上,便于企業的生產管理和流通管理。
最大稱量是電子秤的重要技術指標,選擇的太小會損壞傳感器,造成不必要的經濟損失;選擇的太大會使稱重不準確,影響計量的準確性。本課題根據牛胴體分割肉的實際情況選擇最大稱量為60kg的電子秤。另外,由于屠宰工藝的要求,部分牛胴體切塊的長度比較大,而最大稱量為60kg電子秤承重梁的標準尺寸達不到實際的尺寸要求,所以制作一塊符合實際尺寸要求的秤臺蓋板,并在承重梁和蓋板之間設置擋板,限制蓋板的移動,在不影響稱重精確度的情況下滿足實際的稱重需要,使秤臺達到美觀、方便、實用的要求。
承重梁安裝有稱重傳感器,可以感受切塊的重力,并將信號通過傳感器連線傳輸給稱重儀表。稱重儀表可以把傳感器傳來的信號進行A/D轉換,計算成公斤數并把重量數據通過串口連接線傳輸給計算機,與此同時該切塊的公斤數也顯示在電子秤的顯示屏幕上,便于操作人員調整產品重量(配送鮮貨時經常需要調整產品重量以滿足客戶要求)。
稱重儀表和計算機之間的串口連接采用最簡單的三線制接法,即接收數據針腳(RxD)與發送數據針腳(TxD)相連,彼此交叉,信號地(GND)對應相接[9],如圖2所示。

圖2 串口三線制連接方法Fig.2 Three-wire principle of serial communication interface
本課題選用的是東芝USB接口條碼打印機,它擁有8點/毫米(203dpi)的打印頭,清晰打印的速度可達127毫米/秒(5英寸/秒),支持的條碼類型有CODE39、CODE128、EAN128、PDF417等。
Code128碼是1981年引入的一種高密度條碼,可表示從ASCII 0到ASCII 127共128個字符,故稱128碼。其中包含了數字、字母和符號字符,是一種長度可變、連續性的字母數字條碼。與其他一維條碼比較起來,相對較為復雜,支持的字元也相對較多,又有不同的編碼方式可供交互運用,因此其應用彈性也較大[5]。因此本課題選擇的是Code128碼。
軟件設計是在計算機平臺上的Visual C++6.0環境下,用基于對話框的應用程序完成的,用到了MFC(微軟基礎類)庫和ActiveX控件。軟件實現的總體流程如圖3所示。

圖3 軟件總體流程圖Fig.3 Flow chart of software
2.1.1 串口通信協議 在現代工業控制中,串口通信的應用越來越廣泛。下位機和PC機之間的串口通信在進行數據交換時經常被使用。在串行通信時,要求通信雙方都采用一個標準接口,RS-232C接口是下位機和PC機進行通信最常用的一種接口。RS-232C標準規定在碼元畸變小于4%的情況下,傳輸電纜長度最大約為 15m,最高傳輸速率為20kbit/s[9]。
稱重顯示控制器采用EIA-RS-232-C串行標準與計算機進行通信,其串口通信的主要參數如表1所示。
稱重顯示控制器向串行口發送數據的方式有兩種,即連續方式和指令方式。
2.1.1.1 連續方式 所傳送的數據為稱量(毛重或凈重)。毛重格式為:ww000.000kg或ww000.000lb;凈重格式為:wn000.000kg或wn000.000lb(以上小數點位置是根據儀表的小數點位置設置確定)。
2.1.1.2 指令方式 儀表按上位機所發送的指令,執行相應的操作。命令R:儀表接收命令并發送一次重量數據(格式同連續方式);命令T:儀表接收命令,儀表去皮(同去皮鍵),不接收命令,儀表返回CRLF;命令Z:儀表接收命令,儀表置零(同置零鍵),不接收命令,儀表返回CRLF。
首先對稱重儀表進行標定,把小數點設置選擇為3位小數。然后進行用戶功能設置,把波特率設置為9600,RS232輸出方式選擇為命令方式(Z:置零,T:除皮,R:發送一次重量數據)。
2.1.2 串口通信的實現 在windows平臺下用C/C ++語言開發串行口通信程序的傳統方法是使用Win32API。Win32API包括了一個通信函數的集合,使用這些函數可以像使用文件I/0一樣對串行口、并行口等通信資源進行讀寫訪問和控制。但是,由于這些函數的使用非常復雜,不但使得開發通信程序變得困難,而且增加了程序出錯的機會,Windows平臺先進的ActiveX技術使我們在對串行口編程時不再需要處理煩瑣的細節,利用已有的ActiveX控件,只需要編寫少量的代碼,就可以輕松高效地完成任務[10]。
Microsoft Communication Control(簡稱MSComm)是Microsoft公司提供的簡化Windows下的串行通信編程的ActiveX控件,為應用程序提供了串口接收發送數據的簡便方法。MSComm控件通過串行端口傳輸和接收數據為應用程序提供串行通信功能。MSComm提供了兩種處理通信問題的方法:一是事件驅動(Event-Driven)方法,主要是利用OnComm事件捕獲并處理這些通信時間,也可以檢查和處理通信錯誤;二是查詢法,在這種情況下,每當應用程序執行完一個串口操作后,將查看MSComm控件的CommEvent屬性以確定執行結果或者檢查某一事件是否發生[11]。這里采用第一種事件驅動方法。
串口通信程序流程圖如圖4所示。
首先在當前工程中添加MSComm控件,并為此控件添加CMSComm控制變量m_ctrlComm,在對話框應用程序的OnInitDialog()函數中用m_ctrlComm來完成串口初始化,包括串行通信端口選擇、設置波特率、設置緩沖區大小等。
在程序界面中添加一個稱重按鈕,在其單擊消息即 BN_CLICKED處理函數中利用 m_ ctrlComm.SetOutput(COleVariant(“R”))這條語句向稱重儀表發送字符R(發送一次重量數據的命令)。
稱重儀表接收到命令R后發送一次重量數據,計算機的串口緩沖區有數據時,程序將響應MSComm控件的消息處理函數OnComm(),然后在此函數中處理接收到的數據并在界面中顯示出來。其中接收串口緩沖區數據的流程如圖5所示。

圖4 串口通信程序流程圖Fig.4 Flow chart of serial communication

圖5 串口數據接收程序流程圖Fig.5 Flow chart of receiving data in serial communication
串口緩沖區的有效數據全部接收后,還要對數據進行處理,并得到正常的顯示格式。牛胴體分割肉的重量在25kg以內,數據格式為ww000.000kg,所以判斷十位數據(即第4個字節)是否為零,如果不為零就從十位開始顯示,如果為零從個位開始顯示,這樣就能達到在程序界面中正常顯示的目的。
2.2.1 Code128編碼規則 Code128碼具有A、B、C三種不同的編碼類型,每種類型擁有不同的字符集,如表2所示。
這里需要標準數字和大小寫字母,所以采用了Code128B。
Code128B碼的組成為:起始字符(START)+數據字符(DATA)+檢驗字符(CHECK CHAR)+終止字符(STOP)。
其中開始字符為STARTB,終止字符為STOP,每個數據字符對應到0~102其中的一個值,對于每個值各個字符集都有自己獨立的具體含義解釋。Code128碼的部分編碼表如表3。BandCode中的“1”代表一個單元,“2”代表兩個單元,“4”代表四個單元,“條”和“空”間隔排列。若用b代表“條”,s代表“空”,則字母“a”對應的編碼值為“bssbsbbssss”。若要打印,只需將b用黑色線標出,s用白色線標出[12]。

表2 Code128碼分類表Table 2 Classification of Code128

表3 部分字符編碼表Table 3 Code list of some characters

其中:checksum為校驗字符值,start為起始字符值,data(i)為數據區第i個字符的數值。i為數據區字符的位置,從左到右依次為1到n,n為數據區字符的個數,mod為取模運算[13]。
Code128碼的校驗符是條碼本身的特性,它不是數據的一部分,因此校驗符不會在供人識讀的數據中出現。
2.2.2 Code128編碼和打印的實現 上述條碼Code128的編碼規則可以通過C++類來實現,考慮到代碼重用,采用了專門為 Code128碼設計的CCode128類,條形碼的編碼過程在類中由校驗和編碼兩個方法共同完成。
在系統界面中添加打印按鈕并定義它的消息響應函數OnPrinting,在此函數中調用標準打印對話框對象printDlg獲得打印機的設備環境并初始化打印機。然后調用CCode128類的校驗和編碼方法把牛肉質量等級和重量信息編碼成條形碼字符串,最后調用print方法完成條碼的打印。Code128編碼和打印的程序流程圖如圖6所示。
打印機初始化由標準打印對話框對象printDlg來完成,首先設置條形碼高度、碼線寬度以及要編碼的字符串等信息,然后利用printDlg的GetDevMode方法獲得一個DEVMODE結構體指針,DEVMODE結構體包含了打印機的許多基本參數,例如打印機名稱、打印方向、打印紙尺寸以及打印質量等。其中DEVMODE結構體的dmPrintQuality成員表示打印機的打印質量,單位為dpi。dmPrintQuality除以25.4,得到顯示比率rato,即每一毫米內打印點的數量[14]。
在編碼表中查表,尋找待編碼字符串中每個字符對應的編碼字符串,然后組合在一起,形成一個條形碼字符串,得到編碼的結果。
校驗字符由起始字符和數據區的字符值決定,計算時由起始符的數值開始累加各數據字符的數值與其位置作為權值的乘積之和,最后使用總和對103取模所得到余數即為校驗字符的數值。其計算公式如下:

圖6 Code128編碼打印程序流程圖Fig.6 Flow chart of coding use Code128 and printing
打印機初始化完成后,把需要編碼的信息加入待編碼字符串,這些信息包括稱重系統得到的重量信息、牛胴體分割肉的等級信息、系統的時間。
校驗是對待編碼的字符串進行一次檢查,查看字符串中的字符是否都是合法且能夠使用Code128碼編碼的字符,該任務由CCode128類的成員函數Code128Verify完成。如果校驗成功則返回0,可進行下一步編碼的工作;如果校驗失敗則返回-1,系統會給用戶相應的提示信息。
編碼工作由 CCode128類的成員函數Code128Encode完成。該函數有兩個參數,一個是字符串指針,傳遞待編碼的字符串;另一個也是字符串指針,指向編碼后的條形碼字符串。用CCode128類的Code128字符集數組表示Code128編碼規則里的編碼表,編碼時在字符集數組中尋找待編碼字符串中每個字符對應的編碼字符串,然后組合在一起,形成一個條形碼字符串,得到編碼的結果。
最后調用print方法完成打印,根據編碼生成的條形碼字符串,在標簽紙上畫線。寬度為“1”畫1道線,寬度為“2”則畫2道線,空是不畫線的,只向右移動相應的距離。實現時定義了一個公有成員函數print,它有兩個參數,一個是字符串指針,傳遞編碼后的條形碼字符串;另一個是設備環境指針,指向要顯示條形碼的設備環境。如果該指針指向顯示設備環境,則條形碼將在顯示器中顯示;如果該指針指向打印機設備環境,則條形碼將會被打印在紙上。print函數通過一條一條地畫豎線來畫出所需的條形碼寬度,每條線的寬度為(i n t)(m_CodeWidth*rato),其中rato是上文提到的顯示比率[12],條形碼的起始點可以在代碼中設定。代碼舉例如下:


條碼打印完成后還可以在標簽紙上打印廠家信息和當前日期。
計算機平臺上的系統界面控制稱重和條碼打印功能的使用,稱重儀表與計算機平臺通過串口線連接。首先點擊界面上的“稱重”按鈕,計算機平臺向稱重儀表發送命令“R”,此時,稱重儀表接收命令并發送一次重量數據。計算機平臺接收到串口數據后對數據進行處理并把重量數值顯示在界面上。然后加入其它需要編碼成條碼的信息,把它們和重量信息一起編碼成條碼字符串,本系統是通過界面的“質量等級”按鈕把牛胴體分割肉的質量等級和廠家信息加入到待編碼字符串。最后通過點擊界面上的“打印”按鈕,把待編碼字符串編碼成條碼字符串,并利用與計算機平臺連接的條碼打印機把條碼和相關信息打印到標簽紙上。
本文所述的串口通信技術和條碼技術已經在牛肉質量分級系統、生產屠宰系統、追蹤溯源系統中得到初步應用,并且能在肉牛屠宰加工企業信息管理系統中得到進一步推廣,幫助人們實現牛肉生產、流通過程中的高效管理和安全監管。
[1]崔付榮.關注中國的食品安全問題[J].經濟研究導刊,2010(19):1.
[2]Blancou J.A history of the traceability of animals and animal products[J].Rev Sci Tech,2001,20(2):413-425.
[3]Dickinson D L,DeeVon B.Meat traceability:Are U.S. consumers willing to pay for it[J].Journal of Agricultural and Resource Economics,2002,27(2):48-364.
[4]Davis J R,Dikeman M E.Practical aspects of beef carcass traceability incommercialbeefprocessing plants using an electronic identification system[C].Cattlemen's Day,Kansas State University,2002:47-48.
[5]史新建.現代工業技術在糧油儲藏管理中的應用[J].北京農業,2011(3):36-37.
[6]沈振寧.牛肉影像分級儀對牛肉分級的精確性與適用性研究[D].南京:南京農業大學,2008:5.
[7]周杰.電子秤與計算機在串行通訊控制中的應用[J].工業計量,2004,14(5):16-20.
[8]雷衛武.電子秤與PC機串行通信的接口設計[J].衡器,2003(2):17.
[9]曾自強,王玉菡.用VC++實現單片機與PC機串口通信的三種方法[J].自動化與儀器儀表,2005(3):60-63.
[10]黃海榮,李鷹,田作華.基于VC++和ActiveX控件的PT650C電子秤重顯示器串行通信接口程序設計[J].微型電腦應用,2000,16(4):42-44.
[11]龔建偉,熊光明.Visual C++/Turbo C串口通信編程實踐[M].2版.北京:電子工業出版社,2007:63-65.
[12]王曉東.VC++在條形碼打印中的應用[J].科技廣場,2007(5):153-155.
[13]阮少林.網上閱卷中信息提取與識別技術研究[D].成都:電子科技大學,2010:21.
[14]諶章義,李華貴,顏廷秦.在VC 6.0對話框應用程序中實現打印和打印預覽[J].計算機應用,2003,23(S2):337-338.
Label Printing System of the beef cattle business based on serial port communication
LIANG Lin1,SHEN Ming-xia1,*,PENG Zeng-qi2,CHEN Shi-jin1,WU Hai-juan1,WANG Wei1,LIU Chao-chao1,CHEN Qi-liang2
(1.College of Engineering,Nanjing Agricultural University,Nanjing 210031,China; 2.Key Laboratory of Agricultural and Animal Products Processing and Quality Control,Ministry of Agriculture,Nanjing Agricultural University,Nanjing 210095,China)
The practical serial port communication and barcode in Information Management System for beef cattle business was introduced.The serial port communication between computer and electronic weighter was realized by Microsoft Communication Control,which was supplied by Visual C++6.0.Then,the weight data of beef carcass or beef carcass cut was
by the computer.Applying the rule of Code128B,the data of weight and quality grade was coded to barcode.Finally,the barcode could be printed by label printer.
electronic weighter;serial port communication;Microsoft Communication Control;barcode;Code128
TS206
A
1002-0306(2012)08-0339-05
2011-08-19 *通訊聯系人
梁林(1985-),男,碩士研究生,主要從事機器視覺與圖像處理在農產品品質檢測領域中的應用研究。
國家現代農業(肉牛)產業技術體系項目(nycytx-38);農業科技成果轉化資金項目(SQ2011ECC100043);江蘇高校優勢學科建設工程資助項目(PAPD)。