Boa tarde,
Estou trabalhando com um CLP da Schneider e pretendo utilizar o HIscada Pro como parte da minha solução deste projeto. O detalhe é que com este CLP as variáveis booleanas são mapeadas em uma memória word de 16 bits. Ou seja, cada bit desta word(16 bits) representa uma outra memória booleana correspondente.
Meu objetivo é ler e escrever cada bit dessa word de forma individual e sem influenciar os outros bits. Como posso fazer isso?
Manipulando bits de uma word
- ViniciusMoraes
- Administrador
- Posts: 36
- Joined: Sat Oct 22, 2016 1:48 am
- Contact:
Re: Manipulando bits de uma word
Prezado, boa tarde!
Para responder esta sua dúvida criamos um programa de exemplo do HIscada Pro (que se encontra ao final deste tópico para download).
Para implementar essa funcionalidade foi necessário trabalhar com scripts LUA e, com isso, manipular os bits de uma word de forma individual.
É importante ressaltar que este programa está bem genérico e com muitas imagens, textos estáticos e etc. Daremos ênfase apenas nos scripts utilizados.
Programa de Exemplo em execução:
--------------------------------------------------------------------------------------------------------------------------------------------------
Configuração da memória %MW0 do CLP da Schneider (word que será manipulada):
Leitura da %MW0:
Para realizar a leitura da word e manipular cada bit invidualmente foi necessário utilizar o objeto Tag_Monitor.
O objeto Tag_Monitor é utilizado para chamar um script através do evento de alteração de valor(On Tag Change). Ou seja, quando a memória %MW0 sofrer alteração no seu valor, automaticamente será executado um script(neste caso é o script Read_Word).
Script Read_Word:
--------------------------------------------------------------------------------------------------------------------------------------------------
Escrita individual nos bits da %MW0:
Para o processo de escrita individual dos bits da word decidimos aproveitar os objetos ImageList que foram utilizados apenas para indicação no processo de leitura.
Ou seja, foram criados os eventos de OnClick do ObjAction para cada ImageList de cada bit. Em outras palavras, a cada clique sobre os objetos ImageList será executado um script LUA e este script, por sua vez, enviará um valor de escrita para o respectivo bit associado.
Configuração da ImageList e ObjAction:
Script Write_Bit0:
Para cada objeto ImageList existe um script Write_Bitx que é executado no evento de OnClick. No exemplo acima, o script Write_Bit0 realiza a lógica XOR para inverter apenas o respectivo bit, sem alterar ou influenciar nos demais bits.
--------------------------------------------------------------------------------------------------------------------------------------------------
. Assista o vídeo da Execução deste Exemplo, clicando neste link
. Programa de Exemplo:
Para responder esta sua dúvida criamos um programa de exemplo do HIscada Pro (que se encontra ao final deste tópico para download).
Para implementar essa funcionalidade foi necessário trabalhar com scripts LUA e, com isso, manipular os bits de uma word de forma individual.
É importante ressaltar que este programa está bem genérico e com muitas imagens, textos estáticos e etc. Daremos ênfase apenas nos scripts utilizados.
Programa de Exemplo em execução:
--------------------------------------------------------------------------------------------------------------------------------------------------
Configuração da memória %MW0 do CLP da Schneider (word que será manipulada):
Leitura da %MW0:
Para realizar a leitura da word e manipular cada bit invidualmente foi necessário utilizar o objeto Tag_Monitor.
O objeto Tag_Monitor é utilizado para chamar um script através do evento de alteração de valor(On Tag Change). Ou seja, quando a memória %MW0 sofrer alteração no seu valor, automaticamente será executado um script(neste caso é o script Read_Word).
Script Read_Word:
Code: Select all
local tag_local = Tags.Get("Kernel.Tags.Local.TagLocalGroup_001.TagLocal_001") -- Obtem acesso ao TagLocal_001
local Tag = Tags.Get("Kernel.Tags.Opc.TagOpcGroup_001.TagOpc_001") -- Obtem acesso ao TagOpc_001
idx = 1 -- Variável Index para posicionamento do vetor booleano
for i = 0,15 do -- Laço de repetição para executar a função bit32.extract para obter o estado dos 16 bits da word individualmente
bit = bit32.extract(Tag.Value,i,1) -- Função bit32.extract é utilizada para obter o estado de cada bit individual da word analisada
if (bit == 1) then -- Se o bit analisado estiver em ON(1), então...
bit = -1 -- Atribui o valor -1(true) para a posição do bit analisado
end
tag_local.Value[idx] = bit -- Vai escrevendo cada bit analisado em posições diferentes do vetor booleano
print(tag_local.Value[idx]) -- Imprime o valor de cada bit analisado da word
idx = idx + 1 -- Incrementa variável de index do vetor
end
tag_local:WriteValue() -- Escreve efetivamente os valores de cada bit da word em posições diferentes do vetor booleano(TagLocal_001)
--------------------------------------------------------------------------------------------------------------------------------------------------
Escrita individual nos bits da %MW0:
Para o processo de escrita individual dos bits da word decidimos aproveitar os objetos ImageList que foram utilizados apenas para indicação no processo de leitura.
Ou seja, foram criados os eventos de OnClick do ObjAction para cada ImageList de cada bit. Em outras palavras, a cada clique sobre os objetos ImageList será executado um script LUA e este script, por sua vez, enviará um valor de escrita para o respectivo bit associado.
Configuração da ImageList e ObjAction:
Script Write_Bit0:
Code: Select all
local word = Tags.Get("Kernel.Tags.Opc.TagOpcGroup_001.TagOpc_001") -- Obtem o caminho de acesso ao TagOpc_001
word.Value = bit32.bxor(word.Value, bit32.lshift(1, 0)) -- Realiza a lógica XOR e Desloca o valor 1 para o bit 0 da word
word:WriteValue() -- Escreve efetivamente o valor no bit 0 da word
--------------------------------------------------------------------------------------------------------------------------------------------------
. Assista o vídeo da Execução deste Exemplo, clicando neste link
. Programa de Exemplo:
Vinícius de Moraes
Vendas | Suporte Técnico Comercial
E-mail de contato: suporte@hitecnologia.com.br
Telefone: (19)2139-1700 - (Opção 2 - Suporte Técnico).
Vendas | Suporte Técnico Comercial
E-mail de contato: suporte@hitecnologia.com.br
Telefone: (19)2139-1700 - (Opção 2 - Suporte Técnico).