Como fazer um LED piscar? Troca rápida e constante entre duas imagens e outras dúvidas


(Kelvin) #1

Olá,

Estou começando a aprender o desenvolvimento no Elipse E3, e estou com algumas dúvidas no momento.

Tenho aqui duas imagens, a primeira é um LED apagado e a segunda é o mesmo LED, só que aceso, como visto abaixo:

image image

Consigo deixar o fundo da imagem transparente dentro do Elipse E3 normalmente.

Criei um XControl chamado LED_Vermelho com intenção de receber um valor binário de um TAG, então dentro do XControl criei uma propriedade chamada TAG do tipo Boolean e fiz o seguinte Script na imagem:

Aqui está funcionando conforme descrito, posso colocar este XControl em uma tela e associar qualquer TAG boolean à propriedade TAG do XControl inserido na tela.

Agora, a primeira dúvida é: este método de fazer funciona, mas está eficiente? Ou existe alguma forma mais eficaz de fazer?

Segunda dúvida, gostaria de adaptar este XControl para receber uma propriedade chamada “Piscar”, onde se eu coloca 0, não pisca, e se eu coloco 1, fica piscando caso a propriedade TAG for igual a 1, como se um alarme estivesse ativo por exemplo.

Como ainda sou novo no Elipse, não consegui uma forma de conseguir fazer, a primeira coisa que pensei em fazer foi criar um evento no LED novamente com a “Condição de Ocorrência” configurada para “Sempre que a expressão for verdadeira” e selecionar “Repetir o evento” a cada 500 ms, para aproveitar este tempo para fazer o LED piscar, trocando o estado da imagem sempre que entrar neste evento pela condição.

Porém, eu já fiz alguns testes aqui e eu não consigo entender o motivo, mas a condição nunca se torna verdadeira, quando eu seto a TAG para 1, o script não entra neste evento de jeito nenhum, e eu não consigo entender o motivo disto, a condição ali seria: LED_Vermelho.TAG = 1, igual a condição que eu usei no exemplo descrito acima em que o LED não pisca, apenas acende, com a exceção que o método de ocorrência é diferente e que a expressão agora compara se a TAG é igual a 1. Mas eu não sei o que ocorre para este evento nunca ser executado, mesmo quando forço a TAG para 1 ao rodar o programa. Se alguém puder tirar esta dúvida, agradeço muito.

Tendo esta dificuldade acima, ali na expressão (imagem acima mesmo), coloquei: second(time) <> 0

Com esta expressão, o evento ficou ocorrente sempre, fiz este teste por imaginar que o segundo real sempre está variando e sempre será diferente de zero (até que chegue até zero). E com isto talvez desse para fazer algo, já que o script estaria sempre rodando a cada 500 ms, porém, outra dúvida que eu tenho é que se eu fizesse por este caminho, daria algum problema no programa? Imagino que desta forma não seja otimizado.

Na verdade, outra dúvida que eu tenho é justamente sobre isto, se é possível deixar um script rodando sempre, sem parar? Sei que é possível porque fiz com este método de ficar comparando os segundos sempre, mas quero saber se há alguma forma certa de fazer isto, caso haja, por favor, gostaria de saber como e se pode causar problema ao rodar a aplicação, como lentidão ou algo do tipo. Eu pergunto isto, pois estou acostumado a programar IHMs e lá havia a opção de deixar uma macro (script) rodando sempre e se repetindo sempre de acordo com o tempo definido em ms.

Pensando nisto, pensei um usar a “Tag Timer” do próprio Elipse, a fim de tentar trocar a imagem do LED pagado e aceso sempre que o timer estourasse, mas ao inserir, parece que não era o que eu imaginava, me deu a impressão de que é algo programado por calendário ou algo assim. Gostaria de algum comentário sobre isto se possível. Então, inseri um “Tag contador”, este sim tinha configurações com o que eu imaginava, porém, no "comportamento’ dele, na área “preset” e “increment”, não consegui uma forma de configurar para ms (milissegundos), então outra dúvida é se é possível usar o tag contador com ms.

É isto, existem muitas dúvidas neste post, ficaria muito grato se pudessem responder todas ou a maioria delas e orientações para os métodos mais otimizados e indicados possíveis, seria muito esclarecedor. Desde já, agradeço a ajuda de todos.


(Luiz Fernando Freire dos Reis) #2

@KDM, bom dia.

Seguem respostas:

  • Pergunta 1:

Como bem observou, funciona, mas não é o mais eficiente. A melhor forma de fazer é por associação.

Associa à propriedade FileName do objeto Imagem a propriedade TAG do XControl do tipo digital. Quando ligado, colocar o caminho da imagem do led aceso e quando desligado o inverso.

  • Pergunta 2:

Não ficou claro em que momento quer que isto aconteça. Pretende modificar essa propriedade em Runtime ou, após intanciar, escolher se deverá piscar? Ele sempre deve piscar ou apenas quando estiver em alarme. Por favor, detalhar.

  • Pergunta 3:

Depende de alguns fatores. Exemplo: Aonde criou este evento? Se no XControl, por que não utilizou o OnPropertyChange da propriedade TAG? Por favor, detalhar.

  • Pergunta 4:

Também não é a melhor maneira. Sempre que possível deve substituir os scripts por associações. Neste caso, não acredito que utilizar um script a cada 500 ms resolveria o problema. É necessário analisar. Se possível, por favor, detalha a Pergunta 3 que este deve ser sanado.

  • Pergunta 5:

É possível, mas deve analisar se faz sentido deixá-lo rodando a cada x segundos. Explico: isto pode causar lentidão e, dependendo de qual for o motivo, pode fazer uso de gatilhos para executar os scripts, por exemplo, quando mudar de valor ou se perder a conexão ou ao realizar login, etc.

Sempre que possível, evitar scripts cíclicos.

  • Pergunta 6:

Sim, o TagTimer é como se fosse um calendário. Nele você faz programação horária. Este artigo explica melhor sobre o funcionamento: https://kb.elipse.com.br/kb25590-como-funciona-um-tag-timer/.

  • Pergunta 7:

Não, ele realiza contagem por segundos.

Por favor, esclarecer as dúvidas acima para que eu possa continuar.

Sds.


(Kelvin) #3

Bom dia amigo, muito grato pela resposta.

Eu fiz sua sugestão de associar a propriedade FileName do objeto a propriedade TAG do XControl com conexão do tipo digital, e realmente é bem mais simples, confesso que eu não tinha conhecimento disto. E como consequência, vi ali que este método já oferece uma opção para piscar para outro valor, então fiz o teste, coloquei na opção ligado a imagem do LED ligado e no pisca da opção ligado coloquei o LED desligado, quando a propriedade TAG do Xcontrol está em nível lógico 1, o LED começa a piscar, era tudo o que eu estava tentando fazer.

Uma dúvida que eu deixo agora sobre isto agora, é se é possível modificar a frequência do pisca por meio desta associação digital. Se não for possível, tudo bem, a frequência padrão já satisfaz nossa aplicação. EDIT: mexendo aqui, descobri que dá pra mudar a frequência na propriedade BlinkTime do Viewer. Então pergunto se é possível mudar a frequência individualmente.

Sobre a pergunta 2, vou explicar. Como eu desconhecia a associação digital, fiz naquele método de script que eu descrevi no post anterior, onde o LED apenas acendia quando recebia valor 1 na propriedade TAG do Xcontrol e ficava apagado quando recebia valor 0 na TAG. O que eu estava querendo fazer, NÃO seria em Runtime, seria no ambiente de desenvolvimento mesmo, ou seja, eu coloco o XControl na tela, que é o LED no caso, e nas propriedades dele, teria uma propriedade chamada “Piscar”, esta seria uma propriedade que receberia 0 ou 1, se recebesse 0, o LED teria o mesmo comportamento de antes, fica aceso quando em 1 e fica apagado quando em 0. Porém, se a propriedade Piscar fosse 1, quando o LED estivesse em nível lógico 1, ele ficaria piscando (alternando entre a imagem dele aceso e apagada). Esta propriedade “Piscar” não seria algo dinâmico, seria apenas uma constante mesmo ao inserir o XControl, o qual eu definiria o comportamento dele se piscaria ou não apenas inserindo 0 ou 1 na propriedade Piscar.

Estou apenas explicando minha ideia inicial, conhecer a associação digital muda um pouco meu pensamento. O que estou em mente agora, é se vale a pena tentar criar apenas um XControl que seja flexível para aceitar uma opção de piscar ou não. Ou se eu criar dois XControls, um em que o LED apenas ficada apagado ou aceso e o outro em que o LED ficado apagado e piscando (usarei das duas formas em minha aplicação). Creio que criarei dois XControls mesmo, me parece mais simples.

Na pergunta 3, eu havia criado este evento na imagem que eu inseri dentro do XControl, ou seja, não era necessariamente no XControl, mas na imagem dentro dele. Sobre usar “OnPropertyChange”, eu não encontrei esta opção, para ser sincero eu não sei do que se trata. Seria grato uma breve explicação sobre.

Se possível, pode me responder se existe alguma biblioteca de imagens para baixar em algum lugar e jogar dentro do Elipse E3? Como LEDs, botões, chave de 3 posições ou mais, etc. Imagens além daquelas que vem na própria galeria do Elipse. Havia esquecido de perguntar isto, obrigado.

Sobre as demais perguntas, creio que eu compreendi suas respostas. Eu entendo bem a lógica das coisas, só estou tendo um pouco de dificuldade nas syntaxs e otimizações, mas vou aprendendo isto com o tempo.

Amigo, imensamente grato por suas respostas, foi um aprendizado muito grande.


(Luiz Fernando Freire dos Reis) #4

@kdm,

Por nada!

O evento OnPropertyChange fica nas propriedades dos XControls/XObjects. Ele serve para executar um script quando o valor dele mudar. Este evento é interessante, pois só é executado na mudança de valor, então não precisa ficar executando de forma cíclica.

A Elipse disponibiliza as imagens da galeria, a qual comentou, as imagens dos treinamentos e também as da biblioteca High Performance. Outras imagens podem ser encontradas na internet ou desenvolvidas pelo próprio cliente. Neste tópico tratamos sobre isto: Biblioteca Simbolos

Aproveito para lhe sugerir os tutoriais disponíveis no Knowledge Base (Usando bibliotecas no E3, Noções de VBScript, Usando Bancos de Dados no E3, Linguagem SQL) e os vídeos no Youtube. Com certeza eles lhe ajudarão nos futuros desenvolvimentos.

Qualquer dúvida, só avisar.

Sds.