LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 1 Códigos de barra EAN13: 1. COMO FUNCIONA: A leitora ótica foi projetada para ler barras ou ausência de barras com 0,33 mm de espessura. Quando a barra existe, representa o binário 1 e a sua ausência representa o binário 0. A existência de barras mais grossas é pura ilusão, pois, na realidade, são várias barras justapostas, representando uma seqüência de s binários 1. O mesmo acontece em relação aos espaços, isto é, espaços maiores representam uma seqüência de s binários 0. Adotou-se comercialmente em todo mundo o código EAN-13 como o padrão para identificação de produtos comerciais. Apenas os Estados Unidos e o Canadá não adotam este padrão. Utiliza-se também o código EAN-8, muito raramente, apenas quando o tamanho do produto impede o uso do código EAN-13, pois, o primeiro utiliza 8 dígitos decimais para representar o código do produto, enquanto que o segundo utiliza 13 s decimais. 2. HARDWARE: A leitora é ligada na entrada para teclado da CPU e este na leitora, através de uma dupla de conectores presentes no final do cabo da mesma. Para o teclado Para a CPU Desta forma, a leitora ótica funciona como se fosse um teclado, não necessitando portanto de qualquer instalação de software. Como estão ligados em paralelo, tanto faz digitar os números do código de barras, como lê-los através da leitora, que estes serão colocados no objeto que estiver focado no momento (edit, memo, dbedit, etc...).
LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 2 3. O CÓDIGO EAN-13: Existe uma entidade mundial que controla a numeração dos produtos comerciais: é a EAN. O Brasil se filiou à mesma e recebeu o número 789 como prefixo de todos os seus produtos. No nosso país, quem controla a liberação dos números é a GS1 BRASIL, constituída oficialmente em 8 de novembro de 1983, a ABAC - Associação Brasileira de Automação Comercial - atualmente GS1 BRASIL, começou a ser delineada em fevereiro daquele ano, quando a SEI - Secretaria Especial de Informática - convocou empresas do comércio para elaborar um documento refletindo as necessidades do setor com relação a automação comercial. (http://www.gs1brasil.org.br) Os 3 primeiros s representam o País onde o produto foi embalado. Este número é fornecido pela EAN mundial, que atribuiu ao Brasil, como já dissemos, o número 789. Para a Argentina, por exemplo, o número é 779, etc. A G1 BRASIL estabeleceu que os 4 ou 5 s decimais seguintes representariam a Empresa. Ela utiliza 4 s quando a empresa produz muitos produtos. Estão disponíveis no Brasil 6000 códigos de Empresas nesta situação, estes códigos são numerados de 0000 a 5999. São utilizados 5 s para empresas com menor número de produtos. Neste caso, existem 40000 códigos, numerados de 60000 a 99999. Os dígitos seguintes, exceto o último, representam os códigos dos produtos produzidos. Consideram-se produtos diferentes aqueles que, mesmo sendo do mesmo produto, têm embalagens diferentes, ou pesos diferentes, etc. Na realidade, o código de barras deverá identificar, sem nenhuma dúvida o produto que está sendo comercializado. Estes códigos de produtos, representados por 4 ou 5 s (dependendo se a Empresa tem um código com 5 ou 4 s) são de responsabilidade da Empresa, e devem ser informados à G1 BRASIL os códigos escolhidos com a respectiva correspondência ao produto produzido. O último dígito, é o DÍGITO VERIFICADOR, que através de um pequeno algoritmo, verifica a autenticidade do número lido pela leitora de códigos de barra, minimizando o erro de leitura da mesma. Existe a necessidade deste dígito, pois, se a leitora fizer a leitura de uma seqüência de s errada (defeitos de impressão na embalagem, sujeira, amassados, descoloração, etc) o último certamente irá dar diferente do que está gravado na embalagem, causando um erro de leitura. Existindo tal erro, a leitura é repetida um certo número de vezes. Caso persista, a entrada do código deverá ser feita manualmente pelo teclado, fato que constatamos frequentemente nos supermercados.
LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 3 EXEMPLO: 7899168510017 = 789 91685 1001 7 Código do País Dígito verificador Número do produto Número da empresa 4. ALGORITMO DO DÍGITO VERIFICADOR: a) Numere os s da esquerda para a direita (retirei o próprio dígito verificador): 7 8 9 9 1 6 8 5 1 0 0 1 01 02 03 04 05 06 07 08 09 10 11 12 b) Some todos os s das posições ímpares: 7 + 9 + 1 + 8 + 1 + 0 = 26 c) Some todos os s das posições pares multiplicando-os por 3: 8 * 3 + 9 * 3 + 6 * 3 + 5 * 3 + 0 * 3 + 1 * 3 = 87 d) Some o resultado da letra b com o da letra c : 26 + 87 = 113 e) Ache o múltiplo de 10 mais próximo, para mais, do resultado da letra d : 113 120 f) O dígito verificador será o valor da letra e menos o valor da letra d : 120 113 = 7 o dígito verificador será 7. 5. DIMENSÕES DO CÓDIGO EAN-13: 510017 Alterações nestas dimensões são permitidas, através de tabelas de conversão, que não publicamos neste trabalho, pois, fogem ao assunto do mesmo.
LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 4 6. REPRESENTANDO OS NÚMEROS EM BARRAS: Cada, dependendo da sua posição, terá sua representação definida de acordo com a tabela a seguir: Algarismo Tabela A Tabela B Tabela C 0 0001101 0100111 1110010 1 0011001 0110011 1100110 2 0010011 0011011 1101100 3 0111101 0100001 1000010 4 0100011 0011101 1011100 5 0110001 0111001 1001110 6 0101111 0000101 1010000 7 0111011 0010001 1000100 8 0110111 0001001 1001000 9 0001011 0010111 1110100 Tabela 1 A posição 1 indicará a seqüência de tabelas A ou B para os s das posições de 2 a 7: 1º Tabela do 2º Tabela do 3º Tabela do 4º Tabela do 5º Tabela do 6º Tabela do 7º 0 A A A A A A 1 A A B A B B 2 A A B B A B 3 A A B B B A 4 A B A A B B 5 A B B A A B 6 A B B B A A 7 A B A B A B 8 A B A B B A 9 A B B A B A Tabela 2 A tabela C é utilizada para os s localizados nas posições 8 a 13. As barras do código EAN-13, ainda têm alguns códigos binários adicionais. Abaixo, descreveremos toda a sequência de binários em um código de barras: Margem de silêncio (vazia, sem barras) Caractere auxiliar de guarda: 101 Seis caracteres utilizando a tabela A ou B, de acordo com o primeiro caractere. No nosso exemplo, o primeiro caractere é 7 e portanto, consultando a tabela 2 verificamos que a seqüência para este é: A B A B A B. Então pela tabela 1 temos a seguinte sequência de binários: guarda 8 9 9 1 6 8 101 0110111 0010111 0001011 0100111 0101111 0001001 tabela A tabela B tabela A tabela B tabela A tabela B
LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 5 Caractere auxiliar central: 01010 101011011100101110001011010011101011110001001 01010 Seis caracteres utilizando a tabela C da tabela 1 : 5 1 0 0 1 7 1001110 1100110 1110010 1110010 1100110 1000100 Um caractere auxiliar de guarda: 101 10101101110010111000101101001110101111000100101010100111011001101000100 101 Margem de silêncio final. Você pôde verificar que o primeiro não possui barras, ele é representado pela seqüência das tabelas utilizadas, de acordo com a tabela 2. A seguir, apresentamos algumas rotinas que podem ser incluídas em um programa que desenha os códigos de barra através de um objeto Canvas dentro de um objeto Image. Sugiro que acrescente ao formulário um objeto Edit, onde serão digitados os 12 primeiros s do código EAN-13, e o próprio programa se encarregará de determinar o dígito verificador. Em seguida, será desenhado dentro do objeto Image o código de barras correspondente: Declarar globalmente as constantes a seguir, que guardam a tabela de caracteres: Const TabelaA: array[0..9] of string[7] = ('0001101', // 0 '0011001', // 1 '0010011', // 2 '0111101', // 3 '0100011', // 4 '0110001', // 5 '0101111', // 6 '0111011', // 7 '0110111', // 8 '0001011');// 9 TabelaB: array[0..9] of string[7] = ('0100111', // 0 '0110011', // 1 '0011011', // 2 '0100001', // 3 '0011101', // 4 '0111001', // 5 '0000101', // 6 '0010001', // 7 '0001001', // 8 '0010111');// 9
LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 6 TabelaC: array[0..9] of string[7] = ('1110010', // 0 '1100110', // 1 '1101100', // 2 '1000010', // 3 '1011100', // 4 '1001110', // 5 '1010000', // 6 '1000100', // 7 '1001000', // 8 '1110100');// 9 TabelaPaises: array[0..9] of string[6] = ('AAAAAA', 'AABABB', 'AABBAB', 'AABBBA', 'ABAABB', 'ABBAAB', 'ABBBAA', 'ABABAB', 'ABABBA', 'ABBABA'); Agora sugerimos uma rotina que desenha realmente uma barra: Procedure Barra(x,altura:byte); With Form1.Image1.Canvas do MoveTo(x,0); LineTo(x,ALTURA); A rotina a seguir, auxilia na escolha de qual das tabelas iremos acessar: Function Binario(t,n: byte): string; Case T of 1: Binario:= TabelaA[n]; 2: Binario:= TabelaB[n]; 3: Binario:= TabelaC[n];
LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 7 A função abaixo, nos mostra como podemos compor o número binário correspondente aos 13 s do código de barras: Function Codigo(c: string): string; Var aux: string; i: byte; Aux:= 101 ; Pais:= Tabelapaises[strtoint(c[1])]; For i:= 2 to 7 do If Pais[i-1] = A then Aux:=Aux+Binario(1,StrToInt(c[i])) else Aux:= Aux+Binario(2,StrToInt(c[i])); Aux:= Aux + 01010 ; For i:= 8 to 13 do Aux:= Aux + Binario(3,StrToInt(c[i])); Codigo:= Aux + 101 ; A rotina abaixo, é a que comanda o desenho de todas as barras, inclusive detecta aquelas que deverão ter uma altura maior do que as outras: Procedure Desenha_Barra(cod: string); var i: byte; For i:= 1 to length(cod) do If cod[i] = '1' then If i in [1..3,46..50,93..95] then Barra(15 + i,95) else Barra(15 + i,90); A função abaixo, faz o cálculo do dígito verificador: Function digito_verificador(n: string): string; var i: byte; s, x: integer; S:= 0; for i:= 1 to 12 do If odd(i) then s:= s + StrToInt(n[i]) else s:= s + StrToInt(n[i]) * 3; x:= 0; while (x < s) do inc(x,10); digito_verificador:= IntToStr(x-s);
LINGUAGEM DE PROGRAMAÇÃO DELPHI - Prof. Alberto Cezar de Carvalho Página 8 Para montar o programa faça: 1) Permita ao usuário montar o número do código utilizando um objeto Edit por exemplo. O número é composto pelas seguintes partes: a) o código do País b) número da empresa c) número do produto 2) De posse deste número chame a rotina "Digito_Verificador", passando a esta função o número digitado, como parãmetro. 3) Acrescente o dígito verificador ao final do número que havia sido digitado (item 1). 4) Passe à função "Codigo" o número obtido no item 3, como o parãmetro da mesma. 5) O valor retornado da função codigo (item 4) será passado como parâmetro da rotina "Desenha_Barra", para que a mesma comande o desenho de todas as barras. 6) Pronto. O código de barras será desenhado no objeto Canvas do objeto Image1. Tente fazer, é importante você se acostumar a encontrar e resolver os problemas de programação!!!