Manipulando bits de uma word

Post Reply
Wallacy
Posts: 24
Joined: Thu May 30, 2019 8:05 pm

Manipulando bits de uma word

Post by Wallacy »

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?
User avatar
ViniciusMoraes
Administrador
Posts: 36
Joined: Sat Oct 22, 2016 1:48 am
Contact:

Re: Manipulando bits de uma word

Post by ViniciusMoraes »

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
Bitwise_Script.png (16.22 KiB) Viewed 1162 times

--------------------------------------------------------------------------------------------------------------------------------------------------



Configuração da memória %MW0 do CLP da Schneider (word que será manipulada):

Bitwise_Script_02.png
Bitwise_Script_02.png (25.02 KiB) Viewed 1160 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
Bitwise_Script_03.png (19.9 KiB) Viewed 1158 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
Bitwise_Script_04.png (26.35 KiB) Viewed 1142 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:
Bitwise_Script_Read_Write.H7G
(606.34 KiB) Downloaded 140 times
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).
Post Reply