Gerenciamento de Tags
Modelo de Dados
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 |