LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

Máquina de Estado

Bom dia pessoal,
 
  estou com dúvidas na implementação em uma máquina de estado(ME).
 
Estou fazendo uma aplicação que busca adquirir dados, startando com um trigger, analisar estes dados e mostra-los o resultado gráfico da análise. Bem, para complementar tenho ainda que salvar os dados e gerar um mini relatório em HTML. Todas estes blocos de código estão prontos, porém nõ consigo implementa-lo em uma máquina de estado.
 
Esta aplicação busca construir uma waterfall, orbita e BODE da partida de um motor.
 
Abaixo segue como visualizei a ME pela primeira vez:
Uma máquina de estado contendo:
Case 1: Parte de aquisição - Daqmx express adquirindo de 4 canais com trigger no primeiro canal. Constante direcionando para Case 2
Case 2: Parte da análise - FFT e FRF para cálculos e análise dos dados, preparando-os para apresentação. Constante direcionando para Case 3
Case 3: Parte da Apresentação - montagem dos arrays de dados e apresentação dos mesmos nos componentes gráficos. Constante direcionando para Case 1
 
Loop em paralelo à ME para salvar os dados e construir o relatório.
 
Dúvida: O fato é que se estivermos no Case de aquisição, o programa estará "preso" na espera da ocorrência de uma trigger, o que impossibilita de manipula-lo caso o motor não gere a mesma. Ex. o motor estiver parado.
Possível solução: baixar o timeout.  
Contra: Gerará dados vazios que não sei como manipula-los para evitar que sejam inseridos na análise.
 
Dúvida: Como posso a qualquer momento executar uma rotina para construção de waterfall?
Possível solução: Utilizar a rotina no loop em paralelo para isto com os dados de uma variável local.
 
Dúvida: Como posso mudar a seleção de um próximo case, visto que o arranjo feito inicialmente é ciclico:aquisição=>analise=>apresentação=>aquisição=>....?
Possível solução: Criar um case default "em branco" que espera um novo destino.
Contra: Como fazer isto se preciso que ele fique no ciclo somente até eu decidir que é para sair do mesmo.
 
Dúvida: Como fazer com que possa parar este processo e fazer com que o programa continue rodando para startar outro ciclo de aquisições?
Possível solução: Inserir um loop externo à ME, parando o loop interno à ME, estria retornando ao loop externo e esperando a nova inicialização.
 
Dúvida: como relacionar uma estrutura de eventos com uma máquina de estados?
 
Se alguém estiver disposto a enviar um código exemplo para exemplificar a resolução destes problemas(os códigos do labview são muito básicos), a NI poderia lançar mão de exempos de aplicativos mais complexos para exemplificar a interação e resolução de problemas como este.... agradeço....ou se tiver um e-mail de suporte para enviar o código e discutirmos o mesmo...também é possível. Infelizmente não posso postar o código no site.
 
Agradeço de antemão a alma caridosa que estiver disposta a encarar esta bomba.
 
Um abraço.
Leonardo de S. Cavadas
Maintenance Engineer and Inspection - Bureau Veritas do Brasil

Engineer Metallurgist with emphasis in Advanced Materials
Technologist in Computer Science
0 Kudos
Message 1 of 5
(3,289 Views)

Dúvida: O fato é que se estivermos no Case de aquisição, o programa estará "preso" na espera da ocorrência de uma trigger, o que impossibilita de manipula-lo caso o motor não gere a mesma. Ex. o motor estiver parado.
Possível solução: baixar o timeout.  
Contra: Gerará dados vazios que não sei como manipula-los para evitar que sejam inseridos na análise.

Você poderia usar uma estrura Produtor/cosumidor de mensagens (tem um template do LV de exemplo). Desta forma, soh trataria os dados se alguma informação fossa adicionada à fila de mensagens.
Esta estrutura de Produtor/Consumidor de mensagens te permitiria também de separar as funções de tratamento de eventos com as funções de anàlise e interação com o processo.





Dúvida: como relacionar uma estrutura de eventos com uma máquina de estados?

A estrutura de eventos deve ficar dentro de um case da màquina de estados que trata ações do usuàrio. Uma espécie de idle.

.


Dúvida: Como fazer com que possa parar este processo e fazer com que o programa continue rodando para startar outro ciclo de aquisições?
Possível solução: Inserir um loop externo à ME, parando o loop interno à ME, estria retornando ao loop externo e esperando a nova inicialização.

Você poderia colocar o processo dentro de um While e verificar a cada iteração se deve continuar ou não.


Eh complicado dar sugestões sem ver o codigo ou um sinoptico do processo. Espero que tenho ajudado um pouco.
Dica: se você postar em inglês, muito mais pessoas poderão te ajudar. Acredito que os membros mais ativos e experientes deste forum não falam português, com sorte espanhol... Pode demorar um pouco mais para se redigir a mensagem, mas vale a pena.

Salut,







Rasputin
LV7.1 <> W2K
Message 2 of 5
(3,285 Views)
Prezado Rasputin,
 
Obrigado pelas dicas, vou estuda-las e tentar implementar. Vou postar em inglês também.
 
inté.
Leonardo de S. Cavadas
Maintenance Engineer and Inspection - Bureau Veritas do Brasil

Engineer Metallurgist with emphasis in Advanced Materials
Technologist in Computer Science
0 Kudos
Message 3 of 5
(3,281 Views)
Inté? Smiley Surprised
Você é mineiro também, DD ou é soh coincidência? Smiley Very Happy
Boa sorte aih.
Rasputin
LV7.1 <> W2K
0 Kudos
Message 4 of 5
(3,279 Views)
Sô mineiro não.....sô Carioca...mas só conheço mineiro gente boa...e a comida é especial. Um grande abraço a Minas.
Leonardo de S. Cavadas
Maintenance Engineer and Inspection - Bureau Veritas do Brasil

Engineer Metallurgist with emphasis in Advanced Materials
Technologist in Computer Science
0 Kudos
Message 5 of 5
(3,277 Views)