Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado (editado)

Olá pessoal

Estivemos batendo a cabeça a alguns dias com um problema na leitura de peso da balança Urano, onde em algumas situações o peso retornado pelo componente era o peso da TARA definido na balança.

Analisando os Logs gerados pelo Acbr BAL, identificamos que em algumas poucas situações a balança não retornava a string PESO L, conforme exemplo abaixo tirado da linha 31296 do log que está em anexo

--------------------------------------------------------------------------------
ATIVAR - 13/07/23 11:43:31:714 - Modelo: Urano - Porta: COM7         Device: BAUD=9600 DATA=8 PARITY=N STOP=1 HANDSHAKE= MAXBANDWIDTH=0 SENDBYTESCOUNT=0 SENDBYTESINTERVAL=0
--------------------------------------------------------------------------------

-- 13/07 11:43:31:714 -  - 11:43:31:714 TX -> �
-- 13/07 11:43:32:321 -  - 11:43:32:321 RX <- �������� �DATA:  00/00/00 VALID.: 00/00/00      TARA:   0.790kg 
-- 13/07 11:43:32:321 -               UltimoPesoLido: 0,79 - Resposta: �������� �DATA:  00/00/00 VALID.: 00/00/00      TARA:   0.790kg 
-- 13/07 11:43:32:841 - 

Quando esta String retornava da balança, o código que interpreta o peso identificava que era o protocolo USE-P2, quando não era o caso, conforme o exemplo abaixo:

function TACBrBALUranoPOP.InterpretarRepostaPeso(const aResposta: AnsiString): Double;
var
  wResposta: AnsiString;
  wPos, wQtd: Integer;
begin
  Result    := 0;
  wResposta := aResposta;

  wPos := Pos('PESO L:', wResposta);  // Protocolo USE-CB2
  if (wPos > 0) then
  begin
    wResposta := Copy(wResposta,wPos, 16);
    wPos := Pos(':', wResposta);

    if (Length(wResposta) > 1) then
    begin
      wQtd      := (Pos('g', wResposta) - 2);
      wQtd      := wQtd - (wPos + 1);
      wResposta := Copy(wResposta, wPos + 2, wQtd); //123456
    end;
  end
  else
  begin
    wPos := Pos('kg', wResposta);  // Protocolo USE-P2
    if (wPos > 0) then
      wResposta := copy(wResposta, wPos-7, 6)
    else
      wResposta := '';
  end;

  if (wResposta = EmptyStr) then
    Exit;

  { Ajustando o separador de Decimal corretamente }
  wResposta := StringReplace(wResposta, '.', DecimalSeparator, [rfReplaceAll]);
  wResposta := StringReplace(wResposta, ',', DecimalSeparator, [rfReplaceAll]);

  try
    { Já existe ponto decimal ? }
    if (Pos(DecimalSeparator, wResposta) > 0) then
      Result := StrToFloat(wResposta)
    else
      Result := (StrToInt(wResposta) / 1000);
  except
    case  PadLeft(Trim(wResposta),1)[1] of
      'I': Result := -1;     { Instavel }
      'N': Result := -2;     { Peso Negativo }
      //'S': Result := -10;  { Sobrecarga de Peso }
    else
      Result := 0;
    end;
  end;
end;

Vejam que na function original ele verifica se existe a string PESO L:, caso não exista, vai para o ELSE onde busca apenas pela string kg, recuando 7 caracteres para obter o peso ali informado. Nessa situação, com o retorno que veio com a TARA na string, o componente retorna erroneamente o peso da TARA.

Fizemos uma correção aqui para evitar isso, que não sei se é a melhor opção nesse caso pois estou bastante enferrujado no PASCAL, mas resolveu o problema. Segue:

function TACBrBALUranoPOP.InterpretarRepostaPeso(const aResposta: AnsiString): Double;
var
  wResposta: AnsiString;
  wPos, wQtd, wsPosTara: Integer;
begin
  Result    := 0;
  wResposta := aResposta;

  wPos := Pos('PESO L:', wResposta);  // Protocolo USE-CB2
  if (wPos > 0) then
  begin
    wResposta := Copy(wResposta,wPos, 16);
    wPos := Pos(':', wResposta);

    if (Length(wResposta) > 1) then
    begin
      wQtd      := (Pos('g', wResposta) - 2);
      wQtd      := wQtd - (wPos + 1);
      wResposta := Copy(wResposta, wPos + 2, wQtd); //123456
    end;
  end
  else
  begin
    wsPosTara := Pos('TARA:', wResposta);
    if (wsPosTara > 0)
       wsResposta := '';
    else
    begin
         wPos := Pos('kg', wResposta);  // Protocolo USE-P2
         if (wPos > 0) then
            wResposta := copy(wResposta, wPos-7, 6)
         else
             wResposta := '';
    end;
  end;

  if (wResposta = EmptyStr) then
    Exit;

  { Ajustando o separador de Decimal corretamente }
  wResposta := StringReplace(wResposta, '.', DecimalSeparator, [rfReplaceAll]);
  wResposta := StringReplace(wResposta, ',', DecimalSeparator, [rfReplaceAll]);

  try
    { Já existe ponto decimal ? }
    if (Pos(DecimalSeparator, wResposta) > 0) then
      Result := StrToFloat(wResposta)
    else
      Result := (StrToInt(wResposta) / 1000);
  except
    case  PadLeft(Trim(wResposta),1)[1] of
      'I': Result := -1;     { Instavel }
      'N': Result := -2;     { Peso Negativo }
      //'S': Result := -10;  { Sobrecarga de Peso }
    else
      Result := 0;
    end;
  end;
end;   

Nesse caso o componente vai verificar se existe a string TARA antes de assumir que o protocolo USE-P2 está em uso. Se encontrar, ignora e não retorna peso nenhum.

Em anexo log do ACBR usado no exemplo

Log Urano protocolo USE-CB2.zip

Editado por Giovanni Costa Rosa
ortografia
  • Obrigado 1
  • Consultores
Postado

Tópico movido para a área do SAC, para que o SLA de respostas seja considerado

Bom dia @Giovanni Costa Rosa,
 

Poderia anexar os arquivos alterados na sua contribuição (além do log já enviado), assim fica mais fácil de avaliarmos e integrarmos ao SVN.

Obrigado
 

Consultor SAC ACBr

Alexandre de Paula
Ajude o Projeto ACBr crescer - Assine o SAC                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

 

  • Consultores
Postado

Bom dia,

Criada a TK-4209 para avaliar a contribuição.

Obrigado

  • Obrigado 1
Consultor SAC ACBr

Alexandre de Paula
Ajude o Projeto ACBr crescer - Assine o SAC                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

 

  • 2 semanas depois ...
  • 2 semanas depois ...
  • Consultores
Postado
Em 17/07/2023 at 09:22, Giovanni Costa Rosa disse:

Bom dia Alexandre

Segue arquivo em anexo

ACBrBALUranoPOP.pas 5.05 kB · 0 downloads

Em 26/07/2023 at 12:57, Daniel Simoes disse:

@EMBarbosa, geralmente é você que pega esses casos da balança... Sabe como está essa Tarefa ?

Muito obrigado pela contribuição.
Fiz a implementação baseada nela.
Subi as alterações para o SVN na Revisão 30270.

Me parece correto. Mas fiquei na dúvida se em algum caso a balança poderia retornar a TARA e o peso. Nesse caso, me parece que o componente não conseguirá fazer a leitura com o código implementado.

Queira por favor atualizar, testar e reportar qualquer problema.

[]'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.
  • Membros Pro
Postado
13 minutos atrás, EMBarbosa disse:

Muito obrigado pela contribuição.
Fiz a implementação baseada nela.
Subi as alterações para o SVN na Revisão 30270.

Me parece correto. Mas fiquei na dúvida se em algum caso a balança poderia retornar a TARA e o peso. Nesse caso, me parece que o componente não conseguirá fazer a leitura com o código implementado.

Queira por favor atualizar, testar e reportar qualquer problema.

@EMBarbosa você viu que em um post abaixo eu coloquei uma outra Unit né? Só para confirmar mesmo, pois essa eu só vi depois que enviei a que estava errada

 

  • Consultores
Postado
6 horas atrás, Giovanni Costa Rosa disse:

@EMBarbosa você viu que em um post abaixo eu coloquei uma outra Unit né? Só para confirmar mesmo, pois essa eu só vi depois que enviei a que estava errada

 

Sim... :)

[]'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.
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.