lib-agreedpoint-1_2.mpam 3.17 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

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.
	'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.
	'min' - menor dos valores considerados
	'max' - maior dos valores considerados
	'avg' - media dos valores considerados
	'med' - mediana 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.]]
		},
	},
	code = [[
		function _CLASS:read()
			local vals = {}
			local total = 0
			local removidos = 0
			for i, val in ipairs(self.valores) do
				total = total + 1
47
				local status, v, q, t = pcall(val.read, val)
48
49
50
51
52
53
54
55
56
57
58
59
60
61
				if status then
					if q then
						if q==192 then
							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
62
						error(v)
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
					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)
			else
				ret = average(vals)
			end

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