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:
- Bitwise_Script.png (16.22 KiB) Viewed 2488 times
--------------------------------------------------------------------------------------------------------------------------------------------------
Configuração da memória %MW0 do CLP da Schneider (word que será manipulada):
- Bitwise_Script_02.png (25.02 KiB) Viewed 2486 times
Leitura da %MW0:
Para realizar a leitura da word e manipular cada bit invidualmente foi necessário utilizar o objeto
Tag_Monitor.
- Bitwise_Script_03.png (19.9 KiB) Viewed 2484 times
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:
- Bitwise_Script_04.png (26.35 KiB) Viewed 2468 times
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
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: