Os parâmetros, na ordem
A forma é ^BCo,h,f,g,e,m. Em ^BCN,120,Y,N,N são: sem rotação, 120 pontos de altura, com linha legível, ela não vai acima do código, e sem dígito verificador.
Como em todo comando ZPL, a posição é que importa e não o nome: deixar um espaço vazio entre duas vírgulas mantém o valor padrão daquele parâmetro. O conteúdo do código vem no ^FD seguinte, não aqui.
- o — orientação: N normal, R 90°, I 180°, B 270°.
- h — altura das barras em pontos. Não inclui a linha legível.
- f — imprime a linha legível com os dígitos (Y ou N).
- g — coloca a linha legível acima do código em vez de abaixo.
- e — inclui o dígito verificador UCC (raro em etiqueta de envio).
- m — modo (N, U, A, D). O D é o que ativa o modo automático de subconjunto.
A largura vem do ^BY, não do ^BC
O ^BC define a altura, mas não a largura. Quem controla quão largas as barras ficam é o ^BY, que vale para todos os códigos que vierem depois dele: ^BY3 dá um módulo de 3 pontos, e cada barra estreita passa a ter 3 pontos de largura.
É por isso que um código de barras “de repente parou de caber”: alguém mudou o ^BY lá em cima e todas as barras da etiqueta escalaram junto. Um módulo pequeno demais para a resolução da impressora faz o efeito oposto — as barras se fundem e o leitor não separa mais uma da outra.
Quando o payload é só de dígitos
O Code 128 tem subconjuntos, e um payload só de números pode ser codificado no subconjunto C, que empacota dois dígitos por símbolo e sai com metade da largura. Isso é eficiente, mas nem todo sistema a jusante espera isso.
As transportadoras controlam isso escrevendo o subconjunto no começo do ^FD: um ^FD>:1234567890 começa no subconjunto B e impede o colapso para o C. Se o seu código saiu com metade da largura esperada, é isto que está acontecendo.