C#控制DataMax指令打印DPL问题总结
最近這幾天在測試DataMAx-I-4208采用DPL[Developer Programm Language]指令方式進行遇到諸多問題.解決這個問題過程中也是不斷打印測試得到驗證.今天早上用程序批量打印發先DAtaMax打印出來的條碼效果和ZeBar斑馬沒什么區別.有人也詢問很多采用DPL打印細節問題 就此對C#控制DAtaMAx指令DPL打印條碼中遇到問題進行總結一下.
首先在講遇到問題前搞明白我們要打印一個Code128格式的條碼需要具體控制什么因素? 知道我們要在程序中要做什么 這很重要.DataMax發送DPL指令給打印機Code128條碼:
?
?
?
打印一條Code128條碼通過串口通信向打印機DataMax發送DPL指令打印. 首先要建立串口連接,同時要知道DPL中關于Code128條碼打印指令語法.剩下就是條碼位置? 等細節調試問題. 具體總結如下:
<1>DPL中打印Code128指令語法
<2>DPL指令中控制BarCode和文本 寬度和高度
<3>DPL設置條碼打印在底板上初始位置X,Y
<4>采用密爾值控制DPL中條碼寬高比例.
<5>Code128條碼格式控制
分析好問題,我們在項目采用是界面先建立打印模板:
?
?
?
?
?
?
?
?
?
?
打印系統條碼數據時指定不同的打印模板:
?
?
?
?
?
后臺程序自動解析打印模板和打印數據稱DataMax支持的DPL指令方式 再發送給打印機批量打印.整個流程:
?
?
?
?
?
?
?
?
?
在上一篇中C#控制DataMax打印機問題總結中提到.Code128基本打印指令:
1: //Code128 DPL手冊上打印指令 2: <STX>L 3: D11<CR> 4: 1E000000015010001234567890<CR> 5: 121100000000100Barcode E<CR> 6: E在DPL手冊Code128基本能看到基礎語法:
<STX>L對應DPL語法特定打印標識頭, 如果直接通過串口工具發送給打印機 則不執行 測試發現需要把<STX>轉換成16進制ACII碼格式.
<D11>用來設置設置條碼中平均的英寸范圍內每個打印點寬度和高度. 類似打印DAtaMAx-i-4208對飲DPI203 則每英寸的打印點DOT 固定為8個,在DPL手冊中設置語法:
?
?
?
?
?
?
?
在說明我可以看出打印機為203DPI的Dot點設置默認為D22. DWH語法能夠設置的值組合總共有6個.來調節條碼寬度.
第三行是核心打印條碼的指令:
1: //核心打印條碼DPL指令 分為兩部分 2: 1E0000000150100 01234567890<CR> 3: ?如上清晰看出大概分為兩部分. 前一部分是打印條碼Code128格式字符串,?? 后面一部分則是條碼中指定負載數據.其實如果你進一步深入會問: 不同條碼間格式如何定義的?后來我翻遍整個DPL手冊終于在一個小角落[150頁]找到相關說明:
?
?
?
?
?
?
?
對打印整個條碼指令進行結構拆解:
?
?
?
?
?
?
?
?
?
1E0000000150100 這端標識頭字符串代表什么意思?繼續進行拆解發現:
?
?
?
?
?
?
?
?
?
這時是否有些徹底明白了吧那一段代碼具體代表什么意思.如下我會演示用C#發送DPLCode 128打印條碼.整個過程,.在上篇中C#控制DataMax打印機問題總結.提到<STX>標識指令頭轉換16進制問題.
?
?
?
?
?
這時轉換后16進制字符串,我們通過ASII16進制修改工具查看一下這個字符16進制碼:
?
?
?
?
?
?
?
?
?
?
?
經測試發現<STX>對應16進制碼為: 3C?? 53?? 54?? 58? 3E? . ok 到此在C#程序把程序拼接時發現 把這些16進制發送給打印機依然無法識別.后來找到串口工具.發現文本中拷貝進入成功打印:
?
?
?
?
?
發現DAtaMAx打印機識別則是<STX>轉換16進制后指令字符是 ? ,既然有了有了<STX> 16進制編碼我們進行反編譯字符:
1: //格式化字符指令頭<STX> 2: //Author:chenkai DAta:12/08 11 AM 3: protected override string Leading() 4: { 5: #region 轉16進制數據 6: StringBuilder getbuilder = new StringBuilder(); 7: string getconverstr = "<STX>"; 8: char[] values = getconverstr.ToCharArray(); 9: ? 10: foreach (char getchar in values) 11: { 12: int value = Convert.ToInt32(getchar); 13: getbuilder.AppendFormat(String.Format("{0:X}", value)); 14: } 15: #endregion 17: this.StartStr = "<STX>".ToString();//3c 53 54 58 3E[16進制結果一直 無打印效果] 18: string teststr = "EF BB BF 02"; 19: ? 20: #region 16進制轉字符串 21: StringBuilder getAsibuilder = new StringBuilder(); 22: string[] spiltstr = teststr.Split(' '); 24: string[] charstr = new string[spiltstr.Length]; 25: int count = 0; 26: foreach (string hex in spiltstr) 27: { 28: int value = Convert.ToInt32(hex, 16); 29: string stringValue = Char.ConvertFromUtf32(value); 31: //回歸字符 32: char charValue = (char)value; 33: charstr[count] = charValue.ToString(); 35: count++; 36: getAsibuilder.AppendFormat(charValue.ToString());//測試發現 最后一位16ASII碼即為有效字符[Fuck] 37: } 38: #endregion 39: return charstr[charstr.Length - 1] + "L" + "\n";//D11<CR>\n";//[測試成功 但每次出現WebServer重啟現象] 40: }經過對<STX>16進制編碼進行反編譯成字符發現最后一個16進制碼3E對應就是打印識別特殊字符 . ok至此第一步讓DataMAX打印機識別DPL指令.如下在來解決涉及BArcode 128在打印中涉及具體問題.
首先來看如何在利用DPL指令方式控制BarCode在打印中初始位置X,Y: 在打印中如果想知道打印元素對應的方位坐標則需要知道目前打印機對坐標系統設置對應關系:
?
?
?
?
?
?
?
打印機中不同的坐標系統.同一個元素所在坐標位置值則不同.類似坐標系統A中:條碼對應XY坐標也不同:
?
?
?
根據DPL中說明DAtaMAx坐標為A方案.那么如何來通過DPL指令來控制條碼在紙帶上初始位置? 在DPL文檔中仔細研究發現設置BArCode初始位置屬性時Row OffSet和Column OFFset 分別對應語法:
?
?
?
?
?
?
?
?
?
基本語法為R0015,則設置在紙帶上初始X坐標位置15點, 值的范圍[0-9999],對應格式必須是4位數作為標識,Column Offset則基本雷同.不在贅述.添加了初始化位置DPL指令如下:
1: //設置初始位置DPL指令 chenkai 2: L 3: R0044<CR> 4: C0015<CR> 5: D11<CR> 6: 1E000000015010082001590000000013324<CR> 7: E 8: ?從上可以看出對應初始坐標為X:y=44:15.程序中控制坐標位置格式000R:
1: //格式化初始打印位置數據 chenkai 2: public string ConvertDataFormat(float getvalue) 3: { 4: string converstr = string.Empty; 5: if (!string.IsNullOrEmpty(getvalue.ToString())) 6: { 7: //Convert Float to int type 8: string getfromtint = Convert.ToInt32(Math.Round(getvalue)).ToString(); 9: if (4 - getfromtint.Length > 0) 10: { 11: int getlength = 4 - getfromtint.Length; 12: for (int count = 0; count < getlength; count++) 13: { 14: getfromtint = "0" + getfromtint; 15: } 16: converstr = getfromtint; 17: } 18: else 19: { 20: //長度超過或等于格式長度4 21: if (4 - getfromtint.Length == 0) 22: converstr = getfromtint; 23: else 24: { 25: converstr = string.Empty; 26: throw new EquipmentException("打印位置超過本地打印機設置 設置小于等于4位數"); 27: } 28: } 29: } 30: return converstr; 31: }調用控制XY坐標:
1: //設置初始打印Row OffSet 位置值 2: string topstr = this.ConvertDataFormat(top); 3: string leftstr = this.ConvertDataFormat(left); 4: ? 5: //設置初始打印Column OffSet 位置值 6: getbuilder.AppendFormat("R{0}<CR>\n", topstr); 7: getbuilder.AppendFormat("C{0}<CR>\n", leftstr);如下在關注條碼寬度設置,在圖一中我們對條碼設置一個屬性值叫密爾 即條碼寬度單位.在測試ZeBar打印計算ZPL中計算寬度是每密爾對應0.25CM. 但是在DPL設置則不同,單一單位區域內打印點DOt數量是不變的,只有設置DOt的高度和寬度才能設置條碼外在寬度效果.203DPI 對應每英寸8個點Dot. DPL如何來設置每個點的Width和Height:具體語法格式
?
?
?
?
?
?
?
D11是默認值,針對300、400 600DPI打印機,DAtaMAx-i-4208的DPi為203,則對應的設置為D22. 在界面中密爾值范圍8-17共10個值:
?
?
?
?
?
?
?
?
?
10值范圍對應可以設置的比例關系為6個: 分別為1:1 /1:2/1:3/2:1/2:2/2:3. C#中進行范圍指定控制:
1: #region 設置密爾值. 2: string miwidth="1", miheight="1"; 3: int barLineWidth = PubMethod.ToInt(detailtmp.BARLINEWIDTH); 4: int midvalue = barLineWidth; 5: if (barLineWidth < 10) 6: { 7: //Default Code128 Bint 8: miwidth = "1"; 9: miheight = "1"; 10: } 11: else if (barLineWidth >= 10 && midvalue < 12) 12: { 13: miwidth = "1"; 14: miheight = "2"; 15: } 16: //密爾值設置BarCode 寬高比例關系. 17: //DPL使用Dot 在Inch中密度在決定寬高. 不能直接設置 值范圍Width[1-2] Height[1-3] 18: //DAtaMAx中DPi203 默認值 為D22 Code 128設置Defaul D11 19: string setLocation="D"+miwidth+miheight; 20: getbuilder.AppendFormat(setLocation+"<CR>\n"); 21: #endregion如果采用默認的D11設置發現打印出來效果 總體條碼寬度或高度過小.需要對條碼寬高進行重新設置.在Code128語法命令有一段說明很重要:
?
?
?
?
?
其中明確提到第四個字符用來設置條碼寬度,從第五個字符串到第七位設置條碼高度值. Height[0-999] C#則需要憑借字符串方式來組合DPL指令:
1: #region 處理條碼寬高比例 2: //BarCode設置寬高比例需要Header FrmatString設置 寬第四個字符 高 第五至第七個字符串 3: //Width[0-9]-Common[0-4] height[0-999]-Common[32-45] 4: string widthstr = string.Empty; 5: string heightstr = string.Empty; 6: ? 7: //元素在打印效果中寬高 8: width = (detailtmp.ENDX - detailtmp.BEGINX); 9: height = (detailtmp.ENDY - detailtmp.BEGINY); 10: ? 11: if (this.Template != null) 12: { 13: widthstr = ((int)width/100).ToString(); 14: heightstr =this.FormatBarCodeHeight(((int)height-25).ToString()); 16: if (Convert.ToInt32(widthstr) > 9) 18: widthstr = "9"; 20: else if (Convert.ToInt32(widthstr) == 0) 22: widthstr = "1"; 24: } 26: #endregion 27: getbuilder.AppendFormat("1E0{0}{1}00150100{2}\n","1",heightstr,barcode);//剔除<CR>至此從程序發給DAtaMAx最終打印DPL指令為:
1: //最終DPL指令 2: L 3: D22<CR> 4: R0044<CR> 5: C0015<CR> 6: 1E01032001501008200745869542876<CR> 7: 121100000000100Barcode T<CR> 8: E最終控制打印效果[居中設置]:
?
?
?
?
最后關于<CR>如果在傳入條碼值時最好去掉 在指令中有時會把CR作為字符串打印條碼數據中.
總結
以上是生活随笔為你收集整理的C#控制DataMax指令打印DPL问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 采用CSS+JS实现简洁的滑动导航栏_网
- 下一篇: ISO9000互联网管理办法