Los parámetros, en orden
La forma es ^BCo,h,f,g,e,m. En ^BCN,120,Y,N,N eso se lee: sin rotación, 120 puntos de alto, con la línea legible, no ponerla arriba del código, y sin dígito verificador.
Como en todo comando ZPL, lo que importa es la posición y no un nombre: dejar un lugar vacío entre dos comas mantiene el valor por defecto de ese parámetro. El contenido del código viene en el ^FD siguiente, no acá.
- o — orientación: N normal, R 90°, I 180°, B 270°.
- h — alto de las barras en puntos. No incluye la línea legible.
- f — imprime la línea legible con los dígitos (Y o N).
- g — pone la línea legible arriba del código en lugar de abajo.
- e — incluye el dígito verificador UCC (poco común en etiqueta de envío).
- m — modo (N, U, A, D). El D es el que activa el modo automático de subconjunto.
El ancho viene del ^BY, no del ^BC
El ^BC fija el alto pero no el ancho. Lo que controla cuán anchas son las barras es el ^BY, que vale para todos los códigos que vengan después: ^BY3 da un módulo de 3 puntos, así que cada barra angosta pasa a tener 3 puntos de ancho.
Por eso un código de barras “de golpe dejó de entrar”: alguien cambió el ^BY allá arriba y todas las barras de la etiqueta escalaron con él. Un módulo demasiado angosto para la resolución de la impresora hace lo contrario — las barras se fusionan y el lector ya no las distingue.
Cuando el payload es solo dígitos
Code 128 tiene subconjuntos, y un payload solo numérico puede codificarse en el subconjunto C, que empaqueta dos dígitos por símbolo y sale con la mitad del ancho. Es eficiente, pero no todos los sistemas que vienen después lo esperan.
Los transportistas controlan esto escribiendo el subconjunto al principio del ^FD: un ^FD>:1234567890 arranca en el subconjunto B e impide el colapso al C. Si tu código salió con la mitad del ancho esperado, esto es lo que pasó.