Jump to content

Delphi chamada_delphi.png acbr.png

C6 chamada_c6.png botao.png

Implementar Suporte A Bematech Mp-4200 Th No Acbrnfedanfeescpos


  • Este tópico foi criado há 1672 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Senhores, boa tarde!

 

Configurei o modo ESC/POS na Bematech MP-4200, e estou conseguindo imprimir o DANFeNFCe pela impressora não fiscal usando o ACBrNFeDANFeESCPOS.

 

Em um post do André observei que o componente só foi testado com Epson e DASCOM [1], e gostaria de contribuir implementando as alterações para a Bematech (MP-4200).

 

Analisando o código em ACBrNFeDANFeESCPOS.pas vejo que não existe uma propriedade para informar que tipo de impressora está utilizando, e pelo que observo, cada impressora tem seu padrão de comandos para imprimir o QRCode (na Bematech os demais ESC's funcionaram perfeitamente, negrito, condensado, etc. exceto o QRCode, que imprimiu a "string").

 

Acredito que teremos que criar uma propriedade onde deve ser informado qual tipo de impressora está sendo utiilzada (Epson, Daruma, Bematech, etc., onde Epson será o default, para não quebrar o código de quem já está utilizando). O que acham?

 

Na classe ACBrNFeDANFEClass.pas tem uma propriedade chamada "Impressora", qual a utilidade? Poderíamos utilizar essa propriedade?

 

Por enquanto vou continuar lendo o manual e fazendo testes no Delphi para impressão do QRCode sem DLL.

 

[1] 

WRMedeiros

Focus

Link to comment
Share on other sites

Já consegui imprimir o QRCode.

 

 

ACBrNFeDANFeESCPOS.pas:

  //formato Bematech (http://partners.bematech.com.br/2014/09/imprimindo-qrcode-na-impressora-mp-4200-th/)
  FLinhaCmd :=  #27 + #97 + #1 +      // esse código faz a centralização
                #29 + #107 + #81 +      // esse é o do qr code
                #2 + #12 + #8 + #1 +    // aqui é o tamanho
                Chr(Length(qrcode)) +   // tamanho de caracteres correspondente ao texto
                #0 +
                qrcode;

Fazendo dessa forma acabo quebrando a implementação anterior (Epson), mas para testes por enquanto vou deixar assim.

 

Com essa implementação o QRCode é impresso, mas como a string é muito grande (mais de 300 caracteres), o sistema só consegue enviar uma parte da string para o QRCode (algo em torno de 120 caracteres), e os demais aparecem abaixo do qrcode em formato de texto. Acredito que o problema está no Chr(Length(qrcode)), só não faço ideia de como resolver.

 

Com URL's menores que 120 caracteres funciona perfeitamente.

WRMedeiros

Focus

Link to comment
Share on other sites

  • 2 weeks later...

Pessoal, bom dia!

 

Encontrei um demo no site da Bematech que mostra como imprimir o QRCode no ESC/POS:

 

http://partners.bematech.com.br/bemacast/wp-content/uploads/downloads/2014/09/qrcode.rar

 

Nos meus testes só consigo imprimir URL's com no máximo 255 caracteres, no entanto as URL's da NFCe costumam passar de 350 caracteres como o exemplo abaixo que peguei do manual do NFCe:

 

http://www.nfe.se.gov.br/portal/consultarNFCe.jsp?chNFe=43120910585504000174650010000000541123456781&nVersao=100&tpAmb=1&cDest=43708379006485&dhEmi=323031322d30392d32375431363a32303a33342d30333a3030&vNF=1000.00&vICMS=180.00&digVal=37327151612b623074616f514f3966414a7766646c5875715176383d&cIdToken=000001&cHashQRCode=80f5d4a1e4b12bc97aae0e971a61bff73270fd81

 

Aparentemente o CHR não permite um inteiro maior que 255:

              chr(length(txtMensagem.Text)) +  // tamanho de caracteres correspondente ao texto

Alguém sabe como contornar isso?

 

Já tentei contato com a Bematech, mas não obtive resposta quanto ao caso.

WRMedeiros

Focus

Link to comment
Share on other sites

Bom dia Welkson, essa limitação é do delphi e não da DLL, tenta assim:

 

procedure TForm1.Button1Click(Sender: TObject);
var
   x: Integer;
   s: AnsiString;
begin
   s  := 'http://homologacao.s...e/consultanfce?' +
         'chNFe=51131009471363000180650010000000021000000025&' +
         'nVersao=100&tpAmb=2&' +
         'dhEmi=323031332d31302d31345430383a30343a35372d30343a3030&' +
         'vNF=54.91&vICMS=0' +
         '&digVal=7a75777551485a6a68574c4f7952776a366253484f4d52686a68673d&cIdToken=000001&cHashQRCode=5487648014f46599400a6e10150604c960f246cc';

 

chr( length( s ));

 

end;

Link to comment
Share on other sites

Nilton, bom dia!

 

No demo da Bematech a URL é passada apartir de um EditText, ou seja, nem tem essa limitação de 255 caracteres de uma string comum.

 

Antes quando eu estava testando usando variáveis eu percebi essa limitação e fiz como você mencionou, concatenei, mas dessa vez o problema é nesse parâmetro que informa quantos caracteres tem na URL.

 

Tanto que a URL é codificada no QRCode até a 255 posição, e o resto é "impresso" como observação logo abaixo do QRCode, ou seja, a String foi enviada por completo, no entanto o Chr só considerou 255.

 

Cheguei ao ponto de remover o Chr e colocar somente o #347, e mesmo assim a impressora "quebra" o QRCode.

 

Tem um aplicativo da Bematech onde é feito alguns ajustes na impressora (atualização de firmware, definição de set de comandos: ESC/POS, ESC/BEMA, etc.), e nele tem um local onde é possível imprimir um QRCode de exemplo, lá eu colei essa URL com 347 caracteres e imprimiu certinho, mas os fontes desse APP não são disponibiizados.

 

Para descobrir como eles fizeram instalei um "sniffer" de porta serial e capturei o tráfego que esse aplicativo envia, no entanto observei que eles usam ESC/BEMA em vez de ESC/POS para imprimir o QRCode, e no ESC/BEMA não é necessário informar o tamanho da URL.

 

Alguém tem algum exemplo de como imprimir um QRCode usando ESC/BEMA?

WRMedeiros

Focus

Link to comment
Share on other sites

Pessoal,

 

A Bematech respondeu o e-mail e consegui resolver o problema.

 

Acredito que a solução ideal seria criar uma propriedade no componente TACBrNFeDANFeESCPOS para informar o padrão de QRCode deve ser impresso (já que no ESC/POS não tem um comando padronizado para imprimir QRCode, cada fabricante está fazendo do seu jeito).

 

Como não sou expert em criação de componentes, reutilizei uma propriedade do componente que na minha análise (rápida) não está sendo utilizado: Impressora

 

Se o campo estiver vazio, o componente vai considerar que a impressora ligada é uma Epson (set de comandos default), se o campo estiver preenchido com a string "Bematech" (acredito que seria mais interessante algum tipo de record: tQRCodeBematech, tQRCodeDaruma, etc.) o componente vai enviar o set de comandos do QRCode no padrão Bematech.

 

Na segunda-feira devo receber uma Daruma DR700 que compramos para NFCe, vou fazer os testes, e se necessitar de ajustes irei fazer e disponibilizar nesse mesmo tópico.

 

Para que a impressão seja feita corretamente é necessário configurar o set de comandos "ESC/POS" via aplicativo da Bematech (Bematech User Software).

procedure TACBrNFeDANFeESCPOS.GerarRodape(CortaPapel: Boolean = True; Cancelamento: Boolean = False);
var
  qrcode : string;
  cCaracter:AnsiString;
  i, cTam1, cTam2:Integer;
begin
  FBuffer.Add(cCmdFonteNormal+'------------------------------------------------');
  FLinhaCmd := cCmdAlinhadoCentro+'Consulta via leitor de QR Code';
  FBuffer.Add(FLinhaCmd);
  FBuffer.Add(' ');




  qrcode := NotaUtil.GetURLQRCode( FpNFe.ide.cUF, FpNFe.ide.tpAmb,
                                   FpNFe.infNFe.ID,
                                   DFeUtil.SeSenao(FpNFe.Dest.idEstrangeiro <> '',FpNFe.Dest.idEstrangeiro, FpNFe.Dest.CNPJCPF),
                                   FpNFe.ide.dEmi,
                                   FpNFe.Total.ICMSTot.vNF, FpNFe.Total.ICMSTot.vICMS,
                                   FpNFe.signature.DigestValue ,
                                   TACBrNFe( ACBrNFe ).Configuracoes.Geral.IdToken,
                                   TACBrNFe( ACBrNFe ).Configuracoes.Geral.Token);


  //bematech
  if (FImpressora = 'Bematech') then
     begin
        //formato Bematech (http://partners.bematech.com.br/2014/09/imprimindo-qrcode-na-impressora-mp-4200-th/)

        //OBS: para que o QRCode seja impresso na Bematech é necessário instalar o firmware 1.6 ou superior (http://partners.bematech.com.br/2013/03/edicao-139-mp-4200-th-com-qr-code/)
        //     essa implementação utiliza o set de comandos ESC/POS. Para habilitar na impressora utilize o aplicativo "Bematech User Software", e na aba "Configurações Adicionais" selecione
        //     o tipo de comando "Esc/POS"

        for i := 1 to length(qrcode) do
            begin
               cCaracter := cCaracter + Chr(Ord(qrcode[i]));
            end;

        if (length(qrcode) > 255) then
          begin
             cTam1 := length(qrcode) mod 255;
             cTam2 := length(qrcode) div 255;
          end
        else
          begin
             cTam1 := length(qrcode);
             cTam2 := 0;
          end;

        FLinhaCmd :=  #27 + #97 + #1 +             //esse código faz a centralização
                      #29 + #107 + #81 +           //esse é o do qr code
                      #3 + #8 +                    //aqui é o tamanho do QRCode
                      #8 + #1 +                    //dimensão (8)
                      Chr(cTam1) +                 //resto da divisão correspondente ao tamanho do texto / 255
                      Chr(cTam2) +                 //divisão correspondente ao tamanho do texto
                      cCaracter;                   //aqui começa o texto

     end
     
  else if (FImpressora = 'Daruma') then
     begin

     end

  else //default (Epson ESC/POS)
     begin
        //formato Epson ESC/POS
        FLinhaCmd := chr(29)+'(k'+chr(4)+chr(0)+'1A2'+chr(0)+
                     chr(29)+'(k'+chr(3)+chr(0)+'1C'+chr(4)+
                     chr(29)+'(k'+chr(3)+chr(0)+'1E0'+
                     chr(29)+'(k'+Int2TB(length(qrcode)+3)+'1P0'+qrcode+
                     chr(29)+'(k'+chr(3)+chr(0)+'1Q0';
     end;


  FBuffer.Add(FLinhaCmd);

  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add(cCmdFontePequena+('Protocolo de Autorização:'+Trim(FpNFe.procNFe.nProt)+' '+DFeUtil.SeSenao(FpNFe.procNFe.dhRecbto<>0,DateTimeToStr(FpNFe.procNFe.dhRecbto),''))+cCmdFonteNormal);
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');
  FBuffer.Add('');

  if CortaPapel then
     FBuffer.Add(cCmdCortaPapel);
end;

Acredito que o componente está ignorando algumas propriedades, como NumCopias, pois sempre sai 2 vias mesmo quando configurado para 1 (tentei com ViaConsumidor False mas o mesmo comportamento ocorre). Vou analisar com mais calma o código pra ver se acho onde está enviando essa segunda cópia.

  • Like 1

WRMedeiros

Focus

Link to comment
Share on other sites

Desconsiderem esse último trecho onde informo que o componente sempre imprime 2 vias. Foi erro meu =)   

 

O componente automaticamente imprime quando a propriedade DANFE está configurada, e mesmo assim logo após o comando Enviar eu estava enviando o comando Imprimir, o que o ocasionava 2 impressões.

WRMedeiros

Focus

Link to comment
Share on other sites

  • Consultores

Boa tarde

Welkson

vou pedir para que anexe os fontes, não poste código no post!

é só clicar em mais opções no quando onde faz o post que tem o local para anexar os arquivos

 

Obrigado

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other sites

De qualquer forma, os fontes ainda não estão prontos para serem submetidos ao repositório oficial. Decidi postar o trecho no qual mexi para que o pessoal pudesse dar opiniões.

 

Observe que no bloco de comandos da Daruma não tem nada, só o IF mesmo.

 

Sem falar que "reaproveitar" a propriedade "Impressora" não é uma boa prática, ficaria mais interessante se fosse criado algum tipo de "record" onde o usuário selecionasse "Daruma, Bematech, Epson", deixando a Epson como padrão para quem já está usando em produção (atualmente o componente só suporta Epson/DASCOM).

 

Devo receber a impressora Daruma DR700 hoje ou amanhã, até o fim de semana implemento o QRCode também para esse modelo e submeto os fontes completos.

WRMedeiros

Focus

Link to comment
Share on other sites

  • Consultores

Boa tarde

o componente citado é para impressão diretamente na porta da impressora pelo protocolo!

Bom dia, welkson.

 

 

Desculpe me intrometer no seu tópico. Tenho uma dúvida de principiante.

 

Quando você utiliza o ACBrNFeDANFeESCPOS, ao invés da instalação dela diretamente no windows, é apenas para que a impressão seja mais rápida?

  • Like 1
Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other sites

Não estou no trabalho agora, mas dei uma analisada rápida [1] e ficou excelente. Obrigado André.

 

http://svn.code.sf.net/p/acbr/code/trunk/Fontes/ACBrNFe2/ACBrNFeDANFeESCPOS.pas

 

Chegar em casa testo com a impressora e retorno pra vocês.

 

Quando receber a Daruma faço a alteração e submeto para que seja integrado ao código.

WRMedeiros

Focus

Link to comment
Share on other sites

Pessoal,

 

Testei as alterações que André fez e está tudo OK.

 

Já recebi a Daruma, tive alguma dificuldade para imprimir o QRCode (consegui imprimir, mas está pequeno)... o pessoal da Daruma ontem me enviou um exemplo em Delphi (sem DLL), vou fazer testes e quando estiver implementado no ACBr envio o código aqui pelo fórum.

WRMedeiros

Focus

Link to comment
Share on other sites

Quais as propriedades tenho que alterar no ACBrNFeDANFeESCPOS para imprimir na bematech mp 4200 TH, na porta USB ? 

 

ACBrNFe1.NotasFiscais.Clear;
ACBrNFe1.NotasFiscais.LoadFromFile('D:\Vti\01\NFe\31141122307425000180650010000000011000000013-nfe.xml');
 
ACBrNFeDANFeESCPOS.MarcaImpressora := iBematech;
 
ACBrNFe1.NotasFiscais.Imprimir;
 
Com esse código dá o erro:  'Communication error 9994: Instance not yet connected'.
 
 

Thiago Balbino

Analista de Sistemas Programador

email: [email protected]

Muriaé - MG

 

Link to comment
Share on other sites

Beleza.

 

Como o colega comentou, a Bematech quanto habilitada no módulo ESC/POS só imprime 42 colunas, mas observe que todos os comandos funcionam (cortar papel, condensado, negrito, etc.), com um pequeno ajuste (habilitar condensado para algumas linhas, etc.) esse problema é resolvido.

 

Se você habilitar o modo BEMA/POS ela vai imprimir as 48 colunas, no entanto os outros comandos serão ignorados.

Link to comment
Share on other sites

O BEMA/POS não consegue interpretar algumas letras e sem falar q fica saindo alguns caracteres estranhos e tambem ele não imprime o QRCode

 

Eu iria comprar essa Bematech pra usar o ESC/POS, mas pelas incomodações que o pessoal vem tendo estou pensando em pegar ou a EPSON TM-T20 ou DASCOM DT-230 conforme recomendação do André

Link to comment
Share on other sites

  • Moderadores

Thiago, 

 

O meu também fica dessa forma, acredito que precisa de alguns ajustes na quantidade de caracteres por linha.

 

O QRCode imprimiu certinho?

Acabei de enviar uma ataulização ao SVN do arquivo ACBrNFeDANFeESCPOS para tentar usar os comandos BEMA/POS qdo a impressora for Bematech, como não tenho a impressora, não tenho como testar. Por favor atualize seus fontes e veja se tem alguma melhora.

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link to comment
Share on other sites

  • Este tópico foi criado há 1672 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.