lib-agreedpoint-1_0.mpam 2.72 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

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 = "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.
	'min' - menores valores devem ser considerados/eliminados
	'max' - maiores valores devem ser considerados/eliminados
	'dif' - maiores diferenças da média devem ser considerados/eliminados
	]]
		},
		{	id = "operacao", name = "Operação", type = "STRING",
			description = [[Configuração de operação que de deve ser usada para calcular o valor considerado.
	'min' - menor dos valores considerados
	'max' - maior dos valores considerados
	'avg' - media dos valores considerados
	'med' - mediana dos valores considerados
	]]
		},
	},
	code = [[
		function _CLASS:read()
			local vals = {}
			local total = 0
			local removidos = 0
			for i, val in ipairs(self.valores) do
				total = total + 1
				local v, q, t = val:read()
				if q then
					if q==192 then
						vals[#vals+1] = v
					else
						removidos = removidos + 1
					end
				else
					vals[#vals+1] = v
				end
			end

			local remover = self.considerar
			if remover then
				if math.mod(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     self.operacao == 'med' then
				ret = calcular_mediana(vals)
			elseif self.operacao == 'min' then
				ret = minimo(vals)
			elseif self.operacao == 'max' then
				ret = maximo(vals)
			else
				ret = average(vals)
			end

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