Ir para conteúdo
  • Cadastre-se

dev botao

Leitura de CMC7 na SwedaSTX


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

Recommended Posts

Acho que não deve ser muito difícil... posso tentar lhe ajudar se tiver alguma dúvida...

Tem o manual de comunicação direta da STX ? Ele está na pasta TOOLS do repositório (troque /trunk por /tools na linha do SVN)

Vou baixar e tentar implementar Daniel.

Qualquer coisa posto as dúvidas aqui pra você me ajudar.

Obrigado!

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • 4 meses depois ...

Bom dia Daniel!

Depois de algum tempo consegui parar pra poder tentar implementar a leitura de CMC7 na classe ACBrSwedaSTX.

É a única função que ainda me impede de mudar da classe ACBrSweda para ACBrSwedaSTX.

Bom mas vamos lá!

Seguindo o manual da sweda para o protocolo stx e um exemplo que solicitei a própria sweda, criei a função override na classe ACBrSwedaSTX com o comando para a leitura.

function TACBrECFSwedaSTX.LeituraCMC7: AnsiString;

begin

  result := EnviaComando('24|1|0');

end;
O exemplo da sweda é feito com o AsyncFree usando os métodos do próprio componente para leitura e escrita, apenas fazendo o devido tratamento do retorno como segue abaixo.
Function TForm1.LeituraBuffer(): String;  // Leitura do Buffer

 Var Checksum : String;

      TResposta:string;

    retorno:string;

    tam: integer;

    LerBuffer:integer;


begin

Lerbuffer:=1;

while LerBuffer =1 do

                begin

                      retorno:= AfComPort1.readstring; 

                      tam:=Length(retorno);

                      if (tam>1) and (retorno[tam-1] = #3) then   // Etx

                           begin

                                 TResposta := TResposta+ Copy(retorno,1, tam-1);

                                 Checksum:=CalculoCS(Pchar(TResposta));

                                 if Checksum = retorno[tam] then

                                  Begin


                                      TResposta:=TResposta+ retorno[tam];

                                      LerBuffer:=0;

                                      Result:=TResposta;

                                      AfComPort1.WriteChar(Char (6)); // enviar ACK para confirmar a leitura da REsposta

                                      break;


                                  end

                                  else

                                  begin

                                        Result:='#21';

                                        AfComPort1.WriteChar(Char (21)); // enviar NACK para erro de leitura da REsposta

                                        LerBuffer:=0;

                                        Showmessage('Nak' + TResposta);

                                        break;

                                  end;


                           end


                           else if tam =0 then sleep (100)

                           else

                                begin

                                        TResposta:=TResposta+retorno;


                                end;

               end;





end;

Ao executar o método implementado ali na classe ACBrSwedaSTX, a impressora faz o processo de leitura, puxando e ejetando o cheque normalmente, mas o retorno vem algo como na imagem em anexo.

Uma coisa que eu percebi foi que esse retorno vem praticamente na hora que a ecf puxa o cheque, ou seja, bem antes dela efetivamente ler o cheque.

Tentei mexer em timeout, mas não resolveu.

Depurando até o método do synaser que faz a leitura da porta, pude perceber que o retorno vem exatamente como na imagem em anexo.

Gostaria de uma ajuda pra tentar identificar onde pode estar o problema :)

Agradeço desde já ao Daniel e aos colegas por qualquer dica, sugestão, etc.

Att.

post-63-1354898811123.png

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Reproduzi o comando com o Emulador e o resultado foi o mesmo...

O estranho é que o comando não está se comportando de acordo com o manual... o Resultado da Msg de Erro deveria ser 110

110 Resultado: Leitura com êxito (fonte CMC7).

O resultado está inserido na mensagem (campo: adicional) em forma de string termina em null

O código da Sweda que vc colou, é uma rotina de leitura genérica, ou seja é o código que Lê o retorno do ECF (no caso da Sweda)... O interessante seria ver nos fontes da Sweda, qual é o conteúdo do método que chama a Leitura do CMC7 (cmd 24)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Boa tarde Daniel!

No email da sweda:

Boa tarde!

Segue anexado programa teste em protocolo STX com comunicação direta, com comando de leitura do CMC7 em Delphi 6.

O código fonte em questão foi desenvolvido utilizando componentes de terceiros (segue anexado para que você possa instalar e conseguir recompilar o projeto).

A seguir tela de exemplo de código lido:

Tela em anexo.

O Status 109 solicita a inserção do cheque.

O Status 200 informa que está a leitura está em processo.

O Status 110 informa êxito na operação e retorna o conteúdo lido.

post-63-13548988113788.png

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Como não tenho D7, baixei a versão do ApdComPort, e fiz um teste com a ecf, e realmente, depois dessas alterações de "status", vem o código CMC7, conforme a tela do teste em anexo.

post-63-13548988113834.png

Acho que o tratamento para o retorno desse comando, teria que ser diferente, certo?

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Pelo que percebi do Emulador ele não responde com a mudança do Status.. não tenho como testar...

Por favor tente modificar a Linha 715 para:

if not (Erro in [ 52, 109,110, 200, 216, 240 ]) then

(Adicione o 109,110 e 200 na lista de exceções de erro)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Mandei algumas alterações para o SVN, que devem nos fornecer melhor subsidio para uma implementação final...

Fiz no escuro, baseado na Imagem fornecida pelo e-mail da Sweda... Vamos ver no que dá... :)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Bom dia Daniel!

Já fiz update no svn e testei novamente, mas o retorno foi o mesmo.

Depurando, percebi que não passa pelo bloco que você alterou, pois no retorno, o tipo é + em vez de !

if Result and (Tipo = '!') then  // Bloco de Satus não solicitado, Verificando

  begin

    Erro := StrToIntDef( copy(Bloco,6,4), 0 ) ;


    if not (Erro in [ 0, 52, 110, 216, 240 ])  then

    begin

      GravaLog( '         VerificaFimLeitura: Bloco (!) Descartado: '+Bloco, True) ;

      Result := False ;

    end

  end ;

Segue anexo o log para análise.

Att.

acbrlog.txt

post-63-13548988114292.png

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Mas segundo a imagem que foi postada na resposta

viewtopic.php?p=38606#p38606

ele deveria retornar "!0000"...

Se não ocorrer o flag de mudança de status, não há como saber que devemos continuar lendo....

Tente com o Demo da Sweda em sua Impressora e observe os resultados

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Boa tarde Daniel!

Demorei um pouco pra responder porque o exe da sweda, não sei porque raios trava quando abre a porta serial no meu pc.

Bom ai instalei o Delphi 7 em outra máquina, e lá a leitura funcionou certinho.

O que acontece é que aquela primeira linha que vem, sem a !, na verdade é a resposta da ecf que o comando 24 de leitura foi processado com sucesso.

Tanto que eu fiz o seguinte, mandei fazer a leitura sem ter inserido o cheque, e ai vem essa resposta.

A partir do momento que o cheque é inserido, ai sim vem as alterações de status (!).

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Tente no ECFTeste, porém sem inserir o cheque antes de comandar a leitura...

O fato é que se o ECF responder com '+', a comunicação está encerrada.. ou seja, ele precisa responder '!'

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Ah e outro detalhe Daniel!

Conforme a imagem do post http://www.djsystem.com.br/acbr/forum/viewtopic.php?p=38606#p38606

Aquela primeira alteração de status (24+) antes do comando para leitura ser enviado, é informação de que o sensor identificou o cheque sendo inserido, mas no caso, sem ter enviado o comando para a leitura.

Se eu ficar colocando o tirando o cheque, sem nunca enviar o comando para ler, fico recebendo essa alteração de status.

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não compreendi a sequencia de comandos necessária... Infelizmente acho que será muito difícil implementar isso sem um ECF para testes...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Bom dia Daniel!

A sequência seria:

1 - O comando 24 é enviado para ecf informando para ela entrar em "estado" de leitura de cmc7.

2 - A ecf responde com +24, informando que o comando foi processado com sucesso e entra em estado de leitura de cmc7.

3 - A partir desse momento, se o cheque já estava posicionado, ou caso ele seja posicionado nessa hora, as alterações de status (!) vão ser enviadas, e teria que iniciar o monitoramento do que vem da ecf, ignorando as alterações de status até o recebimento do cmc7.

Aplicação (24)             -> Ecf

Aplicação (24+)            <- Ecf

Aplicação (24!0109)        <- Ecf

Aplicação (24!0200)        <- Ecf

Aplicação (24!0110...CMC7) <- Ecf

Seria isso.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

O que ocorre se o usuário não inserir o cheque ?

O que o ECF faz (ou envia) enquanto o Cheque não é posicionado ?

Quanto tempo devemos considerar de TimeOut entre o 24+ e o próximo envio ?

Sinto muito, mas acho que não serei capaz de fazer essa rotina sem um ECF para testes...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

O que ocorre se o usuário não inserir o cheque ?

Ai depende do que foi enviado no 3o. parâmetro (timeout) do comando 24|1|timeout.

Se for passado nulo a ecf irá esperar ("infinitamente") até que operador insira o cheque, ou que o comando 47 para cancelar seja enviado.

Se for passado um valor (em milisegundos) a ecf cancela automaticamente o processo após esse tempo.

O que o ECF faz (ou envia) enquanto o Cheque não é posicionado ?

Nada. Fisicamente o led slip fica piscando.

Quanto tempo devemos considerar de TimeOut entre o 24+ e o próximo envio ?

Acho que vai depender ali que for no comando 24 também. No caso de existir um timeout ali, seria esse.

Sinto muito, mas acho que não serei capaz de fazer essa rotina sem um ECF para testes...

Se você tiver disponibilidade posso lhe enviar uma ecf :)

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Vamos tentar um pouco mais...

Vamos observar a resposta do TimeOut... O que ocorre se vc enviar o comando como:


function TACBrECFSwedaSTX.LeituraCMC7: AnsiString;
begin
Result := EnviaComando('24|1|0|1000');
end;
[/code]

Ou seja, com 1 segundo de TimeOut... Por favor copie o trecho do Log gerado pelo ACBrECF...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Bom dia Daniel!

Teste feito, mas sem sucesso. Mesma coisa.

No ecf teste, ao mandar ler o cmc7, recebo a resposta que comando de leitura foi executado com sucesso (24+) e para por ai.

Segue log da operação conforme solicitado.

Se tiver disponibilidade, posso lhe passar um acesso remoto da máquina que está a ecf, delphi com acbr, para que você possa acompanhar.

Att.

acbrlog.txt

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.

The popup will be closed in 10 segundos...