安美君,王淑
1.上海健康醫(yī)學(xué)院 醫(yī)學(xué)電子與信息工程系,上海 200093;2.上海市兒童醫(yī)院 信息科,上海 200040
基于有限狀態(tài)機(jī)的UCC/EAN-128條碼編程實(shí)現(xiàn)
安美君1,王淑2
1.上海健康醫(yī)學(xué)院 醫(yī)學(xué)電子與信息工程系,上海 200093;2.上海市兒童醫(yī)院 信息科,上海 200040
本文采用有限狀態(tài)機(jī)理論,討論了UCC/EAN-128條碼3種字符集的使用條件,3種編碼方式互相轉(zhuǎn)換的流程,展示了從信息字符串轉(zhuǎn)變成編碼字符串的處理過程,設(shè)計(jì)了一種鏈表結(jié)構(gòu)存儲編碼字符串,實(shí)現(xiàn)了條碼的最小編碼,為后續(xù)檢驗(yàn)碼計(jì)算和圖案生成提供了方便。整個(gè)模塊已經(jīng)應(yīng)用在醫(yī)院臨床用血管理系統(tǒng)中并獲得了良好效果。
醫(yī)院信息系統(tǒng);臨床用血;UCC/EAN-128條碼;有限狀態(tài)機(jī);條碼編程
UCC/EAN-128條碼[1]是一種可同時(shí)描述字母、數(shù)字的高密度條碼,該條碼的每個(gè)字符由3條和3空組成,總寬度為11個(gè)基本寬度單位,每個(gè)條或空的寬度由字符的編碼決定。UCC/EAN-128條碼有3種字符集,根據(jù)條碼的具體內(nèi)容特點(diǎn),可以采樣合適的字符集,從而獲得最短長度編碼。同一條碼允許有多個(gè)字符集組成,最小碼長只有3位、最長碼長可達(dá)48位,為非定長條碼;條碼前幾位(2~4位)稱為標(biāo)識位,指示后續(xù)的數(shù)據(jù)長度和所代表的含義;可同時(shí)標(biāo)識多組數(shù)據(jù),中間用功能符分隔,檢驗(yàn)碼統(tǒng)一計(jì)算;同一信息可以有3種不同編碼格式;相比其它一維條碼,它能標(biāo)識更多的字符,蘊(yùn)含的信息量更大;在物流[2]和醫(yī)院信息管理[3-6]等領(lǐng)域獲得廣泛應(yīng)用。
GB/T15425-2002標(biāo)準(zhǔn)附錄A聲明了UCC/EAN-128條碼符號長度最小原則和對字符串編碼時(shí)起始符、切換符和轉(zhuǎn)換字符與原始信息的組合方法。目前的文獻(xiàn)資料中鮮見關(guān)于UCC/EAN-128條碼生成算法,大多討論EAN-13碼[7]、Code39碼[8-9],賈海生[10]等討論了EAN-128碼純數(shù)字的編程實(shí)現(xiàn),沒有考慮數(shù)字、字符和控制碼混合的條碼編程情況。本文利用有限狀態(tài)機(jī)的基本原理和GB/T15425-2002標(biāo)準(zhǔn)附錄A中聲明的最小原則,設(shè)定狀態(tài)轉(zhuǎn)換條件,通過對原始編碼信息掃描,確定每個(gè)字符編碼時(shí)的狀態(tài),從而實(shí)現(xiàn)條碼的最短編碼。
UCC/EAN-128條碼由起始碼、功能碼、信息碼、停止碼、校驗(yàn)碼組成[1],見圖1。該條碼有3個(gè)字符集,分別為字符集A、B和C,每種字符集有不同的編碼方式。字符集A包括所有標(biāo)準(zhǔn)的大寫英文字母、數(shù)字字符、控制字符、特殊字符及輔助字符;字符集B包括所有標(biāo)準(zhǔn)的大寫和小寫英文字母、數(shù)字字符、特殊字符及輔助字符;字符集C包括00~99的100個(gè)數(shù)字以及輔助字符。因?yàn)樽址疌中的1個(gè)條碼字符表示2個(gè)數(shù)字字符,因此使用該字符集表示數(shù)字信息可以比其它字符集信息量增加1倍,適合描述連續(xù)的數(shù)字符號。A、B、C 3個(gè)字符集可以交替使用,也可以用SHIFT功能對一個(gè)字符進(jìn)行字符集之間的轉(zhuǎn)換。
圖1 UCC/EAN-128條碼組成結(jié)構(gòu)
有限狀態(tài)機(jī)是有限個(gè)狀態(tài)以及在這些狀態(tài)之間的遷移和動作等行為的數(shù)學(xué)模型,通常由狀態(tài)、遷移、事件、動作和條件等幾個(gè)基本要素構(gòu)成。狀態(tài)是從系統(tǒng)開始到現(xiàn)在時(shí)刻的行為所產(chǎn)生的綜合結(jié)果,具有暫時(shí)穩(wěn)定性,在外部或內(nèi)部條件的影響下,系統(tǒng)可以從一種狀態(tài)遷移到另一種狀態(tài),系統(tǒng)狀態(tài)遷移圖指示其變化情況;事件是在特定時(shí)空發(fā)生的對系統(tǒng)有意義的改變,一般會引起狀態(tài)遷移,它既可以來自外部也可由內(nèi)部生成;動作是在給定時(shí)刻對要進(jìn)行的活動描述。有限狀態(tài)機(jī)系統(tǒng)用動作來響應(yīng)內(nèi)外部事件,響應(yīng)結(jié)果與系統(tǒng)當(dāng)前狀態(tài)和外部條件有關(guān)。
基于事件驅(qū)動的有限狀態(tài)機(jī)思想在軟件工程中主要應(yīng)用于多分支選擇結(jié)構(gòu)中,它能采取多種操作來響應(yīng)不同的事件。計(jì)算機(jī)中正在運(yùn)行的程序可以看成是一種離散系統(tǒng),在各個(gè)時(shí)刻都具有特定狀態(tài),該狀態(tài)可用程序中所有變量的值和程序堆棧指針來確定。
在對UCC/EAN-128條碼進(jìn)行編碼時(shí),首先需要確定當(dāng)前使用的字符集類型,然后根據(jù)后續(xù)要編碼字符串特點(diǎn),決定是否繼續(xù)使用當(dāng)前字符集或者切換到其它字符集,UCC/EAN-128條碼編碼特征適合用有限狀態(tài)機(jī)模型進(jìn)行處理。
在UCC/EAN-128條碼符號中,通過使用不同的起始、切換和轉(zhuǎn)換字符的組合,可以對相同的數(shù)據(jù)有不同的表示,下述內(nèi)容為狀態(tài)遷移的條件和動作[1]。
(1)如果數(shù)據(jù)以4位或4位以上的數(shù)字型數(shù)據(jù)符開始,則使用起始符C;如果數(shù)據(jù)中在小寫字母字符之前出現(xiàn)ASCII控制字符,則使用起始符A;其他情況,使用起始符B。
(2)如果使用起始符C,并且數(shù)字個(gè)數(shù)為奇數(shù),則在最后一位數(shù)字前插入字符集A或字符集B。
(3)如果在字符集A或字符集B中同時(shí)出現(xiàn)4位或4位以上的數(shù)字字符,且數(shù)字型數(shù)據(jù)字符的個(gè)數(shù)為偶數(shù),則在第一個(gè)數(shù)字之前插入CODE C字符將字符集轉(zhuǎn)換為字符集C,若數(shù)字型數(shù)據(jù)字符的個(gè)數(shù)為奇數(shù),則在第一個(gè)數(shù)字之后插入CODE C字符將字符集轉(zhuǎn)換為字符集C。
(4)當(dāng)使用字符集B,并且數(shù)據(jù)中出現(xiàn)ASCII控制字符時(shí),如果在該控制字符之后,在另一個(gè)控制字符之前出現(xiàn)一個(gè)小寫字母字符,則該此控制字符之前插入轉(zhuǎn)換字符;否則,在控制字符之前插入CODE A將字符集轉(zhuǎn)換為字符集A。
(5)當(dāng)使用字符集A,并且數(shù)據(jù)中出現(xiàn)小寫字母字符時(shí),如果在該小寫字母字符之后,在另一個(gè)小寫字母字符之前出現(xiàn)一個(gè)控制字符,則在該小寫字母字符之前插入轉(zhuǎn)換字符;否則,在小寫字母字符之前插入CODE B將字符集轉(zhuǎn)換為字符集B。
(6)如果在字符集C中出現(xiàn)一個(gè)非數(shù)字字符,則在該非數(shù)字字符之前插入CODE A或CODE B。
按照上述規(guī)則,UCC/EAN-128條碼編碼狀態(tài)遷移圖,見圖2[11],序號①~⑦代表狀態(tài)遷移條件,例如序號⑦代表從字符集B編碼模式遷移到字符集C編碼模式,觸發(fā)條件是后續(xù)編碼的字符串中至少有4個(gè)連續(xù)的數(shù)字字符。
圖2 UCC/EAN-128條碼編碼狀態(tài)遷移圖
按照UCC/EAN-128條碼的組成規(guī)則,在確定需要生產(chǎn)的條碼信息字符串后,先生產(chǎn)左邊空格編碼,然后掃描信息字符串,確定開始使用的字符集,明確當(dāng)前狀態(tài),再以后續(xù)要編碼的字符為輸入條件,結(jié)合當(dāng)前狀態(tài),確定是否繼續(xù)維持使用當(dāng)前字符集,循環(huán)進(jìn)行處理直至要編碼信息字符串結(jié)尾[12-13]。
在處理中有狀態(tài)遷移行為發(fā)生,最后的編碼字符串與編碼信息字符串不一致,它中間可能包含一些控制碼,在計(jì)算校驗(yàn)碼時(shí),所有編碼字符串均要參與運(yùn)算,其權(quán)值與所在位置相關(guān),最后的編碼字符集決定校驗(yàn)碼的歸屬。為方便計(jì)算校驗(yàn)碼和生成條碼圖案,可采用一個(gè)鏈表結(jié)構(gòu),保存編碼字符串,每個(gè)節(jié)點(diǎn)保存一個(gè)編碼字符,新增節(jié)點(diǎn)加在鏈表尾部。從鏈表頭開始遍歷,可以很方便計(jì)算校驗(yàn)碼,亦可按此順序生成條碼圖案,見圖3。
圖3 編碼字符存儲示意圖
例如,輸出條碼集AbcD12345E,經(jīng)過上述編碼算法處理,得到的UCC/EAN-128編碼集如下:Start B,F(xiàn)UNC1,A,b,c,D,Code C,12,34,Code B,5,E,校驗(yàn)碼,Stop;每個(gè)字符集的狀態(tài)分別是:2,2,2,2,3,3,2,2,最后校驗(yàn)碼使用Code B字符集,狀態(tài)為2。生成的條碼,見圖4。
圖4 UCC/EAN-128條碼
本文基于有限狀態(tài)機(jī)的原理,結(jié)合UCC/EAN-128條碼的最小編碼要求,分析了該條碼的三種字符編碼轉(zhuǎn)換條件,實(shí)現(xiàn)了從信息字符串到編碼字符串的處理過程。設(shè)計(jì)了一種鏈表結(jié)構(gòu),存儲包含控制碼的編碼信息,通過對鏈表進(jìn)行遍歷,實(shí)現(xiàn)了校驗(yàn)碼計(jì)算和條碼圖案生成。整個(gè)模塊已經(jīng)應(yīng)用在醫(yī)院臨床用血管理系統(tǒng)中,獲得了較好效果。
[1]GB/T 15425-2002,EAN·UCC系統(tǒng)128條碼[S].
[2]楊應(yīng)全,沈焰,李雪茹.圖書館條形碼標(biāo)簽的設(shè)計(jì)方法[J].重慶工業(yè)高等??茖W(xué)校學(xué)報(bào),2005,20(1):66-68.
[3]潘寧,鄧賓.條形碼技術(shù)在臨床輸血中的應(yīng)用[J].中國醫(yī)療設(shè)備,2013,28(3):86-87,164.
[4]黃峭,朱春平,盧桂芳,等.條形碼技術(shù)在門診采血工作中的應(yīng)用與流程管理[J].護(hù)理實(shí)踐與研究,2010,7(1):66-66.
[5]陳蘭,周湘江,羅安燕.臨床輸血業(yè)務(wù)管理信息系統(tǒng)的設(shè)計(jì)與應(yīng)用[J].中國醫(yī)療設(shè)備,2014,29(12):46-49.
[6]吳森.基于條形碼的門診掛號系統(tǒng)研究與設(shè)計(jì)[J].計(jì)算技術(shù)與自動化,2014,33(2):115-120.
[7]周超.C++中一維條碼生成與打印的設(shè)計(jì)實(shí)現(xiàn)[J].電腦知識與技術(shù):學(xué)術(shù)交流,2007,3(14):415-416.
[8]王曉東.VC++在條形碼打印中的應(yīng)用[J].科技廣場,2007,(5):153-155.
[9]楊靖,管艷輝,曹健慧.圖書館常用條形碼Code 39的編碼原理及打印設(shè)計(jì)[J].河北科技師范學(xué)院學(xué)報(bào)(社會科學(xué)版),2006,5(3):84-88.
[10]賈海生,楊小寧.EAN-128條碼打印技術(shù)的研究與實(shí)現(xiàn)[J].寧夏大學(xué)學(xué)報(bào)(自然科學(xué)版),2005,26(4):336-338.
[11]李偉,門佳.一種事件驅(qū)動有限狀態(tài)機(jī)的編程實(shí)現(xiàn)框架[J].計(jì)算機(jī)與現(xiàn)代化,2014,(6):116-119.
[12]婷婷,孫精科.基于有限狀態(tài)機(jī)的工作流實(shí)例狀態(tài)遷移研究[J].軟件導(dǎo)刊,2014,13(12):39-41.
[13]周莉娟,劉心剛,張志鵬.基于有限狀態(tài)機(jī)的雷達(dá)狀態(tài)模型建立[J].電子設(shè)計(jì)工程,2014,22(16):35-37.
Realization of UCC/EAN-128 Barcode Computer Programming Based on the Finite State Machine
This paper discussed the application conditions of three character set of UCC/EAN-128 barcode and switch of three encoding models,based on the theory of fnite state machine. It also showed the transformation processing from the information string to encoding string and designed a linked list for storage of encoding strings,which made it convenient to draw barcode patterns and calculate check codes. The module was well applied in the clinical blood management system of the hospital and achieved excellent effectiveness.
hospital information system;clinical blood;UCC/EAN-128 barcode;fnite-state machine;barcode programming
AN Mei-jun1,WANG Shu2
1. Department of Medical Electronics and Information Engineering,Shanghai University of Medicine &Health Sciences,Shanghai 200093,China;2. Department of Information,Shanghai Children’ Hospital,Shanghai 200040,China
TP391.44;R197.324
A
10.3969/j.issn.1674-1633.2016.09.053
1674-1633(2016)09-0168-03
2015-06-02
2016-07-05
上海市教教育委員會科研創(chuàng)新項(xiàng)目(YZ146)。
安美君,高級工程師,主要研究方向?yàn)橛?jì)算機(jī)軟件、醫(yī)學(xué)信息處理、康復(fù)設(shè)備控制軟件。
通訊作者郵箱:hngdamj@163.com