Jump to content

ACBrBAL - TimeOut gera Exception em vez de retornar código/peso -9


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

Recommended Posts

  • Membros Pro

Olá pessoal, tudo bem?

Já uso ACBrBAL (balança de checkout) há um tempo, e funciona bem, porém algo está me intrigando e gostaria de saber se pode ser melhorado no componente.

Atualmente, na leitura de peso (seja chamando o LePeso() ou programando no evento OnLePeso), se houver problemas de TimeOut retorna o peso "-9" indicando problemas na comunicação.

Porém, em dado momento, ocorre a Exception de TimeOut (em vez de retornar o "-9").

Adentrando no componente, verifiquei que o problema ocorre no ponto abaixo:

-> function TACBrBALClass.LePeso(MillisecTimeOut: Integer): Double;
--> procedure TACBrBALClass.SolicitarPeso;
---> procedure TACBrDevice.EnviaString(const AString: AnsiString);
-----> procedure TACBrDeviceSerial.EnviaString(const AString: AnsiString);
Linha 578 (ACBrDeviceSerial.pas): BytesSent := fsSerial.SendBuffer(Pointer(Buffer), BytesToSend);

Nessa linha ocorre este erro:

image.png.ebf87e7dc9ffdc66ed6beb5a8ee89baf.png

Estou fazendo testes usando o Emulador de Balança do ACBr (e um par de portas seriais virtuais).
Para conseguir simular esse erro, eu fecho emulador e aciono a leitura no meu PDV. Quero simular situações onde há falhas na comunicação com a balança.
 

Eu vi que, dentro do método LeSerial() que é chamado em TACBrBALClass.LePeso(MillisecTimeOut: Integer), o tratamento de TimeOut e retorno do "-9" é feito como esperado, mas no "SolicitarPeso", que é acionado também dentro do LePeso(), esse tratamento não é feito.

No início, imaginei que fosse algo com as portas seriais virtuais, até que ocorreu em um cliente. 
Uma outra observação que fiz também foi: Não ocorre na primeira vez que aciono a leitura, e sim lá pela terceira em diante. (nas primeiras ela passa por esse método sem erro e retorna o código -9, quando aciona o LeSerial().

A minha dúvida é, seria possível tratar para que retorne também o código/peso "-9" em vez de gerar uma Exception?

Não sei se consegui explicar corretamente.

Desde já agradeço.

Link to comment
Share on other sites

  • Membros Pro

Obs: Eu sei que, alterando o componente é possível, mas não sei até que ponto isso iria interferir em quem já usa atualmente, e seu eu poderia fazer e subir os fontes para integração ao fonte oficial.

Link to comment
Share on other sites

  • Consultores

   Boa tarde.

Em 19/05/2021 at 13:28, maiconsaraiva disse:

Adentrando no componente, verifiquei que o problema ocorre no ponto abaixo:

-> function TACBrBALClass.LePeso(MillisecTimeOut: Integer): Double;
--> procedure TACBrBALClass.SolicitarPeso;
---> procedure TACBrDevice.EnviaString(const AString: AnsiString);
-----> procedure TACBrDeviceSerial.EnviaString(const AString: AnsiString);
Linha 578 (ACBrDeviceSerial.pas): BytesSent := fsSerial.SendBuffer(Pointer(Buffer), BytesToSend);

Em 19/05/2021 at 13:28, maiconsaraiva disse:

Eu vi que, dentro do método LeSerial() que é chamado em TACBrBALClass.LePeso(MillisecTimeOut: Integer), o tratamento de TimeOut e retorno do "-9" é feito como esperado, mas no "SolicitarPeso", que é acionado também dentro do LePeso(), esse tratamento não é feito.

   Boa análise... Muito obrigado. Isso facilita bastante pra gente poder dar um parecer. Vamos lá...

   De certa maneira, acredito que você tenha razão. Se o TimeOut está ocorrendo aí, então está faltando mesmo um tratamento para o retorno.

   Mas o tratamento não poderia ser feito no "SolicitarPeso", porque esse método não tem retorno.

   Teria que ser feito nos outros métodos que chamam esse "SolicitarPeso, como "LePeso" e "AguardarRespostaPeso".

Em 19/05/2021 at 13:34, maiconsaraiva disse:

Obs: Eu sei que, alterando o componente é possível, mas não sei até que ponto isso iria interferir em quem já usa atualmente, e seu eu poderia fazer e subir os fontes para integração ao fonte oficial.

   Você pode alterar e anexar aqui para que possamos avaliar sim.

   Vou pedir pra você apenas ficar atento ao seguinte:

   1) Seria bom verificar no log se o timeout está mesmo ocorrendo.

   2) fazer o ajuste apenas na classe TACBrBalClass vai ajustar a maioria dos modelos, mas alguns sobrescrevem esses métodos (em especial LeSerial e LePeso) e assim pode ser necessário um ajuste na classe delas.

  • Like 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • 2 weeks later...
  • Membros Pro
Em 25/05/2021 at 16:35, EMBarbosa disse:

   Boa tarde.

   Boa análise... Muito obrigado. Isso facilita bastante pra gente poder dar um parecer. Vamos lá...

   De certa maneira, acredito que você tenha razão. Se o TimeOut está ocorrendo aí, então está faltando mesmo um tratamento para o retorno.

   Mas o tratamento não poderia ser feito no "SolicitarPeso", porque esse método não tem retorno.

   Teria que ser feito nos outros métodos que chamam esse "SolicitarPeso, como "LePeso" e "AguardarRespostaPeso".

   Você pode alterar e anexar aqui para que possamos avaliar sim.

   Vou pedir pra você apenas ficar atento ao seguinte:

   1) Seria bom verificar no log se o timeout está mesmo ocorrendo.

   2) fazer o ajuste apenas na classe TACBrBalClass vai ajustar a maioria dos modelos, mas alguns sobrescrevem esses métodos (em especial LeSerial e LePeso) e assim pode ser necessário um ajuste na classe delas.

Obrigado pelo retorno. Como estava corrido, acabei contornando pela minha aplicação.

Mas vou deixar como tarefa aqui, e faço assim que tiver um tempinho.

Sobre as suas perguntas:

1. Sim, ocorre, tanto que, no método LePeso, o timeout funciona normal. O problema ocorre no SolicitarPeso que fica logo acima de LePeso.
Pelo que entendi, parece funcionar de forma assíncrona, enviando o comando no SolicitarPeso, e depois pegando a resposta no LePeso. Sendo este o caso, o TimeOut está implementado apenas no LePeso.

2. Certo, farei essa checagem também;

Link to comment
Share on other sites

  • Este tópico foi criado há 428 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.