博尔杰PTS - 工业标签标识打印整体解决方案
首页 > 技术支持 > 序列号断点续打与作废重打的计数恢复排查

序列号断点续打与作废重打的计数恢复排查

批量打印进行到一半卡纸、断电、换耗材,或者中间几张打糊了要废掉——这类场景在标签打印现场几乎每天都会遇到。真正麻烦的往往不是把机器恢复起来,而是号码接不回去:剩下的标签从哪个号开始打、作废的那几张要不要补号、软件里显示的计数器和机器里跑的计数器到底哪个说了算。

本文只处理「作业中断后的接续与计数恢复」这一类问题,覆盖四个方向:中断后从哪里接着打、作废张数怎么补、计数器的保存位置、恢复与验证步骤。写法按「现象 → 原因 → 步骤」展开,涉及 ZPL、TSPL 指令层与 BarTender、NiceLabel 软件层两侧的口径。

先划清与相邻文章的界线,避免走错排查入口:本文不讨论「递增参数写错导致压根不递增」(那是对象属性与数据源优先级的问题,见《Codesoft 序列号不递增与数据库字段错乱排查》);也不讨论「份数设置错误导致多打少打」(见《打印份数与张数设置错误导致重复出标排查》);打印队列整体卡死的处理见《Windows打印队列堵塞与假脱机服务卡死排查步骤》;业务系统重复下发任务的处理见《ERP/MES触发批量打印不打印与重复打印排查》。

Zebra ZT231 203dpi 工业标签打印机

图示为 Zebra 斑马 ZT231 203dpi 工业标签打印机,用于说明作业中断后机器侧与软件侧两套计数并存的情况

一、先分清四种「中断」,处理路径完全不同

断点续打的第一步不是改起始值,而是判断中断属于哪一种。四种形态的处置顺序不一样,判断错了会把本来能接上的号码改乱。

  1. 作业中断:软件已下发任务,机器打了一部分就停了(卡纸、缺纸、打印头未压紧、被人为暂停)。此时软件侧的计数器通常已经消耗到已发送的张数,而机器侧只打到实际出标的那张。两边不一致,必须以实物为准。
  2. 整机中断:断电、重启、拔线。除了实物清点,还要额外确认机器内部计数器是否被清零(ZPL 与 TSPL 的行为不同,见第四、五节)。
  3. 单张报废:批量没停,中间几张打糊、褶皱、贴错。这类不中断作业,只涉及作废张数的补法(第八节)。
  4. 整批报废:材质错、内容错、日期错,整批重来。这类通常要求号码段整体作废并重新起号,而不是接着打。

判断方法很简单:看机器是否还在「同一个作业里」。作业没结束就属于作业中断;机器重新上电或软件重新发送任务,就按整机中断或新作业处理。同一个作业内软件侧计数是连续推进的,跨作业才会触发重置条件。

二、接号之前先清点:把「已经打出去的号」确定下来

绝大多数断点续打出错,都是因为没人先数清楚打到了哪个号,凭印象填了起始值。清点有三个可靠来源,建议至少用两个交叉验证。

  1. 实物清点:把已经打出来的标签按顺序摊开,取最后一张上的号码作为「已用最大值」。如果中间有跳号,把跳号的位置记下来,不要只取最后一张。
  2. 机器侧张数:Zebra 打印机提供里程计数,用 ! U1 getvar "odometer.total_label_count" 可以读出整机的累计出标张数。官方口径是这个数值统计整机生命周期内的标签数,不含走纸与校准动作。作业前读一次、作业后读一次,两次之差就是本次实际出标张数;这一差值与软件侧计数对不上,就说明中间有任务没跑完或被取消。
  3. 软件侧日志:开启了打印日志的软件会把每张标签的变量值、打印时间、操作人与「是否已重打」记录下来,补打时直接按日志取号最省事(详见第七节)。

注意一个高频陷阱:打印预览不消耗计数器,但打印到文件会消耗。测试阶段习惯性点「打印到文件」,正式批量时就会凭空少掉几张号,看起来像跳号。清理 Windows 打印队列也要在清点前做,队列里残留的任务被恢复后还会再打一次,导致同一个号出现两次。

三、计数器到底存在哪里:四个位置,先找到再谈恢复

「计数器」不是一个东西,它可能落在四个不同的位置。断点续打的绝大多数分歧,本质上是两个位置同时存在计数且互不知情。

  • 位置一:标签文档内部。软件把当前值随文档一起保存。以 BarTender 为例,序列化当前值在文档被保存时写入文档;用 Print Station 打印时对含序列号的文档会自动保存,用 Designer 直接打印则需要在「文件 → 打印 → 选项」里勾上保存已修改的文档,或者在应用消息设置里把 1605 号消息的默认应答设为「是」。文档没保存,下一次打开就从旧值开始。
  • 位置二:软件附属数据文件。NiceLabel 的计数器与共享序列号保存在 .dvv 这类外部变量文件中;文件没写回、路径失效或多人各自保存一份,就会出现号码接不上或重复。
  • 位置三:系统数据库或全局变量。BarTender 的全局数据字段保存在 BarTender System Database 中,可被多个文档共用;NiceLabel 的全局变量由 Control Center 统一保存。这是多人、多工位、多文档共用号码段时唯一稳妥的做法。
  • 位置四:打印机内部。走原生指令打印时,号码由打印机自己递增(ZPL 的 ^SN、TSPL 的 SET COUNTER)。这一层的数值与软件无关,机器一断电行为就不一样。

排查时的规则是:只允许一个位置真正拥有号码。软件侧在递增时,指令层就不要再递增;打印机侧在递增时,软件侧必须改成固定值只做下发。两边都递增,出标号码会以两倍步长跳号。

四、ZPL 侧:^SN 的三个参数与「打印机不记忆当前值」

Zebra 的 ZPL 里,序列号用 ^SN 输出,格式为 ^SNv,n,z:v 是起始值(被递增部分最长 12 位),n 是步长(最长 12 位,加负号为递减),z 为是否补前导零(Y/N,默认 N)。例如 ^SN0001,1,Y 表示从 0001 开始、每张加 1、不足四位补零。

两个必须记住的口径:

  1. ^SN 必须与 ^PQ 配合使用,序列号按 ^PQ 指定的打印数量逐张递增;只写 ^SN 不发 ^PQ,只会输出起始值那一张。
  2. 打印机不会记录当前序列号值。Zebra 官方说明明确写到:下一批序列号打印时需要自行更改参数 v(起始值)。也就是说,ZPL 的序列号是「一次性」的——断电、重启、换作业之后,机器不会替你记住打到几号,必须由上位软件或人工计算后重新下发起始值。

这解释了为什么很多现场会出现「重启之后号码从 1 重新开始」:不是机器坏了,是指令层本来就不保存。断点续打的正确做法是在软件侧算出新的起始值(已用最大值 + 1),把 ^SN 的 v 改掉再下发,而不是指望机器继续。

五、TSPL 侧:SET COUNTER 与「断电后哪些计数器会清零」

TSC 的 TSPL 用 SET COUNTER @n step 定义计数器,再用 @n="初始值" 赋初值,在 TEXT、BARCODE 里以 @n 引用。步长可以为正、为负,范围在 ±999999999 之间;步长设为 0 时该计数器就退化成固定变量,每张打出来都一样。

断点续打要特别注意的是计数器的编号区间(以 TSC 编程手册口径为准,不同机型固件版本支持的数量不同,实际以所用机型的手册为准):

  • @0 ~ @50:打印机重新启动后会被清零。用这一段做批量编号,断电重启后号码会从初值重新开始。
  • @51 ~ @60:数值保存在打印机内,直到恢复出厂设置才清除。需要跨断电接续的场景应使用这一段(@51~@55、@56~@60 分别在较晚的固件版本中才提供支持,老机型需先确认固件版本)。
  • 计数器初值字符串长度上限为 101 字节,长序列号不适合整串放进计数器,可拆分成「固定前缀 + 计数器」两段拼接。

因此 TSPL 侧的恢复步骤是:先读机器上最后一张实物的号码;若用 @0~@50,重启后必须重新下发初值;若用 @51~@60,先确认机器没有恢复过出厂设置,再决定是沿用还是重置初值。

TSC TX300 300dpi 桌上型标签打印机

图示为 TSC TX300 300dpi 桌上型标签打印机,用于说明 TSPL 计数器在机器侧的保存区间差异

六、BarTender 侧:当前值随文档保存,重置条件决定「什么时候从头开始」

BarTender 的序列化属于软件侧计数,恢复动作集中在三个地方。

  1. 当前值的保存时机:序列号的当前值在文档保存时被写入文档。用 Print Station 打印含序列号的文档时会自动保存;用 Designer 直接打印则需要在打印选项中勾选「保存已修改的文档」,否则关掉软件再打开,号码回到上次保存时的值。断点续打前先手动保存一次文档,是最省事的一步。
  2. 重置条件:序列化对话框的「重置」页签可以设定序列从头的时机——达到某个值、运行新的打印作业、读取新的数据库记录、某个数据源的值发生变化、按计划时间。批量打印中途中断又重新发起作业时,如果重置条件里勾了「运行新打印作业时重置」,号码就会从头开始,这正是很多现场「接不上号」的直接原因。
  3. 手工重置与共享:需要立刻从头开始时点「立即重置」;需要跨文档、跨工位共用同一段号码时,改用全局数据字段——它保存在 BarTender System Database 中,所有连接到同一系统数据库的文档都能共用,避免各自为政。

一个容易忽略的细节:如果模板里同时存在数据库字段与软件内部计数器,最终以绑定的数据源为准,内部计数器会被数据库字段覆盖。断点续打时若发现改了起始值仍然打旧号,先检查这一处(详见《Codesoft 序列号不递增与数据库字段错乱排查》里关于数据源优先级的说明)。

七、NiceLabel 侧:变量文件、全局变量与打印日志重打

NiceLabel 的计数器是变量的一种,恢复要点有三条。

  • 变量值保存在哪:计数器与共享序列号保存在 .dvv 变量文件中。多人在不同电脑上各自保存一份 .dvv,就会出现重复编号或号码接不上。多工位连续打印应改用 Control Center 中的全局变量统一保存,变量值在确认后会被记住,适合跨模板、跨工作站继续编号。
  • 系统计数器与打印机计数器:在计数器的「常规」设置里可以切换使用计算机计数器还是打印机内部计数器。内部计数器只接收起始值,后续由打印机自己递增,速度快但数值不受软件控制;断点续打场景下建议测试阶段先固定在「计算机计数器」,确认号码可控后再决定是否切换。切换后要同步核对固定长度、数字格式与打印机内部字体,否则换机器或换驱动后容易出现异常。
  • 用打印日志做重打:开启打印日志后,日志会记录每张标签的变量值、打印时间、操作人以及「该标签是否已被重打」。作废重打时直接从日志里取原数据重发,既不会消耗新号,也能留下记录。

八、作废张数怎么补:补号与跳号两种口径

单张或几张报废时,有两种合规的处置口径,选哪一种取决于你们的追溯规则,但必须在作业前定好,不能现场临时决定。

  • 补号(用原号重打):把作废标签上的号码原样再打一次。适用于号码段必须与实物一一对应、不允许缺号的场景。操作上从日志或实物取号,把起始值设成该号,打一张即停;不要用递增方式补,否则会多消耗一个号。
  • 跳号(登记作废后不补):作废的号登记进台账,批次里允许缺号,后续标签按原序列继续。适用于允许缺号、但对缺号必须留痕的场景。操作上不需要回退起始值,只要把作废号段记录清楚即可。

无论哪一种,补打出来的标签都要重新做一次质量确认:补打时打印头往往已经积累了脏污或受到前一次卡纸的擦伤,条码的印制质量等级会下降。建议按 ISO/IEC 15416(一维条码印制质量)或 ISO/IEC 15415(二维符号印制质量)的口径对补打样张重新评级,扫不出来的补打标签等于白补。走纸路径上的胶辊与打印头也建议在这一时点顺手清洁一次,避免同一张反复报废。

九、断点续打的六步标准流程

把上面的判断收敛成一个可执行的顺序,现场照做即可,不需要每次重新推理。

  1. 停机并保留现场:不要立刻按第二次打印。先把机器暂停,保留已出标签与报错信息,避免队列里前后两批任务混在一起。
  2. 清理打印队列:取消或删除残留任务,确认队列为空。残留任务被恢复后会整批重打,是号码重复最常见的来源。
  3. 清点已打号码:实物清点取已用最大值并记录跳号位置;同时用机器里程计数(Zebra 可用 odometer.total_label_count 前后差值)或软件日志交叉验证。
  4. 确定起始值并只改一处:新起始值 = 已用最大值 + 1(补号场景则直接取作废号)。只改拥有号码的那一处——软件侧递增就改软件,指令层递增就改指令参数,不要两处都改。
  5. 试打三张核对:先打三张,逐张核对文字、条码与实际出纸顺序,确认步长、前导零、方向都对,再恢复批量。这三张本身就是记录凭证,别随手扔掉。
  6. 记录与留痕:把中断原因、作废号段、新的起始值写进作业记录,并保存一次模板文档(软件侧计数依赖文档保存)。

十、把结果固化:让下一次中断不再需要人工推算

断点续打反复出问题,说明号码的所有权还放在「人脑」或「易失的位置」上。四项改造可以基本消除这类问题:

  • 起始值外部化:把当前号码放进数据库表、全局变量或系统数据库,而不是文档内部计数器。多人多机共用时这是唯一可靠方案。
  • 只用一处递增:软件侧递增就关闭打印机侧递增,反之亦然。两边都开的模板在切换机型后几乎必然出错。
  • 开启打印日志:日志既能在补打时直接取原数据,也能在盘点时对账,是追溯链条的最后一道保险。
  • 明确责任人:规定谁有权修改起始值、谁负责补打标签、作废号段由谁登记。规则定清楚,比事后手工补号码省心得多。

Honeywell PM42 406dpi 屏显工业标签打印机

图示为 Honeywell 霍尼韦尔 PM42 406dpi 屏显工业标签打印机,用于说明带屏显机型在面板侧核对起始值与出标张数的场景

十一、带屏显机型:在机器侧直接核对的两个数

带显示屏的工业机(如霍尼韦尔 PM42、斑马 ZT231 等)可以在面板侧直接做两项核对,不用接电脑:

  1. 核对出标张数:进入机器的菜单或信息页查看累计出标张数,与第二节提到的里程计数互相印证;作业前后各记一次,差值就是本次实际出标张数。
  2. 核对当前起始值:号码由机器递增时,面板上显示的起始值就是下一次出标的第一个号。中断后先看这个数,再决定是沿用还是改成「已用最大值 + 1」。

面板能查不等于面板能改:多数机型的起始值仍由下发的指令或软件侧决定,面板只显示当前接收到的值。若面板数值与软件侧不一致,说明中间还有一层在递增,回到第三节确认号码归属。

十二、与相邻问题的界线

  • 号码压根不递增、每张都一样:属于序列化对象属性(步长为 0、重置条件设错)或数据源优先级问题,不是中断恢复问题。
  • 多打或少打:属于份数设置在软件、驱动、业务系统、指令层四处的相乘关系问题。
  • 队列整体不动:属于假脱机服务与队列堵塞问题。
  • 业务系统重复下发:属于接口触发与重发机制问题。
  • 整批内容错(日期、批次、材质):属于模板变量与数据源取值问题,号码应整段作废而不是接续。

常见问题

1. 中断之后把起始值改成记忆里的号,直接接着打可以吗?

不建议。凭记忆填起始值是断点续打出错的第一大来源。先按第二节清点实物,取「已用最大值 + 1」,再用机器里程计数或打印日志交叉验证一次。只差一号也会造成整批号码错位,而错位往往在贴到产品上之后才被发现。

2. 机器断电重启后,接着打要不要重设起始值?

取决于号码由谁递增。走 ZPL 的 ^SN 时,打印机不记录当前序列号值,下一批必须自行更改起始值参数;走 TSPL 的 SET COUNTER 时,@0~@50 在机器重启后会被清零,必须重新下发初值,只有 @51~@60 会保留到恢复出厂设置。软件侧递增(BarTender、NiceLabel 的计数器)则由文档或变量文件决定,重启机器不影响,但重开文档而没保存时会回到上次保存的值。

3. 打坏的那几张要不要补号?

看你们的追溯规则:允许缺号的场景登记作废后跳号即可,号码必须与实物一一对应的场景则用原号重打。两种做法都要在作业前定好并写进作业记录,补打时不要走递增,否则会平白多消耗号码。

4. 为什么我改了起始值,打出来还是旧号?

通常是两处计数并存。检查三件事:模板里是否同时存在数据库字段与软件内部计数器(以绑定的数据源为准,内部计数器会被覆盖);打印机内部是否也在递增(走原生指令时 ^SN 或 SET COUNTER 会自行加数);改的是不是正在生效的那份模板文档(副本与原件混用很常见)。

5. 打印预览和打印到文件会不会消耗号码?

预览不消耗,打印到文件会消耗。测试阶段习惯性输出成文件,正式批量时就会凭空少掉几张号,看起来像跳号。测试请走预览或打废纸,或者打完文件后把起始值补回来。

6. 多人共用一台机器,号码总是接不上怎么办?

说明号码被分散保存在各自的文档或变量文件里。改用统一保存位置:BarTender 用全局数据字段(保存在 BarTender System Database),NiceLabel 用 Control Center 的全局变量,指令层则把起始值放在上位系统里统一下发。同时限定只有一个人有权修改起始值。

7. 中途补纸或换碳带之后,会不会跳号?

补纸、换碳带本身不改变计数器,但期间机器会走纸与校准动作,用里程计数对账时要记得这部分不计入出标张数(Zebra 的累计出标张数明确不含走纸与校准)。换耗材后建议先打三张核对号码与质量,再恢复批量。

8. 补打出来的条码扫不出来,是号码接错了吗?

与号码无关,多半是打印头或耗材状态问题。卡纸、褶皱之后打印头容易积脏,补打前先清洁打印头与胶辊,补打后按 ISO/IEC 15416(一维)或 ISO/IEC 15415(二维)重新评级,等级不达标就整张重做,不要靠调高浓度硬凑。

9. 计数器到了最大值会怎样?

取决于递增设置是否定义了上限与重置条件。软件侧可以在序列化设置里设定「达到某值时重置为某值」,指令层则是位数溢出后从可用位数重新循环,表现为号码突然变短或回零。批量前应估算号码段长度,并明确到达上限后的处置规则。

10. 队列里残留的任务恢复后重打了一次,号码重复怎么办?

先清空队列再清点。已经重复贴到产品上的标签要按作废流程登记,不要只撕掉重贴了事。之后把「打印前先清空队列」写成固定动作,可以从根上避免这类重复。

11. 能不能干脆让机器自己记住打到几号?

可以,但要选对位置:TSPL 的 @51~@60 会保存在打印机内直到恢复出厂设置;ZPL 的 ^SN 不保存当前值,必须由上位软件下发起始值。更稳妥的做法是把当前号码放进数据库或全局变量,由系统统一拥有号码,机器只负责按下发的数值输出。

更多标签软件与打印机的使用问题,可查看 软件分类支持文章 与 全部支持文章;如需了解设备与耗材的配套方案,可参考 产品方案栏目。文中涉及的机型与规格以各产品页标注为准。

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