Stampare i barcode

I barcode nei processi di automazione industriale rivestono un’importanza fondamentale. Il barcode abbinato ad un oggetto consente di identificarlo precisamente tramite lettori ottici velocizzando e rendendo più affidabili tutti i processi aziendali.

Il barcode (o “codice a barre”) lineare venne adottato a partire dal 1973 grazie allo sviluppo di Woodland presso IBM. Era il barcode UPC (Universal Product Code). Successivamente nel 1977 in Europa venne fondata l’associazione EAN (European Article Numbering) ora conosciuta come GS1.

Esistono due tipi di barcode: lineari (o monodimensionali) e Matrix (o bidimensionali). Barcode monodimensionali sono EAN8, EAN13, CODE128, UPCA, POSTNET, …
Barcode bidimensionali sono QRCode o DataMatrix, …

E’ possibile stampare da IBM i molti tipi di barcode. Da V5R2 c’è il supporto anche per i barcode bidimensionali.

Prerequisito fondamentale è definire il printer file di tipo *AFPDS (Advanced Function Printing Data Stream). E’ necessario specificare il parametro DEVTYPE(*AFPDS) in fase di creazione del printer file (CRTPRTF).
E’ consigliabile aggiungere altri due parametri che possono risultare comodi per ottenere il layout desiderato:

  • PAGESIZE(29.7 21 *UOM) per ottenere il formato di stampa A4 verticale (portrait) oppure PAGESIZE(21 29.7 *UOM) per il formato A4 orizzontale (landscape)
  • UOM(*CM) per specificare l’unità di misura dei valori utilizzati nel parametro precedente od anche in altre keyword (p.es. POSITION) utilizzate nel sorgente del printer file

Ricordo che da IBM i 6.1 è possibile ottenere direttamente un file pdf invece di un file di spool specificando il parametro WSCST(*PDF) e indicando nel parametro TOSTMF il percorso e/o il nome dello stream file. Cfr. anche Stampare PDF da RPG.

In allegato all’articolo trovate qualche programma RPG e printer file di esempio:

N.B. nei pdf con l’esempio dell’output di stampa sono state aggiunte delle informazioni di misura per rendere più immediata la comprensione del risultato che si ottiene modificando i parametri della keyword BARCODE.
La griglia di riferimento (crocette blu e rosse) è stata ottenuta posizionando la costante ‘+’ con la keyword POSITION con un distanziamento verticale di 1 cm e orizzontale di 5 cm.

Programma RPG

Per quanto riguarda il programma RPG non ci sono difficoltà particolari. L’unica annotazione riguarda il check-digit: viene calcolato automaticamente in fase di stampa in base alla keyword specificata nel campo del printer file. Quindi nel programma RPG occorre valorizzare il campo del printer file con il valore del barcode eccetto l’ultima cifra del check-digit. Per esempio se si tratta di un barcode EAN13 9780201379624 il campo del printer file andrà valorizzato con 978020137962 omettendo il check-digit 4.

Definizione printer file

Attenzione maggiore va dedicata al printer file e alle keyword che consentono di definire come si desidera stampare il barcode (tipo, dimensione, orientamento…).

La keyword BARCODE consente di definire un campo che verrà esposto in output come barcode. Questa keyword è particolarmente complessa perché contiene numerosi parametri la cui corretta combinazione consente di stampare diversi tipi di barcode.

La prima informazione da specificare è il tipo di barcode che si desidera stampare (parametro bar-code-ID).
La tabella 2 del manuale contiene la lista dei tipi di barcode supportati. Per citare quelli più comuni: EAN8, EAN13, CODE128, CODE3OF9, DATAMATRIX, QRCODE, …

In base al tipo di barcode occorre definire correttamente il tipo dati del campo abbinato alla keyword BARCODE. La tabella 1 del manuale contiene la lista dei tipi barcode con indicato quale tipo dati e lunghezza utilizzare per il campo. Per esempio per stampare un barcode EAN13 il campo deve essere definito di tipo numerico (S) lungo 12; invece per un barcode Code 3 of 9 il tipo dati è alfanumerico (A) e la lunghezza può essere compresa tra 1 e 50.

Queste sono le informazioni essenziali che occorre inserire nel printer file per poter stampare un barcode.

Gli altri parametri sono opzionali oppure dipendono dal tipo di barcode che si desidera ottenere.

  • altezza: il parametro height definisce l’altezza del barcode. Range di valori: da 0,25 cm a 25,40 cm. Per esempio BARCODE(EAN8 (1 *UOM)) specifica che il tipo di barcode è EAN8 e l’altezza è 1 riferita all’unità di misura specificata nel parametro UOM in fase di creazione del printer file. Nel nostro esempio 1 cm.
    N.B. l’altezza è riferita alla rappresentazione grafica del barcode escluso la stringa human readable. Con i valori di default degli altri parametri l’altezza totale del barcode compreso la stringa human readable è circa +0,25 cm. Per esempio un barcode EAN13 con parametro height uguale a 1 cm risulterà occupare verticalmente circa 1,25 cm.
  • orientamento: il parametro *HRZ o *VRT definisce l’orientamento del barcode. Il default è *HRZ (orizzontale). Per esempio BARCODE(EAN8 (1 *UOM) *VRT) definisce un barcode EAN8, alto 1 cm e orientato verticalmente.
  • human readable: per default (*HRI) sotto la rappresentazione grafica del barcode viene stampata anche la stringa alfanumerica. Il parametro  *HRITOP sposta la stringa sopra al barcode e il parametro *NOHRI la omette.
    N.B. il parametro *HRITOP non è disponibile per tutti i tipi di barcode (p.es. con i tipi EAN8 o EAN13 la stringa viene sempre posizionata al di sotto del barcode).
  • larghezza: il parametro symbol-width *SWIDTH è espresso in pollici. Il valore è compreso tra 0,00 e 9,99 pollici. Rappresenta la larghezza totale del barcode.
  • larghezza barre strette: il parametro unit-width *WIDTH è espresso in pollici. Il valore è compreso tra 0,007 e 0,208. Rappresenta la larghezza delle barre/spazi stretti.
    L’effetto risultante in output di questo parametro è che con valori maggiori di width si ottiene un barcode più largo e proporzionalmente anche più alto.
    Per esempio BARCODE(EAN13 (1 *UOM) (*WIDTH 0.02)) definisce un barcode EAN13, alto 1 cm e con un fattore di larghezza di 0,02 pollici. Il barcode risultante è largo 4,8 cm.
    Un barcode EAN13 con parametro width 0,04 pollici misura in larghezza circa 9,6 cm. Proporzionalmente anche l’altezza del barcode aumenta: pur indicando il parametro altezza uguale a 1 cm, il risultato è un barcode alto (compresa la stringa human readable) circa 1,8 cm.
  • rapporto barre strette/larghe: il parametro wide/narrow-ratio *RATIO rappresenta il rapporto tra le barre/spazi strette e larghe. Il valore è compreso tra 2,00 e 3,00.
    N.B. dai test effettuati con barcode di tipo EAN13 o CODE128 sembra che non produca nessuna variazione nel barcode stampato
  • modifier: questo è un parametro che occorre specificare per alcuni tipi di barcode. Va specificato come valore esadecimale. La tabella 2 del manuale contiene per ogni tipo di barcode la lista dei possibili valori esadecimali del parametro modifier. Per esempio se si vuole stampare un barcode di tipo UCC/EAN 128 (ovverosia GS1-128) occorre specificare come tipo barcode CODE128 e modifier x'03' o x'04'. Per un barcode di tipo QRCODE il valore di modifier è x'02'.
  • QRCode: per ottenere un barcode bidimensionale di tipo QRCode occorre specificare il tipo barcode QRCODE, il parametro modifier con valore esadecimale x'02' e aggiungere il parametro composto [QR Code data]. Quest’ultimo parametro è composto da vari sottoparametri.
    (*QRCODE version error-correction [alternate-data-type] [escape-indicator] [sequence-indicator] [convert-indicator] [trim-indicator])
    Per esempio BARCODE(QRCODE X'02' (*QRCODE 1 3 *TRIM)) produce un QRCode versione 1 correzione errore 3 (livello H) con rimozione di eventuali spazi finali nella stringa.
    Il valore del sotto-parametro version è compreso nel range da 0 a 40 e determina la dimensione del QRCode; anche la lunghezza dei dati contenuti nella stringa del barcode determina la dimensione del simbolo.
    Per regolare la dimensione del QRCode si può utilizzare il parametro symbol-width *SWIDTH.
    Il parametro height non influisce sulla dimensione del QRCode.
    Il sottoparametro alternate-data-type consente di ottenere un QRCode UCC/EAN (ovverosia GS1) se si specifica *UCCEAN. GS1 è lo standard globale di comunicazione tra imprese. I QRCode GS1 consentono di fornire numerose informazioni su un prodotto tramite la lettura del simbolo. Oltre all’identificativo del prodotto (GTIN) è possibile aggiungere nel QRCode numerose informazioni identificate in maniera precisa tramite gli AI (Application Identifier). Per esempio 01 è l’AI per il GTIN, 00 quello per l’SSCC, 10 per il lotto, 17 per la data di scadenza, ecc.
  • DataMatrix: per ottenere un barcode bidimensionale di tipo DataMatrix occorre specificare il tipo barcode DATAMATRIX e aggiungere il parametro composto [Data Matrix data].
    (*DATAMATRIX number-rows row-size [alternate-data-type] [reader][header-trailer] [escape-indicator] [sequence-indicator][convert-indicator] [encoding-scheme] [trim-indicator])
    N.B. nella documentazione IBM i sottoparametri row-size number-rows sono scritti in ordine inverso. Il primo sottoparametro è number-rows e il secondo è row-size.
    N.B. il sottoparametro alternate-data-type dovrebbe consentire di ottenere un Data Matrix UCC/EAN (ovverosia GS1) se si specifica *UCCEAN. Dopo numerosi test però sembra che non sia possibile ottenere un Data Matrix GS1.

Per quanto riguarda i barcode CODE128 può essere utile fare riferimento alla lista dei caratteri consentiti che si trova nella documentazione IBM: https://www.ibm.com/docs/en/i/7.6.0?topic=files-code128-character-set-in-dds.

Link utili

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *