Gerenciamento de Tags

Modelo de Dados

../_images/uml_tags.png

Existem outros atributos de Tags que representam constantes de qualidade do padrão OPC, a lista completa é:

Atributo

Valor Hex

Valor Decimal

QUALITY_GOOD

0xC0

192

QUALITY_GOOD_LOCAL_OVERRIDE

0xD8

216

QUALITY_BAD

0x00

0

QUALITY_BAD_CONFIG_ERROR

0x04

4

QUALITY_BAD_NOT_CONNECTED

0x08

8

QUALITY_BAD_DEVICE_FAILURE

0x0C

12

QUALITY_BAD_SENSOR_FAILURE

0x10

16

QUALITY_BAD_LAST_KNOWN

0x14

20

QUALITY_BAD_COMM_FAILURE

0x18

25

QUALITY_BAD_OUT_OF_SERVICE

0x1C

28

QUALITY_BAD_WAITING_FOR_INITIAL_DATA

0x20

32

QUALITY_UNCERTAIN

0x40

64

QUALITY_UNCERTAIN_LAST_USABLE

0x44

68

QUALITY_UNCERTAIN_SENSOR_CAL

0x50

80

QUALITY_UNCERTAIN_EGU_EXCEEDED

0x54

84

QUALITY_UNCERTAIN_SUB_NORMAL

0x58

88

QUALITY_QUALITY_NOT_SET

0xFFFF

65535

TagObject = Tags.Get(pathname)

Descrição:

  • Recupera um objeto Tag dado seu caminho completo na árvore do projeto. O objeto recuperado já vem com os valores preenchidos (equivalente a uma leitura de ReadCache())

Parâmetros de entrada:

  • pathname - Caminho completo do Tag na árvore de projeto.

Parâmetros de saída:

  • Tabela Lua que representa um Tag.

Exemplo de utilização:

-- recupera vetor de pressao de fundo
-- da Poco 12 passada como parâmertro na variavel Instance
prefix_g1 = "Kernel.Tags.Local.group1."
local Tag = Tags.Get(prefix_g1 .. "pressao_fundo")
print("Id " .. Tag.Id)
print("Name " .. Tag.Name)
print("Value " .. tostring(Tag.Value))
print("Quality " .. Tag.Quality)
print("Type " .. Tag.Type)
print("DateTime " .. tostring(Tag.DateTime))

opc_pressao_fundo   = Tags.Get("Kernel.Tags.Opc.group1.pressao_fundo")
local_pressao_fundo = Tags.Get("Viewers.Tags.group1.pressao_fundo")

-- acesso a tag direto a uma instancia de modelo, desde que saiba o nome da instancia
-- pressao_fundo = Tags.Get("Instances.grupoBM.AR147.Tags.Local.group1.pressao_fundo")
pressao_fundo = Tags.Get("Instances.grupoGLI.MG012.Tags.Opc.group1.pressao_fundo")

-- leitura do valor do tag no momento em que o objeto pressao_fundo foi criado
local valor = pressao_fundo.Value
pressao_fundo:ReadCache()  -- atualiza todos os campos de pressao_fundo
local novo_valor = pressao_fundo.Value

pressao_fundo:ReadDevice() -- atualiza Tag através de leitura sincrona

-- OBS: pode ser que pressão de fundo represente um vetor, neste caso o acesso seria indexado:
-- valor = pressao_fundo[2]

pressao_fundo.Value = valor  -- atualiza valor do Tag no contexto deste script
pressao_fundo:WriteValue() -- escrita síncrona do Tag

-- Opcionalmente podemos implementar o esquema abaixo:
-- Neste esquema um script será invocado quando o valor estiver
-- disponível assíncronamente recebendo como
-- script_name = "NomeDeUmScriptDefinido"
-- valor = pressao_fundo[2]:ReadAsync(script_name)

A qualidade do Tag possui os seguintes valores numéricos:

  • QUALITY_BAD = 0

  • QUALITY_GOOD = 192

  • QUALITY_WAIT = 32

tagTable = Tags.List()

Descrição:

  • Recupera uma tabela Lua cujas chaves são caminhos e cujos valores são objetos Tag, os quais seriam retornados por Tags.Get.

Parâmetros de saída:

  • Tabela Lua cujas chaves são caminhos e cujos valores são objetos Tag, os quais seriam retornados por Tags.Get.

Exemplo de utilização:

-- Imprime todos os Tags registrados e seus valores no momento
for path,tag in pairs(Tags.List()) do
  print(tag.Id .. " : " .. tag.Name .. " -> " .. tag.Value)
  print(path)
  print("")
end

tagTable = Tags.ListTypes()

Descrição:

  • Recupera uma tabela Lua cujas chaves são nomes de tipos de Tags e cujos valores são códigos numéricos que identificam estes tipos. A Tabela de tipos se encontra no fim desta página.

Parâmetros de saída:

  • Tabela Lua cujas chaves são nomes de tipos de Tags e cujos valores são códigos numéricos que identificam estes tipos.

Exemplo de utilização:

-- Imprime todos os Tipos de Tags definidos em um tipo Variant.
for typeName,typeId in pairs(Tags.ListTypes()) do
  print(typeName .. " : " .. typeId)
end

Instância de Tag

err = tagObject:GetInstance()

Descrição:

  • Retorna instância de modelo relacionada ao Tag.

Parâmetros de saída:

  • Objeto do tipo instância ou nil, se não é Tag de instância.

Exemplo de utilização:

local tag = Tags.Get("Instances.Grupo1.Instancia1.Tags.Opc.GrupoOpc1.tagOpc001")
print("Name " .. tag.Name)
local model_instance = tag:GetInstance()

if model_instance then -- sucesso na obtenção da instancia
  print("GetInstance() " ..  model_instance.Name)
else
  print("Erro em GetInstance tag nao possui instancia")
end

err = tagObject:ReadCache()

Descrição:

  • Atualiza os campos (Value,Quality,!DateTime) do objeto Tag (tagObject) de acordo com o que estiver presente na cache.

Parâmetros de saída:

  • err - o valor é 0 se a atualização for bem sucedida, ou um código de erro diferente de 0 se não for possível atualizar o valor do Tag.

Exemplo de utilização:

local tag = Tags.Get("Kernel.Tags.Local.xTagLocalGroup1.xTagLocalA1")
print("Name " .. tag.Name)
err = tag:ReadCache()
if err==0 then -- sucesso na leitura
  print("ReadCache() " ..  tag.Value)
else
  print("Erro em ReadCache: " ..  err)
end

err = tagObject:SetQuality(new_quality)

Descrição:

  • Manipula a propriedade Quality do objeto Tag de acordo com o parâmetro.

Parâmetros de saída:

  • err - o valor é 0 se a escrita da qualidade for bem sucedida, ou um código de erro diferente de 0 se não for possível manipular a qualidade do Tag.

Exemplo de utilização:

local tag = Tags.Get("Kernel.Tags.Local.xTagLocalGroup1.xTagLocalA1")
print("Name " .. tag.Name)
--configura qualidade ruim para o tag
err = tag:SetQuality(Tags.QUALITY_BAD)
if err==0 then -- sucesso na leitura
  tag:ReadCache()
  print("SetQuality() " ..  tag.Quality)
else
  print("Erro em SetQuality: " ..  err)
end

err = tagObject:WriteValue(valor)

Descrição:

  • Escreve o valor no objeto Tag presente na cache.

Parâmetros de entrada:

  • Valor a ser escrito no Tag.

Parâmetros de saída:

  • Retorna o código de erro (0==Sucesso).

Exemplo de utilização:

local tag = Tags.Get("Kernel.Tags.Local.xTagLocalGroup1.xTagLocalA1")

print("Name " .. tag.Name)
tag.Value = 12
err = tag:WriteValue() -- faz escrita síncrona do Valor
if err ~=0 then -- falha na escrita
  print("Erro em WriteValue: " ..  err)
end
err = tag:ReadCache()
if err==0 then -- sucesso na leitura
  print("Valor esperado 12, valor lido " ..  tag.Value)
else
  print("Erro em ReadCache: " ..  err)
end

Outros Exemplos

-- Método abaixo foi cogitado, mas ainda não foi implementado.
Tags.Set("Kernel.Tags.Local.group1.pressao_fundo", 1.2)
-- Por enquanto utilize:
tag = Tags.Get("Kernel.Tags.Local.group1.pressao_fundo")
tag.Value = 1.2
tag:WriteValue()

Utilização de Vetores

-- benchmark
local begin_time = os.clock()

-- obtém objeto lua que representa o Tag
local tag = Tags.Get("Viewers.Tags.TagArrayGroup.aTag001")

 -- impressão de informações
 print("\n .................... Informações sobre o Tag .................... \n")
 print("Id " .. tag.Id)
 print("Name " .. tag.Name)
 print("Quality " .. tag.Quality)
 print("Type " .. tag.Type)
 -- no caso do vetor o valor é uma LuaTable e este "print" não fornece informação sobre o conteúdo de cada posição
 print("Value " .. tostring(tag.Value))
 print("DateTime " .. tostring(tag.DateTime))
 print("Tamanho vetor " .. tostring(#(tag.Value) + 1))

 -- atualiza o valor da propriedade Value do objeto tag com o conteudo do tag
 -- este comando é realizado automaticamente no Tags.Get() e não precisaria ser chamado
 tag:ReadCache()

 -- realiza iteração para escrever em todas as posições do vetor
 for i = 1, #(tag.Value) do
   print(string.format("Value tag[%d]:%s",i,tostring(tag.Value[i])))
   tag.Value[i] = i + tag.Value[i]
 end
 -- envia conteúdo da propriedade "Value" para o conteúdo do tag
 tag:WriteValue()

 --realiza nova leitura para garantir que a escrita foi executada com sucesso
 tag:ReadCache()

 --imprime os valores contidos na TableLua que representa o vetor
 for i = 1, #(tag.Value) do
   print(string.format("Value tag[%d]:%s",i,tostring(tag.Value[i])))
 end
 -- imprime o tempo de execução do scipt
 local end_time = os.clock()
 print("Duração " ..  string.format("%f", end_time - begin_time))
 print(end_time)
 print(begin_time)

 -- imprime primeiro e último valor do vetor
 print("primeiro valor: " .. tostring(tag.Value[1]))
 print("ultimo valor: " .. tostring(tag.Value[#(tag.Value)])

A tabela a seguir apresenta os códigos associados aos diversos tipos “Variant”. Para consultar os tipos de dados admitidos para os Tags de uma aplicação consulte Tipos de Tags.

Tipos Variant Utilizados

Nome

Valor Escalar

Valor Vetor

VT_ARRAY

8192

VT_I2

2

8194

VT_I4

3

8195

VT_R4

4

8196

VT_R8

5

8197

VT_DATE

7

8199

VT_BSTR

8

8200

VT_BOOL

11

8203

VT_I1

16

8208

VT_UI1

17

8209

VT_UI2

18

8210

VT_UI4

19

8211

Tipos Variant Não-utilizados

Nome

Valor

VT_EMPTY

0

VT_NULL

1

VT_CY

6

VT_DISPATCH

9

VT_ERROR

10

VT_DECIMAL

14

VT_I8

20

VT_INT

22

VT_HRESULT

25

VT_PTR

26

VT_SAFEARRAY

27

VT_CARRAY

28

VT_LPSTR

30

VT_LPWSTR

31

VT_RECORD

36

VT_INT_PTR

37

VT_FILETIME

64

VT_BLOB

65

VT_BLOB_OBJECT

70

VT_CF

71

VT_CLSID

72

VT_BSTR_BLOB

4095

VT_ILLEGALMASKED

4095

VT_BYREF

16384

VT_ILLEGAL

65535

VT_RESERVED

32768

VT_STORAGE

67

VT_STORED_OBJECT

69

VT_STREAM

66

VT_STREAMED_OBJECT

68

VT_TYPEMASK

4095

VT_UINT_PTR

38

VT_UNKNOWN

13

VT_USERDEFINED

29

VT_VARIANT

12

VT_VECTOR

4096

VT_VERSIONED_STREAM

73

VT_VOID

24

VT_UINT

23

VT_UI8

21

VT_ARRAY

8192