博尔杰PTS - 工业标签标识打印整体解决方案
首页 > 技术支持 > 条码校验位计算错误与前后缀设置排查

条码校验位计算错误与前后缀设置排查

条码校验位的问题有个共同特征:标签打得出来、枪也扫得响,但数据进系统就被挡回来。原因往往不在打印机本身,而在于一个更基础的问题没人说清——这个校验位到底该由谁算、算几位、能不能关。本文以工业现场常见的 Zebra ZT610(ZPL 指令族)、TSC TTP-244 Pro(TSPL 指令族)、Honeywell PX4i(多指令语言机型)为参照,配合 BarTender 等标签软件,说明四类现象的分诊方法、三种校验位的身份区别、各码制的位数与校验字符对照,以及从数据源到扫描枪的四层排查顺序与验证方法。文中参数以官方手册口径为准,具体规格以产品页为准。

Zebra ZT610 工业条码打印机(ZPL 指令族参照机型)

一、先把四类现象分开,否则一定反复返工

「校验位不对」这句话在现场至少对应四种完全不同的问题,处理路径没有交集。分诊错了,改一整天参数也不会好。

  • 第一类 算错:条码本身编码正确,但内容是错的——校验位按错误的前缀或错误的权重算出来,扫出来是一串合法但不对的数字。系统若只做长度和格式校验,往往放行;一旦做校验位复算就拒收。
  • 第二类 多一位:可读字符比预期长一位或两位,条码里也确实多编了字符。典型是软件算了一遍、打印机又算了一遍,或者操作员把校验位当成数据输进去了。
  • 第三类 少一位:前导零被吃掉、超长数据被截断、或者输的是 13 位却只该输 12 位。这类问题最隐蔽,因为生成的仍然是合法条码,只是编号变成了另一个。
  • 第四类 多出看不见的字符:屏幕上看着是 12 位,系统收到的却是 14 位——末尾多了回车、Tab,或开头多了 AIM 标识前缀。肉眼看不出,只有长度统计或十六进制查看才现形。

判断顺序建议固定为:先看条码解码结果与标签内容是否一致,再看系统报错是长度还是校验,最后才动参数。跳过前两步直接改设置,等于在四个变量里同时调一个,永远调不准。

二、校验位不是一类东西:三种身份必须先分清

这是全文最核心的一节。设备手册和软件界面里都叫「校验位」,但它们分属三个互不相干的体系。

  1. 符号自带、强制、不可关闭。Code 128 的模 103 校验字符、Code 93 的两个模 47 校验字符(C 与 K)、EAN-13 与 UPC-A 与 ITF-14 的模 10 校验位,都属于符号结构的一部分。它们由编码方在生成条码时自动写入,扫描枪解码时自行验证并剥离,所以扫出来的数据里永远不含它们。Zebra 官方对 ^BC 的说明写得很明确:模 103 校验字符始终存在,无法开启或关闭。既然不可关,界面上任何「校验位开关」都不可能是控制它的。
  2. 可选、需要显式开启。Code 39 的模 43、交叉二五码的模 10、MSI 的模 10、Codabar 的模 16 属于这一类。默认通常是关闭的,开启后编码方会额外追加一个字符。这类才是界面上那个勾选框真正控制的对象。
  3. 数据本身携带的业务校验位。GS1 应用标识符字段里的模 10 校验位、集装箱箱号末位、某些行业编码的自校验位,属于「数据内容」而非「符号结构」。它们应当由数据源头给出,软件和打印机都不该再算一遍。

把这三者混为一谈,就会出现最典型的错判:看到 Code 128 没有校验位开关,就以为「这台机器不支持校验位」;或者看到 EAN-13 有一个勾选框,就以为可以关掉模 10。

三、按码制查表:几位数据、几个校验字符、谁能关

下表按常见码制列出数据位数与校验字符的关系。位数一栏指「输入时应当提供的数据字符数」,不含校验字符本身。

  • EAN-13:输入 12 位,符号共 13 位,末位为模 10 校验位,由编码端自动生成,不可关闭。
  • UPC-A:输入 11 位,符号共 12 位,末位为模 10 校验位,同样不可关闭。
  • ITF-14 / EAN-14:输入 13 位,末位为模 10 校验位,用于箱码层级。
  • Code 128:变长,末尾固定 1 个模 103 校验字符,不可关闭;若启用 UCC 模式,还会再叠加一个模 10 校验位。
  • GS1-128:在 Code 128 基础上加 FNC1 起始标识,各应用标识符字段按标准各自带模 10 校验位。
  • Code 93:变长,末尾固定 2 个模 47 校验字符(C 与 K),不可关闭。
  • Code 39:变长,可选 1 个模 43 校验字符,默认关闭,需显式开启。
  • 交叉二五码:定长或偶数长度,可选 1 个模 10 校验位;开启后输入长度要求会改变,TSPL 手册对此有明确区分。
  • MSI / Codabar:可选 1 个校验字符,模 10 与模 16,现场使用频率较低但同样存在双算风险。

校验位算法本身并不复杂,现场复算时记住三条就够:GS1 系列的模 10 从数据最右一位起算,权值按 3 与 1 交替,用不小于总和的最小十的倍数去减,差值即校验位;Code 39 的模 43 是字符值求和后取余,字符值 0 至 9 对应 0 至 9、A 至 Z 对应 10 至 35、连字符 36、句点 37、空格 38、美元符 39、斜杠 40、加号 41、百分号 42;Code 128 的模 103 是起始字符值加上「每个字符值乘以位序」的总和再取余,起始值随子集不同而不同。

四、第一层 数据源:前导零与位数错位

这一层的问题占了现场故障的多数,而且完全与打印机无关。

  1. Excel 吃掉前导零。把条码列按常规格式粘贴,以 0 开头的 13 位编号会变成 12 位,EAN-13 生成时在左侧补零,最终得到的是一个合法但编号错误的条码。处理办法是把该列先设为文本格式再粘贴,或在输入时前置一个英文单引号,或改用文本导入并显式指定列类型。
  2. 位数决定码制。11 位数据会被当成 UPC-A,12 位被当成 EAN-13,13 位被当成 ITF-14。少输一位通常不会报错,只是换了码制,条码看着一样能扫,编号却对不上。核对时不要只看长度「差不多」,要数清楚。
  3. 把校验位当数据输入。上游给的是完整 13 位,操作员原样输进 EAN-13 的 12 位字段,软件按前 12 位重算校验位,末位被丢弃或错位。判据是可读字符最后两位里有一位与手算结果不符。
  4. 数据库字段长度不足。源头字段定义为 12 位,13 位编号入库时被截断,后续所有环节都在错误数据上运转。这类问题要在入库前拦,不能靠打印端补救。

现场快速判据:把数据导出成纯文本,用等宽字体逐位对齐数一遍。凡是「看起来对、系统说不对」的,九成能在这一步发现少位或移位。

五、第二层 软件层:生成与显示是两个开关

BarTender 一类软件把校验位相关设置分散在两个属性页,这是误操作的高发区。

  1. 生成开关在「符号体系与尺寸」页。该页会按当前码制显示是否有 Check Digit 选项。Code 39 可启用并选择模 43 等算法,Code 11 可选自动、C、C 加 K 等模式;而 EAN、UPC 这类码制的校验位默认启用且不可更改,界面上根本不会给可切换的选项。看不到选项不等于功能缺失,恰恰说明它是强制的。
  2. 显示开关在「人眼可读」页。Hide Check Digit 控制的是可读字符里是否显示校验位,不控制是否计算。很多「打出来多一位」的投诉,实际是显示开关被打开,条码内容并没有多。
  3. 不要在数据源里手拼校验位。需要额外校验位时,正确做法是新建一个 Visual Basic Script 数据源调用内置校验函数,或直接写自定义算法,让它作为独立数据源参与编码。手拼字符串在换码制、换长度时会全部失效。
  4. 换打印机后要复核。部分软件在切换目标打印机后,码制相关选项会回到默认值。改完先看预览里的可读字符长度,再打一张样张,不要直接批量。

一个反直觉但很实用的结论:可读字符里有校验位、条码里没有,是完全正常的组合。可读字符只是给人看的文本,它和符号里编码了什么可以不一致。验收时必须用解码器读原始数据,不能靠肉眼读可读字符。

六、第三层 指令层:ZPL 与 TSPL 的参数语义各不同

绕过软件直接下指令,或者用驱动直发模式时,参数语义的细节决定成败。

ZPL 侧:

  • Code 128 用 ^BC,格式为方向、高度、可读字符、可读字符在上、UCC 校验位、模式。其中 UCC 校验位参数开启后,是在固有的模 103 之外再加一个模 10,官方原文是「模 10 与模 103 同时出现」。这就是「一开校验位就多一位」的直接来源。
  • Code 39 用 ^B3,第五个参数是模 43 校验位,默认关闭。开启后打印机自行计算并追加,不要再在数据里给。
  • EAN-13 用 ^BE,只接收 12 位。官方说明是超出会截断、不足会在左侧补零,两个动作都不报错,这是静默出错的典型。
  • UPC-A 用 ^BU,只接收 11 位,末位参数控制的是「是否打印校验位」,默认打印。它不控制是否计算——模 10 一直由打印机算。把这个参数当成「校验位开关」去关,只会让可读字符少一位,条码本身不变。

TSPL 侧:

  • 指令格式为 BARCODE 加坐标、码制名称、高度、可读字符、旋转、窄条宽、宽条宽,最后是内容。
  • 码制名称本身区分是否带校验位:39 与 39C、25 与 25C、MSI 与 MSIC 分别对应「不带」与「带校验位」。选错名称就是少一位或多一位。
  • 长度要求随之变化:25 要求偶数长度,25C 要求奇数长度。开启校验位后输入从偶数变奇数,仍按偶数准备数据必然报错或被截断。
  • 固定长度码制同样有硬约束:EAN13 为 12 位、UPCA 为 11 位、ITF14 与 EAN14 为 13 位。
TSC TTP-244 Pro 桌面条码打印机(TSPL 指令族参照机型)

判断问题落在哪一层有个简单办法:把作业打印到文件而不是打印机。如果文件里是纯文本指令,说明走的是指令直通,纸张名称、驱动缩放这些设置都不参与;如果文件是位图或 EMF,说明软件已经把整张标签渲染成图形,此时条码的校验位是软件算的,打印机参数再改也没用。

七、第四层 输出层:扫描枪的前缀、后缀与字符替换

条码本身完全正确,数据却在进入系统的瞬间被改写,问题在输出层。这一层最容易被漏掉,因为它不在标签上,也不在打印机里。

  1. 先做隔离测试。把光标放进记事本,用同一把枪扫同一张标签。记事本里就多字符,说明问题在枪;记事本干净而业务系统异常,说明在中间件或上位机的字段映射。
  2. 看后缀。多数枪出厂默认在数据末尾追加回车,方便表格逐行录入。业务系统若把这个回车计入长度,就会报「超长」或「校验失败」。处理方式是在配置工具的数据格式化里把后缀清空或改成需要的键。
  3. 看前缀。若开启了 AIM 标识符传输,数据开头会带上标识串(Code 128 常见为右方括号加 C1,EAN 系列常见为右方括号加 E0,具体以设备手册为准)。这类前缀肉眼在输入框里几乎看不出,但会让校验位复算整体右移一位,必然失败。
  4. 看字符替换与长度控制。有的枪配置了把某个字符替换成空、或限制了最大长度。替换规则按字符编码匹配,配错一位就会吃掉数据。
  5. 特殊字符要用十六进制输入。回车是 0x0D、Tab 是 0x09。在配置界面里直接粘贴不可见字符,往往被过滤掉,导致「配了没用」。Zebra 的 123Scan 在数据格式化的前缀后缀页提供特殊字符插入,Honeywell 的配置工具同理,路径名称不同但层级一致。
  6. 改完必须复验。每次改前缀后缀都重新扫一遍记事本,并导出配置文件备份,同型号设备可直接下发,避免逐台手调出现新的差异。

八、GS1-128 的两个专属坑:括号与 FNC1

GS1-128 是校验位问题最集中的码制,原因有两个。

  • 括号只是给人看的。应用标识符外面的圆括号出现在可读字符里,不进入编码数据。把括号一起打进数据串,扫出来就会多出两个字符,且位置错乱。正确做法是数据里只写标识符与值,括号交给可读字符模板处理。
  • 可变长度字段必须有分隔。应用标识符后面的字段若为可变长度,且后面还有其他字段,必须用 FNC1 分隔,或把可变长度字段放在最后。缺了分隔,解码端会把后续字段的内容并入前一字段,长度校验必然失败。

另外,GS1 各字段的模 10 校验位由软件按字段自动追加,不需要人工计算。人工再算一遍,就会出现字段内多一位。ZPL 的 UCC 与 EAN 模式、TSPL 的 EAN128 码制都会自行处理这部分,前提是数据串里不要预置校验位。

九、十步排查流程,照做即可

  1. 取一张问题标签,用解码器读取原始数据,记下字符数与首尾字符。
  2. 对照本文第三节的表,确认该码制应有的数据位数与校验字符数。
  3. 把解码结果与标签设计稿的字段值逐位比对,确认是算错还是移位。
  4. 检查数据源:前导零是否保留、字段长度是否足够、有没有把校验位当数据输入。
  5. 检查软件的符号体系页,确认码制是否被改动,校验位选项是否与码制匹配。
  6. 检查人眼可读页,确认显示开关有没有造成「看起来多一位」。
  7. 检查指令层参数:ZPL 看 ^BC 的 UCC 参数与 ^BE、^BU 的位数,TSPL 看码制名称是否带 C。
  8. 做记事本隔离测试,排查扫描枪的前缀、后缀、替换规则。
  9. 对 GS1-128,确认括号未入数据、FNC1 分隔到位、字段校验位未重复。
  10. 改完只打一张,按第十节三级验证通过后再批量。

十、改完怎么验证:三级验证缺一不可

  1. 解码器直读。用解码器或带原始数据输出的扫码设备读取,不看可读字符、不经过业务系统。这一级确认符号内容正确。
  2. 校验位复算。按码制算法从数据体重算,与解码结果的末位比对。注意复算时不要把已存在的校验位计入求和,也不要把权重从左往右数——这两件事是复算失败的最常见原因。
  3. 业务系统端比对。完整走一遍真实流程,检查系统收到的字符数与字段值,包括不可见字符。这一级才能暴露前缀后缀问题。

三级验证的顺序不能颠倒。跳过第一级直接看系统,会把编码错误误判成接口问题;跳过第三级只看解码器,会把前缀后缀问题留到批量生产时爆发。

Honeywell PX4i 工业条码打印机(现场验证用参照机型)

十一、把规则固化下来,减少重复排查

  • 在模板规范里写死三件事:码制名称、输入位数、校验位由谁负责。三者写清楚,换人换机都不会走样。
  • 建立码制与位数的对照清单,贴在工位或写进作业指导,避免凭印象输数。
  • 数据源统一按文本处理,从导入环节就保住前导零。
  • 每批首张留样并记录解码结果,出现争议时可回溯是模板变更还是来料变更。
  • 扫描枪配置导出备份,同型号统一刷写,避免「同一张标签不同工位结果不同」。

常见问题

1. 条码能扫出来,为什么系统说校验位错误?

能扫说明符号结构和印刷质量没问题,报错说明内容与系统预期不符。最可能是系统按另一套规则复算:它期待的是数据体内含校验位,而标签上的是符号自带校验字符。先确认码制与位数,再确认系统侧是否要求数据内再带一位校验位。两者不是同一件事。

2. 我在软件里勾了校验位,为什么打出来多一位?

因为这个码制的校验位本来就是强制且不可关闭的,勾选加上的是另一层。典型是 Code 128 勾了 UCC 校验位:模 103 一直在,再叠加模 10,可读字符自然长一位。先查该码制是否允许关闭,不允许就说明这个勾选框控制的是别的参数。

3. Code 128 的校验位能不能关?

不能。模 103 校验字符是符号结构的一部分,Zebra 官方明确写「始终存在,无法开启或关闭」。界面上能改的只有 UCC 校验位这一项,它加的是模 10,不是模 103。

4. Code 39 加了校验位,枪扫出来为什么末尾多一个字母?

因为模 43 校验字符在符号里是真实编码的字符,扫描枪不会剥离它。开启后末尾多出的那个字母就是校验字符,属于正常现象。若业务系统不接受,应在中间件里去掉末位,而不是关掉校验位——关掉会失去检错能力。

5. EAN-13 输入 13 位会怎样?

不会报错,但结果通常不对。EAN-13 只接收 12 位数据,超出部分被截断、不足在左侧补零。输入 13 位时首位可能被截掉,剩下 12 位重算校验位,得到的是另一个合法编号。正确做法是只输前 12 位。

6. 为什么 Excel 里的条码少了一位,或者变成科学计数法?

单元格被识别为数值,前导零被丢弃,位数一多还会转成科学计数法。把整列先设为文本再粘贴,或在输入时前置英文单引号。这一步必须在导入前做,打印端无法恢复已经丢失的零。

7. 同一张标签,A 枪扫正常,B 枪扫多一个回车,为什么?

两把枪的后缀配置不同。多数枪默认在末尾追加回车,用于表格逐行录入。差异来自设备配置而非标签。在配置工具里统一后缀设置,并把配置导出后批量下发,可一次性消除这类差异。

8. 可读字符有校验位,条码里却没有,正常吗?

正常。可读字符是给人看的文本,与符号里编码的内容可以不一致。验收要以解码器读出的原始数据为准,不能靠肉眼读可读字符判断。反过来,可读字符没有校验位而条码里有,也是常见配置。

9. GS1-128 的括号要不要打进数据?

不要。括号只出现在可读字符里,不进入编码数据。把括号打进数据串会让扫描结果多出字符且位置错乱,长度校验随之失败。数据里只写应用标识符与对应值,括号由可读字符模板生成。

10. 打印机自己会算校验位,软件还要不要算?

对符号自带的校验字符,由生成方算一次即可,打印机在指令层会自动处理。软件再算一遍、或者人工把算好的校验位写进数据,就会变成双校验位。可选校验位(如 Code 39 模 43)只能由一方开启,不能两边同时开。

11. 换了打印机后校验位就报错,为什么?

换机后指令族与码制名称都可能变化,固定长度码制的位数要求也随之不同。另外部分软件在切换目标打印机后,码制相关选项会回到默认值。换机后必须重新核对码制、位数与校验位归属,并重打样张验证。

12. 怎么快速判断是枪的问题还是标签的问题?

用记事本做隔离测试:扫进记事本,若数据与标签一致,问题在枪之后的环节(中间件、系统字段映射);若记事本里就多字符或缺字符,问题在枪的配置或标签本身。这一步一分钟内可完成,能省掉大量无效调试。

本文涉及的码制参数以 ZPL 与 TSPL 官方手册口径为准,具体机型的支持范围与默认值可能因固件版本不同而有差异,落地前请以产品页与随机手册核对。更多打印机、标签、碳带与软件的操作问题,可查看 mroer 支持中心 或 全部分类。

« 返回列表
博尔杰PTS|博尔杰标识商城|博盾安全标识|博锐迪生物标签