lib-antigolf-5_0.mpam 18.5 KB
Newer Older
1
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
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
include 'lib-equips-2_0.mpam'
include 'lib-painel-2_1.mpam'
include 'lib-utils-1_1.mpam'
include 'lib-time-1_2.mpam'
include 'lib-blocos-4_0.mpam'
include 'lib-fuzzy-1_0.mpam'
include 'lib-access-1_0.mpam'

class{ id = "mod_antigolf_actChoke", name = "Anti-Golfadas: Atuação na Choke", group = "Anti-Golfadas",
	bases = {},
	description = [[
		Modelagem de atuação de módulo anti-golfadas.

		Esse módulo agrega é usado pelos os sub-módulos para avaliar e coordenar a atuação
		na válvula choke do poço pra evitar golfadas e manter um posição alvo.
	]],
	code = [===[
	]===],
	attributes = {
		{	id = "permissoes_act", name = "Permissões de Atuação", type = "permissoes", access = "g",
			description = [[
				Lista com permissões de atuação para módulo.
				Essas permissões podem ser:

				- 'prot', comandos de proteção podem ser realizados pelo módulo.
			]],
		},
		{	id = "perm_ignorar_du_max", name = "Perm. Ignorar Delta U Máx.", type = "permissoes", access = "g",
			description = [[
				Lista com permissões de atuações maiores que Delta U Máximo.

				Se não for configurado, apenas atuações 'prot' irão ignorar a configuração de Delta U Máximo.

				Essas são customizáveis pelo desenvolvedor de módulos que fazem uso do
				diagrama "{AntiGolf/actCmdChoke}" para atuações na choke.
			]],
		},
		{	id = "ind_choke_pos_min", name = "Pos. Mín. de Choke", type = "REAL_POINT", access = "r",
			description = [[Indicação de posição mínima permitida para choke.]],
		},
		{	id = "ind_choke_pos_max", name = "Pos. Máx. de Choke", type = "REAL_POINT", access = "r",
			description = [[Indicação de posição máxima permitida para choke.]],
		},
		{	id = "cfg_choke_du_min", name = "Delta U Mín. na Choke", type = "REAL", access = "g",
			description = [[
				Configuração de variação mínima na posição da choke em uma atuação.

				Variações menores serão acumuladas quando mantiverem o mesmo sinal e
				serão aplicadas quando a variação acumulada alcançar esse valor.
			]],
		},
		{	id = "cfg_choke_du_max", name = "Delta U Máx. na Choke", type = "REAL", access = "g",
			description = [[
				Configuração de variação máxima na posição da choke em uma atuação.

				Variações maiores serão descartadas quando mantiverem o mesmo sinal e
				serão aplicadas quando a variação mínima for alcançada.
			]],
		},
	},
	methods = {
		{ id = "ajustar_du_acum", name = "Ajustar Delta U Acum.",
			description = [[Ajusta o valor de Deltu U Acumulado para a próxima execução.]],
			parameters = {
				{	name = "Delta U", type = "REAL"}
			},
			results = {
			},
			code = [===[ function(self, du)
				self._du_acum = du
			end ]===],
		},
		{ id = "informar_du_acum", name = "Informar Delta U Acum.",
			description = [[
				Informa a o valor acumulado de Delta U na última execução.

				O valor informado é apagado, tendo que ser definido novamente.
			]],
			parameters = {
			},
			results = {
				{	name = "Delta U Acum.", type = "REAL"}
			},
			code = [===[ function(self, idact)
				local du_acum = self._du_acum

				self._du_acum = nil

				return du_acum
			end ]===],
		},
	},
}

class{ id = "mod_antigolf_monPrsTopo", name = "Anti-Golfadas: Mon. Pressão de Topo", group = "Anti-Golfadas",
	bases = {},
	description = [[Modelagem de módulo de monitoração de pressão de topo.

		Esse módulo avalia a pressão de topo do poço retornando se esse valor está alto ou normal,
		de acordo com o limite máximo corrente.

		A pressão de topo avaliada é configurada via atributo Seleção Prs. Topo, que irá determinar
		como o limite máximo é avaliado.
	]],
	code = [===[
	]===],
	attributes = {
		{	id = "cfg_sel_prs", name = "Sel. de Pressão", type = "STRING", access = "g",
			description = [[
				Seleção de Pressão de Topo do Poço que deve ser considerada pela monitoração.
				Essa configuração deve ser definida como:

				- 'pmon', a pressão a montante será considerada e uma curva de cálculo de pressão
				de entrada máxima deverá estar configurado.

				- 'pjus', a pressão à jusante será usada e o valor de Pressão de Topo máxima
				será usado de acordo com a configuração de indicador de pressão máxima.
			]],
		},
		{	id = "ind_prs_topo_max", name = "Ind. P. Topo Máx.", type = "REAL_POINT", access = "g",
			description = [[Indicador de Pressão de Topo Máxima para o Poço.]],
		},
		{	id = "curva_prs_topo_max", name = "Curva de P. Topo Máx.", type = "curva_interpolada", access = "g",
			description = [[
				Curva para Cálculo de Pressão de Topo Máxima em função de Posição Atual da Choke.
			]],
		},
		{	id = "tmr_prs_topo_ok", name = "Tempor. P. Topo Normal", type = "timer", access = "g",
			description = [[
				Temporizador de pressão normal que, quando concluído,
				indica que a proteção deve ser desativada.
			]],
		},
		{	id = "tmr_prs_topo_alta", name = "Tempor. P. Topo Alta", type = "timer", access = "g",
			description = [[
				Temporizador de pressão alta que, quando concluído,
				indica que a proteção deve ser ativada.
			]],
		},
		{	id = "ret_mon", name = "Retorno de Monitoração", type = "STRING", access = "gs",
			description = [[
				Indica o resultado avaliado pela monitoração de acordo com a pressão de topo
				selecionada e os temporizadores.

				Esse valor pode ser:
				- 'ok'   - temporizou pressão abaixo da máxima avaliada
				- 'alta' - temporizou pressão está acima da máxima avaliada
			]],
		},
		{	id = "t_intervalo_s", name = "Intervalo", type = "REAL", access = "g",
			description = [[Tempo em segundos que deve ser esperado entre passos do módulo.]],
		},
	},
	methods = {
	},
}

class{ id = "mod_antigolf_ProtPrsTopo", name = "Anti-Golfadas: Proteção", group = "Anti-Golfadas",
	bases = {},
	description = [[Modelagem de módulo de proteção anti-golfadas.

		Esse módulo avalia a pressão de entrada do poço e, caso essa pressão esteja acima
		de um limite máximo, atua levando a posição da choke do poço para o valor mínimo.

		Se a posição atual estiver abaixo do mínimo a proteção não irá atuar.
	]],
	code = [===[
	]===],
	attributes = {
		{	id = "cfg_modo_rastreio_prot", name = "Modo de Rastreio", type = "STRING", access = "g",
			description = [[
				Seleção de modo de rastreio de comando de choke auxiliar na inicialização e quando o
				a proteção estiver desabilitada.

				O rastreio só deve ser configurado quando o MPA escreve em uma válvula auxiliar.
				Quando não configurado, o comando atual é mantido.

				Para que o rastreio seja realizado, essa configuração deve ser definida como:

				- 'pos', o comando da choke irá rastrear a posição atual da válvula do poço.
				- 'cmd', o comando da choke irá rastrear o comando atual da válvula do poço.
			]],
		},
		{	id = "cfg_du_prot", name = "Delta U de Proteção", type = "REAL", access = "g",
			description = [[
				Delta de proteção que deve ser aplicado por passo de proteção.

				O sinal dessa configuração será ignorado, resultando em um delta negativo do valor absoluto configurado
				com valor no mínimo do 'Delta U Mínimo' configurado para o Atuador configurado.

				Quando não for configurado, será aplicado um delta de -100, levando a posição para o valor mínimo.
			]],
		},
		{	id = "tmr_degrau_prot", name = "Tempo. Degrau Prot.", type = "timer", access = "g",
			description = [[Temporizador de degraus de proteção que, quando concluído, indica que um novo degrau pode ser aplicado.]],
		},
		{	id = "t_intervalo_s", name = "Intervalo", type = "REAL", access = "g",
			description = [[Tempo em segundos que deve ser esperado entre passos do módulo.]],
		},
	},
	methods = {
	},
}

class{ id = "mod_antigolf_monPrsFundo", name = "Anti-Golfadas: Mon. Pressão de Fundo", group = "Anti-Golfadas",
	bases = {},
	description = [[
		Monitoração de pressão de fundo de acordo com a configuração de seleção.
	]],
	code = [===[
	]===],
	attributes = {
		{	id = "cfg_sel_prs", name = "Sel. de Pressão", type = "STRING", access = "g",
			description = [[
				Seleção de variável de processo que será considerada como pressão de fundo do poço.
				Essa configuração deve ser definida como:

				- 'pmon', a pressão à montente da choke;
				- 'pjus', a pressão à jusante da choke;
				- 'pdg', a pressão de fundo medida pelo PDG;
				- 'tpt', a pressão de fundo medida pelo TPT;
			]],
		},
		{	id = "bl_calc_prs_fundo", name = "Bl. Cálc. Pressão de Fundo", type = "bloco_calculo", access = "g",
			description = [[Configuração de bloco para valor de pressão usada para calcular de variação.]],
		},
		{	id = "ret_prs_fundo_calc", name = "Pressão Calculada", type = "REAL", access = "gs",
			description = [[Resultado calculado para pessão de fundo.]],
		},
		{	id = "cfg_reg_step", name = "Registrar Passos", type = "BOOLEAN", access = "g",
			description = [[
				Configuração que, quando verdadeira, inclui linhas para cada passo de
				monitoração no registro.
			]],
		},
		{	id = "t_intervalo_s", name = "Intervalo", type = "REAL", access = "g",
			description = [[Tempo em segundos que deve ser esperado entre passos do módulo.]],
		},
	},
	methods = {
	},
}

class{ id = "mod_antigolf_CAvDeltaPressao", name = "Anti-Golfadas: C. Av. de Variação de Pressão", group = "Anti-Golfadas",
	bases = {},
	description = [[
		Módulo de controle avançado anti-golfadas baseado em algoritmo
		de estabilização de dinâmica de poço com gas-lift com ponto de operação livre.

		Esse módulo usa o algoritmo proposto pela UFSC [1] para determinar uma variação na
		posição da válvula choke do poço em função da variações de pressão e uma posição alvo
		para a válvula.

		du(k) = gama_0*dp(k) + gama_1*dp(k-1) + beta*(sp_u-u(k-1))

		* Onde du(k) é a variação calculada ppara a válvula no instante k:
		* sp_u é a 'Posição Alvo' pela operação;
		* dp(k) é a variação de pressão desde o instante k-1
			* dp(k) = p(k) – p(k-1)    -> que deve tender a zero
		* a posição atual é calculada a partir da característica da válvula
			* gama_0 - Fator dp atual
			* gama_1 - Fator dp anterior
			* beta - Fator de erro (realimentação)


		[1] Plucenio, A., Ganzaroli, C. A., & Pagano, D. J. (2012).
		Stabilizing gas-lift well dynamics with free operating point.
		IFAC Proceedings Volumes, 45(8), 95-100.
	]],
	code = [===[
	]===],
	attributes = {
		{	id = "ind_pos_alvo_choke", name = "Pos. Alvo de Choke", type = "REAL_POINT", access = "rw",
			description = [[Indicação a posição alvo para a choke.]],
		},
		{	id = "cfg_margem_pos_alvo", name = "Margem para Pos. Alvo", type = "REAL", access = "g",
			description = [[
				Margem que deve ser mantida entre posição alvo e limites para garantir
				grau de liberdade mínimo para realização de controle.

				Se esse valor for maior que metade da faixa de operação (entre posição mínima e posição máxima),
				a posição alvo será o metade da faixa.
			]],
		},
		{	id = "cfg_modo_rastreio", name = "Modo de Rastreio", type = "STRING", access = "g",
			description = [[
				Seleção de modo de rastreio de posição alvo na inicialização e quando o controle estiver
				desabilitado.
				Se não houver um rastreio configurado a posição alvo será mantida.
				Essa configuração deve ser definida como:

				- 'min', a posição alvo irá rastrear a posição mínima;
				- 'max', a posição alvo irá rastrear a posição máxima;
				- 'pos', a posição alvo irá rastrear a posição atual.
				- 'cmd', a posição alvo irá rastrear o comando atual.
			]],
		},
		{	id = "cfg_fator_dp_atual", name = "Fator de Delta P. Atual", type = "REAL", access = "g",
			description = [[
				Configuração de fator proporcial da variação de pressão atual
				no cálculo de variação de posição da choke.
			]],
		},
		{	id = "cfg_fator_dp_anterior", name = "Fator de Delta P. Ant.", type = "REAL", access = "g",
			description = [[
				Configuração de fator proporcial da variação de pressão anterior
				no cálculo de variação de posição da choke.
			]],
		},
		{	id = "cfg_fator_erro", name = "Fator de Erro", type = "REAL", access = "g",
			description = [[
				Configuração de fator proporcial do erro para realimentação da posição alvo
				no cálculo de variação de posição da choke.
			]],
		},
		{	id = "cfg_dp_tol", name = "Variação Prs. Tolerada", type = "REAL", access = "g",
			description = [[
				Configuração de tolerância para considerar que não existe um variação de pressão
				no passo atual.
			]],
		},
		{	id = "cfg_erro_tol", name = "Erro Tolerado", type = "REAL", access = "g",
			description = [[
				Configuração de tolerância para considerar que não existe um erro entre a posição alvo
				e a posição atual.
			]],
		},
		{	id = "t_intervalo_s", name = "Intervalo", type = "REAL", access = "g",
			description = [[Tempo em segundos que deve ser esperado entre passos do módulo.]],
		},
	},
	methods = {
	},
}

class{ id = "mod_antigolf_monOscPrsFundo", name = "Anti-Golfadas: Mon. Osc. Pressão de Fundo ", group = "Anti-Golfadas",
	bases = {},
	description = [[
		Monitoração de Oscilação Anti-Golfadas.

		Esse módulo realiza amostragens na pressão de fundo monitorada para determinar aumento no desvio
		padrão local cuja média será usada para calcular a amplitude de oscilação.
	]],
	code = [===[
	]===],
	attributes = {
		{ id = "b_media_p", name = "Média de Pressão", type = "bloco_media", access = "g",
			description = [[Configuração de bloco para cálculo de valor médio, desvio padrão, máximo e mínimo de amostras de pressão.]],
		},
		{ id = "b_media_std_p",	name = "Méd. de Desv. Padrão de P.", type = "bloco_media", access = "g",
			description = [[Configuração de bloco média para cálculo de valor médio de desvio padrão local da pressão controlada.]],
		},
		{ id = "tmr_atualizacao",	name = "Timer Atualização", type = "timer", access = "g",
			description = [[Temporizador de atualização de diagnóstico de oscilação.]],
		},
		{ id = "calc_amp_osc",	name = "Amp. de Osc. Calculada", type = "REAL", access = "gs",
			description = [[
				Indica o último valor de amplitude de oscilação calculada.

				A amplitude de oscilação é calculada de acordo com cada implementação da interface.
			]],
		},
		{	id = "cfg_intervalo_passos", name = "Intervalo entre Passos", type = "REAL", access = "g",
			description = [[Tempo que deve ser esperado entre passos do módulo.]],
		},
	},
	methods = {
		{ id = "reset", name = "Iniciar",
			description = [[Prepara as estruturas do diagnóstico para uma avaliação.]],
			parameters = {
			},
			results = {
			},
			code = [===[ function(self)
				self.b_media_p:apagar()
				self.b_media_std_p:apagar()
				self.tmr_atualizacao:iniciar()

				self.calc_amp_osc = -1
			end ]===],
		},
	},
}

class{ id = "mod_antigolf_OtmPosAlvoChoke", name = "Anti-Golfadas: Otm. Pos. Alvo da Choke", group = "Anti-Golfadas",
	bases = {},
	description = [[
		Modelagem de Otimização de posição alvo para controle avançado anti-golfadas.

		Esse módulo determina variações na posição alvo da válvula choke do poço de acordo com a amplitude
		de oscilação avaliado para a pressão controlada.
	]],
	code = [===[
	]===],
	attributes = {
		{	id = "chave_hab", name = "Chave Hab. Otim.", type = "chave", access = "g",
			description = [[Chave que indica que a a Otimização de Posição Alvo está habilitada.]],
		},
		{	id = "fuzzy_otm", name = "Fuzzy Otimização", type = "fuzzy", access = "g",
			description = [[Configuração de Controlador Fuzzy para posição alvo em função de grau de oscilação.]],
		},
		{	id = "ret_otm", name = "Retorno de Otimização", type = "REAL", access = "gs",
			description = [[Último valor calculado ou identificado para Alvo de Posição.]],
		},
		{	id = "t_intervalo_s", name = "Intervalo", type = "REAL", access = "g",
			description = [[Tempo em segundos que deve ser esperado entre passos do módulo.]],
		},
	},
	methods = {
	},
}

class{ id = "mod_antigolf", name = "Módulo Anti-Golfadas", group = "Anti-Golfadas",
	bases = {},
	description = [[
		Modelagem de atuação de módulo anti-golfadas.

		Esse módulo agrega é usado pelos os sub-módulos para avaliar e coordenar a atuação
		na válvula choke do poço pra evitar golfadas e manter um posição alvo.
	]],
	code = [===[
	]===],
	attributes = {
		{	id = "chave_hab", name = "Chave Habilitação", type = "chave", access = "g",
			description = [[Chave que indica que a atuação do módulo está habilitada.]],
		},
		{	id = "e_poco", name = "Poço", type = "poco", access = "g",
			description = [[Equipamento poço protegido pelo módulo.]],
		},
		{	id = "e_valv_act", name = "Válvula de Atuação", type = "valvula", access = "g",
			description = [[
				Válvula para atuação no poço.

				Se o MPA escrever diretamente na válvula do poço, não há necessidade de configurar
				esse atributo.
			]],
		},
		-- sub-módulos
		{	id = "m_act_choke", name = "Atuação na Choke", type = "mod_antigolf_actChoke", access = "g",
			description = [[Módulo de atuação na choke.]],
		},
		{	id = "m_prot", name = "Proteção", type = "mod_antigolf_ProtPrsTopo", access = "g",
			description = [[Módulo de proteção anti-golfadas.]],
		},
		{	id = "m_cav_dp", name = "C. Av. de Variação de Pressão", type = "mod_antigolf_CAvDeltaPressao", access = "g",
			description = [[Módulo de conrole avançado de variação de pressão anti-golfadas.]],
		},
		{	id = "m_otm_pos_alvo_choke", name = "Otm. Posição Alvo", type = "mod_antigolf_OtmPosAlvoChoke", access = "g",
			description = [[Módulo de Otimização da Posição Alvo do Controle Avançado.]],
		},
		-- motiorações
		{	id = "m_mon_prs_topo", name = "Mon. Pressão de Topo", type = "mod_antigolf_monPrsTopo", access = "g",
			description = [[Módulo de monitoração de pressão de topo.]],
		},
		{	id = "m_mon_prs_fundo", name = "Mon. Pressão de Fundo", type = "mod_antigolf_monPrsFundo", access = "g",
			description = [[Módulo de monitoração de pressão de fundo.]],
		},
		{	id = "m_mon_osc_prs_fundo", name = "Mon. Osc. Pressão de Fundo", type = "mod_antigolf_monOscPrsFundo", access = "g",
			description = [[Configuração de monitoração de oscilação de pressão de fundo.]],
		},
	},
	methods = {
		{ id = "get_act_valv", name = "Obter Válvula Atuação",
			description = [[
				Avalia a configuração do módulo para determinar a válvula que deve ser usada
				para atuação.
			]],
			parameters = {
			},
			results = {
				{	name = "Válvula Atuação", type = "valvula"}
			},
			code = [===[ function(self)
				local valv_act = self.e_valv_act

				if valv_act == nil then
					local poco = getattribute(self, 'e_poco')
					valv_act = getattribute(poco, 'valvula_choke')
				end

				return valv_act
			end ]===],
		},
	},
}