lib-agreedpoint-1_3.mpam 3.7 KB
Newer Older
1
include 'lib-list-1_10.mpam'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

class{ id = "AGREED_REAL_POINT", name = "Ponto Real com Acordo", group = "Pontos Estendidos",
	isPoint = true,
	bases = { "REAL_POINT" },
	simulationValue = 1,
	description = [[
		Classe de ponto real que leva em consideração um lista de tags para retornar seu valor.
		Quando disponível, a qualidade de uma leitura OPC deve ser boa (192) para que o valor seja considerado.
	]],
	attributes = {
		{	id = "valores", name = "Valores", type = "REAL_POINT[]",
			description = [[Lista de valores que devem ser considerados para definição de valor.]]
		},
		{	id = "referencia", name = "Referência", type = "REAL",
			description = [[Valor que deve ser considerado caso nenhum valor apresente qualidade boa.]]
		},
		{	id = "considerar", name = "Considerar", type = "INTEGER",
			description = [[
				Configuração de quantidade de elementos que devem ser considerados, caso positivo, ou eliminados, caso negativo, da lista para retornar o valor.
				Caso esse valor não seja configurado ou seja zero, todos os elementos serão considerados inicialmente.
			]]
		},
		{	id = "criterio", name = "Critério", type = "STRING",
			description = [[
				Configuração de critério de deve ser usado para considerar ou eliminar os valores.

				Os critérios disponíveis são:

				'min' - menores valores devem ser considerados
				'max' - maiores valores devem ser considerados
				'dif' - maiores diferenças da média devem ser eliminadas
			]]
		},
		{	id = "operacao", name = "Operação", type = "STRING",
			description = [[
				Configuração de operação que de deve ser usada para calcular o valor considerado.

				As operações disponíveis são:

				'min' - menor dos valores considerados
				'max' - maior dos valores considerados
				'avg' - media dos valores considerados
				'med' - mediana dos valores considerados
				'sum' - somatório dos valores considerados
			]]
		},
		{	id = "inibe_erro", name = "Inibe Erro", type = "BOOLEAN",
			description = [[Caso ocorra um erro na leitura de ponto o erro não será exibido.]]
		},
51
52
53
		{	id = "qual_opc_min", name = "Qualidade OPC Mín.", type = "INTEGER",
			description = [[Qualidade OPC Mínima para leitura de valor ser considerada.]]
		},
54
55
56
57
58
59
	},
	code = [[
		function _CLASS:read()
			local vals = {}
			local total = 0
			local removidos = 0
60
			local min_qual = self.qual_opc_min or 192
61
62
63
64
65
			for i, val in ipairs(self.valores) do
				total = total + 1
				local status, v, q, t = pcall(val.read, val)
				if status then
					if q then
66
						if q >= min_qual then
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
							vals[#vals+1] = v
						else
							removidos = removidos + 1
						end
					else
						vals[#vals+1] = v
					end
				else
					if self.inibe_erro then
						removidos = removidos + 1
					else
						error(v)
					end
				end
			end

			local remover = self.considerar
			if remover then
				if remover%1 ~= 0 then
					remover = 0
				elseif remover < 0 then
					remover = abs(remover)
				else
					remover = total - remover
				end
			else
				remover = 0
			end

			local med = average(vals)
			table.sort(vals, self.criterio == 'dif' and (function(a,b) return math.abs(a-med) < math.abs(b-med) end) or nil)

			while remover > removidos do
				table.remove(vals, (self.criterio == 'max' and 1) or nil)
				removidos = removidos + 1
			end

			local ret
			if #vals == 0 then
				ret = self.referencia
			elseif self.operacao == 'med' then ret = mediana(vals)
			elseif self.operacao == 'min' then ret = minimo(vals)
			elseif self.operacao == 'max' then ret = maximo(vals)
			elseif self.operacao == 'sum' then ret = sum(vals)
			else
				ret = average(vals)
			end

			return ret, #vals==0 and 0 or 192, os.time()
		end
	]],
}