none
Agilizando a busca no retorno de status da Impressora Fiscal Bematech RRS feed

  • Discussão Geral

  • Olá pessoal,

    Sabemos que as impressoras fiscais Bematech, interagem com sua aplicação enviando bytes de status, a cada execução de comando - os famosos "ACK" ou "NACK", "ST1", "ST2" e "ST3" ("ST3" para as impressoras do Convênio ICMS 85/01).

    Analisar este retorno é fundamental, pois é através dele que sabemos se o comando enviado foi executado com sucesso ou não.

    Antes do desenvolvimento da rotina que fará a busca deste retorno, vamos entender um pouco mais sobre estes bytes.

    - "ACK" indica que o comando enviado à impressora foi recebido com sucesso e que irá processá-lo. O seu valor é 6 (seis), tanto decimal quanto hexadecimal.

    - "NACK" indica que o comando enviado à impressora não foi recebido com sucesso, que seu protocolo (seqüência de bytes do comando) não está correto. O seu valor é 21 (vinte e um) em decimal ou 15 (quinze) em hexadecimal.

    - "ST1" informa o primeiro quadro de status da impressora, onde cada bit setado possui uma situação, como:

    bit 7 - "Fim de Papel" (128 é o valor deste bit).
    bit 6 - "Pouco Papel" (64 é o valor deste bit).
    bit 5 - "Erro no Relógio" (32 é o valor deste bit).
    bit 4 - "Impressora em Erro" (16 é o valor deste bit).
    bit 3 - "Comando não iniciado com ESC" (8 é o valor deste bit).
    bit 2 - "Comando Inexistente" (4 é o valor deste bit).
    bit 1 - "Cupom Aberto" (2 é o valor deste bit).
    bit 0 - "Número de Parâmetro(s) Inválido(s)" (1 é o valor deste bit).

    - "ST2" informa o segundo quadro de status da impressora, onde cada bit setado possui uma situação, como:

    bit 7 - "Tipo de Parâmetro de Comando Inválido" (128 é o valor deste bit).
    bit 6 - "Memória Fiscal Lotada" (64 é o valor deste bit).
    bit 5 - "Erro na Memória RAM" (32 é o valor deste bit).
    bit 4 - "Alíquota Não Programada" (16 é o valor deste bit).
    bit 3 - "Capacidade de Alíquotas Lotada" (8 é o valor deste bit).
    bit 2 - "Cancelamento Não Permitido" (4 é o valor deste bit).
    bit 1 - "CNPJ/IE do Proprietário Não Programado" (2 é o valor deste bit).
    bit 0 - "Comando Não Executado" (1 é o valor deste bit).

    - "ST3" informa o terceiro quadro de status da impressora. Disponível apenas nas impressoras do Convênio ICMS 85/01 (MP-25 FI, MP-50 FI, MP-2000 TH FI, MP-2100 TH FI e MP-6000 TH FI), este byte define com maior precisão o status da impressora.

    Vamos visualizar alguns valores de retorno deste byte, pois teremos todos na rotina que iremos desenvolver:

    0 - "Comando OK".
    1 - "Comando Inválido".
    2 - "Erro Desconhecido".
    3 - "Número de Parâmetro Inválido".
    4 - "Tipo de Parâmetro Inválido".
    5 - "Todas as Alíquotas já Programadas".
    6 - "Totalizador Não Fiscal já Programado".
    7 - "Cupom Fiscal Aberto".
    8 - "Cupom Fiscal Fechado".
    9 - "ECF Ocupado 10 Impressora em Erro".
    11 - "Impressora sem Papel".
    12 - "Impressora com Cabeça Levantada".
    13 - "Impressora OFF LINE".
    14 - "Alíquota não Programada".
    15 - "Terminador de String Faltando".
    16 - "Acréscimo ou Desconto maior que o total do Cupom Fiscal".
    17 - "Cupom Fiscal sem Item Vendido".
    18 - "Comando não Efetivado".
    19 - "Sem espaço para novas Formas de Pagamento".
    20 - "Forma de Pagamento não Programada".
    ...

    Pronto! Agora que conhecemos melhor o status da impressora fiscal, vamos iniciar o nosso desenvolvimento.

    A idéia é agilizar a busca deste retorno, ou seja, obter o retorno apenas quando a impressora possuir informações de status para enviar, caso contrário, iremos continuar com as operações normalmente.

    Se a impressora não possuir informações de status, seu retorno será "ACK" = 6, "ST1" = 0, "ST2" = 0 e "ST3" = 0. Neste caso, não estaremos analisando.

    Se a impressora possuir informações de status, seu retorno será "ACK" = 6, "ST1" <> 0, "ST2" <> 0 e "ST3" <> 0. Neste caso, estaremos analisando.

    Observação: Caso deseje trabalhar com o retorno do byte ST3 nas impressoras MP-25 FI, MP-50 FI, MP-2000 TH FI e MP-6000 TH FI, será necessário habilitá-lo através da função Bematech_FI_HabilitaDesabilitaRetornoEstendidoMFD( '1' ), passando como parâmetro a string '1'. Esta função poderá ser chamada na entrada da aplicação. Para ler este byte, use a função Bematech_FI_RetornoImpressoraMFD( iACK, iST1, iST2, iST3 ).

    Para que nossa rotina tenha efeito, precisamos habilitar a chave "StatusFuncao" no arquivo "BemaFI32.ini" (arquivo de configuração da BemaFI32.dll). Para isso, abra o arquivo, localize esta chave e mude o seu valor para 1 (StatusFuncao=1). Esta chave tem como objetivo retornar o valor -27 (menos vinte e sete) a cada função chamada na dll, sempre que a impressora possuir alguma informação de status.

    Veremos a rotina em Delphi e Visual Basic. Em anexo, a função VerificaRetornoFuncaoImpressora e VerificaRetornoFuncaoImpressoraMFD.

    - Exemplo em Delphi

    ...
    iRetorno := Bematech_FI_AbreCupom( pchar( '' ) );
    if ( iRetorno <> 1 ) or ( iRetorno = -27 ) then
       VerificaRetornoFuncaoImpressora( iRetorno )
    else
    ...

    ou

    ...
    iRetorno := Bematech_FI_AbreCupom( pchar( '' ) );
    if ( iRetorno <> 1 ) or ( iRetorno = -27 ) then
       VerificaRetornoFuncaoImpressoraMFD( iRetorno )
    else
    ...

    - Exemplo em Visual Basic

    ...
    iRetorno = Bematech_FI_AbreCupom("")
    If (iRetorno <> 1) Or (iRetorno = -27) Then
       VerificaRetornoFuncaoImpressora (iRetorno)
    Else
    ...

    ou

    ...
    iRetorno = Bematech_FI_AbreCupom("")
    If (iRetorno <> 1) Or (iRetorno = -27) Then
       VerificaRetornoFuncaoImpressoraMFD (iRetorno)
    Else
    ...

    Boas implementações!


    Um abraço,
    André Munhoz
    andre.munhoz@bematech.com.br

    quarta-feira, 14 de fevereiro de 2007 13:38

Todas as Respostas