Business - Automação Comercial

Palavra de status da impressora na DarumaFramework

Veja neste artigo como obter o status geral de sua impressora com apenas uma variável.

por Daruma Developer



Olá pessoal, Nas DLL obsoletas tínhamos uma função que nos retornava algumas Flags Fiscais sobre o ECF, como por exemplo:

  • Cupom Fiscal aberto = 1
  • Fechamento de formas de pgto iniciado = 2
  • Horário de verão selecionado = 4
  • Já houve redução Z no dia = 8
  • Permite Cancelar o Cupom Fiscal = 32
  • Memória Fiscal sem espaço = 128

Onde a função nos retornava a somatória dos valores referentes as informações de Flags Fiscais.

Somatório dos Valores

Figura 01. Somatório dos Valores.

No exemplo da imagem acima foi aberto um Cupom Fiscal e em seguida chamado o método para capturar a Flag Fiscal, que retornou 33, onde 33 é a somatória de:

Cupom Fiscal aberto + Permite Cancelar o Cupom Fiscal

1 32 = 33

Só que agora não precisa mais fazer todos aqueles if/cases!

Na DarumaFramework.dll tudo isto muda! Agora, você pode contar com a obtenção de muita mais informação, pelas funções da Palavra de Status de uma maneira bem mais fácil.

Funções:
  • rStatusImpressora_ECF_Daruma
  • rStatusImpressoraBinario_ECF_Daruma
  • rConsultaStatusImpressoraInt_ECF_Daruma
  • rConsultaStatusImpressoraStr_ECF_Daruma
rStatusImpressora_ECF_Daruma:

Este método nos permite saber o status do ECF realizando a leitura de 14 bytes, onde são a somatória das informações relacionadas ao ECF.

A função possui uma tabela subdivida em S(x) aonde x é cada byte da informação retornada sobre o ECF. Não se assuste, você deve pensar como saber 4 informação distintas com apenas um valor, mais é bem tranquilo...

S4

b3 0 = Ainda não emitiu RZ hoje (Dia Aberto) = 8

1 = Já emitiu RZ não pendente hoje

b2 0 = Não há RZ pendente = 4

1 = RZ do dia anterior pendente

b1 0 = Near End não detectado = 2

1 = Near End detectado

b0 0 = Bobina de papel presente = 1

1 = Bobina de papel ausente

Por exemplo acima é demonstrado o S4, onde se refere a quarta posição da palavra de Status.

O S4 é composto por 4 informações e caso a informação retorne 1, o valor indicado pela seta azul entrará na soma da Palavra de Status. Quando houver mais de um valor, os valores serão somados, e caso ultrapassarem 1 digito entrarão na Palavra de Status como hexadecimal.

Se a função nos retornasse: A4C40C00000000

Isto indica que RZ do dia anterior pendente!

Pois a informação foi verdadeira, então 4 bytes constaram na Palavra de Status!

Agora se fosse o caso da palavra retornar: A40A0C00000000

A palavra retornou em hexadecimal, pois só pode ter 14 bytes na Palavra de Status quando iria ultrapassar se fosse inserido o numero 10.

Veja que 10 é a soma de 2+8...

Isto quer dizer que duas informações foram diferentes de zero...

  • Near End detectado
  • Já emitiu RZ não pendente hoje
Confira a tabela para visualizar todas as informações de retornos: rStatusImpressoraBinario_ECF_Daruma:

Este método nos permite saber o status atual do ECF, como: Modo Fiscal, Se a tampa está aberta, e até mesmo se há bobina ou não...

Mas não para por ai, está função retorna o status binário de 18 informações muito uteis em relação ao ECF.

Seu parâmetro é: Variável: Tam: Descrição:

pszStatus 18 Variável por referência que ira receber 18 dígitos.

Cada digito binário representa uma informação de status do ECF.

Consulte a Tabela:

Tabela de Status do ECF

Figura 02. Tabela de Status do ECF.

A função nos devolve:

Ex:

Status Binário da Impressora: 000000001100000000

Vejamos na prática:

C#
public static extern int rStatusImpressoraBinario_ECF_Daruma
      ([MarshalAs(UnmanagedType.VBByRefStr)] ref string Status);
        [DllImport("DarumaFrameWork.dll")]

private void button1_Click(object sender, EventArgs e)
      {
       string Str_StatusBin = new string(' ', 20);
       DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.iRetorno =
 DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.
       rStatusImpressoraBinario_ECF_Daruma(ref Str_StatusBin);
       DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.
       DarumaFramework_Mostrar_Retorno
      (DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.iRetorno);

       TB_Retorno.Text =
       "Status Binário da Impressora: " + Str_StatusBin.ToString();
        }
Delphi:
function rStatusImpressoraBinario_ECF_Daruma(pszStatus:String):Integer;
StdCall; External 'DarumaFramework.dll';
VB6:
Public Declare Function rStatusImpressoraBinario_ECF_Daruma
       Lib "DarumaFramework.dll"
(ByVal pszStatus As String, ByVal) As Integer

Private Sub botao_Click()
Dim Int_Status As Integer
 
        Int_Status = Space(18)
 iRetorno = rStatusImpressoraBinario_ECF_Daruma(Int_Status)
        MsgBox(CStr(Int_Status))

End Sub

Comunicação Direta:

  • Comando: Palavra de Status
  • Sintaxe: [GS] [ACK]
  • Parâmetros: Nenhum
  • Resposta: S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 [DDMMAA] [CR]
  • Nota: Em modo Resposta Estendida, a palavra de status é acrescida de 6 dígitos, correspondentes a Data do Movimento

Agora nossa segunda função: rConsultaStatusImpressoraInt_ECF_Daruma

Esta função nos retorna 1 ou 0 indicando se o índice informado esta habilitado ou não, segue a mesma tabela da função rStatusImpressoraBinario_ECF_Daruma que vimos a pouco mais.

Porem você programa o índice do Status especifico que deseja obter a informação.

Seus parâmetros são:

Variável: Tam: Descrição:

iIndice 2 Índice da Informação desejada

iRetorno -- Variável Inteira por referência que ira receber o status 1 ou 0.

Por exemplo, se passarmos Índice: 05 a função nos devolverá 0 - que é: “Ainda não emitiu RZ hoje (com dia fiscal aberto)” ou 1 - que é: “Já emitiu RZ não pendente hoje”.

Vejamos na prática:

C#
[DllImport("DarumaFrameWork.dll")]
 public static extern int rConsultaStatusImpressoraInt_ECF_Daruma
  (int iIndice, ref int IStatus);

 private void BT_botao_Click(object sender, EventArgs e)
  {
   int Int_Valor = 0;
   string Str_Indice = Microsoft.VisualBasic.Interaction.InputBox
   ("Informe o Índice desejado:", "Daruma Framework", "1", posX, posY);

DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.iRetorno = 
 DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.
  rConsultaStatusImpressoraInt_ECF_Daruma
   (Convert.ToInt32(Str_Indice), ref Int_Valor);
      MessageBox.Show("Status = " + Int_Valor.ToString());
  }
Delphi:
function  rConsultaStatusImpressoraInt_ECF_Daruma
(iIndice:Integer; iRetorno:Integer): Integer; 
  StdCall; External 'DarumaFramework.dll';
  
SetLength (iRetorno,2);
Int_Retorno := rConsultaStatusImpressoraInt_ECF_Daruma(iIndice, iRetorno);
VB6:
Public Declare Function rConsultaStatusImpressoraInt_ECF_Daruma Lib 
 "DarumaFramework.dll" (pszIndice As String, ByVal pszRetorno As String)
   As Integer

Private Sub BT_Botao_Click()
 Dim Str_Indice, Str_Retorno  As String
        
  Str_Indice = TB_Indice.Text
              
   Str_Indice = Space(2)
   iRetorno = rConsultaStatusImpressoraInt_ECF_Daruma(Str_Indice, Str_Retorno)
   MsgBox (Str_Retorno)
End Sub
Comunicação Direta:
  • Comando: Palavra de Status
  • Sintaxe: [GS] [ACK]
  • Parâmetros: Nenhum
  • Resposta: S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 [DDMMAA] [CR]
  • Nota: Em modo Resposta Estendida, a palavra de status é acrescida de 6 dígitos, correspondentes a Data do Movimento.

Temos também a opção de passar o Índice e Obtermos a informação em texto do status da impressora referente ao índice informado.

Com nossa ultima função de hoje que é: rConsultaStatusImpressoraStr_ECF_Daruma.

Seus parâmetros são: Variável: Tam: Descrição:

iIndice 2 Índice da Informação desejada

szStatus -- Variável String por referência que retorna o Status do Índice informado.

Vejamos na prática:

C#
[DllImport("DarumaFrameWork.dll")]
 public static extern int rConsultaStatusImpressoraStr_ECF_Daruma
   (int iIndice, [MarshalAs(UnmanagedType.VBByRefStr)]
      ref string StrStatus);
        
 [DllImport("DarumaFrameWork.dll")]
 private void métodoRConsultaStatusImpressoraStrECFDarumaToolStripMenuItem_Click
   (object sender, EventArgs e)
     {
      string Str_Valor = new string(' ', 60);
      string Str_Indice = Microsoft.VisualBasic.Interaction.InputBox
       ("Informe o Índice desejado:", "Daruma Framework", "1");
            
 DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.iRetorno = 
  DarumaFramework_DLL.DarumaFramework_Declaracoes_CSharp.
   rConsultaStatusImpressoraStr_ECF_Daruma(Convert.ToInt32(Str_Indice), ref Str_Valor);
            
  MessageBox.Show("Status = " + Str_Valor);
   }
Verificando conteúdo armazenado

Figura 03. Verificando conteúdo armazenado.

Delphi:
function  rConsultaStatusImpressoraStr_ECF_Daruma
  (iIndice:Integer; szStatus:String): Integer; StdCall; 
     External 'DarumaFramework.dll';
  
SetLength (Str_Informacao,150);
Int_Retorno := rConsultaStatusImpressoraStr_ECF_Daruma(1, Str_Informacao);

VB6:
Public Declare Function rConsultaStatusImpressoraStr_ECF_Daruma Lib
 "DarumaFramework.dll" (pszIndice As String, ByVal pszRetorno As String)
   As Integer

Private Sub BT_Botao_Click()
 Dim Str_Indice, Str_Retorno  As String
        
  Str_Indice = TB_Indice.Text
            
   Str_Indice = Space(2)
   iRetorno = rConsultaStatusImpressoraStr_ECF_Daruma(Str_Indice, Str_Retorno)
   MsgBox (Str_Retorno)
End Sub
Comunicação Direta:
  • Comando: Palavra de Status
  • Sintaxe: [GS] [ACK]
  • Parâmetros: Nenhum
  • Resposta: S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 [DDMMAA] [CR]
  • Nota: Em modo Resposta Estendida, a palavra de status é acrescida de 6 dígitos, correspondentes a Data do Movimento.

Ai vai mais uma dica para facilitar seu desenvolvimento!

Um abraço e até a próxima!

Daruma Developer

Daruma Developer