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 DeveloperOlá 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.
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
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...
S4b3 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
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:
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 SubComunicaçã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); }
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 SubComunicaçã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!
- Códigos de Barras no ECF Automação Comercial
- Gerando o SPED Automação Comercial
- Gerando o Arquivo MFD (PAF-ECF) Automação Comercial
- Desprogramando o Horário de VerãoAutomação Comercial
- Programando o Horário de VerãoAutomação Comercial