Discussão sobre Produtos NI

cancelar
Mostrando resultados para 
Pesquisar então 
Você quer dizer: 

Construindo vetores

Resolvido!
Ir para a solução

Boa noite colegas. 

Meu problema é o seguinte: 

 

Objetivo: Contruir um subVI que faça média móvel de "n" elementos de um vetor que faz sucessivas leituras.

 

Meu algoritmo mental:

1º) Inicializar o vetor: valor de INICIALIZAÇÃO e "n" ELEMENTOS;

2º) Quero adicionar na posição "i", do vetor inicializado, o NEW ELEMENT;

3º) O time Delay tah ali pro While não "disparar";

4º) Gostaria de colocar no FrontPanel a atualiização, em tempo real, das posições.

 

Esse é um problema prático em que gostaria de aprender os fundamentos da manipulação de vetores/matrizes, com boas práticas de LV.

 

Não consigo compreender por que o parâmetro "INDEX 0", da função "INSERT INTO ARRAY", não é atualizado junto com o indicador de contagem do While, de forma que, no FrontPanel, as amostras estejam em ordem decrescente, ou seja, a mais recente leitura está no topo. (ou embaixo. O que preciso é do vetor das últimas "n" amostras para conseguir viabilizar a média móvel. A questão estética do FrontPanel é secundária). 

 

Obrigado pela cooperação,

 

[]'s,

Renato.

 

PS.: Já achei, no Grande G, informações sobre Shift Register, mas, como comentei com  vocês, gostaria de manipular vetores e matrizes

0 Kudos
Mensagem 1 de 14
49.480Exibições

Olá Renato,

 

Dei uma olhada no seu código e me parece que além do conhecimento de manipulação de vetores no LabVIEW lhe falta compreender como funciona o ambiente LabVIEW.

Por exemplo, o Time Delay em seu código não está fazendo o que você gostaria que ele fizesse. Na verdade como ele está lá você tem u mdelay de 0s, ou seja não tem delay, além disso ele está executando em paralelo com o resto do código, o que faz com que ele não consiga garantir delay algum.

Quanto a sua lógica de manipulação de vetores, está está funcionando, porém no loop while você está utilizando o terminal "i" para incrementar o index do array, porém você inicializou uma quantidade finita de elementos no array antes do loop, e a função insert into array só consegue inserir dados em posições inicializadas do array.

Por último mas não menos importante, este código não funcionaria bem como um subVI, pois não se deve colocar loops em um subVI e nem funções de temporização, ficando a temporização e a repetição do código a cargo do VI principal, evitando assim que seu código fique preso em um subVI.

 

http://www.ni.com/white-paper/7571/en

 

http://www.ni.com/gettingstarted/pt/

 

Atenciosamente,

Abel Souza
Engenheiro Eletrônico
LabVIEW User since 8.5
Mensagem 2 de 14
49.469Exibições

Boa noite Abel. 
Muito obrigado pela tua contribuição, vô responder à Jack Stripador, por partes. (ha-ha-ha) 

 

Dei uma olhada no seu código e me parece que além do conhecimento de manipulação de vetores no LabVIEW lhe falta compreender como funciona o ambiente LabVIEW."

  • Confesso que sou um baita iniciante, mergulhado em milhões de apostilas da internet. Venho do Pascal, pro Mathematica, dele para o Matlab (acho que fiquei mal acostumado com a lida dos arrays com eles...) e, agora, acho que o Labview pode melhorar meu rendimento em trabalhos de pesquisa na faculdade. Por isso estou procurando compreênde-lo and I'm a braSilian guy... (risos)

Por exemplo, o Time Delay em seu código não está fazendo o que você gostaria que ele fizesse. Na verdade como ele está lá você tem u mdelay de 0s, ou seja não tem delay, além disso ele está executando em paralelo com o resto do código, o que faz com que ele não consiga garantir delay algum."

  • Falha minha, acho que mandei uma versão antiga. Tenho setado 1 seg, para dar tempo de mudar os parâmetros e avaliar a saída.

Quanto a sua lógica de manipulação de vetores, está está funcionando, porém no loop while você está utilizando o terminal "i" para incrementar o index do array, porém você inicializou uma quantidade finita de elementos no array antes do loop, e a função insert into array só consegue inserir dados em posições inicializadas do array.

  • Compreendi a falha. Estou modificando somente a posição do contador, mas não entendi por que as posições anteriores não são mantidas. Pois, em cada iteração, gostaria de adicionar ao indice "i", do vetor inicializado, o "new element". E, também, que se a inicialização das variáveis é feita fora e antes do While, por que a atualização do FrontPanel é zero para todas as posições, exceto na posição "i", que é onde está sendo alimentado o vetor?
  • Se a função "Insert Into Array" não é a mais recomendada, o que aconselharia para que eu consiga alimentar um vetor e mostrar os seus "n" últimos elementos no FrontPanel, a cada iteração?

 Por último mas não menos importante, este código não funcionaria bem como um subVI, pois não se deve colocar loops em um subVI e nem funções de temporização, ficando a temporização e a repetição do código a cargo do VI principal, evitando assim que seu código fique preso em um subVI.

  • A possibilidade de looping infinito num subVI não deve ser cogitada, mas, como avaliar uma média móvel, dentro de um subVI, sem um laço? 

 

Abel e colegas que queiram colaborar com um bom pitaco, não precisam se apegar as minhas perguntas/respostas, de repente não fui feliz nas palavras do meu primeiro post. As vezes eu acho que tenho um milhão de idéias, mas não consigo saber o suficiente para implementar uma.. =(... Óó, mas é só as vezes!! =P

O que eu gostaria de extrair do LV é que a cada iteração eu tenha um display das "n" últimas alimentações de um vetor unidimensional e, do lado dessa "coluna" (ou linha, não entendi se os vetores unidimensionais são colunas ou linhas e/ou se posso escolher...) tenha um indicador que mostre: " A média móvel das "n" últimas amostras é:____"

 

Obrigado pela ajuda pessoal, feliz carnaval!!

[]'s

Renato.

 

 

 

0 Kudos
Mensagem 3 de 14
49.461Exibições

Olá Renato,

 

Desculpe renato, acho que eu não fui muito claro, a sua lógica de manipulação dos arrays funciona, você só precisa utilizar um shift register para realimentar o vetor de saída com os novos valores, quando você não utiliza um shift register é como se a cada iteração do loop você tivesse um novo vetor completamente diferente.

Anexei um VI que provavelmente não é a melhor solução mas com ele acredito que você compreenderá melhor o que quero dizer.

 

O Insert into array não é a melhor solução porque ele faz uma alocação dinâmica de memória, ou seja a cada elemento não inicializado que você inserir ele vai fazer uma nova alocação de memória para o vetor. A melhor opção seria um vetor com tamanho fixo e utilizar a função Replace Array Subset, de modo que você substitui os valores de um vetor utilizando um mesmo espaço de memória, não sendo secessária a realocação.

 

Quanto a questão do loop em um subVI, em LabVIEW utilizamos uma técnica chamada FGV - Functional Global Variable. Entre as várias funções de uma FGV podemos utilizá-la para isso. Seguem alguns links sobre FGV.

 

https://decibel.ni.com/content/docs/DOC-2143

 

http://labviewjournal.com/2011/08/race-conditions-and-functional-global-variables-in-labview/

 

https://decibel.ni.com/content/docs/DOC-20897

 

Você também pode encontrar informações sobre FGV no help do LabVIEW.

 

Fica também uma dica para todos os usuários do fórum, sempre mencionem qual a versão de LabVIEW, ou qualquer outro software, que você está utilizando já que a versão anterior não abre um arquivo da versão mais recente.

 

Para você e todos aqueles que estão iniciando em LabVIEW deixo também um link um conteúdo introdutório ao LabVIEW que se chama Aprenda LabVIEW em 6 horas. Todo este material está em português.

 

http://www.ni.com/white-paper/12689/pt

 

Além disso a NI oferece vários cursos aqui no Brasil e a agenda dos cursos pode ser conferida no site.

 

http://brasil.ni.com/treinamentos/calendario

 

A equipe de marketing da NI também promovem e participam de diversos eventos, em alguns eles provemem sessões práticas na utilização das ferramentas NI.

 

Bom carnaval!

 

Atenciosamente,

Abel Souza
Engenheiro Eletrônico
LabVIEW User since 8.5
Mensagem 4 de 14
49.451Exibições

Abel, tu é fera!! Muito obrigado pela ajuda.

 

Teu exemplo não resolveu, ainda, o que eu tenho em mente, mas já foi muito útil! Ainda ontem estava lendo sobre a "flat sequence"... são muitas ferramentas nesse brinquedinho novo pra mim, chamado LV.

 

Vô atacar os treinamentos que encaminhaste, dei uma olhada por cima e parecem ser bem práticos e pouco maçantes.

Já tentei fazer o Core 1 da NI, mas qdo eu tinha dinheiro não tinha turma em POA/RS, qdo clareou a turma, já não havia mais o "faz-me rir"... Acredito que esteja apanhando tanto, pois não tenho ninguém por perto que domine o LV e possa conversar sobre minhas dúvidas, dar dicas ou, simplesmente, apontar um caminho diferente para o mesmo problema. Por sorte, encontrei vocês por aqui!! ;-D

 

 

Obrigado pela cooperação e a paciência! =D

Abraços,

 

Renato.

0 Kudos
Mensagem 5 de 14
49.446Exibições

Prezados, aquele material: "APRENDA LV EM 6H" é muuuito bom!! =D

0 Kudos
Mensagem 6 de 14
49.443Exibições
Solução
Aceita pelo autor do tópico rfpedrotti

Prezados, antes tarde do que mais tarde, resolvi, exatamente, o que eu queria.

 

1º) O Dial dá um input. 

2º) Mostradores do input;

3º) Construir e atualizar vetor linah e vetor coluna no FrontPanel;

4º) Médias móveis de 10 períodos: em vetor e em gráfico contra T_atual;

5º) Critério de estabilidade com contador de tempo e amostras em regime permanente;

 

Dúvidas: Alguém tem alguma idéia brilhante para criar uma subVI de médias móveis, onde os inputs sejam: número de elementos e o dado de entrada. Enquanto a saída seja somente o valor da Média Móvel?

 

Espero que ajude outros iniciantes a sacar os vetores. Para as atualizações dos vetores no FrontPanel o truque é: FrontPanel>Controls>Modern>Array e coloca o Array no Front Panel. FrontPanel>Controls>Modern>Indicator e coloca o indicator dentro do Array, recém posto. Basta arrastar para a direita, para ter um vetor mostrado como linha ou, para baixo, para ter um vetor mostrado como coluna.

 

Sem dúvida, a ajuda do Abel e dos treinamentos foram essenciais para chegar nesta etapa.

Abraços,

 

Renato.

 

0 Kudos
Mensagem 7 de 14
49.431Exibições

Olá Renato,

 

Deixa eu ver se eu entendi direito, os dados serão inseridos pelo usuário fora do seu subVI, ou seja, seu subVI receberá o array já completo com os dados?

 

Sendo assim, você precisaria apenas de uma entrada para o seu subVI e ela seria o seu array que contém os dados. E assim, dentro do seu subVI você poderia usar a função Array Size para verificar quantos elemento foram enviados para que a média móvel fosse calculada.

 

Uma coisa outra que eu gostaria de entender também é se o número de elementos da sua média móvel será fixo e se sempre você terá essa quantidade de elementos? Ou seja, no começo da execução já haverá o número máximo de elementos da sua média móvel ou eles serão adicionados até atingirem o limite de elementos pré-estabelecidos?

 

Tendo essas informações acima poderei te guiar melhor, pois pode ser que seja necessário que o subVI receba elemento a elemento e não o array completo. Mas enfim, dependendo do seu cenário eu continuo o meu raciocínio.

 

Atenciosamente,

 

 

 


 

Plínio Costa
Senior Techinical Support Engineer
National Instruments Brazil



0 Kudos
Mensagem 8 de 14
49.373Exibições

Boa tarde Plínio. Obrigado pelo interesse em procurar me ajudar.

 

Em anexo, posto um VI da aplicação mais simples possível que me serve, junto com o driver do instrumento que uso (Agilent 34970A).

 

Ele simplesmente, faz a aquisição do canal 101 e larga no Front Panel.

 

O objetivo do subVi da média móvel é que ele seja personalizável com relação ao número de elementos. Por exemplo: Quero média móvel das últimas 50 amostras. Logo, quero um subVi que tenha 2 inputs (o número de elementos (50) e o dado de temperatura) e um output (a média das últimas "50" amostras). 

Dessa forma, se eu quiser avaliar, simultanemente, uma média móvel de 10, uma de 25 e uma de 100 elementos, eu não precise fazer 100 shift registers e 3 daqueles blocos '"Compound Arithmetic"(que deixam o código completamente emaranhado de fios), respectivamente para 10, 25 e 100. Basta colocar 3 subVI's, colocar 3 "Controls" para setar o número de elementos da Média Móvel e 3 "Indicators" para as saídas.

 

Plínio, não consegui vislumbrar, ainda, como conseguir setar o número de amostras que o shiftregister guardará, ao invés de criá-los na borda de entrada do laço.

 

Abraços,

Renato.

 

PS.: Versão: Labview 2009 Professional Development System.

Baixar tudo
0 Kudos
Mensagem 9 de 14
49.362Exibições

Certo, você sabe me responder quantas amostras essas função EZ Temperature te devolve a cada iteração? Esse número é de amostras é configurado no seu instrumento?

 

A idéia de solução é seguinte:

 

Primeiramente, você deverá pensar em um limite de amostras (S_lim) que o usuário poderá escolher para ser feita a média móvel. Se não você teria que guardar todas os pontos adquiridos, o que não é muito viável dependendo do tempo do ensaio.

 

Segundo, se for possível selecionar o número de amostras que seu instrumento te envia por palavra, você deverá escolher esse número igual ao limite de amostras (S_lim). Isso porque, dessa forma você não precisará ficar trabalhando com array para concatenar os dados recebidos a cada iteração, você já terá a quantidade total a cada iteração. Ou seja, a cada iteração seu conjunto de dados anterior será substituido por completo, sem precisar concatenar.

 

Tendo isso em mente e implementado, o exemplo abaixo te dará um idéia de como implementar o seu subVI.

 

Plínio Costa
Senior Techinical Support Engineer
National Instruments Brazil



0 Kudos
Mensagem 10 de 14
49.351Exibições