DESARROLLO E iMPLEMENTAdÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Resultados
En la tabla 5.50 se muestran los resultados delexperimento 21: nitrógeno no eliminado yporcentajes de eliminación en diferentes unidades.
Suma integrada de nitrógeno en la salida (g/d)N-NH4
+ 1.188N-NCV 0.255N-N02- 0.285N total 1.728
Eliminación de nitrógenoEliminación de N (g/d)
% eliminación de N% N-NH4
+ del N total salida% N-NCV del N total salida% N-NO2" del N total salidamg N eliminado / g SSV d
mg N-NH4+ salida / g SSV d
mgN-NCVsalida/gSSVdmgN-NO/salida/gSSVd
11.29486.768.714.816.5
26.012.740.590.66
Tabla 5.50. Resultados experimento 21
Comentarios
Variables "in-line"
Caudales de recirculación. La relación derecirculación externa utilizada es 0.5 encondiciones normales y 1 en condiciones de altacarga. En la relación de recirculación interna seobservan unos valores de 1,2 y 4, aunque aparecemayoritariamente este último.
Temperatura. Se obtienen valores de 19.5 a 23 °C.pH. Hay variación de pH en el reactor 3 debido al
problema con el electrodo. En el reactor 2aparecen valores en el margen entre 7.25 y 8.00.En el primer reactor, se observan las variacionesprovocadas por el cambio de condiciones óxicas.Aparecen incrementos de pH relacionados conlas condiciones aeróbicas, y disminuciones depH por las condiciones anóxicas. En este reactorse obtienen valores entre 7.10 y 7.90. Lasperturbaciones en el pH producidas por elcambio de condiciones en el primer reactorpueden observarse también en los reactores 2 y3, aunque bastante reducidas.
Redox. En el reactor 1 existen oscilaciones entre O y-150 mV en condiciones óxicas alternantes,mientras que en condiciones anóxicas se obtienevalores alrededor de -200 mV. En el reactor 2puede observarse el comportamiento relacionadocon las diferentes consignas de oxígeno. Conconsignas de 3 mg/1 se obtiene valores de redoxalrededor de 100 mV. En condiciones anóxicasde 10:00 a 12:00 horas, baja a valores alrededorde O mV. Durante el último periodo con consignaO mg/1, el redox no baja porque todavía existeoxígeno presente en el medio.
Oxígeno. Se puede apreciar en general el adecuadocontrol, con cierta oscilación por lasestimaciones de OUR. En este caso se observa larelación entre las estrategias de control desecuencia anóxica/aeróbica del primer reactor yel aumento de recirculación unido al cambio deconsigna del oxígeno en el tercer reactor. Alaumentar la concentración de nitrógenoamoniacal en la salida, el sistema experto inicialas secuencias anóxicas/aeróbicas en el primerreactor. Esto se traduce en un aumento denitratos en el periodo aeróbico, unido a unamenor desnitrificación. Esto provoca un aumentode nitratos en la salida del sistema detectada porel analizador. El sistema experto comprueba queel valor de N-NOX en la salida del sistema esalto, por lo que aumenta la recirculación internaa una relación 4 y disminuye la consigna deoxígeno del tercer reactor a 1 mg/1. Cuandofinaliza el periodo aeróbico en el reactor 1, elsistema empieza a desnitrificar, por lo que pocodespués baja la concentración de N-NOX. Aldetectar medidas bajas, el sistema expertodevuelve las condiciones de recirculación yoxígeno en el reactor 3 a sus valores iniciales. Laaparición de otro ciclo óxico en el primer reactorhace repetir de nuevo el cambio de condiciones.
Aireación. Se observa un consumo de aire elevadoen el reactor 1 durante los periodos aeróbicos. Enel reactor 2 el consumo es bastante bajo, aunqueoscila bastante en función de las condiciones delreactor 1. En el 3 el consumo es más elevado queen anteriores experimentos, sobre todo encondiciones en que el reactor 2 la consigna deoxígeno es O mg/1.
Variables analíticas
NH4+ salida. Se obtienen valores máximos algo
elevados, 7.1 mg/1 sobre las 20:00 horas.NO3" salida. El máximo es reducido, 1.4 mg/1 a las
1:00 horas. Se observa la oscilación de lasmedidas provocada por los ciclos deanóxicos/aeróbicos del primer reactor.
NO2" salida. Los valores máximos (1.4 mg/1) sepresentan sobre las 17:30. También se observa elcomportamiento oscilante.
OUR. El consumo es elevado en el reactor 1,ligeramente bajo en el 2 y el 3. El máximo es0.023 mg O 2 /1 s y aparece sobre las 19:30 horasen el reactor 1.
Valoración global
La eliminación de nitrógeno es de 86.7 %, valorelevado. La eliminación por unidad de biomasa es de26.01 mg N / g SSV d, rendimiento de eliminaciónelevado. Las concentraciones de nitrógenoamoniacal a la salida son ligeramente altas, pero lasde N-NOX son reducidas, por lo que globalmente laeliminación es correcta.
248 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
EXPERIMENTO 22. Perturbación de caudal
Objetivos
En este experimento, se mantienen todas lasestrategias de control, pero se modifica la entrada ala planta. Se introducen dos caudales diferentesdurante dos períodos, pero la cantidad de nitrógenoadicionado mediante las bombas dosifícadoras semantiene constante. De este modo se producen dosperiodos de diferente caudal pero con igual carga.Los caudales y la dosificación se han calculado detal modo que el caudal total y el nitrógeno totalintroducido durante el experimento es igual al de losexperimentos anteriores.
Condiciones experimentales
En la tabla 5.51 se muestran las condicionesexperimentales de oxígeno, recirculación y entradatotal de la planta piloto.
Estado óxicoReactor
0123
EstadoAnaeróbico
AnóxicoAeróbicoAeróbico
Consigna ODOmg/1
0 mg/1 / 3 mg/10 mg/1 / 3 mg/11 mg/1 / 3 mg/1
RecirculaciónR. Interna Caudal RI / Caudal Entrada = 1 / 2 / 4R. Externa Caudal RE / Caudal Entrada = 0.5/1
Suma integrada de nitrógeno en la entrada (g/d)N-NH4
+ 7.264N-Norg 5.049N-NCV ' 0.709N total 13.022
Sólidos en suspensión (09:00 horas)Reactor
O123
SSV(mg/l)4450445045404520
Total sistema 418.3 gramosDSVI 275 mi
Tabla 5.51. Condiciones experimento 22
Incidencias de operación
Planta piloto
Parada por escape de agua 11:44 a 12:44 horas.
El control de oxígeno en los tres reactoresfunciona adecuadamente durante todo elexperimento. Se mantienen correctamente lasconsignas fijadas en cada reactor. Durante elexperimento se mantiene las condiciones decarga constantes, por lo que no se observanperiodos de baja carga donde el control deoxígeno no está tan optimizado.
No se disponen de medida de redox del reactor3, por mal funcionamiento del electrodo.
El control de pH funciona correctamente,excepto una pequeña perturbación sobre las13:00 horas provocada por un exceso de adiciónde bicarbonato.
Analizadores
No se disponen datos de nitrato, nitrito niamonio de 8:00 a 9:15 horas por recalibraciónde los analizadores.
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 249
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
1800
1600-
1400-
1000-
800 •
600
400-
200-
Q entradaQ Rec IniQ Rec Ext
2S.
26
25-
24 •
23-
22 -
21 •
20 •
19 •
18
T1T2T3
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
04:00 08:00
(a) Caudales de entrada, recirculación interna y recirculación externa
8.50
8.25-
8.00-
7.75-
Í. 7.50
7.25-
7.00-
6.75
6.50
- pH1...... pH2-- pH3
300
200 •
100 -
I °x| -100-
-200-
-300-
08:00 12:00 16:00 20:00 00:00 04:00
Tiempo (horas)
(c) Evolución del pH en los reactores 1, 2 y 3
08:00-400
08:00 12:00 16:00 20:00 00:00 04:00 08:00
Tiempo (horas)
(b) Temperatura en los reactores 1, 2 y 3
Redox 1Redox2
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
04:00 08:00
(d) Evolución del potencial redox en los reactores 1 y 2
20
18
16-
? 14 •
S 12-B
A
08:00
- mA1...... mA2-- mA3
16:00 20:00 00:00
Tiempo (horas)
04:000-^
08:00 08:00 12:00 16:00 20:00 00:00 04:00 08:00!
Tiempo (horas)i
(e) Actuación sobre las válvulas de aireación de los reactores 1, 2 y 3 (f) Evolución del oxigeno disuelto en los reactores 1, 2 y 3
Fig. 5.42. Evolución de los parámetros del proceso. Experimento 22
250 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁUSIS DE DIFERENTES ESTRATEGIAS DE CONTROL
14
12-
10 •
Í ,E. 8-
+
ï* 6 -
• N-NH,*
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
08:00
(g) Análisis del nitrógeno amoniacal "on-line" (CFA) de la salida
o
Z
08:00
N-N03' FIA
16:00 20:00 00:00
Tiempo (horas)
04:00 08:00
(h) Análisis de nitrato "on-line" (FIA) de la salida
2 •
• N-NO; FIA
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
04:00
(i) Análisis de nitrito "on-line" (FIA) de la salida
0.030
0.025 -
08:000.000
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
04:00 08:00
(j) Velocidad de consumo de oxígeno (OUR) en los reactores aeróbicos
25 ¡
20-
Í (É 1S"Z
10-
5 -
n -
oN-NH/ entrada
• N-NH/ análisis
o N-N,,,
600-
500-
oí 400-
8 300-
200-
100-
n -
DQO entrada
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
04:00 08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
04:00 08:00
(k) Evolución de diferentes formas de nitrógeno en la entrada (I) Evolución de la DQO de entrada de la planta
Fig. 5.42. Evolución de los parámetros del proceso. Experimento 22
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 251
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Resultados
En la tabla 5.52 se muestran los resultados delexperimento 22: nitrógeno no eliminado yporcentajes de eliminación en diferentes unidades.
Suma integrada de nitrógeno en la salida (g/d)N-NH4
+ 0.270N-NO3' 0.351N-NO2" 0.240N total 0.861
Eliminación de nitrógenoEliminación de N (g/d)
% eliminación de N% N-NH4
+ del N total salida% N-NCV del N total salida% N-NO2" del N total salidamg N eliminado / g SSV d
mgN-NH4+salida/gSSVd
mg N-NO3" salida / g SSV dmgN-NO2 'salida/gSSVd
12.16193.431.440.827.8
29.070.650.840.57
Tabla 5.52. Resultados experimento 22
Comentarios
Variables "in-line "
Caudales de recirculación. La relación derecirculación externa utilizada generalmente es0.5, pero en condiciones de alta carga se utilizauna relación de 1. En la relación de recirculacióninterna se observan diferentes periodos conrelación 1,2 y 4.
Temperatura. Se observan valores de 20 a 23.5 °C.pH. En el reactor se mantiene en torno a la consigna
con oscilaciones mayores que en anterioresexperimentos. Esto es debido a la utilización deuna solución de carbonato en vez de bicarbonato.En el reactor 2 aparecen valores en el margenentre 7.00 y 7.40. En el primer reactor, seobservan las variaciones provocadas por elcambio de condiciones óxicas. Se obtienenvalores de pH entre 6.75 y 7.40.
Redox. En el reactor 1 existen oscilaciones entre 25y -100 mV en condiciones óxicas alternantes,mientras que en condiciones anóxicas, lasmayoritarias, se obtiene valores alrededor de -150 mV. En el reactor 2 se observan valoresentre 50 y 125 mV, dependiendo de lasdiferentes consignas de oxígeno. Con consignas
de 3 mg/1 se obtiene valores de redox alrededor de125 mV. En condiciones anóxicas baja a valoresalrededor de 50 mV.
Oxígeno. Se puede apreciar en general el adecuadocontrol, con la oscilación provocada por lasestimaciones de OUR.
Aireación. Se observa un consumo de aire elevadoen el reactor 1 durante los periodos aeróbicos. Enlos reactores 2 y 3 el consumo es bastantereducido, incluso con condiciones aeróbicas de 3mg/1.
Variables analíticas
salida. Se obtienen valores máximos muypequeños, 2.45 mg/1 sobre las 13:00 horas. Laparada de la planta sobre las 1 1 :45 horas provocaque la concentración de salida no se incremente eincluso disminuya ligeramente. Cuando la plantase vuelve a encender, se recuperan los valores desalida esperados.
salida. El máximo es limitado, 2.2 mg/1 a las13:30 horas. Esta perturbación también estáproducida por la parada, durante la cual se hapodido incrementar la nitrificación ligeramente.
N02" salida. Los valores máximos (1.0 mg/1) sepresentan sobre las 8:00 horas. Se puedenobservar unas pequeñas oscilaciones asociadas ala secuencia anóxica/óxica del primer reactor.
OUR. El consumo no es demasiado elevado en elreactor 1 y existen pocos periodos aeróbicos.Tiene valores máximos de 0.024 mg O2 / 1 ssobre las 2:00 horas. En el reactor 2 se observaun consumo mayor durante el periodo con menorcaudal. En el reactor 3 se mantiene bastanteconstante y con valores reducidos.
Valoración global
La eliminación de nitrógeno es de 93.4 %, valor muyelevado. La eliminación por unidad de biomasa es de29.07 mg N / g SSV d, el mayor rendimiento deeliminación obtenido. Las concentraciones denitrógeno a la salida son muy reducidas. Teniendoen cuenta que la carga total es igual a la deanteriores experimentos, los resultados demuestranla importancia de la adecuada distribución durantetodo el periodo para obtener eliminaciones casitotales. Aunque disponer de un depósito dehomogeneización es posible para caudalesreducidos, no es una opción demasiado económicapara una planta de tratamiento de aguas residualesurbanas de tamaño medio.
252 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁUSIS DE DIFERENTES ESTRATEGIAS DE CONTROL
EXPERIMENTO 23. Baja carga
Objetivos
En este experimento, también se mantienen todas lasestrategias de control, pero se modifica la entrada ala planta. Se simula una condición de baja carga denitrógeno y de DQO. Se introducen dos caudalesdiferentes durante dos periodos, pero la cantidad denitrógeno adicionado mediante las bombasdosifícadoras se mantiene constante. De este modose producen dos periodos de diferente caudal perocon igual carga.
Condiciones experimentales
En la tabla 5.53 se muestran las condicionesexperimentales de oxígeno, recirculación y entradatotal de la planta piloto.
Estado óxicoReactor
0123
EstadoAnaeróbico
AnóxicoAeróbicoAeróbico
Consigna ODOmg/1
0 mg/1 / 3 mg/10 mg/1 / 3 mg/11 mg/1 / 3 mg/1
RecirculaciónR. Interna Caudal RI / Caudal Entrada = 1 / 2 / 4R. Externa Caudal RE / Caudal Entrada = 0.5/1
Suma integrada de nitrógeno en la entrada (g/d)N-NH4
+ 3.822N-Norg 2.656N-NO3- 0.562N total 7.040
Sólidos en suspensión (10:30 horas)Reactor
O123
SSV(mg/l)3640457047204790
Total sistema 427.0 gramosDSVI 300 mi
Tabla 5.53. Condiciones experimento 23
Incidencias de operación
Parada por escape de agua 18:06 a 18:07 horas.
El control de oxígeno en los tres reactoresfunciona adecuadamente durante todo elexperimento. Se mantienen correctamente lasconsignas fijadas en cada reactor, excepto algúnperiodo de muy baja carga en el reactor 3.
No se disponen de medida de redox del reactor3, por mal funcionamiento del electrodo.
El control de pH funciona correctamente,excepto una perturbación sobre las 18:00 horas.Se adiciona un exceso de carbonato, lo queafecta al pH de los tres reactores.
Analizadores
No se disponen datos de nitrato, nitrito ni amonio de9:45 a 11:00 horas por calibración de losanalizadores.
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 253
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
1600-
1400-
1200-
1000-
600-
400 •
n -
I
Q entrada• • • • • • • QRecInt
Q Rec Ext
26
25-
24 -
23 •
22 -
21 •
20 -
19 -
1808:00 16:00 20:00 00:00
Tiempo (horas)
04:00
(a) Caudales de entrada, recirculación interna y recirculación externa
08:00 12:00 16:00 20:00 00:00 04:00 08:00
Tiempo (horas)
(b) Temperatura en los reactores 1, 2 y 3
8.50
8.25-
8.00-
7.75-
Í. 7.50 •
7.25-
7.00 •
6.75-
6.50
pH1pH2pH3
300
200 -
100 -
0 -
-100-
-200 -
-300 -
-400
• Redox1Redox2
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
04:00 08:00 08:00 12:00 16:00 20:00 00:00
. Tiempo (horas)
04:00 08:00
(c) Evolución del pH en los reactores 1, 2 y 3 (d) Evolución del potencial redox en los reactores 1 y 2
Icsu
1
18 •
16-
14-
12 •
10-
8
6 -
í .
I•: •&í i
ÉKL J'l:.rv ¡Ife
1- ,1
- .4 íf;tflifií.íi^ll/ï'V·'ll*: !:
mA1mA2mA3
•% ^
MO^:-
" 'l'/(ll\to#^A^V/J^l''/V/! W i i" ' v08:00 12:00 16:00 20:00 00:00 04:00 08:00
Tiempo (horas)
(e) Actuación sobre las válvulas de aireación de los reactores 1, 2 y 3
08:00 12:00 16:00 20:00 00:00 04:00 08:00I
Tiempo (horas)
(f) Evolución del oxigeno disuelto en los reactores 1, 2 y 3
Fig. 5.43. Evolución de los parámetros del proceso. Experimento 23
254 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO, ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
14
12-
10-
3Z
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
• N-NH,*
04:00 08:00
(g) Análisis del nitrógeno amoniacal "on-line" (CFA) de la salida
7
6
Ç 5
i" A
ÍZ 3
2
1
08:00 12:00 16:00 20:00 00:00
Tiempo (horas)
• N-NOj" FIA
04:00 08:00
(h) Análisis de nitrato "on-line" (FIA) de la salida
4 -
3 -
2 -
• N-NCV FIA
08:00 12:00 16:00 20:00 00:00 04:00
Tiempo (horas)
(i) Análisis de nitrito "on-line" (FIA) de la salida
0.030
08:000.000
08:00 12:00 16:00 20:00 00:00 04:00 08:00
Tiempo (horas)
(j) Velocidad de consumo de oxígeno (OUR) en los reactores aeróbicos
30
25
20-
15-
10-
08:00 12:00
N-NH/ entrada
• N-NH/ análisis
o N-NO
16:00 20:00 00:00
Tiempo (horas)
700
600
500
O) 400 -
§ 300-
200-
100-
04:00 08:00
(k) Evolución de diferentes formas de nitrógeno en la entrada
08:00 12:00
• DQO entrada
16:00 20:00 00:00
Tiempo (horas)
04:00 08:00
(I) Evolución de la DQO de entrada de la planta
Fig. 5.43. Evolución de los parámetros del proceso. Experimento 23
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 255
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Resultados
En la tabla 5.54 se muestran los resultados delexperimento 23: nitrógeno no eliminado yporcentajes de eliminación en diferentes unidades.
Suma integrada de nitrógeno en la salida (g/d)N-NH4
+ 0.210N-NCV 0.397N-NO2" 0.144N total 0.751
Eliminación de nitrógenoEliminación de N (g/d)
% eliminación de N% N-NH4
+ del N total salida% N-NCV del N total salida% N-NCV del N total salidamg N eliminado / g SSV d
mgN-NH/salida/gSSVdmg N-NCV salida/g SSV dmgN-NO2'salida/gSSVd
6.28989.327.952.919.214.730.490.930.34
Tabla 5.54. Resultados experimento 23
Comentarios
Variables "in-line "
Caudales de recirculación. La relación derecirculación externa utilizada es 0.5, ya que nose detectan condiciones de alta carga. En larelación de recirculación interna se observandiferentes periodos con relación 2 y 4.
Temperatura. Se observan valores de 20.5 a 25 °C.pH. En el reactor se mantiene en torno a la consigna
con oscilaciones mayores que en anterioresexperimentos, por la utilización de carbonato. Enel reactor 2 aparecen valores en el margen entre7.00 y 7.60. En el primer reactor, se observanvalores de pH entre 6.80 y 7.50.
Redox. En el reactor 1 se observan valores entre 25y -300 mV, lo que refleja las diferentescondiciones óxicas en el reactor. En el reactor 2se observan valores entre -25 y 100 mV,dependiendo de las diferentes consignas deoxígeno. Con consignas de 3 mg/1 se obtiene
valores de redox alrededor de 100 mV, mientrasque en condiciones anóxicas se llegan a valoresnegativos.
Oxígeno. Las medidas son correctas, aunquegráficamente no aparecen muy claras porque haymuchos cambios de consigna desde el sistemaexperto. También se aprecian las oscilacionesprovocadas por la estimación de OUR.
Aireación. Se observa un consumo de aire muyreducido. Sólo aparece un consumo elevado enlos dos periodos en los que se airea el primerreactor.
Variables analíticas
4+ salida. Se obtienen valores máximos muypequeños, 1 .5 mg/1 sobre las 1 1 :30 horas.
NO3" salida. El máximo aparece al principio delexperimento, y es provocado por el amoniomirificado en el anterior experimento, que no seha eliminado por la falta de materia orgánica. Elmáximo es 2.2 mg/1 sobre las 8:00 horas.
NO2" salida. Los valores máximos (1.2 mg/1) sepresentan sobre las 9:30 horas. Tambiénprovienen del anterior experimento.
OUR. El consumo no es elevado en el reactor 1durante los pocos periodos aeróbicos. En elreactor 2 se observa un consumo en función de lacarga de entrada. Sobre las 10:00 horas comienzaa bajar al recibir una carga menor. Después de uncambio de anóxico a aeróbico, se incrementamucho, alcanzando valores máximos de 0.026mg O2 / 1 s sobre las 19:00 horas. En el reactor 3también se observan variaciones provocadas porlos cambios de condiciones de consigna deoxígeno.
Valoración global
La eliminación de nitrógeno es de 89.3 %, valorelevado. La eliminación por unidad de biomasa es de14.73 mg N / g SSV d, muy reducida porque la cargaes muy pequeña. Las concentraciones de nitrógeno ala salida también son mínimas. Este experimentodemuestra prácticamente que es posible obtenerbuenos resultados de eliminación utilizando losrecursos necesarios, sin desperdiciar energía deaireación o recirculación cuando la eliminacióndeseada no lo requiere.
256 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
EXPERIMENTO 24. Efecto del sedimentador
Objetivos
Para este experimento se repiten las condiciones deentrada y de control de los experimentos 19, 20 y 21.La diferencia se encuentra en el tamaño delsedimentador, ya que se prueba la respuesta delsistema con un nuevo sedimentador de volumen 25litros, en contraste con los 60 litros del anterior.
Condiciones experimentales
En la tabla 5.55 se muestran las condicionesexperimentales de oxígeno, recirculación y entradatotal de la planta piloto.
Estado óxicoReactor
0123
EstadoAnaeróbico
AnóxicoAeróbicoAeróbico
Consigna ODOmg/1
0 mg/1 / 3 mg/10 mg/1 / 3 mg/11 mg/1 / 3 mg/1
RecirculaciónR. Interna Caudal RI / Caudal Entrada = 1 / 2 / 4R. Externa Caudal RE / Caudal Entrada = 0.5/1
Suma integrada de nitrógeno en la entrada (g/d)N-NH/ 7.264N-Norg
N-NCVN total
5.0490.70913.022
Sólidos en suspensión (8:30 horas)Reactor
O123
SSV(mg/l)2670299030603110
Total sistema 280.5 gramosDSVI 410 mi
Tabla 5.55. Condiciones experimento 24
Incidencias de operación
Parada por alarma de funcionamiento de lasbombas de 14:05 a 14:07 horas.
La instalación del nuevo sedimentador provocaque la concentración de sólidos en la planta seamenor y más variable. Puede observarse comola concentración de sólidos en los reactores,sufre una disminución de 280 a 165 gramos deeste experimento al del día siguiente. Estavariabilidad está producida por el peorrendimiento de sedimentación, unida a la menorcapacidad de acumulación de lodos.
La baja concentración de microorganismo en losreactores, provoca que el consumo de oxígenosea muy reducido. Esto desfavorece al controlde oxígeno, que sólo es correcto para el primerreactor. En los reactores 2 y 3 el consumo deaire es mínimo, por lo que el oxígeno está casisiempre por encima de la consigna, incluso conlas válvulas de aireación cerradas.
El control de pH funciona correctamente.
Analizadores
No aparecen problemas con los analizadoresdurante el experimento.
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 257
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
"c"
1
1(0O
1600-
1400-
1200-
1000-
800-
600-
400-
n .
I : ; ''• Q entrada ::i i : : QRecInt j i
: • • • • ! : : Q Rec Ext ::
^ •— L_l_^ ; i..;!; ;;
r~n ^ i¡— u-, _^_^ pX , L IL
26
25 -
24 -
23 -
Ü 2 2 -
Ie 2o ¿
20 -
19-
18
T1T2T3
10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00
(a) Caudales de entrada, recirculación interna y recirculación externa
14:00 18:00 22:00 02:00 06:00 10:00
Tiempo (horas)
(b) Temperatura en los reactores 1, 2 y 3
8.25-
8.00-
7.75-
ï 7.50 -
7.25-
7.00 -
6.75-
10
pH1pH2pH3
^^A/vA/V/Wvf^^,;
:00 14:00 18:00 22:00 02:00 06:00 10
300
200-
100 -
-100 -
-200-
-300 -
100
- Redox 1...... Redox2-- Redox 3
Tiempo (horas)
(c) Evolución del pH en los reactores 1, 2 y 3
10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
Í
(d) Evolución del potencial redox en los reactores 1, 2 y 3
S 12- go>
O
10:00 14:00 18:00 22:00 02:00 06:00 10:00
Tiempo (horas)
(e) Actuación sobre las válvulas de aireación de los reactores 1, 2 y 3
10:00 14:00 18:00 22:00 02:00 06:00 10:00
Tiempo (horas)
(f) Evolución del oxígeno disuelto en los reactores 1, 2 y 3
Fig. 5.44. Evolución de los parámetros del proceso. Experimento 24
258 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
O
• N-NO,' FIA
10:00 14:00 18:00 22:00 02:00 06:00
Tiempo (horas)
10:00 10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
(g) Análisis del nitrógeno amoniacal "on-line" (CFA) de la salida (h) Análisis de nitrato "on-line" (FIA) de la salida
3 -
2
• N-NO; FIA
0.030
0.025 -
ÚT 0.020 -
oo, 0.015
.o 0.010 -
0.005 -
0.000
• OUR1
• OUR 2• OUR 3
10:00 14:00 18:00 22:00 02:00 06:00
Tiempo (horas)
10:00 10:00 14:00 18:00 22:00 02:00 06:00 10:00
Tiempo (horas)
(i) Análisis de nitrito "on-line" (FIA) de la salida (j) Velocidad de consumo de oxígeno (OUR) en los reactores aeróbicos
10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00 10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
(k) Evolución del nitrógeno amoniacal en la entrada (I) Evolución de la DQO de entrada de la planta
Fig. 5.44. Evolución de los parámetros del proceso. Experimento 24
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 259
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Resultados
En la tabla 5.56 se muestran los resultados delexperimento 24: nitrógeno no eliminado yporcentajes de eliminación en diferentes unidades.
Suma integrada de nitrógeno en la salida (g/d)N-NH4
+ 3.713N-NO3' 0.420N-NCY 0.290N total 4.423
Eliminación de nitrógenoEliminación de N (g/d)
% eliminación de N% N-NH4
+ del N total salida% N-N03- del N total salida% N-NO2' del N total salidamg N eliminado / g SSV d
mg N-NH4+ salida / g SSV d
mg N-NO3" salida / g SSV dmgN-NO2 'salida/gSSVd
8.59866.083.99.56.6
30.6513.241.501.03
Tabla 5.56. Resultados experimento 24
Comentarios
Variables "in-line "
Caudales de recirculación. Las relaciones internasutilizadas son 0.5 y 1. En la relación derecirculación interna se observan diferentesperiodos con relación 2 y 4.
Temperatura. Se observan valores de 20.5 a 23.5 °C.pH. En el reactor se mantiene en torno a la consigna
sin oscilaciones. En el reactor 2 aparecen valoresen un estrecho margen entre 7.00 y 7.25. En elprimer reactor, se observan valores de pH entre7.00 y 7.25, con oscilaciones por las diferentescondiciones aeróbicas.
Redox. En el reactor 1 se observan valores entre 50y -150 mV, con oscilaciones por el cambio de
condiciones. En el reactor 2 se observan valoresentre 50 y 150 mV. En el reactor 3 se midenvalores entre 100 y 150 mV.
Oxígeno. Las medidas son mayores que lasconsignas en los reactores 2 y 3, ya que elcontrol trabaja en la zona donde las válvulas nocierran totalmente. En el reactor 1 los valores sonmás aceptables.
Aireación. Se observa un consumo de aire muyreducido, incluso en los periodos en los que seairea el reactor 1.
Variables analíticas
NH4+ salida. Se obtienen valores máximos muy
elevados, 16.6 mg/1 sobre las 21:00 horas. Sontan elevados por la escasa nitrificación debido alos bajos sólidos en los reactores.
N03" salida. El máximo es 2.2 mg/1 sobre las 10:00horas. No son muy elevados porque lanitrificación es bastante baja.
N02' salida. Los valores máximos (1.2 mg/1) sepresentan sobre las 15:30 horas.
OUR. El consumo es muy reducido en los tresreactores. El máximo de 0.011 mg O2 / 1 s sealcanza sobre las 13:00 horas en el reactor 1. Enlos reactores 2 y 3 se mantiene valores sobre 0.05mg O2 / 1 s durante todo el periodo. Estosconsumos están producidos por la bajaconcentración de microorganismos en losreactores.
Valoración global
La eliminación de nitrógeno es de 66.0 %, valor muyreducido. La eliminación por unidad de biomasa esde 30.65 mg N / g SSV d, muy elevado porque laconcentración de microorganismos es escasa.También debe considerarse la alta concentración deamonio a la salida, que supera los límites legales. Enconclusión, puede admitirse que la nueva situaciónde la planta no favorece al porcentaje de eliminaciónde nitrógeno, aunque proporcionalmente losresultados sean buenos.
260 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VAUDACION EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
EXPERIMENTO 25. Validación del efecto delsedimentador
Objetivos
Este experimento es una repetición del anterior, conlas mismas condiciones de entrada y de control.
Condiciones experimentales
En la tabla 5.57 se muestran las condicionesexperimentales de oxígeno, recirculación y entradatotal dé la planta piloto.
Estado óxicoReactor
0123
EstadoAnaeróbico
AnóxicoAeróbicoAeróbico
Consigna ODOmg/1
0 mg/1 / 3 mg/10 mg/1 / 3 mg/11 mg/1 / 3 mg/1
RecirculaciónR. Interna Caudal RI / Caudal Entrada = 1 / 2 / 4R. Externa Caudal RE / Caudal Entrada = 0.5/1
Suma integrada de nitrógeno en la entrada (g/d)N-NH4
+ 7.264N-Norg 5.049N-NCV 0.709N total 13.022
Sólidos en suspensión (8:30 horas)Reactor
O123
SSV(mg/l)1790178017901750
Total sistema 165.1 gramosDSVI 365 mi
Tabla 5.57. Condiciones experimento 25
Incidencias de operación
• Parada por alarma de funcionamiento de lasbombas de 14:05 a 14:22 horas.
• La concentración de microorganismos en losreactores es bastante reducida y tiene uncomportamiento inestable.
• La baja concentración de microorganismo en losreactores, provoca que el consumo de oxígenosea muy reducido, lo que desfavorececontrol.
• El control de pH funciona correctamente.
Analizadores
No aparecen problemas con los analizadoresdurante el experimento.
su
VAUDACION EXPERIMENTAL EN PLANTA PILOTO 261
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
„
i
Cau
dal
1600-
1400-
1200 -
1000 -
800-
600-
400 -
200-
fl-IC
Q entrada; QRecInt
: - •• Q Rec Ext
: Í.... i ; - : • • • : !
i—1 — ' ' ' — ' — ' "" : • • : :
J ^ r ~*— i ^1—^-r~— r~~ L·~' — L~L, — ' — ' i T" ,—
:00 14:00 18:00 22:00 02:00 06:00 10
26
25
24
g 23
ira 22
&1 2 120
19
18
T1T2T3
10:00
Tiempo (horas)
(a) Caudales de entrada, recirculación interna y recirculación externa
14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10: O
(b) Temperatura en los reactores 1, 2 y 3
8.50
8.25-
8.00-
7.75
Í. 7.50 •
7.25 -
7.00-
6.75-
6.50
pH 1• • • • p H 2-— pH3
300
f
200 -
100-
-100-
-200 -
-300 -
-400
Redox 1Redox2Redox3
10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
(c) Evolución del pH en los reactores 1 , 2 y 3 (d) Evolución del potencial redox en los reactores 1 , 2 y 3
10:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
5 -
4 -
3 -
2 -
1 -
OD1OD2OD3
í Iv-v í II
f :
? N*$y•• • n*-' '
iiiifÀ VMSfe;
piI***'n :
Kífi 41I
lNl
k C-lLj/;:: \iJ 1 / '• *
! r ^"\
10:00 14:00 18:00 22:00 02:00 06:00 10:0
Tiempo (horas)
(e) Actuación sobre las válvulas de aireación de los reactores 1, 2 y 3 (f) Evolución del oxígeno disuelto en los reactores 1, 2 y 3
Fig. 5.45. Evolución de los parámetros del proceso. Experimento 25
262 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
(g) Análisis del nitrógeno amoniacal "on-line" (CFA) de la salida
2 -
• N-NO," FIA
10:00 14:00 18:00 22:00 02:00 06:00 10:00
Tiempo (horas)
(i) Análisis de nitrito "on-line" (FIA) de la salida
10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
(k) Evolución del nitrógeno amoniacal en la entrada
Fig. 5.45. Evolución de los parárr
Ir* Ao
. N-NCV FIA
10:00 14:00 18:00 22:00 02:00
Tiempo (horas)
06:00 10:00
(h) Análisis de nitrato "on-line" (FIA) de la salida
0.025 -
0.015 -
0.010 -
0.000
• OUR1• OUR 2• OUR 3
" *
10:00 14:00 18:00 22:00 02:00 06:00 10:00
Tiempo (horas)
Ü) Velocidad de consumo de oxígeno (OUR) en los reactores aeróbicos
10:00 14:00 18:00 22:00 02:00 06:00 10:00
Tiempo (horas)
(I) Evolución de la DQO de entrada de la planta
etros del proceso. Experimento 25
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 263
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Resultados
En la tabla 5.58 se muestran los resultados delexperimento 25: nitrógeno no eliminado yporcentajes de eliminación en diferentes unidades.
Suma integrada de nitrógeno en la salida (g/d)N-NH4
+ 2.915N-NO3' 0.331N-NO2' 0.182N total 3.428
Eliminación de nitrógenoEliminación de N (g/d)
% eliminación de N% N-NH4
+ del N total salida% N-NO3- del N total salida% N-NO2" del N total salidamg N eliminado / g SSV d
mg N-NH/ salida / g SSV dmg N-NCV salida / g SSV dmg N-NO2" salida / g SSV d
9.594273.785.09.75.3
58.1217.662.011.10
Tabla 5.58. Resultados experimento 25
Comentarios
Variables "in-line "
Caudales de recirculación. Las relaciones internasutilizadas son 0.5 y 1. En la relación derecirculación interna se observan diferentesperiodos con relación 2 y 4.
Temperatura. Se observan valores de 20.5 a 23.5 °C.pH. En el reactor se mantiene en torno a la consigna
sin oscilaciones. En el reactor 2 aparecen valoresen un margen entre 7.10 y 7.25. En el primerreactor, se observan valores de pH entre 7.00 y7.25, con oscilaciones por las diferentescondiciones aeróbicas.
Redox. En el reactor 1 se observan valores entre 50y -150 mV, con oscilaciones por el cambio decondiciones. En el reactor 2 se observan valoresalrededor de 100 mV. En el reactor 3 se registran
valores alrededor de 150 mV.Oxígeno. Se mantiene por encima de la consigna en
los reactores 2 y 3 durante algunos periodos debaja carga. En el reactor 1 se mantienecorrectamente.
Aireación. Se observa un consumo de aire muyreducido, aunque ligeramente superior al delanterior experimento. El consumo en el primerreactor también es superior al anterior.
Variables analíticas
NH4+ salida. Se obtienen valores máximos muy
elevados, 14.4 mg/1 sobre las 21:00 horas. Sontan elevados por la escasa nitrificación.
NO3" salida. El máximo es 1.7 mg/1 sobre las 8:00horas
NCV salida. Los valores máximos (0.8 mg/1) sepresentan sobre las 12:00 horas.
OUR. El consumo es muy reducido en los tresreactores, aunque ligeramente superior al delanterior experimento. El máximo de 0.015 mg O2
/ 1 s se alcanza sobre las 20:30 horas en el reactor1. En los reactores 2 y 3 se mantiene valoressobre 0.05 mg O2 /1 s durante todo el periodo.
Valoración global
La eliminación de nitrógeno es de 73.7 %, valorreducido pero mejor al anterior. La eliminación porunidad de biomasa es de 58.12 mg N / g SSV d,demasiado elevado y, por tanto, algo sospechosa. Laconcentración de microorganismos varía a lo largodel experimento, debido al mal funcionamiento delsedimentador. Una posible explicación es laacumulación de biomasa en el sedimentador paracaudales bajos de recirculación externa(correspondientes al inicio del experimento) y suposterior recirculación al aumentar la recirculaciónexterna cuando se detecta el aumento de carga en elsistema. También es posible que el nitrógenoorgánico, que normalmente desaparece porcompleto, no se haya hidrolizado totalmente, lo queno estaríamos considerando cuando calculamos elrendimiento.
264 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
5.2.7 ANÁLISIS DE RESULTADOS
En primer lugar se representan los resultados deeliminación de nitrógeno obtenidos para losexperimentos 1 a 23, realizados con la planta pilotoen las mismas condiciones. Los experimentos 24 y25 son los efectuados con el nuevo sedimentador demenor volumen y se desvían mucho delcomportamiento de los anteriores, por lo que sontratados aparte.
La figura 5.46 muestra los resultados de porcentajede eliminación en los experimentos 1 a 23. Estosvalores permiten la comparación entre losexperimentos, pero no se está considerando lasdiferentes concentraciones de sólidos en losreactores. Esta es una variación importante, que sedebe tener en cuenta para obtener resultadoscoherentes.
En la figura 5.47 se muestran los valores analizadosde sólidos volátiles en los reactores, utilizados para
c•o° R«;cE
^ nI
li
-
'<
r-l
*
-i ',
-
1
r-l
s
i-| r-j
'
|-,
-
"
_- -
p.
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
calcular la eliminación de nitrógeno por unidad debiomasa. En la representación de estos datos no hayuna evolución de los sólidos en el tiempo, sino quesólo es indicativo de la variación entre cadaexperimento. Durante el periodo experimental con elsedimentador inicial, se obtienen valores entre 400 y650 gramos de biomasa, pero después del cambio desedimentador (experimentos 24 y 25) la biomasadisminuye en gran medida, provocado por la menorcapacidad de separación del nuevo sedimentador.
En la figura 5.48 se representa la eliminación denitrógeno en miligramos por gramo de SSV en losreactores y día. Este parámetro sí permite lacomparación entre experimentos con diferentescondiciones de sólidos en los reactores.
Por último, se representa en la figura 5.49 los mg denitrógeno en forma de amonio, nitrato o nitrito queaparece en la salida por gramo de SSV y día. Conestos parámetros se obtiene un valor comparativo,entre experimentos con diferente concentración demicroorganismos, de la fracción de cada especie delnitrógeno que no se elimina.
'Yfxí l , l l , l l ,
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3
Experimento
Fig.5.46. Porcentaje de eliminación de nitrógeno
O 5 10 15
Experimento
Fig.5.47. Sólidos volátiles totales en el sistema
30
25
ç/ÍAJ ^Lh- I M ij M l;i M i;i 171 i-i i J i,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 192021 2223
Experimento
Fig.5.48. mg N eliminados / g SSV d
/
•s•z.OÍ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
Experimento
Fig.5.49. mg N en el efluente / g SSV d
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 265
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
5.2.7.1 EFECTO DE LA RELACIÓN DERECIRCULACIÓN EXTERNA
En los experimentos 1 y 2 se estudia la respuesta dela planta piloto a la entrada variable en composicióny caudal, comparando la eliminación obtenidautilizando una recirculación extema de caudalconstante Q = 150 ml / min (experimento 1) con laobtenida a una relación de recirculación constanteQRE/QE = 0-5 (experimento 2). El mantenimiento dela relación de recirculación constante debe permitirla recirculación de lodos adecuada para tratar elcaudal de entrada de la planta, lo que favorece elmantenimiento de una adecuada relaciónalimento/microorganismos.
LU
g?
80 -
?n/
r í" '
*- U!
yw-H [
Experimento
Fig. 5.50. Porcentaje de eliminación de nitrógeno
En el primer experimento se observa que, a pesar deser las condiciones con menor control, laeliminación de nitrógeno es cercana al 78 % (figura5.50). Si la entrada fuera constante la eliminaciónhubiera sido superior, pero el aumento de caudal yconcentración del perfil de entrada, provoca que elsistema no sea capaz de transformar todo elnitrógeno de entrada durante el periodo de máxima
carga. Vista en porcentaje, la eliminación essatisfactoria, pero como concentración de nitrógenoa la salida, la eliminación no es adecuada, ya que seobtienen niveles mayores de 12mg/l, lo que nocumple los límites legislados.
I01z
22 -
20-
19 -
18 •
16-
i>í/
' 7 i
^j i:
1 2
Experimento
Fig. 5.51. mg N eliminados / g SSV d
TJ
tn
Experimento
Fig. 5.52. mg N en el efluente / g SSV d
ExperimentoEstado óxico (consigna mg Oa /1)
Reactor 1 Reactor 2 Reactor 3Relación de recirculación
Externa Interna
1 Anóxico
2 Anóxico
Aeróbico 3
Aeróbico 3
Aeróbico 3
Aeróbico 3
Q=150(ml/min)
0.5
22
Experi ssv ,mento
1 445.22 454.3
N-NH4%(g)
2.1861.532
N-NCVs
(g)
0.5030.410
N-NCVs(g)
0.2040.307
N o/
TOTAL s e]¡mjna Elimina
do (g) ción
2.893 10.129 77.782.249 10.773 82.73
%N-NH4%
75.5768.12
%N-NCVS
17.3918.21
%N-N02-S
7.0413.67
mg N /gSSV d
22.7523.71
N-NH4+
S
4.913.37
mgN-N03-S
/g SSV d
1.130.90
mgN-N02-S
/ jg SSV d
0.460.68
266
Tabla 5.59. Condiciones experimentales y resultados de los experimentos 1 y 2
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS oe. DIFERENTES ESTRATEGIAS DE CONTROL
En el segundo experimento se introduce la estrategiade control de la relación de recirculación constante,lo que supone una ligera mejora en la eliminación denitrógeno, que se acerca en este caso al 83 %.También se presenta una mejora en los niveles devertido, que disminuyen a 10 mg/1 de nitrógenoamoniacal.
Si se calcula la mejora de eliminación en ñmción delos mg N eliminados por gramo SSV y día (figura5.51), se obtiene una mejora del 4.2 %.
El nitrógeno a la salida, calculado en forma de mgde N que quedan por unidad de biomasa y día(figura 5.52), disminuye en torno al 24 %. Lacomposición del nitrógeno de salida también varía,aumentando el nitrito en detrimento del amonio, loque significa que la nitrificación se ve ligeramentemejorada.
5.2.7.2 EFECTO DE LOS CICLOS ANÓXICOS- AERÓBICOS EN EL REACTOR 1
En los experimentos 3, 4, 5, 6 y 7 se estudia larespuesta del sistema a un cambio cíclico decondiciones aeróbicas y anóxicas en el reactor 1,para comprobar si se puede aprovechar su exceso decapacidad desnitrificadora para nitrificar. En losexperimentos se utiliza diferente relación de tiempoanóxico/aeróbico y diferente duración del ciclo total.En todos ellos se mantiene una consigna de oxígenoen los reactores 2 y 3 de 3 mg/1, una relación derecirculación interna de 2 y una relación derecirculación externa de 0.5.
En la figura 5.53 se representa para estosexperimentos el porcentaje de eliminación de
nitrógeno. En las figuras 5.54 y 5.55 se representa elnitrógeno eliminado y el nitrógeno en el efluente,calculados por unidad de biomasa en el sistema.
1 76LLI
SS 7"
4 5 6
Experimento
Fig. 5.53. Porcentaje de eliminación de nitrógeno
M 21 .01
0 ¿¿
13c oi ,:i(D ->n
z 2(H
O)
n/
/
f
'í;> *•w·"<»! *"
1 "V Ï i
' "5 ,V 1
f**, , '
' -7?;
í ?*< '
V '"v ' 5
f
. ' 'f
'\^
ï-
*j
'•', :
• * '
Kr »:•
Xx
4 5 6
Experimento
Fig. 5.54. mg N eliminados / g SSV d
Experimento
34567
Estado óxicoeactor 1 R
(consigna neactor 2
Anóxico Aeróbico 320'aer-40'anox Aeróbico 330'aer-30'anox Aeróbico 330'aer-60'anox Aeróbico 31 0'aer-20'anox Aeróbico 3
EXpetrÍ SSVT(g)mento °
3 405.74 450.95 502.66 457.07 433.1
N-NH/s(g)
1.7271.1870.6840.8371.261
N-N03-S
(g)
0.7110.5991.1720.9660.998
N-NOjs(g)
0.3860.4960.6340.4680.478
N TOTAL S
(g)
2.8242.2822.4902.2712.737
Neliminado (g)
10.19910.74110.53210.75110.285
g0 2 / l )Reactor 3
Relación de recirculaciónExterna Interna
Aeróbico 3Aeróbico 3Aeróbico 3Aeróbico 3Aeróbico 3
0.50.50.50.50.5
22222
Eliminación
78.3282.4880.8882.5678.98
N-NH/s
61.1752.0327.4536.8746.07
N-N03S
25.1626.2447.0742.5236.46
N-NOis
13.6721.7325.4820.6117.48
mg N /gSSV d
25.1423.8220.9623.5323.75
mgN-NH/s/ g SSV d
4.262.631.361.832.91
mgN-NOjs
g SSV d
1.751.332.332.112.30
mgN-NO2S
g SSV d
0.951.101.261.021.10
Tabla 5.60. Condiciones experimentales y resultados de los experimentos 3 a 7
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 267
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Fig. 5.55. mg N en el efluente / g SS V d
El experimento 3 es una repetición de lascondiciones del número 2, pero se realiza para teneruna referencia actualizada para el resto deexperimentos de la serie. En él se observa unaeliminación de nitrógeno del 78.3 %, pero teniendoen cuenta la biomasa del sistema, la eliminaciónsube a 25.1 mg N/ g SSV d. El nivel de vertidomáximo de amonio se mantiene sobre los 10 mg/1.
En el número 4 la eliminación de nitrógeno es del82.5 %, y, considerando eliminación por unidad debiomasa, es de 23.8 mg N/ g SSV d. Es unaeliminación inferior, pero debe considerarse que labiomasa medida en el experimento 3 era inferior a lanormal, por lo que puede producir resultadosdiferentes. Se observa una mejora en los niveles devertido por unidad de biomasa, además de variar sucomposición, ya que la presencia de amonio en lasalida es un 10% inferior. También se observa unadisminución a 8 mg/1 de la concentración máxima deamonio en el efluente. Los resultados de esteexperimento deben considerarse cuidadosamente, yaque durante las últimas horas la planta estuvoparada, y las concentraciones utilizadas durante eseperiodo fueron estimadas siguiendo las tendenciasde otros experimentos.
En el número 5, la eliminación de nitrógeno baja al80.9 %. Considerando eliminación por unidad debiomasa es de 21 mg N/ g SSV d, valor inferior alanterior. Si se observa la composición del nitrógenoen el efluente, se aprecia la disminución del amonio,pero también el aumento del nitrato y del nitrito. Enlas condiciones de este experimento, la nitrifícaciónmejora mucho, pero en detrimento de ladesnitrificación. Como balance global, elrendimiento no es tan satisfactorio. Existe otro factorque también afecta negativamente a la valoración deeste experimento, los problemas de "rising" en elsedimentador. La pobre desnitrificación, debida alexcesivo porcentaje de condiciones aeróbicas en elreactor 1, provoca altos niveles de nitrato en lasalida, lo que induce procesos de desnitrificación en
el sedimentador secundario, con la consiguientepérdida de lodos en el efluente. Este problemadesaconseja la utilización de esta duración de ciclos,por lo que en experimentos posteriores se utiliza unarelación de condiciones anóxicas y aeróbicas 2 a 1.
En el experimento 6 la eliminación de nitrógenoaumenta al 82.6 %, la máxima de esta serie deexperimentos. Considerando eliminación por unidadde biomasa es de 23.5 mg N/ g SSV d, valor superioral anterior. Con esta secuencia, la nitrifícaciónmejora, sin que afecte tanto a la desnitrificación, porlo que el balance global es mejor al anterior. En lafigura 5.55, puede observarse como el nitrógenototal de salida por unidad de biomasa es casi igual aldel número 5, pero la composición varía. En el n° 6el porcentaje de amonio es mayor, porque lanitrifícación no está tan favorecida, pero esto tieneefectos positivos, porque la desnitrificación se vemejorada. Si se compara al experimento 4, se puedeobservar que la eliminación por unidad de biomasatiene un valor muy parecido, y que el nitrógeno totalen el efluente es también muy similar. La diferenciaentre los dos experimentos es la diferente fracciónde cada una de las especies. Puede observarse comoen el n° 6 aparecen 0.8 mg/1 menos de nitrógenoamoniacal, transformados en nitrato. Los niveles denitrato en este experimento no produjeron losproblemas de "rising" que aparecieron en el n° 5, porlo que las condiciones utilizadas parecen las másfavorables de las estudiadas.
Por último, en el experimento 7 la eliminación denitrógeno es del 79.0 %. Considerando eliminaciónpor unidad de biomasa es de 23.75 mg N / g SSV d.Los niveles de nitrógeno en el efluente son losmayores obtenidos aplicando los ciclos de aireación.La duración de los ciclos aeróbicos, 10 minutos, noproporciona tiempo suficiente para que losmicroorganismos mirificantes se adapten a lasnuevas condiciones, pero si tiene un efectoinhibitorio de la desnitrificación, por lo que losresultados no se ven excesivamente mejoradosrespecto al experimento de referencia 3.
En resumen global de esta serie de experimentos, sepuede observar como la secuencia más positiva delas probadas es la que utiliza un ciclo aeróbico de 30minutos seguido de uno anóxico de 60 minutos,correspondiente al experimento 6. Con ella seobtiene una eliminación del 82.6 %, consumiendo25.6 mg N/ g SSV d, y vertiendo alrededor de 5 mgN / g SSV d con una composición del 37 % denitrógeno amoniacal.
Al aplicar esta estrategia de operación, se observacomo aparecen algunos problemas que deben serevitados al implementaria como estrategia decontrol. En primer lugar, debe prevenirse laaparición de cantidades de nitrato excesivas en el
268 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
efluente, lo que produce problemas de "rising" en elsedimentador, y en consecuencia, pérdidas desólidos e incumplimiento de la legislación en estesentido.
Otro problema es la poca rentabilidad económica demantener los ciclos de aireación las 24 horas. Enhorario de baja carga, es suficiente la configuraciónnormal para tratar la carga introducida, por lo que seestá malgastando energía innecesariamente.
La aireación del primer reactor también provoca unadisminución del consumo de oxígeno en losreactores 2 y 3, lo que produce un funcionamientoincorrecto de su control de oxígeno, aunque éste esun problema resoluble con una mejora del sistemade aireación.
Considerando los hechos anteriores y los resultadosexperimentales, se propone la utilización de estaestrategia de operación, con ciclos de 30 minutosaeróbico y 60 anóxico, cuando aparezcancondiciones de alta carga en el influente.
Variación de pH y redox
Para este conjunto de experimentos se puedeestudiar la diferente respuesta del potencial redox ydel pH durante los ciclos aeróbicos / anóxicos. En lafigura 5.56 se representan los valores que toma elpotencial redox para el periodo de 12:00 a 15:00horas para los 5 experimentos.
100
En la figura puede observarse la disminución delpotencial redox desde que empieza un periodoanóxico. Esta disminución tiene una pendienteinicial aproximadamente igual en los cuatroexperimentos cíclicos. La disminución esinicialmente muy rápida, pero la velocidad devariación va disminuyendo progresivamente. Puedeobservarse que se requiere un tiempo elevado paraalcanzar las condiciones correspondientes a unsistema anóxico como en el experimento sinaireación cíclica. La duración del periodo anóxico enlos experimentos cíclicos es la variable clave paraobtener condiciones anóxicas, con potencial redoxbajo, lo que corresponde a un sistema desnitrificantefuncionando adecuadamente. En este sentido, losexperimentos más adecuados son el n° 4 y el n° 6,correspondientes a secuencias 20'ae-40'an y 30'ae-60'an. En el experimento 5 (30'ae-30'an) se observaque el redox no baja de -75 mV, por lo que no seestá eliminado el nitrato acumulado en el proceso denitrificación. Esto también ocurre en el experimento7, a pesar que la relación anóxico/aeróbico es 2 a 1,el sistema no tiene tiempo suficiente para eliminar eloxígeno aportado en el periodo aeróbico y consumirel nitrato producido, lo que se refleja finalmente enlos resultados de eliminación de nitrógeno.
En la figura 5.57 se representa la variación de redox,pH y oxígeno disuelto durante dos horas para loscuatro experimentos cíclicos.
-30012:00 13:00
Anóxico• Aeróbico 20' - Anóxico 40'• Aeróbico 30' - Anóxico 30'• Aeróbico 30' - Anóxico 60'
Aeróbico 10' -Anóxico 20'
Fig.5.56. Variacióndel potencial redoxpara diferentesciclos de aireación
14:00 15:00
Tiempo (horas)
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 269
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
20' aeróbico - 40' anóxico- 10
-61,
10:00 10:20 10:40 11:00 11:20
Tiempo (horas)
30' aeróbico - 60' anóxico
10:20 10:40 11:00 11:20
Tiempo (horas)
12:00
0:00 10:20 10:40 11:00 11:20
Tiempo (horas)
10' aeróbico - 20' anóxico
6
10:40 11:00 11:20
Tiempo (horas)
Fig. 5.57. Variación de pH, redox y oxígeno disuelto durante los ciclos de aireación
En la figura 5.57 puede observarse la relación entrelas medidas de redox y pH con el oxígeno disueltopresente en el reactor en el diferente periodo delciclo. El cambio de condiciones anóxicas a aeróbicassiempre induce un aumento del potencial redox y unaumento del pH. El aumento del redox vieneprovocado por la capacidad oxidante del oxígeno,pero el cambio de pH está provocado por laacumulación y arrastre de CO2 en el medio. Si elcambio de pH fuera provocado mayoritariamentepor la nitrifícación y la desnitrificación, losresultados deberían ser los contrarios. Lanitrifícación en condiciones aeróbicas va.acompañada de una disminución del pH y ladesnitrificación provoca un incremento del pH. Laexplicación a estos cambios puede estar en eldesplazamiento del CO2 presente en el medio. Encondiciones anóxicas, los microorganismos tambiénpueden consumir la materia orgánica hasta laformación de CO2. La acumulación de este CO2
produce la bajada de pH, porque se encuentra enforma de ácido carbónico, H2CO3. Cuando serecuperan las condiciones aeróbicas, el aire
introducido en el sistema produce el arrastre del C02
acumulado, lo que tiene como consecuencia lasubida del pH.Todos los cambios en las medidas de pH están muyinfluenciados por la alcalinidad disponible. Estaalcalinidad proviene del influente de la planta y delcontrol de pH en el tercer reactor, en el que se utilizabicarbonato. Si la alcalinidad es suficiente, loscambios en el pH se ven amortiguados. En los casosestudiados, la variación máxima producida es dealrededor de 0.4 unidades de pH. Estos cambiosmayores se producen cuando la duración del periodoanóxico es más elevada. También se observa que enlas condiciones de los experimentos, los valores depH tienden hacia un valor estable para periodosanóxicos de larga duración.
La variación observada de pH también tieneinfluencia sobre los valores de redox, aunque lamayor variación de este parámetro está provocadapor la concentración de oxígeno presente en elmedio.
270 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
5.2.7.3 REPRODUCIBILIDAD DE LARESPUESTA
En esta sección se estudia la reproducibilidad de larespuesta de la planta piloto frente a una mismaentrada. En los experimentos 2, 3, 8 y 9 se hanutilizado las mismas estrategias de operación (vertabla 5.61), por lo que teóricamente la respuestadebería ser muy similar. La diferencia en losexperimentos se encuentra en la concentración yestado de los microorganismos en el sistema. Debeconsiderarse que desde la realización delexperimento 2 al 9 transcurre un mes y medio, por loque la población de microorganismos puede habervariado en cantidad y proporción de mirificantes.
En las figuras 5.58, 5.59 y 5.60 se representa elporcentaje de eliminación de nitrógeno, el nitrógenoeliminado y el nitrógeno que queda en el efluentepor unidad de biomasa en el sistema.
"° 23 -
CO 22 •CO ¿¿
-o 20CO
•c 19-.i
Z 17.0,
16 -
I i5/i
; n/i
/
/
' j
' fe
\\*
•
2
'','
3
V ^
.
8
,
,_ ^
9
Ü
C 7fl
se
/n/I
/
/
\ '
: . <
_.
,,"'
-,
• ' f'. • ' '• * %. • '
_. /,/
Experimento
Fig. 5.58. Porcentaje de eliminación de nitrógeno
"sz
Experimento
Fig. 5.59. mg N eliminados / g SSV d
Experimento
Fig. 5.60. mg N en el efluente / g SSV d
Estado óxico (consigna mg O2 / 1)Experimento n t , n . T i „ . ,r Reactor 1 Reactor 2 | Reactor 3
Experimentó
2389
SSVT(g)
454.3405.7519.8574.0
2389
N-NH/s(g)
1.5321.7270.7021.283
Anóxico
Anóxico
Anóxico
Anóxico
N-N(Vs(g)
0.4100.7110.5880.779
N-NCVs(g)
0.3070.3860.4990.480
Aeróbico 3
Aeróbico 3
Aeróbico 3
Aeróbico 3
NTOTAL s
2.2492.8241.7892.542
Neliminado (g)
10.77310.19911.23310.480
82788680
Relación de recirculaciónExterna Interna
Aeróbico 3
Aeróbico 3
Aeróbico 3
Aeróbico 3
lina
73322648
«Î.-.
68.1261.1739.2250.49
N-N03S
18.2125.1632.8930.63
0.50.50.50.5
N-N02's
13.6713.6727.8918.88
m g N / gSSV d
23.7125.1421.6118.26
2222
mgN-NH/s/ g SSV d
3.374.261.352.24
mgN-N<Vs
g SSV d
0.901.751.131.36
mgN-N02S
g SSV d
0.680.950.960.84
Tabla 5.61. Condiciones experimentales y resultados de los experimentos 2, 3, 8 y 9
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 271
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Puede observarse la variabilidad de la respuesta dela planta piloto, independientemente de las unidadesutilizadas en la comparación.
Los resultados del experimento 8 son los que más sedesvían. En este caso, se produjo un problema con elcontrol de pH del reactor 3. Se dosificó un exceso debicarbonato por el funcionamiento incorrecto de lasonda de pH del tercer reactor, lo que provocó unosvalores de pH bastante superiores a los habituales enel resto de reactores. Este hecho puede haberfavorecido a la nitrifícación, lo que explicaría elporcentaje de eliminación del 86, bastante mayor alresto de experimentos. En los resultados por unidadde biomasa, también se observa éste es el mejorexperimento.
En la comparación del resto de experimentos, sedebe tener en cuenta que aparece una importantevariación en la concentración inicial demicroorganismos en los reactores para cadaexperimento, que produce variaciones de 405 a 574gramos totales. Esta importante variación muestralos diferentes estados en los que se encuentra elsedimentador, un parámetro muy importante en elcomportamiento de la planta piloto. Es difícil valorarla concentración de sólidos en el sedimentador sinperturbar el sistema, por lo que no se contabiliza sucontribución en el cómputo de los sólidos volátilesen el sistema. Esto induce un error en los resultadosexperimentales, por lo que la comparación deexperimentos, aún con las mismas condiciones, peroseparados en el tiempo, proporciona resultados nomuy repetitivos.
Otro factor que afecta a la eliminación es latemperatura en los reactores. En los experimentos 2y 8 se mantiene alrededor de 22 °C, mientras que enel 3 y 9 está en torno a 20 °C. Puede observarse queel porcentaje de eliminación se relaciona con los
valores de temperatura: los experimentos 2 y 8 sonlos que muestran una mayor eliminación.
Para evitar la influencia de estos problemas serealiza como primer experimento de cada serie unode referencia con el que comparar correctamente losresultados del resto de experimentos de la serie.
5.2.7.4 EFECTO DE LA CONSIGNA DEOXÍGENO EN LOS REACTORES 2 Y 3
En los experimentos 9, 10 y 11 se estudia lainfluencia de la consigna de oxígeno disuelto en losreactores aeróbicos en la nitrifícación y, enconsecuencia, en la eliminación de nitrógeno. En elexperimento 9 se utilizan 3 mg/1, en el n° 10, 5 mg/1y en el n° 11, 1 mg/1. El resto de condicionesexperimentales se mantiene constante (tabla 5.62).
Para estos experimentos se representa en las figuras5.61, 5.62 y 5.63 el porcentaje de eliminación denitrógeno, el nitrógeno eliminado y el nitrógeno delefluente por unidad de biomasa en el sistema.
82 -
78 -
76-
72 •
?n/
>t '"..»". ..
'
I"
10
Experimento
Fig. 5.61. Porcentaje de eliminación de nitrógeno
ExperimentoEstado óxico (consigna mg O211)
Reactor 1 Reactor 2 Reactor 3Relación de recirculación
Externa Interna
/
91011
AnóxicoAnóxicoAnóxico
Aeróbico 3Aeróbico 5Aeróbico 1
Aeróbico 3Aeróbico 5Aeróbico 1
0.50.50.5
222
ExperiExpen „. IN-INHmento SSVT(g) (g)
N-NH4+s N-N03-S N-NOj's NTOTALS
N
(g) (g) (g)
o/ mg mg,. . P,. . % % % mg N / g ... ™J + N-N<Vs N-NO/s
e h m m a E h m m a + |v/N-Na,s ; ,do(g) C1Ón / g S S V d gSSVd gSSVd
91011
574.0519.8499.4
1.2831.2261.598
0.7790.9060.394
0.4800.4780.284
2.542 10:480 80.48 50.492.609 10.413 79.96 46.972.277 10.745 82.51 70.20
30.6334.7117.31
18.8818.3212.49
18.2620.0321.52
2.242.363.20
1.361.740.79
0.840.920.57
272
Tabla 5.62. Condiciones experimentales y resultados de los experimentos 9 a 11
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
•o
ço
I0)z
15/
_/
9 10 11
Experimento
Fig. 5.62. mg N eliminados / g SSV d
Fig. 5.63. mg N en el efluente / g SSV d
En la figura 5.61 se observa un porcentaje deeliminación prácticamente igual para consignas de 3y 5 mg/1 de oxígeno en los reactores aeróbicos. En elexperimento con consigna de 1 mg/1, la eliminaciónes inesperadamente superior. Estos resultados delexperimento 11, son debidos a que la nitrificación nose ve muy favorecida, pero si que se mejora muchola desnitrificación. Estos resultados se observan enla figura 5.63, donde aparece una importantecontribución del amonio al nitrógeno que no seelimina, unido al menor valor de nitrato y nitrito. Enlos perfiles de salida de nitrato y nitrito en elexperimento 11 (figura 5.31) se aprecianconcentraciones muy reducidas de salida, lo quefavorece el porcentaje de eliminación. A pesar de losvalores obtenidos, la nitrificación no es destacable,ya que se obtienen valores máximos de salida deamonio de 8.5 mg/1.
En la figura 5.63 se observa que los niveles denitrógeno en la salida son mejores utilizando laconcentración de oxígeno disuelto de 3 mg/1. Encomparación con el experimento de 5 mg/1, lacantidad de amonio en el efluente es prácticamentela misma, pero la de nitrato y nitrito es menor para 3
mg/1, lo que demuestra los problemasdesnitrificación para el experimento de 5 mg/1.
de
Estos problemas están provocados por entrada deoxígeno en el reactor 1 mediante la recirculacióninterna. Esto se detecta especialmente paraconcentraciones de 5 mg/1 de oxígeno en el reactor3. Este hecho debe tenerse en cuenta al introduciresquemas de operación que aumenten larecirculación interna teniendo concentraciones deoxígeno elevadas en el reactor 3.
En cuanto a la eliminación por unidad de biomasa(figura 5.62), se observa un aumento en cada uno delos experimentos. Esto puede ser debido a losproblemas de acumulación de biomasa en elsedimentador, ya que la biomasa medida en losreactores disminuye un 15 % del experimento 9 al11.
Como resultado global de estos experimentos, seobserva que la nitrificación mejora para un aumentode la consigna de oxígeno en los reactores aeróbicos,aunque a partir de 3 mg/1 no se obtienen mejorasrepresentativas. Por otro lado, la desnitrificación seve favorecida en condiciones de baja concentraciónde oxígeno en los reactores aeróbicos. Con unaconsigna de 1 mg/1, se obtienen resultadosespecialmente favorables, lo que puede estarprovocado por la menor recirculación de oxígenodesde el reactor 3 al reactor 1, así como por laposible nitrifícación y desnitrificación simultánea enlos reactores aeróbicos.
5.2.7.5 EFECTO DE LA RECIRCULACIÓNINTERNA
En los experimentos 12, 13 y 14 se estudia el efectode la recirculación interna en la desnitrificación y, enconsecuencia, en la eliminación global de nitrógeno.El experimento 12 se utiliza como referencia y enlos experimentos 13 y 14 se introduce la estrategiade control que varia la relación de recirculacióninterna en función de la concentración de nitrato másnitrito a la salida. Las condiciones de cadaexperimento se muestran en la tabla 5.63.
En las figuras 5.64, 5.65 y 5.66 se representa elporcentaje de eliminación, la eliminación y elnitrógeno en el efluente por unidad de biomasa enlos reactores.
En los tres experimentos se observa una altavariabilidad en los sólidos totales del sistema, ya queaparecen valores de 530 a 655 gramos de biomasatotal en los reactores. Esto provoca resultados pocoreproducibles en la planta piloto. A pesar de lavariabilidad, puede observarse como el porcentaje deeliminación aumenta del experimento 12 al 13.
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 273
DESARROLLO e IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
88 -
86 •
84 •
78 -
76 •
7f\/
^ f
t V 'y v"
12 13
Experimento
Fig. 5.64. Porcentaje de eliminación de nitrógeno
20-
17 •
/
H ,. •
1
Î
,
_/12 13 14
Experimento
Fig. 5.65. mg N eliminados / g. SSV d
Este aumento de eliminación no se observa si secalcula la eliminación por unidad de biomasa (figura5.65), pero el nitrógeno que aparece en el efluente esmenor (figura 5.66), tanto en forma de amonio comonitrato y nitrito.
coD)
S
SI2
ExperimentoFig. 5.66. mg N en el efluente / g SSV d
Para el experimento 14, repetición de lascondiciones del anterior, no se obtienen los mismosresultados. La eliminación de nitrógeno es elevada(84.7 %), aunque inferior a las anteriores. Por unidadde biomasa, la eliminación es de 20.8 mgN/g SSV d,bastante superior a las anteriores. La bajaconcentración de sólidos en los reactores provocaese valor de eliminación por unidad de biomasa.
Los resultados de eliminación obtenidos muestran lavariabilidad de la respuesta de la planta piloto,debido al comportamiento no ideal delsedimentador.
En los perfiles de nitrato y nitrito del efluente(figuras 5.33 y 5.34) si se observa la correctaactuación del control de la recirculación interna enfunción de la concentración de N-NOX en el efluente.Puede observarse como cuando la concentraciónsupera los 2 mg/1, la relación de recirculación internavaría, con lo que se consigue mantener laconcentración de salida de N-NOX en el efluente, alcontrario que en el experimento 12, donde laconcentración de nitrato y nitrito continúa
ExperimentoEstado óxico (consigna mg Ü2 /1)
Reactor 1 Reactor 2 Reactor 3Relación de recirculación
Externa Interna
121314
AnóxicoAnóxicoAnóxico
Aeróbico 3Aeróbico 3Aeróbico 3
Aeróbico 3Aeróbico 3 ó 1Aeróbico 3 ó 1
0.50.50.5
21 Ó 2 Ó 41 Ó 2 Ó 4
EXP!rÍmentó SSVT (g) (g) (g) (g) (g) ell!.
do (g)Elimina +N-NH, . N-NO3 s N-NO2 s
mgmg mg
N-N03 s N-NO/s
121314
598.2655.7530.3
0.9070.7621.115
0.5940.4790.564
0.3340.3030.312
1.8351.5441.991
11.187 85.9111.478 88.1411.031 84.71
49.4249.3356.00
32.3531.0528.33
18.2319.6115.67
18.7017.5120.80
1.521.162.10
0.990.731.06
0.560.460.59
274
Tabla 5.63. Condiciones experimentales y resultados de los experimentos 12 a 14
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
aumentando. También se observa como durantealgunos períodos de los experimentos 13 y 14, larelación de recirculación interna toma un valor de 1,ya que la concentración de N-NOX en el efluentedisminuye por debajo del valor límite. Esta relaciónde recirculación permite un ahorro energético enperiodos donde no es necesaria tanta recirculacióninterna.
5.2.7.6 EFECTO DE LA RELACIÓN DERECIRCULACIÓN EXTERNA VARIABLE
En los experimentos 15, 16 y 17 se estudia el efectode la relación de recirculación externa variable en laeliminación de nitrógeno en la planta piloto. En losexperimentos 16 y 17 se incluye un aumento de larecirculación externa en determinados periodos parahacer frente al aumento de carga en la planta.
Este incremento se determina en función de losvalores de OUR en el reactor 2 y de la salida denitrógeno amoniacal. En el n° 17 también semodifica la consigna de oxígeno disuelto en elreactor 3 cuando la relación de recirculación internaes 4. De este modo se evita el aporte excesivo de
experimentales. Una parada de dos horas permite elconsumo casi total del amonio (ver figura 5.36),pero no así de nitrato ni nitrito. Esto puede deberse ala falta de DQO para que los microorganismosheterótrofos puedan desnitrificar, pero globalmentelos resultados son de eliminación casi total.
1JLU
92 •
yn/l
/
%
'" > * ' ^
' '*• ' ' * í
' i
+ i iT1 ,V *• ¿> ,s? * *
' \, »*»W»-rçïw«*| -- | j-**.™ -*»«** «| | -**»*»«,*—** | A
15
Experimento
Fig. 5.67. Porcentaje de eliminación de nitrógeno
oxígeno al reactor anóxico, ya que este es un factorinhibitorio de la desnitrificación.
En las figuras 5.67, 5.68 y 5.69 se representan losvalores de eliminación para los tres experimentos.
Se muestran los resultados del experimento 16,aunque debe considerarse que no son comparables alresto de experimentos, ya que han sido calculadosconsiderando la misma entrada que el resto. Durantedos horas la planta estuvo parada debido a unproblema de operación, por lo que no ha habidoentrada a la planta durante ese periodo. Losresultados de este experimento demuestran que laeliminación obtenible en la planta puede ser casitotal dependiendo de las condiciones
22 -•o
W 2 1 -Wo> 20-o™ 19
'•v
P
/
. »'-«**' "•%>
" , *>K
f f % "i,
' ï -X tCA , WSi*
'v'
f x,
»
» ' ', , r<~. .
*t fl<* " '
' C* ' ' * >>
»• *1'wvr.i'.'::• *•'•
, - - -
"iK"'^
íK^iíV*
; // /^/ !„„...,,., ,, I,»-— w«w»| h-www-"! A
15 16 17
Experimento
Fig. 5.68. mg N eliminados / g SSV d
ExperimentoEstado óxico (consigna mg O2 /1)
Reactor 1 Reactor 2 Reactor 3Relación de recirculación
Externa Interna
151617
Anóxico
Anóxico
Anóxico
Aeróbico 3
Aeróbico 3
Aeróbico 3
Aeróbico 3 ó 1
Aeróbico 3 ó 1
Aeróbico 3 Ó 1
0.50.5 ó 10.5 ó 1
1 Ó 2 Ó 41 Ó 2 Ó 41 Ó 2 Ó 4
Experimento
151617
SSVT(g)
508.9532.2480.4
N-NH/s(g)
0.6520.1640.902
N-NO3S
(g)
0.6810.6971.065
N-NO2S
(g)
0.2980.2170.401
NTOTAL s(g)
1.6321.0782.368
Neliminado (g)
11.39111.94410.654
%Elimina
ción
87Í791.p281.81
%N-NH/s
39.9715.1838.09
%N-NOjs
41.7664.6544.96
%N-N02S
18.2720.1716.94
mg mgmg N / g ™Jf + N-NO,-S N-N02-S
SSV d , ,"*' / // B S S V d gSSVd gSSVd
22.38 1.28 1.34 0.5922.45 0.31 1.31 0.4122.18 1.88 2.22 0.84
Tabla 5.64. Condiciones exoerimentales v resultados de los experimentos 15 a 17
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 275
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
esas condiciones la eliminación ha mejorado.También se obtienen rendimientos de eliminaciónpor unidad de biomasa bastante mejores en losexperimentos 19 y 20.
En cuanto al nitrógeno en el efluente, se observa unacantidad total igual, pero con diferente composición.En los experimentos 19 y 20 la proporción de nitratoy nitrito es superior, lo que indica que lanitrificación está más favorecida, asi como que ladesnitrificación no se ve excesivamente perjudicadacomo consecuencia de los ciclos de aireación en elreactor 1.
En los perfiles de salida (figuras 5.38, 5.39 y 5.40)se puede observar la menor concentración de amonioen el efluente en los experimentos 19 y 20, perounido a un ligero aumento en las concentraciones denitrato y nitrito que se producen oscilatoriamente,coincidiendo con los ciclos de aireación en los que ladesnitrificación no se produce.
Como valoración global, se observa que laeliminación mejora, lo que unido a la optimizaciónde los costes de depuración, puede considerarse unresultado muy positivo.
5.2.7.8 COMPORTAMIENTO DEL SISTEMAANTE DIFERENTES ENTRADAS
En los experimentos 21, 22 y 23 se utilizan todas lasestrategias de control implementadas. En el n° 21 serepite la entrada, pero en el n° 22 y el n° 23 se utilizaotro tipo de entrada, constante. En el n° 22 seintroducen dos caudales diferentes durante dosperiodos, pero la cantidad de nitrógeno adicionadomediante las bombas dosificadoras se mantieneconstante. De este modo se producen dos periodosde diferente caudal pero con igual carga. Loscaudales y la dosificación se han calculado de tal
modo que el caudal total y el nitrógeno totalintroducido durante el experimento es igual al de losexperimentos anteriores. En el n° 23 se simula unacondición de baja carga de nitrógeno y de DQO. Seintroducen dos caudales diferentes durante dosperiodos, pero la cantidad de nitrógeno adicionadomediante las bombas dosificadoras se mantieneconstante. De este modo se producen dos periodosde diferente caudal pero con igual carga.
Los resultados de eliminación se muestran en lasfiguras 5.74, 5.75 y 5.76.
22
Experimento
23
Fig. 5.74. Porcentaje de eliminación de nitrógeno
En el experimento 21 se repite la buena eliminaciónde los experimentos 19 y 20, considerando laconcentración de biomasa. La eliminación denitrógeno es de 86.7 % y por unidad de biomasa esde 26.01 mg N /g SSV d, rendimiento deeliminación elevado. Las concentraciones denitrógeno amoniacal a la salida son ligeramentealtas, pero las de nitrato y nitrito son reducidas, porlo que globalmente la eliminación es correcta.
90 •
84'ü 82 .
,£
* 76-
7n ./
•*
' 1
^ ^
» j•;
1' 1
1
i
ï
1!11(
ExperimentoEstado óxico (consigna mg Ü2 /1)
Reactor 1 Reactor 2 Reactor 3Relación de recirculación
Externa Interna
212223
Anox Ó 30"aer-60'anox
Anox ó 30'aer-60'anox
Anox ó 30'aer-60'anox
Aer 3 ó Anox 0Aer 3 ó Anox 0Aer 3 ó Anox 0
Aeróbico 3 ó 1Aeróbico 3 ó 1Aeróbico 3 ó 1
0.5 ó 10.5 ó 10.5 01
1 Ó 2 Ó 41 Ó 2 Ó 41 Ó 2 Ó 4
Experimentó
212223
SSVT(g)
434.2418.3427.0
N-NH/s(g)
1.1880.2700.209
N-NO/s(g)
0.2550.3510.397
N-N(Vs(g)
0.2850.2390.144
NTOTAL s(g)
1.7280.8610.751
Neliminado (g)
11.29412.1616.289
%Elimina
ción
86.7393.3989.33
%N-NH/s
68.7431.3927.88
%N-N03-S
14.7540.8052.91
%N-N02-S
16.5127.8119.21
m g N / gSSV d
26.0129.0714.73
mgN-NH4
+S
/ g SSV d
2.740.650.49
mgN-NO/s
/g SSV d
0.590.840.93
mgN-NO2-.
/g SSV d
0.660.570.34
Tabla 5.66. Condiciones experimentales y resultados de los experimentos 21 a 23
278 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
^ 24
W 22 •O)
o ¿u
•o
•E 16-<u lb
2 14O)E 1?-
/
, * ,
• , *- ,
• ' \*->A.
"
^ _/21 2322
Experimento
Fig. 5.75. mg N eliminados / g SSV d
22 23
Experimento
Fig. 5.76. mg N en el efluente / g SSV d
En el experimento 22 se obtienen los mejoresvalores de eliminación de nitrogeno de todos losexperimentos. El porcentaje de eliminación es del93.4 %, un valor muy elevado. La eliminación porunidad de biomasa es de 29.07 mg N /g SSV d, elmayor rendimiento de eliminación obtenido. Lasconcentraciones de nitrógeno a la salida también sonmuy reducidas (ver figura 5.42), por lo que la cargavertida por el efluente es también mínima (figura5.76). Teniendo en cuenta que la carga total es iguala la de anteriores experimentos, los resultadosdemuestran la importancia de la adecuadadistribución durante todo el periodo para obtenereliminaciones casi totales. Estos resultados hacenpensar que la disponibilidad de un depósito dehomogeneización sería una mejora muy importantepara el proceso. Esta es una opción posible paracaudales reducidos, pero no es una opcióndemasiado económica para una planta de tratamientode aguas residuales urbanas de tamaño medio.
También debe considerarse que la eliminaciónpodría haber sido aún superior, manteniendo durantelas 24 horas condiciones aeróbicas en los reactores 2y 3, y una relación de recirculación máxima. Estas
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
condiciones hubieran proporcionado unaeliminación superior, pero el coste económicohubiera sido mucho mayor.
Otra consideración que debe realizarse es que lasestrategias de control desarrolladas para un tipo deentrada como la de los experimentos anteriorespuede no ser adecuada para otro tipo de condicionesde entrada. Por ejemplo, en el experimento 22 sepasa de mantener condiciones anóxicas en el reactor2 a una hora después tener que establecercondiciones aeróbicas para ese reactor y realizarsecuencias de aireación en el reactor 1. En este caso,se deberían haber mantenido condiciones aeróbicasen el reactor 2, con lo que no se habría producido elaumento de la concentración de amonio en elefluente. Estos problemas también son consecuenciade las medidas disponibles de amonio, nitrato ynitrito son únicamente en el efluente. Si se hubieradispuesto de la medida de la entrada podría haberseimplementado alguna estrategia de controlcomplementaria.
En el último experimentos la eliminación denitrógeno es del 89.3 %. Se podría obtener unaeliminación superior, pero los cambios de modo deoperación están regulados por los mismos niveles enel efluente que en anteriores experimentos.Cambiando esos valores en el sistema experto, elporcentaje de eliminación podría ser muy mejorado.La eliminación por unidad de biomasa es de 14.73mg N /g SSV d, muy reducida porque la carga esmuy pequeña. Las concentraciones de nitrógeno a lasalida también son mínimas (ver figura 5.43). Eneste experimento se demuestra prácticamente que esposible obtener buenos resultados de eliminaciónutilizando los recursos necesarios, sin desperdiciarenergía de aireación o recirculación cuando laeliminación deseada no lo requiere.
5.2.7.9 EFECTO DEL SEDIMENTADOR
En los experimentos 24 y 25 se prueba la respuestadel sistema con el nuevo sedimentador de 25 litrosde volumen, en contraste con los 60 litros delanterior. La entrada es el mismo perfil dealimentación utilizado en casi todos losexperimentos, mientras que las condicionesutilizadas son las de máximo control (tabla 5.67). Larespuesta se modifica notablemente, comoconsecuencia del diferente comportamiento desedimentador.
En las figuras 5.77, 5.78 y 5.79 se representa elporcentaje de eliminación, la eliminación y elnitrógeno en el efluente por unidad de biomasa enlos reactores.
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO 279
DESARROLLO E IMPLEMENTACTON DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
85 -
% E
limin
aci
ón
50)
--J
~-
J (
in
o
en
c
/
•
,
>
24 25
Experimento
Fig. 5.74. Porcentaje de eliminación de nitrógeno
55-
50-
40-
35-
30-
25 •
in / •\,.f
%. r
/„» „, -X
24
Experimento
25
Fig. 5.75. mg N eliminados / g SSV d
En el experimento 24 la eliminación de nitrógeno esde 66.0 %, valor muy reducido. La eliminación porunidad de biomasa es de 30.65 mg N /g SSV d, muyelevada porque la concentración demicroorganismos es escasa. También debeconsiderarse la alta concentración de amonio a la
salida, que supera los límites legales (figura 5.64).En conclusión, puede admitirse que la nuevasituación de la planta no favorece al porcentaje deeliminación de nitrógeno, aunque proporcionalmentelos resultados sean buenos.
Fig. 5.76. mg N en el efluente / g SSV d
En el experimento 25 la eliminación de nitrógeno esde 73.7 %, valor reducido pero mejor al anterior. Laeliminación por unidad de biomasa es de 58.12 mgN /g SSV d, demasiado elevado comparado con elresto de experimentos. La concentración demicroorganismos puede haber variado a lo largo delexperimento, debido al mal funcionamiento delsedimentador. Una posible explicación es laacumulación de biomasa en el sedimentador paracaudales bajos de recirculación externa(correspondientes al inicio del experimento) y suposterior recirculación al aumentar la recirculaciónexterna cuando se detecta el aumento de carga en elsistema. También es posible que el nitrógenoorgánico, que normalmente desaparece porcompleto, no se haya hidrolizado totalmente, lo queno estaríamos considerando cuando calculamos elrendimiento.
ExperimentoEstado óxico (consigna mg 02 /1)
Reactor 1 Reactor 2 Reactor 3Relación de recirculación
Externa Interna
21 Anox Ó 30'aer-60'anox Aer 3 Ó Anox O Aeróbico 3 ó 1 0.5 01 1 Ó 2 Ó 4
24
25
Anox ó 30'aer-6G"anox
Anox ó 30'aer-60'anox
Aer 3 ó Anox 0
Aer 3 ó Anox 0
Aeróbico 3 Ó 1
Aeróbico 3 ó 1
0.5 ó 1
0.5 0 1
1 Ó 2 Ó 4
1 Ó 2 Ó 4
Experimentó
N-NOj's N-NO:'s NTOTAL s(g) (g) (g)
N % ma°/ °/ *y mo N / o **
ÏST Ecía "W. N-NÔ3-S N-N02-S Slvd8™^
mg
1
mgN-N02S
g SSV d g SSV d
212425
434.2280.5165.1
1.1883.7132.915
0.2550.4200.331
0.2850.2900.182
1.728 11.294 86.734.424 8.598 66.033.428 9.594 73.68
68.7483.9485.04
14.759.509.66
16.516.565.30
26.0130.6558.12
2.7413.2417.66
0.591.502.01
0.661.031.10
280
Tabla 5.67. Condiciones experimentales y resultados de los experimentos 21, 24 y 25
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO. ANÁLISIS DE DIFERENTES ESTRATEGIAS DE CONTROL
JLU
5.2.7.10 MEJORA GLOBAL OBTENIDAMEDIANTE EL SISTEMA DE CONTROL
En esta1 sección se compara el efecto global que tienela implementación de todas las estrategias de controlestudiadas. Para ello se comparan los resultados delos experimentos 1 y 20 (tabla 5.68), ambos con elmismo influente pero con diferente grado de control.En el primero se utiliza el mínimo número deestrategias probadas y en el experimento 20 seutilizan todas las estrategias estudiadas.
En la figura 5.77 se observa el porcentaje deeliminación global de nitrógeno. Se obtiene unamejora en la eliminación del 10.5 %.
100
95
90 •
85-
80
75-
¿- _1_ /
1 20
Experimento
Fig. 5.77. Porcentaje de eliminación de nitrógeno
En la figura 5.78 se representa la eliminación denitrógeno por unidad de biomasa y día, que en estecaso supone una mejora de 3.7 mg N / g SSV d, loque representa un porcentaje del 16.3 %.
Por último se representa el nitrogeno, en las diversasformas en que aparece en el efluente (figura 5.79).En este caso, 'se reduce un 46 % la salida denitrógeno.
D)
o 20 J
S> IR _
0) 1B
z 14O)E 12
m/
, ' ">-.!
'
, , ,„
•ffi•z.
1 20
Experimento
Fig. 5.78. mg N eliminados / g SSV d
Experimento
Fig. 5.79. mg N en el efluente / g SSV d
„ . Estado óxico (consigna rExperimento „ . . n , 0r Reactor 1 Reactor 2
1 Anóxico20 Anox ó 30'aer-60'anox
Aeróbico 3Aer 3 ó Anox 0
igOz/1)Reactor 3
Aeróbico 3Aeróbico 3 ó 1
Relación de recirculaciónExterna Interna
Q=150(ml/min)0.5 ó 1
21 Ó 2 Ó 4
(g) (g) (g) (g) do (g) N-NH4 , N-NO, , N-NO, s SSV d+ N-N03-SN-N02-S
1 445.2 2.186 0.503 0.204 2.893 10.129 77.78 75.57 17.39 7.04 22.75 4.91 1.13 0.4620 434.6 0.893 0.321 0.310 1.524 11.499 88.30 58.61 21.07 20.32 26.46 2.05 0.74 0.71
Tabla 5.68. Condiciones experimentales y resultados de los experimentos 1 y 20
VAÜDACIÓN EXPERIMENTAL EN PLANTA PILOTO 281
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Como puede observarse en los resultados deeliminación, las estrategias de control tienen unefecto global muy positivo. Aparte de esta lecturasuperficial, debe considerarse que la mejora obtenidase ha realizado con el mínimo coste energéticoposible, optimizando el funcionamiento de la plantamediante las reglas de operación implementadas entiempo real. Además de esta mejora global, si seobservan los perfiles de las diferentes formas denitrógeno a la salida de la planta (figuras 5.21 y5.40), se observa la menor concentración denitrógeno amoniacal en el experimento 20 (menor a6 mg/1) respecto al experimento 1 (superior a 12mg/1), lo que puede ser un factor de vitalimportancia para cumplir los límites legislados(apartado 1.1).
5.2.7.11 ELIMINACIÓN DE FÓSFORO
Respecto a la eliminación de fósforo por la plantapiloto, ésta ha sido bastante constante, se ha vistopoco influenciada por las distintas estrategias decontrol utilizadas.
En general, los valores de P-PO43" de la entrada en
forma de perfil (con una concentración variableentre 3 y 8 mg/1), han sido eliminados, obteniéndoseresultados inferiores a 2 mg/1.
El único proceso que puede afectar a la eliminaciónde fósforo, con la configuración de operación de laplanta piloto, sería la entrada de nitrato en el reactoranaeróbico. Este problema de operación sólo puedeocurrir cuando no se está desnitrificandocorrectamente, como en el problema de falta deDQO del experimento 17, pero sólo afectaría si elproblema es de larga duración.
En los experimentos realizados, sólo se producenconcentraciones de fosfato elevadas cuando existenproblemas con los lodos del sedimentador. Los lodospueden retener fosfato adherido a los floculo, que encaso de ser removidos se desprende, produciendovalores elevados de fosfato en el efluente de laplanta, tal como se puede observar en algunosexperimentos.
282 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
iMPLEMENTAaÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS
6 IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL.EDAR GRANOLLERS
Además de la implementation del SE en la plantapiloto del "Departament d 'Enginyeria Química de laUniversitat Autònoma de Barcelona" se estàimplementando otro prototipo, en colaboración conel "Laboratori d'Enginyeria Química i Ambiental dela Universitat de Girona". En este prototipo seutilizan las mismas técnicas descritas en eldesarrollo del SE de la planta piloto, pero eldesarrollo se realiza utilizado la versión 5.0 de G2[Gensym 1997].
Este prototipo se ha implementado en una plantareal, la EDAR de Granollers, que vierte en el caucedel río Besos. Esta planta dispone de pretratamiento,
tratamiento primario y tratamiento secundario,utilizando un proceso de lodos activos para eliminarmateria orgánica y sólidos en suspensión en el aguaresidual producida por cerca de 130.000 habitantesequivalentes. Actualmente se está empezando aimplementar la eliminación de nitrógeno. Elesquema del tratamiento de aguas residuales semuestra en la figura 6.1.
En la planta se realiza una exhaustivacaracterización del influente, proveniente de vertidosurbanos e industriales, incluyendo datos cualitativosy cuantitativos. Los datos cuantitativos sonproporcionados por sensores "on-line"
Data Plant Diagrams Graphics Tools Workspaces
Sludgeanaerobic L,-Jdigestion f" Ei
Fig. 6.1. Esquema de tratamiento de la EDAR de Granollers
IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS 283
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
<f- Data Plant Diagrams Graphics Tools Workspaces Help
Besos
Fig. 6.2. Variables analíticas del proceso
(principalmente caudales, pH, conductividad yoxígeno disuelto) y por determinaciones analíticasde muestras tomadas diariamente en la planta (DQO,nutrientes, aceites y biomasa). También se calculanparámetros globales como el tiempo de residenciacelular, SVI o F/M. Los datos cualitativos, medidoscon una frecuencia inferior, incluyen observacionesmicroscópicas de la biomasa (características delfloculo, identificación y contaje de microfauna ybacterias filamentosas) y observaciones del procesopor los operadores, como la presencia y color deespuma y lodo, o la apariencia del sobrenadante delsedimentador y del efluente. En la figura 6.2 sepueden observar las tablas de atributos del reactor ydel sedimentador, con las variables analíticasanteriormente comentadas.
En este caso, el sistema desarrollado se utiliza, enuna primera fase, para la monitorización, ladetección de problemas de funcionamiento y paradar sugerencias de operación a los operadores. Sesugieren acciones de control pero no se realizanautomáticamente. El esquema de supervisiónimplementado se muestra en la figura 6.3.
Fig. 6.3. Esquema supervisor implementado
284 IMPLEMENTACIÓN Y VAUDACIÓN EN PLANTA REAL. EDAR GRANOLLERS
IMPLEMENTAQÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS. SISTEMA DE ADQUISICIÓN DE DATOS
6.1 SISTEMA DE ADQUISICIÓNDE DATOS
Se ha desarrollado un sistema de adquisición dedatos para el SE. La información generada por lossensores y el estado de todos los equiposdistribuidos en la EDAR es monitorizado por unared de PLCs. Estos PLCs están conectados a un PLCprincipal mediante un bus de comunicaciones decampo. El PLC principal está a su vez conectado alordenador del SE mediante una interfaz RS-232-C(figura 6.4). En el ordenador un programa servidorde datos está a cargo de la comunicación con el PLCprincipal vía RS-232 utilizando un conjunto demensajes predefinidos.
El servidor de datos (figura 6.5) está construidoutilizando G2-GATEWAY, una herramienta paradesarrollar sistemas de adquisición externos para G2[Gensym 1997]. Éste es el nombre de la herramientaequivalente a GSI que se utiliza en la versión 5.0 deG2.
Inicio programa
Inicialización de variables
Inicialización COM2
Creación de tarea pararecepción de datos COM2
EDAR GRANOLLERS
Fig. 6.4. Sistema de adquisición de datos de la
Espera de datos COM2
Inicialización sistema GSI Recepción de datos COM2
Espera inicio conexiónTCP/IP con G2 Tratamiento de
recibidosdatos
Registro variables G2
Espera petición dedatos de G2
Respuesta a petición dedatos de G2
Escritura de datos enmemoria común
Fig. 6.5. Esquema defuncionamiento delservidor de datos
IMPLEMENT/•ACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS 285
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
EDAR de Granollers El servidor, desarrollado enMicrosoft Visual C++, es capaz de recibir unapetición de datos desde G2 en cualquier momento yresponder inmediatamente. Esta comunicación seestablece vía TCP/IP. Esta arquitectura permite tenerdiferentes servidores de datos en cualquierordenador conectado vía TCP/IP con el ordenadorque ejecuta G2. En nuestro caso el servidor de datosy G2 se ejecutan en el mismo ordenador.
El funcionamiento del servidor se esquematiza en lafigura 6.5. En primer lugar, el programa inicializalas variables del programa y el puerto decomunicaciones. Después de la inicialización, elprograma crea una subproceso ("thread") que seencarga de la recepción de datos desde el PLCprincipal. Este PLC está configurado para adquirirlas señales de todos los PLCs distribuidos, yposteriormente codificar esta información y enviarlamediante la salida RS-232 de que dispone.
La información enviada por el PLC es recibida en elpuerto serie del PC. En la configuración utilizada esel PLC quien inicia la comunicación cada ciertotiempo prefijado. El PC siempre está a la espera delos datos enviados por el PLC, de aquí la necesidadde disponer de un proceso dedicado únicamente a
ello. Una vez recibidos los datos, éstos sondescodifícados y posteriormente introducidos en lamemoria común del programa, lo que los hacedisponibles al servidor que trata las peticiones deG2. El subproceso, una vez realizado el tratamientode datos, vuelve a situarse en espera de nuevosdatos, repitiendo el procedimiento cada vez que sereciben datos.
El proceso principal inicializa el sistema GSI y sesitúa en espera de una petición de conexión por partede G2. Cuando esto sucede, G2 envía las órdenesnecesarias para el registro de las variables utilizadasen la base de conocimiento. Una vez registradas, G2puede realizar una petición de datos en cualquiermomento. El programa se mantiene siempre en elpunto de espera de petición de datos, hasta lapetición de desconexión desde G2.
En cuanto a las variables "off-line" analíticas, éstaspueden ser introducidas manualmente desde el SE oleídas a partir de ficheros de datos generados por elservicio de análisis de la EDAR.
En la figura 6.6 se muestra una pantalla de ejemplode la monitorización gráfica de los valores "on-line"adquiridos.
'i? Data Plant Diagrams Graphics Tools Workspaces
18977 7:21:45 p.m. El valor mitjà del tempsde residència hidràulic de les dues darrereshores (6.589 d) és menor que el valor dedisseny (7.1 d). Això pot portar problemes desobrecàrrega hidràulica
TñACTMENt •feíOLOGIÒ Entrep Bològic- sortida'BilgicPERFIL Vtíon InttanteniB (codais eegont)
Fig. 6.6. Pantalla de monitorización de valores "on-line" de la EDAR de Granollers
286 IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS
6.2 SISTEMA EXPERTO
Para la construcción de SE, se ha extraídoconocimiento general y específico de la EDAR apartir de una exhaustiva búsqueda bibliográfica,entrevistas con los responsables y los operadores dela planta y de una clasificación automática de la basede datos histórica. Esta información ha sido reunida,estructurada y sintetizada en un conjunto de árbolesde decisión lógica para la diagnosis y la actuación.
Una vez validado por los expertos del proceso, ennuestro caso el director de la planta, estos árboleslógicos fueron codificados mediante un conjunto dereglas heurísticas que conforman la base deconocimiento del SE en tiempo real.
IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS. SISTEMA EXPERTO
Utilizando como base los módulos desarrollados enla aplicación de la planta piloto, se ha implementadoun nuevo sistema que contiene las característicasespecíficas (proceso y conocimiento) de la EDAR deGranollers.
La base de conocimiento cubre los problemas deoperación para la sedimentación primaria y para eltratamiento secundario, incluyendo problemas nobiológicos (días de lluvia, tormentas, problemasmecánicos y eléctricos, sobrecarga, baja carga,problemas de aireación y caudales no compensados)y problemas con origen biológico ("bulking","foaming", "rising", "pinpoint", "bulking" viscoso ycrecimiento disperso).
En la figura 6.7 se presenta una pantalla donde sepueden observar los módulos principalesdesarrollados en el sistema supervisor.
Data Plant Diagrams Graphics Tools Workspaces Help
KNOWLEDGE BASE T'OP LEVEL MODULE |
1 DSS ON-LINE I 2 DSS,SUPERVISORY CYCLE OFF-LINE
1 Sistema supervisor on-line Monlloratge, diagnosi del prooés on-^line I detecció fallés d'equipament (alarmes I aotuaolons ràpides) *f
- Regles amb 00. Cabals, nivells, pH I senyals digitals (alarmesI aotuaolons rapides)- Totes funolonaran en temps real perd amb valors mitjans de30"- Historio d'una setmana per guardar les mitjanes diàries I 'gradear tendènoles horàries, diàries I setmanals <- Amb l'OD I les seves velocitats, sistema de control avanoat("fuzzy") de l'OD que ens permetrà saber a oada Instant f
s
quina seria l'aotuaoló a realitzar per mantenir el setpolnt ï(tenim un registre d'hores de,funcionament de les soplants ?)Llavors, mitjançant simulació amb un model de l'OD, es podria
* comparar amb el comportament real < y * '
2 Clde*supervisor de l'cperaoló (off-line) Diagnosi de l'estat de la'planta (tendència del procès) mltjanjartt SE I SBC I propostes >d'altuaoli 'V "*>f^ ¿
• S'activarà un cop al día o a petiole de l'usuaíl' , "- Històric d'una setmana per guardar lés mitjanes diàries (nouCAS) I graflcar tendències horàries, diàries i setmanals
Treballarà amb variables de tendència per Identificar unproblema abans que no s'en doni "un episodi greu
aDSS-SUPBWISOR.CYO.E
1. DSS ONLINE
[v], DISSOLVED OXYGEN RULES
> LOADING RATES RULES ;
H j FAULT"DETECTION RULE£ ¡
H PoN LINE REGISTER !
2. DSS SUPERVISOR CYCLE (Process trend diagnosis) [ (S]|
Hj SUPERVISORY CYCLE START AND FINAL J
[3 | EXPERT SYSTEM (BASED ON.RULES REASONING)
U]' CASE BASED REASONING SYSTEM t
[U ' SUPERVISION MODULE '
H í ACTUATION MODULE ê
21 Sistema Expert * * , " -¿*- Regies amb dades analítiques, mloroblológiques l^valors >
mitjans dels sensors de dos dies abans- Diagnosi seqüencial de cadascun dels possibles problemes
"* d'operació ' » ( >, fc,*"<''..
3 2 Sistema Raonament Basat en Cagoçy '
JBStart| ^Shortcutto GsigraZ ' Jll·leT , -J.AnalsgX U Windows NT Task 857PM ii
Fig. 6.7. Pantalla con los módulos principales de supervisión del sistema
IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS 287
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
6.3 APLICACIÓN
Para observar el funcionamiento del SE, acontinuación se muestra su actuación frente a uncaso especifico, cuyas características aparecen en latabla 6.1.
El SE puede inferir la situación del EDAR siguiendodiferentes caminos de los arboles de decisión lógicaque constituyen su base de conocimiento. En el casoestudiado, la diagnosis sigue los caminos basados enlos valores de algunas variables numéricasrelacionadas con el estado global del proceso (bajarelación F/M y alto 0C) y en información cualitativa(referida a la abundante presencia de espumas en lasuperfície del bioreactor, la proliferación de lasbacterias filamentosas y en unos flóculosligeramente dispersos). Tal como se muestra en lafigura 6.8, el SE activa una alarma intermediaseñalando el riesgo de la proliferación de losmicroorganismos filamentosos.
Influente 1 8532 nrVd"On-line" Conductividadlnfluente: 3150 |iS/cm_ Caudal de purga: 926 m3/d _
Analítica
Parámetrosglobales
Microscopio
e: 864 mg/1uente: 84 mg/1
DQOPrimario: 543 mg/1DQOEnUente: 128 mg/1AmonioEfiuenie: 58 mg/1NitratoEflUcnte: 1 mg/1Biomasa: 1423 mg/16C: 9.6 daysF/M: 0.22 Kg/Kg-dSVI: 117 ml/gApariencia floculo: ligeramentedispersoBiodiversidad: 6Especie predominante: ciliadosadheridosFilamentosas: abundanteFilamentosa predominante: NocardiaNocardia: abundante
Observaciones Espuma bioreactor: abundanteTurbidez sobrenadante: no
Tabla 6.1. Datos relevantes para el caso estudiado
COD, BOI). TSS at K f f l u c n t \'}(í SRTF:M ratio
MLSSFloe Outf low
appearance appearanceFilamentous Presence foam on aeration
Presence tank or clarifier
^x/High Low Slighly_dispersej l Pooi- Abundant \Cc Absenc
A L A R M FBP = FALSE ALARM FILAMENTOUS BACTERIA PROLIFERATION = TRUE ALARM_FBP = FALSE
Invoke a set of rule
V30 increasing ?
VicBiomass
¡nctvasiim?
Microbiologieobservations
Floe structure ?I
Slightly disperse
Aeration TankFoam presence
Thick, scummy, darkbrown on aeration lank
surface
Greasy, dark tan foam thatScum entering is strong and carries over toaeration tanks
\
Check trends foriomass or SRTincreasing or
F:M decreasing _., ,3 Oil and greases intoy secondary influen
Aeration tank is criticallyunderloaded (F/M too low'due io improper wasting
program
Dark brown, almostblackish sudsy foam on
aeration lank surf nee.Mixed liquor is very dark,
clarifier y almost blackI Stiff, white, I
billowing, or sudsyfoam on aeration j
tank surface X
Other problem!
FILAMENTOUS ORGANISMS PROLIFERATE(Increase Wasteflow^)
(.Filamentous type and cause identification^)
Fig. 6.8. Árbol de decisión para la prolifereación de bacterias filamentosas
288 IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS
En contraste, otras posibles condiciones querequieren variables cuantitativas o cualitativasrelacionadas con la calidad del agua del influente ydel efluente no infieren en ningún camino dediagnosis (por ejemplo valores normales de otrosparámetros analíticos como SST, DQO, DBO, V30 oapariencia del efluente). Cuando esta alarmaintermedia es activada, el motor de inferencia del SEinvoca diferentes rutas de diagnosis a través de lasmetareglas para inferir la situación (caminos ennegrita en la figura 6.8), mientras que otras reglas noson invocadas (caminos en gris en la figura). Cuandola situación es identificada como proliferación deorganismos filamentosos, el SE activa un conjuntosimilar de reglas, correspondientes a laidentificación de filamentosas.
Con la información detallada en la tabla 6.1 el SEdetecta una presencia abundante de Nocardia y unanormal de Microthrix Parvicella, infiriendo lasituación de "foaming" causada por estas bacteriasfilamentosas. Entonces, el motor de inferencia de SEllama a las reglas que deben determinar las causas dela proliferación de estos microorganismos. Esimportante remarcar que el SE esta todavíautilizando la misma información recogida
IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS. APLICACIÓN
rutinariamente en la planta, con la mínimainformación adicional requerida al usuario a travésde la interfaz del SE.
Si se determina la causa correcta, se recomienda unaactuación específica. Si la causa no essatisfactoriamente determinada, se recomienda unaacción no específica.
Centrándose en el caso de estudio, el sistema escapaz de deducir las causas del "foaming" (edad dellodo elevada, o un rápido descenso en la relaciónF/M) y entonces, puede activar las reglas deactuación específicas correspondientes.
Supervisión y predicción del proceso
La integración de las diferentes informaciones ysoluciones proporcionadas por el SE se realizamediante el módulo supervisor. Este módulo estárealizado mediante un conjunto de reglas que debeprocesar la información recibida de diferentessubmódulos evaluando los posibles conflictos.Además, el módulo supervisor sugiere un plan deactuación resultado de integrar las recomendacionesde los diferentes submódulos.
Data Plant Diagrams Graphics Tools Workspaces Help
Causes and Actuations associated to Filaments BULKING ACTUATION
eULKING-ACTUATIONS
LABERIIMT-GRANOLLERS-FILAMENTOUS-KNOWN-
There is low F:M ratio (321) at the AS-REACTOR (high SRT).(p.e. gradient DB05 soluble Insuficient en RCTA).;F M Baixa (causa poo definida) S ha constatat que q Lan hf ha un gradient de oorío de substrat soluble en el reactor el rang té una
IVF Inferior Quan no h! ha graden! o la concentració de substrat és baixa els organismes filamentosos poden orébcer a velooltatsuperior ais formadors de floouls probablement perqué I estructura deis filamentosos presenten major superficie a través de la qualpoden adsorbir I difondre el susbtrat (fonament del selector) El selector pot serlque no funolonl si la capacitat d acumulado desubstrat (AC) dels organismes lormadors de floout esta saturada (donos llavors no tentent capacitat per acumular I consumirsubstrat per tant I eliminació de substrat és més baixa I per tant la seva taxa de [crelxemetn és molt menor de manera que potarribar a ser del mateix ordre que la dels filamentosos Per això per aconseguir ¡.esgotament de la AC dels org no fllamentosoos Ipromoure el seu orelxment és útil la realreacló del fang de retorn En els sistemes d eliminació en discontinu (batch) hi ha unaevident manca del fenomend el bulking és una conseqüència de que en aquests la configuració és pràcticament la d un flux pistóIdeal (P e per composició de I aigua rica en HC de baix PM La presencia de Ifplds de oadena llarga també afavoreixen el seucreixement Estressos mecànics com ara presenciado bombes centrífugues poden conduir ala ruptura de cèl·lules microbianes Ia I alliberament de Ifplds de les membranes que oden fer proliferar aquests microorganismes filamentosos)
Es recomanable una actuació de les següents; segons causa <.Us de selectors, si és possible.Canviar a oonflg. FP per millorar decantabllltat del fang, st és possible.Comparttnentaljtzar taño aireado.ReatreaoIÓ fang retorn'.Operació discontínua (batch).Augmentar F:M.Disminuir alreaoló
Usejmd design of Selectors j
RS::FILAMENTOUS-UNKOWN-
I-ACTUATIONS-ASSOCIATED-rs
SES-AND-ACTUATIONS
IT-DEFICIENCY-CAUSES-AND-
AUSES-AND-ACTUATIONS
^-CAUSES-AND-ACTUATIOM!
ES-AND-ACTUATIONS
| ÜJG2 ' .IjAnalogX " Windows NT Task
Fig. 6.9. Diagnostico de un situación de proliferación de filamentos por baja carga
IMPLEMENTACIÓN Y VALIDACIÓN EN PLANTA REAL. EDAR GRANOLLERS 289
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
En el caso de estudiosiguiente (figura 6.9):
la situación inferida es la
• "Foaming" causado por Nocardia: laproliferación de bacterias filamentosas, comoNocardia y Microthrix Parvicella, induce laaparición de espumas de origen biológico en lasuperficie del reactor que se puede extender alsedimentador secundario y en algunas ocasionespuede provocar pérdida de biomasa nointencionada, reduciendo su concentración ycausando sobrecarga en el bioreactor.
La solución propuesta es la siguiente estrategia deactuación:
• Incrementar el caudal de purga alrededor del10 % cada día hasta que el proceso se acerca alos parámetros de control normales.
Eliminar la espuma físicamente de los reactoresy del sedimentador.
Comprobar las tendencias de la población deNocardia cada dia.
Si el "foaming" persiste considerar la utilizacióndel efecto selector y la adición de cloro en larecirculación de lodos. Mandar un mensaje a losoperadores recomendando como eliminarfísicamente espumas y como añadir cloro(dosis, localización y prueba).
290 IMPLEMENTACION Y VAUDACIÓN EN PLANTA REAL. EDAR GRANOLLERS
7TOí4CLUSÍ<3ÑES
CONCLUSIONES
7 CONCLUSIONES
Como resultados de esta tesis se han desarrollado yoptimizado un conjunto de metodologías que hanpermitido la construcción de un sistema de controlsupervisor para la gestión y control de EstacionesDepuradoras de Aguas Residuales.
El presente trabajo se inicia en el verano de 1993,cuando se implementa un sistema de adquisición dedatos a una planta EDAR real con toda suinstrumentación de tipo analógica distribuida por laplanta.
Al intentar realizar aplicaciones de control "experto"y prédictive en tiempo real se encontró laproblemática de las EDAR. Estas plantas tienen queverter el efluente a un cauce natural, por lo que no sepueden probar estrategias de operación o control queno garanticen el cumplimiento de la legislación.
Para poder demostrar la aplicabilidad de este tipo detécnicas, así como incrementar el conocimiento delproceso y desarrollar nuevas técnicas de control, sedecide la construcción de una planta piloto.
PLANTA PILOTO
El trabajo desarrollado en la presente tesis se iniciacon la construcción de la planta piloto. En las basesde la misma, figuran la necesidad de que estéaltamente instrumentalizada y la posibilidad de teneruna gran versatilidad que permita disponer dediferentes configuraciones implementablesautomáticamente.
El primer resultado fue la planta con tres reactoresde 18 o 28 litros, que permite disponer de tressistemas aeróbico/anóxico, con un sedimentador de60 litros totales. Posteriormente, se introduce uncuarto reactor anaerobio para permitir la eliminaciónsimultánea de carbono, nitrógeno y fósforo.También se dispone de un segundo sedimentadorcon menor volumen total.
Gracias a disponer de una planta que trabaja encontinuo (1400 días de operación sobre 1500 díastotales) y al "gran volumen" de trabajo, se planteó lanecesidad de disponer de alimento en continuo. Por
motivos de situación de la planta dentro de launiversidad y por el caudal tratado (450 litros pordía) se decidió la definición de un alimento quepudiera suministrarse en composición y caudalvariable, y tuviera la mínima intervención manual.
Gracias a la complejidad del alimento definido se hamantenido durante los cuatro años de trabajo unagran diversidad de microorganismos dentro delsistema de lodos activos.
Una de las mayores ventajas de este sistemaexperimental es el gran nivel de instrumentación deque dispone. Esta instrumentación permite elseguimiento de los parámetros normales (pH, T, OD,redox) de todos los reactores y la regulación de lasprincipales actuaciones del sistema (velocidad deagitación, caudales de bombeo, caudal de aireación).
Una vez construido el sistema experimental se iniciael desarrollo del sistema de control y adquisición dedatos distribuido (SCADA).
SCADA
El sistema de control y adquisición de datos ha sidodiseñado siguiendo un esquema distribuido. Elsistema consta de un PLC y diversos controladoresde sondas, supervisados por un ordenador deproceso, que permite la distribución de diferentestareas entre esos elementos.
El PLC se encarga de controlar el funcionamientohidráulico y del sistema de alimentación automáticode la planta piloto, siendo supervisado por elordenador de proceso. Éste puede cambiar lasconsignas de funcionamiento del PLC, con lo que seobtiene un sistema configurable automáticamente.
Los controladores de sondas se encargan de efectuarlas medidas del proceso, que son utilizadas por elordenador de control para la adquisición de datos delproceso y para su monitorización gráfica. Estoscontroladores también pueden realizar controlON/OFF de las variables, como por ejemplo del pH,característica que ha sido utilizado en algunosexperimentos.
CONCLUSIONES 291
DESARROLLO E IMPLEMENTAOÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
El ordenador del proceso se encarga de lasupervisión de los anteriores elementos y del controlde otros parámetros del proceso, como por ejemploel control de oxígeno en los reactores o los caudalesde recirculación.
Este sistema desarrollado e implementado en laplanta piloto, ha permitido el funcionamientoautónomo de un proceso de depuración biológicacon eliminación de nutrientes. La fíabilidad delsistema se ha demostrado durante la operación de laplanta durante más de cuatro años.
La metodología utilizada en la implementación deeste sistema, ha permitido construir con un esfuerzomuy inferior otras aplicaciones de control, como ladesarrollada para el control del sistema demonitorización analítica.
SISTEMA DE CONTROL DE LOSANALIZADORES
Para la obtención de información analítica sobre elproceso de eliminación de nitrógeno, se ha realizadoun programa que controla dos analizadores, quepermiten realizar medidas de amonio, nitrato ynitrito. Estos dos analizadores, son alimentados pormuestra libre de biomasa mediante un sistemaautomático de toma de muestras, también controladopor el mismo ordenador.
El programa desarrollado se encarga de monitorizarlas concentraciones de amonio, nitrato y nitrito delos puntos de la planta preseleccionados, obteniendola máxima frecuencia de adquisición de esosparámetros del proceso permitida por losanalizadores. Esto permite la óptima utilización delequipo disponible, con lo que se mejora lainformación sobre el proceso.
Con los datos proporcionados por el sistema demonitorización de la planta piloto y el sistema decontrol de los analizadores, es posible optimizar elfuncionamiento de la planta en tiempo real. Pararealizar esta tarea se ha desarrollado el sistema decontrol experto supervisor.
SISTEMA EXPERTO
La implementación del SE hace posible el controldel rendimiento del proceso en conjunto, mediante larelación entre diferentes parámetros.
La implementación del SE en la planta piloto hasupuesto la transformación de un sistema de controlclásico con un comportamiento fijo en un sistemaadaptable a los diferentes problemas que puedenaparecer en una EDAR. La capacidad para tratarestos problemas es útil para controlar situacionesanormales y para mantener las restricciones legales
en el efluente. Además, es capaz de evitar laaparición de algunas situaciones que puedenprovocar problemas a largo plazo y provocardificultades para mantener las restricciones en elefluente para algunos parámetros.
Las acciones correctivas del control experto no sonimplementables en un sistema de control clásico, porlo que hay una importante mejora respecto al controlclásico. Además, es posible implementar todos losalgoritmos de control numérico, por lo que hay unbeneficio neto de posibilidades para resolver losdiferentes problemas de una EDAR. .
La arquitectura distribuida multimóduloimplementada mejora previos desarrollos desistemas con bases de conocimiento monolíticas.Esta arquitectura permite el desarrollo de módulosindependientes y reutilizables, que pueden serrealizados y/o utilizados por diferentesdesarrolladores.
Una consecuencia de realizar un sistema modular ybasado en el diseño orientado a objeto es que losmódulos desarrollados pueden reutilizarse en otrossistemas expertos, adaptándose con mínimoscambios, como se puede comprobar en la aplicaciónen la EDAR de Granollers. Otra importantecaracterística es el menor esfuerzo de mantenimientorespecto a versiones previas. Las tareas realizadaspor diferentes módulos son fácilmente validablesporque son independientes, por lo que esta tarea sesimplifica. La única dificultad añadida en elesquema implementado es la integración con elmódulo supervisor, que debe ser inspeccionada endetalle para evitar errores en la coordinación.
El principal éxito de este prototipo es un marcoversátil capaz de tratar con diferentesconfiguraciones de la planta, basado en el paradigmade la programación orientada a objeto y en elrazonamiento basado en reglas. La característica"on-line" es una importante innovación de estesistema, particularmente para la monitorización dedatos y el control supervisor.
En el sistema desarrollado, se pueden implementardiferentes estrategias de control clásico y experto,así como configuraciones de planta para el sistemade lodos activos con eliminación de materiaorgánica, nitrógeno y fósforo.
El mencionado sistema se ha validado funcionandodurante un periodo ininterrumpido de 30 meses. Esdestacable el cambio del modo de operación de laplanta que ha supuesto la implementación delsistema de control, pasando de una situación degestión semiautomàtica (1996) inicial a que elsistema de gestión desarrollado sea una necesidadineludible en el funcionamiento diario de la planta.
292 VALIDACIÓN EXPERIMENTAL EN PLANTA PILOTO
En este periodo, los objetivos operacionales de laplanta fiíeron cambiados periódicamente, paraoptimizar diferentes partes del proceso. El SE hamostrado un excelente rendimiento en la operaciónde la planta piloto. El sistema desarrollado detecta ycontrola todos los problemas y operacionesespeciales de la planta, como por ejemplo fallo de labomba, problemas de alimentación, funcionamientoincorrecto de las sondas, mantenimiento del equipoy control de los analizadores. Esto ha permitido unadisminución en la atención necesaria para elmantenimiento de la planta piloto en unascondiciones adecuadas de funcionamiento.
VALIDACIÓN EXPERIMENTAL
Para la validación de todo el sistema supervisor sehan realizado una serie de experimentos paraoptimizar la eliminación de nitrógeno encondiciones dinámicas.
Esta optimización se ha basado en dos objetivosprincipales, la obtención de la eliminación denitrógeno prefijada y la utilización de los mínimos
CONCLUSIONES
recursos posibles, manteniendo, a su vez, unaadecuada eliminación de materia orgánica y fósforo.
En la aplicación de las estrategias de operaciónimplementadas, se ha detectado que la validez de suaplicación depende mucho de la situación en que seencuentre la planta en ese momento. Se hademostrado que la utilización de las reglas expertaspara la aplicación de una u otra estrategia, permiteutilizarlas correctamente, con lo que se mejora elrendimiento del proceso.
Utilizando distintas estrategias de operación se haobtenido una mejora global en la eliminación denitrógeno. Esta mejora ha sido superior al 16 % encuanto a eliminación por unidad de biomasa, y se haobtenido una disminución en el vertido de nitrógenosuperior al 46 %.
Además de las mejoras de eliminación, ha mejoradola fiabilidad del proceso, ya que han sidoimplementadas las acciones correctoras posiblescuando se ha detectado algún problema deoperación.
Como conclusión final, se puede ! afirmar que el sistema de control
supervisor desarrollado es una herramienta válida para el control y
gestión en tiempo real de plantas depuradoras, que permite la mejora
de los procesos de depuración biológica, en cuanto a fiabilidad de
operación, mejora del rendimiento de eliminación y reducción del
coste energético necesario para obtener un determinado grado de
depuración. Se ha demostrado í que el sistema es fácilmente
implementable en una EDAR real, mejorando la visión general delproceso y de los problemas de operación al operador experimentado,
así como el aprendizaje a los operadores con poca preparación.
CONCLUSIONES 293
NOMENCLATURA
8 NOMENCLATURA
CONTROL
BCDDCDDDC
GSIHDSE
HTMLIAD
KBKBES
KBSPERL
PIDPLCRTESSBC
SCADA
SESEBC
SSCTCP/IP
PROCESO
AGVCFACOTDBO
DQO
Base ConocimientoDigital Direct ControlDistributed Digital DirectControlGensym Standard InterfaceHerramientas de desarrollo desistemas expertosHyperText Mark-up LanguageInteligencia ArtificialDistribuidaKnowledge BaseKnowledge Base ExpertSystemKnowledge Based SystemPractical Extraction and ReportLanguageProporcional Integral DerivadoProgrammable Logic ControllerReal Time Expert SystemSistema Basado en elConocimientoSistema de Control yAdquisición de DatosSistema expertoSistema Experto Basado en elConocimientoSupervisory Setpoint ControlTransfer Control Protocol /Internet Protocol
Ácidos Grasos VolátilesAnálisis de Flujo ContinuoCarbono Orgánico TotalDemanda Bioquímica deOxígenoDemanda Química de Oxígeno
DSVI
DTOEDAR
FIAIVFD
N/DNKTNTOAF
ODORPOURPHAPHBQEQREORÍQRI/QE
QRE/QE
SBISBRSRTssvSSTSVITCA6c
EPA
IAWQ
Diluted Sludge Volume Index
Demanda Total de OxígenoEstación Depuradora de AguasResidualesAnálisis por inyección en flujoíndice Volumétrico de FangosDiluidosNitrificación/DesnitrificaciónNitrógeno Kheldal TotalNitrógeno TotalMicroorganismosAcumuladores de FósforoOxígeno DisueltoOxidation-Reduction PotentialOxygen Uptake RatePolihidroxialcanosPoli-B-hidroxibutiratoCaudal de entrada a la plantaCaudal de recirculación externaCaudal de recirculación internaRelación de recirculacióninternaRelación de recirculaciónexternaíndice biótico de fangos activosSequential Batch ReactorSludge Retention TimeSólidos en Suspensión VolátilesSólidos en Suspensión TotalsSludge Volumen IndexCiclo del Ácido TricarboxílicoTiempo de residencia celularConcentración del parámetro enla entradaEnvironmental ProtectionAgencyInternational Association onWater Quality
NOMENCLATURA 295
BIBL·I
BIBLIOGRAFÍA
9 BIBLIOGRAFIA
/ijidrews JF. Andrews JF, editors. Dynamics andControl of the Activated Sludge Process.Lancaster, Pennsylvania: TechnomicPublishing Company, Inc. 1992; 8,Knowledge-Based (Expert) System for theActivated Sludge Process, p. 231-43.
Andrews JF. Andrews JF, editors.Dynamics andControl of the Activated Sludge Process.Lancaster, Pennsylvania: TechnomicPublishing Company, Inc. 1992; 7, Applicationof Artificial Intelligence (AI) Techniques inActivated Sludge Process Design, Operations,and Control, pp. 207-29.
Anthonisen AC, Loehr RC, Prakasan TBS, andSrineth EG. Inhibition of nitrification byammonia and nitrous acid. J. Wat. Poll. Con.Fed. 48.pp.835-852.(1976).
Antoniou P. Effect of temperature and pH on theeffective maximum specific growth rate ofnitrifying bacteria. Wat. Res. 24. pp.97 (1990).
APHA.Standard methods. 18th ed. AmericanPublishers Health Association. 1993
Aspegren H, Andersson B, Nyberg U, and Jansen Jl.Model and sensor based optimization ofnitrogen removal at klagshamn wastewatertreatment plant. Wat. Sci. Tech. 26. 5-6.pp.!315-1323.(1992)
Astrom KJ and McAvoy TJ. Intelligent control. J.Proc. Cont. 2. 3. pp.H5-127.(1992)
Aynsley M, Hofland A, Morris AJ, Montague GA,and Di Massimo C. Blanch HW, Bungay HR,Cooney CL, et al, editors. Bioprocess Designand Control. Berlin Heildelberg: Springer-Verlag, 1993; 1, Artificial Intelligence and theSupervision of Bioprocesses. (Real-TimeKnowledge-Based Systems and NeuralNetworks), pp 1-27.
¿Jaeza J, Ferreira EC, and Lafuente J. Real-TimeExpert Control of a Pilot WWTP with Nitrogenand Phosphorus Removal.Mota, M. andFerreira, E.G. editors. Departamento deEngenharia Biológica, Universidade do Minho;1998 Jul; Braga, Portugal. 1998; 321 p.BIOTEC'98. Book of abstracts.
Baeza J. Diseño y diseño de un sistema de controlsupervisor y adquisición de datos: Aplicación auna planta piloto depuradora de aguasresiduales urbanas con criterios denitrificación/desnitrificación. Tesis deLicenciatura. Universitat Autònoma deBarcelona. Bellaterra. 1996.
Baeza J, Gabriel D, and Lafuente J. An expertsupervisory system for a pilot WWTP.Environmental Modelling & Software . 14.pp.383-390.(1999)
Balslev P, Lynggaard-Jensen A, and Nickelsen C.Nutrient sensor based real-time on-line processcontrol of a wastewater treatment plant usingrecirculation. Wat. Sci. Tech. 33. 1. pp. 183-192.(1996)
Bañares-Alcántara, R.; Ponton, J.W. ArtificialIntelligence Techniques in ChemicalEngineering Process Design. Applications ofArtificial Intelligence. VII. pp 581-607.(1992)
Barker PS and Dold PL. Denitrification behaviour inbiological excess phosphorus removal activatedsludge systems. Wat. Res. 30. 4. pp.769-780.(1996)
Barnett MW, Patry GG, and Hiraoka M. AndrewsJF, editors.Dynamics and control of theactivated sludge process. Lancaster, LosAngeles: Technomic Publ.Co.1992;Knowledge-based (expert) systems forthe activated sludge process, p. 231-43.
Beck, M.B. Identification, estimation and control ofbiological waste-water treatment processes.IEEE Proceedings. 133, 254-264.(1986)
BIBLIOGRAFÍA 297
DESARROLLO E iMPLEMENTAdÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Belanche LA, Valdés JJ, Comas J, R-Roda I, andPoch M. Towards a model of input-outputbehaviour of wastewater treatment plants usingsoft computing techniques. EnvironmentalModelling & Software. 14. pp.409-419.(1999)
Benefield; Randall. Biological process design forwastewater treatment. Prentince Hall Inc.N.J.I 980.
Berk SG and Gunderson JH. Wastewaterorganisms.A color atlas. Florida: Lewis. 1993.
Béjar J, Cortés U, Sanchez M, Gimeno JM, andPoch M. Applying domain knowledge to thediscovery of operating situations in wastewatertreatment plants. H.Adeli, IEEE ComputerSociety; Los Alamitos, California,U.S.A. 1997;p 360.
Bel M de, Stokes L, Upton J, and Watts J.Applications of a respirometry based toxicitymonitor. Wat. Sci. Tech. 33. 1. pp.289-296.(1996)
Bond AH and Gasser L. A subject-indexedbibliography of distributed artificialintelligence. 1992; 1260 p.
Borer J.AnonymousInstrumentation and contol forthe process industries. London and New York:Elsevier applied science publishers, 1985; 7,Transmission of measured data, pp 123-52.
Brdjanovic D, Slamet A, Van Loosdrecht MCM,Hooijmans CM, Alaerts GJ, and Heijnen JJ.Impact of excessive aeration on biologicalphosphorus removal from wastewater. Wat.Res. 32. 1. pp.200-208.(l 998)
Brenner A. Use of computers for process designanalysis and control: sequencing batch reactorapplication. Wat. Set. Tech. 35. 1. pp.95-104.(1997)
Brett S, Guy J, Morse GK, and Lester JN. Brett S,editor.Phosphorus removal and recoverytechnologies. London, Great Britain: SelperPublications; 1997;
Brouwer H, Bloemen M, Klapwijk B, and SpanjersH. Feedforward control of nitrification bymanipulating the aerobic volume in activatedsludge plants. Wat. Sci. Tech. 38. 3. pp.245-254.(1998)
Bundgaard E, Nielsen MK, and Henze M. Processdevelopment by full-scale on-line tests anddocumentation. Wat. Sci. Tech. 33. 1. pp.281-287.(1996)
Burrell PC, Keller J, and Blackall L. Microbiology ;
of a nitrite-oxidizing bioreactor. Applied and :Environmental Microbiology. May. pp. 1878- j1883.0998)
Cabezut Boo 0 and Sanchez Aguilar A. AKnowledge Base for Wastewater TreatmentPlants: Case of an Activated-Sludge Facility.Expert Systems with Applications. 14. 1.0998)
Cabezut Boo O and Sánchez-Aguilar A. Towards anontology of waste water treatment plants: theidentification phase. Environmental Modelling& Software. 14. pp.401-408.(1999)
Campbell, J. El libro del RS232. Anaya.1988.
Campmajó Riera, C.. Desenvolupament d'un sistemaexpert pel control en temps real d'un procésbiotecnològic. Tesis de Licenciatura.Universitat Autònoma de Barcelona. Bellaterra.1991.
Cerf, V.G. Redes. Investigación y Ciencia.Noviembre, 16-26.0991).
Cao S and Rhinehart RR. A sel-tuning filter. J. Proc.. Co«/.7.2.pp.l39-148.(1997)
Capodaglio AG, Jones HV, Novotny V, and Feng X.Sludge bulking analysis and forecasting:application of system identification andartificial neural computing technologies. Wat.Res. 25. 10.pp.l217.-1224.(1991)
Carlsson H, Aspegren H, and Hilmer A. Interactionsbetween wastewater quality and phosphorusrelease in the anaerobic reactor of the EBPRprocess. Wat. Res. 30. 6. pp. 1517-1527.0 996)
Carrera J. Depuración biológica de nutrientes enaguas residuales urbanas: Estudio de losparámetros operacionales de la eliminación defósforo. Tesis de Licenciatura. UniversidadAutónoma de Barcelona. Bellaterra. 1997
Cartensen J, Harremoës P, and Strube R. Softwaresensors based on the grey-box modellingapproach. Wat. Sci. Tech. 33. 1. pp. 117-126.0996)
Chang WC, Ouyang CF, Chiang WL, and Hou CW.Sludge pre-recycle control of dynamicenhanced biological phosphorus removalsystem: an application of on-line fuzzycontroller. Wat. Res. 32. 3. pp.727-736.(1998)
Charpentier J, Martin G, Wacheux H, and Gilles P.ORP regulation and activated sludge: 15 years
298 BIBLIOGRAFÍA
of experience. Wat. Sci. Tech. 38. 3. pp. 197-208.(1998)
Chuang SH, Ouyang CF, Yuang HC, and You SJ.Evaluation of phosphorus removal inanaerobic-anoxic-aerobic system - viapolyhydroxyalkanoates measurements. Wat.Sci. Tech. 38. 1. pp. 107-114.(1998)
Cohen A, Janssen G, Brewster SD et al. Applicationof computational intelligence for on-linecontrol of a sequencing batch reactor (SBR) atMorrinsville sewage treatment plant. Wat. Sci.Tech. 35. 10. pp.63-71.(1997)
Comeau Y, Hall KJ, Hancock REW, and OldhamWK. Biochemical model for enhancedbiological phosphorus removal. Wat. Res. 20.pp.1511-1521.(1986)
Connell B.AnonymousProcess instrumentationapplications manual. New York: McGraw-Hill,1996; 2, How instruments are selected, p. 17-34.
Copp JB and Dold PL. Confirming the nitrate-to-oxygen conversion factor for denitrification.Wat. Res. 32. 4. pp.!296-1304.(1998)
Çakici A and Bayramoglu M. An approach tocontrolling sludge age in the activated sludgeprocess. Wat. Res. 29. 4. pp.!093-1097.(1995)
.L/emoulin G, Goronszy MC, Wutscher K, andForsthuber ECO-current nitrification/denitrification and biological P-removal incyclic activated sludge plants by redoxcontrolled cycle operation. Wat. Sci. Tech. 35.1. pp.215-224.( 1997)
Delwiche C.C. The nitrogen cycle. Scientific Am.223.3. pp 137-146. (1970)
Dochain D and Perrier M. Control design fornonlinear wastewater treatment processes. Wat.Sci. Tech. 28. 11-12. pp.283-293.(1993)
.C/PA. Ambient water quality criteria fo ammonia-1984. Washington, DC. U.S. EPA. 1985;EPA/440/5-85/001.
EPA. Ambient water quality criteria for ammonia(saltwater) - 1989. Washington, D.C. U.S.EPA. 1989; EPA/440/5-88/004.
EPA.Manual of Nitrogen Control. EPA/625/R-93/010 ed. Washington, U.S.A. U.S.Environmental Protection Agency; 1993;
BIBLIOGRAFÍA
P olger, H.S. Elements of Chemical ReactionEngineering. Englewood Cliffs,N.J.1990
Forty TR. Nutrient control in Okanagan Valleylakes. Water Quality International.November/December, pp.51-54.( 1998)
Froment, G.F.; Bischoff, K.B. Chemical ReactorAnalysis and Design. Wiley. New York,US A. 1990.
Fu CS and Poch M. System indentiflcation and real-time pattern recognition by neural networks foran activated sludge process. Environmentinternational. 21. pp.57-69.(1995)
Fuente MJ, Vega P, Zarrop M, and Poch M. Faultdetection in a real wastewater plant usingparameter estimation techniques. Control Eng.Practice. 4. pp.!089-1098.(1996)
\Jabriel D, Baeza J, Valero F, and Lafuente J. Anovel FIA configuration for the simultaneousdetermination of nitrate and nitrite and its usefor monitoring an urban waste watertreatmment plant based on N/D criteria.Analytica Chimica Acta. 359. pp. 173-183.(1998)
Gabriel D. Disseny i automatització d'un sistema demonitorització de nitrats, nitrits i amonimitjançant tècniques d'anàlisi en flux:Aplicació a una planta pilot depuradorad'aigües residuals urbanes amb criteris deNitrificació/Desnitrificació. Tesis deLicenciatura. Universitat Autònoma deBarcelona. Bellaterra. 1996.
Gacot, R.; Smith, B. Tapping into Sockets. Byte.March, 261 -268.( 1992).
Gall RAB and Patry GG. Patry GG, Chapman D,editors.Dynamic modeling and expert systemsin wastewater engineering. Chelsea: Lewis,1989;Knowledge-based system for thediagnosis of an activated sludge plant, p. 193-240.
Gensym. G2 reference manual version 4.0. Gensymcorporation: Cambridge; 1995;
Gensym. G2-Standard Interface. User's manualversion 3.2. Cabridge, MA: Gensymcorporation; 1995;
Gensym. G2-Gateway, bridge developer's guideversion 5.0. Cabridge, MA: Gensymcorporation; 1997;
BIBLIOGRAFÍA 299
DESARROLLO E IMPLEMEMTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Gensym. G2 reference manual versión 5.0. GensymCorporation: Cambridge; 1997;
Gernaey K, Vanrolleghem P, and Verstraete W. On-line estimation of Nitrosomonas kineticparameters in activated sludge samples usingtitration in-sensor-experiments. Wat. Res. 32. 1.pp.71-80.(1998)
Giroux ÉY, Spanjers H, Patry GG, and Takàcs I.Dynamic modelling for operational design of arespirometer. Wat. Sci. Tech. 33. 1. pp.297-309.(1996)
Givens, S.W.; Gelman, S.R.; Brown, E.V.; LeslieGrady, C.P.; Skedsvold, D.A. Biologicalprocess design and pilot testing for a carbonoxidation, nitrification, and denitrificationsystem. Environmental Progress. 10,2, 133-146.(1991)
Grijspeerdt K and Verstraete W. A sensor for thesecondary clarifier based on image analysis.Wat. Sci. Tech. 33. 1. pp.61-70.(1996)
Guang D, Wiley DE, Hlavacek M, and Fane G. On-line automatic sampling for real timemonitoring of wastewaters. Wat. Res. 30. 11.pp.2651-2654.( 1996)
rdarremoës P, Haarbo A, Winther-Nielsen M, and
Thirsing C. Six years of pilot plant studies fordesign of treatment plants for nutrient removal.Wat. Sci. Tech. 38. 1. pp.219-226.( 1998)
Harremoës P and Sinkjaer O. Kinetic interpretationof nitrogen removal in pilot scale experiments.Wat. Res. 29. 3. pp.899-905.(1995)
Hack M and Kòhne M. Estimation of wastewaterprocess parameters using neural networks. Wat.Sci. Tech. 33. I.pp.l01-115.(1996)
Hitzmann B, Lübbert A, and Schügerl K. An ExpertSystem Approach for the Control of aBioprocess. I: Knowledge Representation andProcessing. Biotechnol. Bioeng. 39. pp.33-43.(1992)
Hoen K, Schuhen M, and Kòhne M. Control ofnitrogen removal in wastewater treatmentplants with predenitrification, depending on theactual purification capacity. Wat. Sci. Tech. 33.l.pp.223-236.(1996)
Horan NJ and Eccles CR. The potential for expertsystems in the operation and control ofactivates sludge plants. Process Biochemestry.June, pp.81-85.(1986)
CLIP: Computer Logic Input Program.
User's Manual. IDEC. 1992.
Isaacs S and Temmink H. Experiences withautomatic N and P measurements of anactivated sluge process in a researchenvironment. Wat. Sci. Tech. 33. 1. pp. 165-173. (1996)
Jenkins D, Richard MG, and Daigger GT.Manual
on the causes and control of activated sludgebulking and foaming. Michigan: Lewis; 1993;
Jennings NR. Cooperation in industrial niulti-agentsystems. New Jersey, NJ. World Scientific Pub.Co. 1994; World Scientific Series in ComputerScience 43
Jennings NR and Mamdani EH. Using jointresponsibility to coordinate collaborattiveproblem solving in dynamic environments.MIT Press; San José, California. 1992; 269 p.
Johansen NH, Anderen JS, and la Cour Jansen J.Optimum operation of a small sequencingbatch reactor for BOD and nitrogen removalbased on on-line OUR calculation. Wat. Sci.Tech. 35. 6. pp.29-36.(1997)
Jones M and Stephenson T. The effects oftemperature on enhanced biological phosphateremoval. Environment Technology. 17. pp.965-976.(1996)
JVanaya T, Hirabayashi K, Fujita I, and Tsumura
K. Detection of unusual data in onlinemonitoring of wastewater processing. Wat. Sci.Tech. 33. 1. pp.71 -79.( 1996)
Kernighan B.W.; Ritchie, D.M. The C programmingLanguage. 2a ed. Prentince Hall Inc.Englewood Cliffs, N.J.1988.
Klapwijk A, Brouwer H, Vrolijk E, and Kujawa K.Control of intermittently aerated nitrogenremoval plants by detection endpoits ofnitrification and denitrification usingrespirometry only. Wat. Res. 32. 5. pp. 1 700-1703 .(1998)
Knight GC, Serviour EM, Serviour RJ et al.Development of the microbial community of afull scale biological nutrient removal activatedsludge plant during start-up. Wat. Res. 29. 9.pp.2085-2093.(1995)
300 BIBLIOGRAFÍA
Kolkwitz R and Marsson M. Òkologie der tierischesaprobien. Beitràge zur Lehre von derbiologische gewasserbeurteilung. Int Revue gesHydrobiol 2. pp.!26-162.(1935)
Kong Z, Vanrolleghem P, Willems P, and VerstraeteW. Simultaneous determination of inhibitionkinetics of carbon oxidation and nitrificationwith a respirometer. Wat. Res. 30. 4. pp.825-836.(1996)
Konstantinov KB, Aarts R, and Yoshida T. BlanchHW, Bungay HR, Cooney CL, et al, editors.Bioprocess Design and Control. BerlinHeildelberg: Springer-Verlag, 1993; 6, ExpertSystems in Bioprocess Control, RequisiteFeatures, p. 169-91.
Konstantinov KB and Yoshida T. Real-TimeQualitative Analysis of the Temporal Shapes of(Bio)process Variables. AIChE Journal. 38. 11.pp. 1703-1715.(1992)
Konstantinov KB and Yoshida T. Knowledge-BasedControl of Fermentation Processes. Biotechnol.Bioeng. 39. pp.479-486.(1992)
Krichten DJ, Wilson KD, and Tracy KD. ExpertSystems Guide Biological PhosphorusRemoval. Water Environment & Technology.October. pp.60-64.( 1991)
Krowidy, S.; Wee, W.G. Wastewater TreatmentSystems from Case-Based Reasoning. MachineLearning. 10, pp 341 -346.( 1993)
Krowidy, S.; Wee, W.G.; Summer, R.S.; Coleman,J.J. An A-I aproach for wastewater treatmentsystems. Journal of Applied Intelligence. 1, pp247-261.(1991)
Kuhn, T.S. The Structure of Scientific Revolutions.University of Chicago Press. 1962
JUapointe J, Marcos B, Veillette M, Laflamme G,and Dumontier M. Bioexpert: an expert systemfor wastewater treatment process diagnosis.Computers chem. Engng. 13. 6. pp.619-630.(1989)
Leeuw EJ, Kramer JF, Bull BA, and WijchersonMH. Optimization of nutrient removal with on-line monitoring and dynamic simulation. Wat.Sci. Tech. 33. l.pp.203-209.(1996)
Leu H-G, Lee C-D, Ouyang CF, and Tseng H-T.Effects of organic matter on the conversionrates of nitrogenous compounds in a channel
BIBLIOGRAFÍA
reactor under various flow conditions. Wat.Res. 32. 3.pp.891-899.(1998)
Liebmann H. Fisher G, editor.Handbuch derFrischwasser und abwasserbiologic. Jena:1962;
Lindberg C. Control and estimation strategiesapplied to the activated sludge process UppsalaUniversity, Departament of Materials Science,Systems and Control Grup; 1997; 1 p.
Lindberg C and Carlsson B. Estimation of therespiration rate and oxygen transfer functionutilizing a slow DO sensor. Wat. Sci. Tech. 33.l.pp.325-333.(1996)
Lindberg C and Carlsson B. Adaptive control ofexternal carbon flow rate in an activated sludgeprocess. Wat. Sci. Tech. 34. 3-4. pp. 173-180.(1996)
Lo, C.K.; Yu, C.W.; Tarn, N.F.Y.; Traynor, S.Enhaced nutrient removal by oxidation-reduction potential (ORP) controlled aerationin a laboratory scale extended aerationtreatment system. Wat. Res. 28, 10, 2087-2094.(1994)
Londong J and Wachtl P. Six years of practicalexperience with the operation of on-lineanalysers. Wat. Sci. Tech. 33. 1. pp.159-164.(1996)
Luyben, W.L. Process Modeling Simulation andControl for Chemical Engineers. 2a ed.Mc.Graw Hill Publishing Co.. New York,USA. 1990
Lynggaard-Jensen A, Eisum NH, Rasmussen I,Svankjaer Jacobsen H, and Stenstrom T.Description and test of a new generation ofnutrient sensors. Wat. Sci. Tech. 33. 1. pp.25-35.(1996)
IVladoni P. A sludge biotic index (SBI) for theevaluation of the biological performance ofactivated sludge based on the microfaunaanalysis. Wat. Res. 28. pp.67-75.(1994)
Maeda, K. An Intelligent Decision Support Systemfor Activated Sludge Wastewater TreatmentProcess. Instrumentation and control of waterand wastewater treatment and transportsystems.(1985).
Maeda, K. A knowledge-based system for thewastewater treatment plant. Future GenerationComputer Systems. 5, pp 29-32. (1989)
BIBLIOGRAFÍA 301
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
Manesis SA, Sapidis DJ, and King RE. Intelligentcontrol of wastewater treatment plants.Artificial Intelligence in Engineering. 12.pp.275-281.(1998)
Martinelle K and Hàggstrôm L. On the disociationconstant of ammonium: effect of using anincorrect pKa in calculations of the ammoniaconcentration in animal cell cultures.Biotechnol. Tech. 11. 8. pp.549-551.(1997)
McCarty PL and et al. Sources of nitrogen andphosphorus supplies. JAWWA. 59. 344.(1967)
Menzl S, Stühler M, and Benz R. A self adaptivecomputer-based pH measurement and fuzzy-control system. Wat. Res. ' 30. 4. pp.981-991.(1996)
Metcalf and Eddy. McGraw-Hill, editor.Ingenieriade aguas residuales.Tratamiento, vertido yreutilización. 3rd éd. Madrid: 1995;
Mino T, Arun V, Tsuzuki Y, and Matsuo T.Ramadori R, editors.Biological phosphateremoval from wastewaters. 1987;Effect ofphosphorus accumulation on acetatemetabolism in the biological phosphorusremoval process, p. 27-38.
Momba MNB and Cloete TE. The relationship ofbiomass to phosphate uptake by AcinetobacterJunii in activated sludge mixed liquor. Wat.Res. 30. 2. pp.364-370.(1996)
Moreno, R.. Estimación de estados y controlpredictivo del proceso de fangos activados.Bellaterra.(1994)
Moreno R, de Prada C, Lafuente J, Poch M, andMontague GA. Non-linear predictive control ofdissolved oxygen in the activated sludgeprocess. Colorado. 1992; 289 p.
Morley RE and Schelberg C. An analysis of a plant-specific dynamic scheduler. Proceedings ofNSF Workshop on Dynamic Scheduling.Cocoa Beach, FL. 1993;
Moulin B and Chaib-Draa B. Jennings NR,editors.O'Hare, G.M.P. New York: Wiley,!,1996;An overview of distributed artificialintelligence, p. 3-55.
Muller A, Marsili-Libelli S, Aivasidis A, Lloyd T,Kroner S, and Wandrey C. Fuzzy control ofdisturbances in a wastewater treatment process.Wat. Res. 31. 12. pp.3157-3167.(1997)
JNielsen MK and Ônnerth TB. Strategies forhandling of on-line information for optimisingnutrient removal. Wat. Sci. Tech. 33. 1. pp.211-222.(1996)
vJ'Neill M and Horan NJ. Achievig simultaneousnitrification and denitrification of wastewaterat reduced cost. Wat. Sci. Tech. 32. 9-10.pp.303-312.(1995)
Ozgur NH and Stenstrom MK. KBES for processcontrol of nitrification in activated sludgeprocess. Journal of EnvironmentalEngineering. 120. 1. pp.87-107.( 1994)
Ônnerth TB, Nielsen MK, and Stamer C. Advancedcomputer control based on real and softwaresensors. Wat. Sci. Tech. 33. 1. pp.237-245.(1996)
1 arunak HVD. Jennings NR,editors.O'Hare.G.M.P. New York: Wiley,J.1996;Applications of distributed artificialintelligence in industry, p. 139-64.
Parry GG and Barnett MW. Innovative computingtechniques for development of an integratedcomputer control system. Wat. Sci. Tech. 26. 5-6.pp.l365-1374.(1992)
Paul E, Plisson-Saune S, Mauret M, and Cantet J.Process state evaluation of alternating oxic-anoxic activated sludge using ORP, pH andDO. Wat. Sci. Tech. 38. 3. pp.299-306.(1998)
Pedersen, K.M.; Kümmel, M.; Soeberg, H.Monitoring and control of biological removalof phosphorus and nitrogen by flow-injectionanalysers in a municipal pilot-scale waste-water treatment plant. Analytica Chimica Acta.238, pp 191-199. (1990)
Plisson-Saune S, Capdeville B, Mauret M, DeguinA, and Baptiste P. Real-time control ofnitrogen removal using three ORP bendig-points: signification, control strategy andresults. Wat. Sci. Tech. 33. 1. pp.275-280.(1996)
Poch, M.; Lafuente, J.; Sánchez, M.; Cortés, U.;Tomás, R. Los sistemas expertos aplicados alas estaciones depuradoras de aguas residuales.Tecnología del Agua. Agosto, pp 25-32.(1995)
Poch M, Lamente J, Moreno R, and Iza J. Mejora dela calidad del agua residual en una planta detratamiento de aguas residuales con un
302 BIBLIOGRAFÍA
analizador automático de demanda química deoxígeno (DQO). PROMA; 1997; V Congresode Ingeniería Ambiental.
Poch M, Lafuente J, Sánchez M, Cortés U, andTomàs R. Los sistemas expertos: Una nuevaherramienta para ayudar en la gestión de lasestaciones depuradoras de aguas residuales.Tecnología del agua.(\99$)
Potter TG, Koopman B, and Svonoros SA.Optimization of a periodic biological processfor nitrogen removal from wastewater. Wat.Res. 30. l.pp,142-152.(1996)
Pullammanappallil PC, Svonoros SA, ChynowethDP, and Lyberatos G. Expert system forcontrol of anaerobic digesters. Biotechnol.Bioeng. 58. 1. pp.!3-22.(1998)
Puñal AM. Estratexias para a posta en marcha,operación e control de dixestores anaerobiosDepartamento de Enxeñeria Química de laUniversitat de Compostela; 1999;
Xv-Roda I. Desenvolupament d'un protocol perl'aplicació de sistemes basats en el coneixementa la gestió d'estacions depuradores d'aigüesresiduals urbanes Departament d'Enginyeriaquímica Universitat de Girona; 1998; 11 p.
R-Roda I, Comas J, Sánchez M, Cortés U, LafuenteJ, and Poch M. Specific knowledge basedevelopment to build an expert system forwastewater treatment plant management.Vancouver. 1998;
R-Roda I, Sànchez-Marré M, Cortés U, Lamente J,and Poch M. Case based reasoningsystems:asuitable tool for the supervision ofclomplex processes. Chemical EngineeringProgress. 95. 6. pp.39-45.(1999)
R-Roda Layret, I. Definició d'un sistema basat en elconeixement per el control de plantesdepuradores d'aigües residuals urbanes ambcriteris de Nitrificació / Desnitrifícació. Tesi deLlicenciatura. Universitat Autònoma deBarcelona. Bellaterra. 1994.
Randall CW, Barnard JL, and Stensel HD.Eckenfelder WW, Malina JF, and PattersonJW, editors.Design and retrofit of wastewatertreatment plants for biological nutrientremoval. Lancaster,Pennsylvania U.S.A:Technomic publishing company; 1992;
Rodrigo MA, Seco A, Penya-Roja JM, and Ferrer J.Influence of sludge age on enhanced
BIBLIOGRAFÍA
phosphorus removal in biological systems.Wat. Sci. Tech. 34. 1-2. pp.41-48.( 1996)
Roffel, B.; Chin, P. Computer Control in the ProcessIndustries. Lewis Publishers Inc. 1989.
Oànchez M. DAI-DEPUR: an IntegratedSupervisory Multi-level Architechture forWastewater Treatment Plants [Tesi Doctoral].Departament de Llenguatges i SistemesInformàtics, Universitat Politècnica deCatalunya; 1996; 1 p.
Sánchez M, Cortés U, Béjar J, de Gràcia J, LafuenteJ, and Poch M. Concept formation in WWTPby means of classification techniques: Acompared study. Applied Intelligence. 1.pp.H7-165.(1997)
Sánchez M, Cortés U, Lafuente J, R-Roda I, andPoch M. DAI-DEPUR: an integrated anddistributed architecture for wastewatertreatment plants supervision. ArtificialIntelligence in Engineering. !.. pp.275-285.(1996)
Sanchez M, Cortés U, R-Roda I, Lafuente J, andPoch M. DAI-DEPUR: A distributedarchitecture for wastewater treatment plantssupervision. Artificial Intelligence inEngineering. 10. pp.275-285.(1996)
Sanchez M, Cortés U, R-Roda I, Poch M, andLafuente J. Learning and adaptation inwastewater treatment plants through case-based-reasoning. Microcomputers in CivilEngineering. 12. pp.251-266.( 1997)
Sanchez M, R-Roda I, Poch M, Cortés U, andLafuente J. DAI-DEPUR architecture:Distributed agents for real-time WWTPsupervision and control. IF AC; 1994; Valencia.1994; 147 p. Artificial Intelligence in real timecontrol.
Sánchez, M.; R-Roda Layret, I.; Lafuente, J.; Cortés,U.; Solà, C. Real Time Supervision ofWatewater Treatment Plants: a DistributedApproach. 2nd IF AC Workshop on ComputerSoftware Structures Integrating AI/KBS (CSI-AI/KBS'94). Lund (Sweden). (1994)
Sànchez-Marré M, Cortés U, R-Roda I, and Poch M.Case Learning through a similarity measure forcontinuous domains. Brighton (UK). 1998; p39
Sànchez-Marré M, Cortés U, R-Roda I, and Poch M.Sustainable case learning for continuous
BIBLIOGRAFÍA 303
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
domains. Environmental modelling & software.14. 5. pp.349-357.(1999)
Schlegel S and Baumann P. Requeriments withrespect to on-line analyzers for N and P. Wat.Sci. Tech. 33. 1. pp.l39-146.(1996)
Seborg DE, Edgar TF, and Mellichamp DA.Processdynamics and control. New York: 1989;
Serra P, Lafuente J, Moreno R, de Prada C, andPoch M. Development of a real-time expertsystem for wastewater treatment plants control.Control Eng. Practice. 1. 2. pp.329-335.(1993)
Serra P, Sanchez M, Lafuente J, Cortés U, and PochM. DEPUR: a knowledge based tool forwastewater treatment plants. Engng. Applic.Artif. Intell. 7. 1. pp.23-30.(1994)
Serra P, Sanchez M, Lamente J, Cortés U, and PochM. ISC WAP: A knowledge-based system forsupervisig activated sludge processes.Computers chem. Engng. 21. 2. pp.211-221.(1997)
Shoham Y. Agent-oriented programming. ArtificialIntelligence. 60. 1. pp.51-92.(1993)
Smolders GIF, Klop JM, Jacobs R, Van LoosdrechtMCM, and Heijnen JJ. Metabolic model of thebiological phosphorus removal process:!!.Validation during start-up conditions.Biotechnol. Bioeng. 48. 3. pp.234-245.(1995)
Smolders GJF, Klop JM, Van Loosdrecht MCM,and Heijnen JJ. A metabolic model of thebiological phosphorus removal process: I.Effect of the sludge retention time. Biotechnol.Bioeng.48.1.pp.222-233.(l995)
Sorensen J. Optimization of a nutrient removingwastewater treatment plant using on-linemonitors. Wat. Sci. Tech. 33. 1. pp.265-273.(1996)
Stephanopoulos, G. Chemical Process Control. AnIntroduction to Theory and Practice. PrentinceHall Inc. Englewood Cliffs, N.J. 1984.
Stevens, W.R. Unix networking programming.Prentince Hall Software Series. 1990.
Surmacz-Gorska J, Gernaey K, Demuynck C,Vanrolleghem P, and Verstraete W.Nitrification monitoring in activated sludge byoxygen uptake rate (OUR) measurements. Wat.Res. 30. 5. pp.!228-1236.(1996)
Szafhicki K, Bourgois J, Graillot D, Di Benedetto D,Breuil P, and Poyet JP. Real-time supervision
of industrial waste-water treatment plantsapplied to the surface treatment industries. Wat.Res. 32. 8. pp.2480-2490.(1998)
Szafhicki K and Graillot D. Knowledge-based real-time fault detection and supervision of urbandrainage systems. Automática. 32. 7. pp. 1043-1047.(1996)
1 emmink H, Petersen B, Isaacs S, and Henze M.Recovery of biological phosphorus removalafter periods of low organic loading. Wat. Sci.Tech. 34. 1-2. pp.l-8.(1996)
Termo R and Uronen P. Stock and ConcentrationDynamics of Activated Sludge Processes.IF AC Computer Applications in Biotechnology.pp.287-291.(1998)
Thompson L and Mertz G. Real-time expert systemimplementation at Monsanto-Krummrich.Automática. 29. 5. pp.1177-1183.(1993)
Thomsen HA and Kisbye K. N and P on-line meters:requeriments, maintenance and stability. Wat.Sci. Tech. 33. 1. pp.!47-157.(1996)
Tseng CC, Potter TG, and Koopman B. Effect ofinfluent chemical oxygen demand to nitrogenratio on a partial nitrification / completedenitrification process. Wat. Res. 32. 1. pp. 165-173 .(1998)
Van Vooren L, Willems P, Ottoy JP,Vansteenkiste GC, and Verstraete W.Automatic buffer capacity based sensor foreffluent quality monitoring. Wat. Sci. Tech. 33.1. pp.81-87.0 996)
Vanrolleghem P and Coen F. Optimal design of in-sensor-experiments for on-line modelling ofnitrogen removal processes. Wat. Sci. Tech. 31.2.pp.l49-160.(1995)
Vanrolleghem P, Van der Schueren D, Krikilion G,Grijspeerdt K, Willems P, and Werstraete W.On-line quantification of settling propertieswith in-sensor-experiments in an automatedsettlometer. Wat. Sci. Tech. 33. 1. pp.37-51.(1996)
Verheijen L, Uchiakawa I, Kobayashi T, and Endo I.IMCS (Intelligent Monitoring and Controlsystem) for wastewater-treatment. Budapest.1997; 299 p.
Wacheux H, Million J-L, Guillo C, and Alves E.NH4 automatic analyser for wastewater
304 BIBLIOGRAFÍA
BIBLIOGRAFÍA
treatment plant: evaluation test at laboratoryand field level. Wat. Sci. Tech. 33. 1. pp.193-201. (1996)
Wareham DG, Hall KJ, and Mavinic DS. Real-timecontrol of wastewater treatment systems usingORP. Wat. Sci. Tech. 28. 11-12. pp.273-282.(1993)
Water Environment Federation & American Societyof Civil Engineers. Desing of municipalwastewater treatment plants. Manual ofpractice No. 8. ASCE Manual and Report onEngineering Practice No. 76. WEF / ASCE.Alexandria. New York. 1992.
WPCF (The Water Pollution Control Federation).Nutrient control. Manual of practice FD-7.WPCF. Washington. 1983.
Wentzel MC and Ekama GA. Principles in thedesign of single sludge activated sludgesystems for biological removal of carbon,nitrogen and phosphorus. Valencia, Venezuela.1999; III Simposio internacional sobrepolución de aguas por procesos biológicos.
Wentzel MC, Ekama GA, Dold PL, and MaraisGVR. Biological excess phophorus removal-steady state process design. Water SA. 16.pp.29-48.(1990)
Wentzel MC, Letter LH, Loewenthal RE, andMarais GVR. Metabolic behaviour ofAcinetobacter spp. in enhanced biologicalphosphorus removal-a biochemical model.Water SA. 12.4.(1986)
Wild D, von Schulthes R, and Gujer W. Structuredmodelling of denitrifícation intermediates. Wat.Sci. Tech. 31.2. pp.45-54.(1995)
l u RF, Liaw SL, Chang CN, Lu HJ, and ChengWY. Monitoring and control using on-lineORP on the continuous-flow activated sludgebatch reactor system. Wat. Sci. Tech. 35. 1.pp.57-66.(1997)
o H, Isaacs S, Soeberg H, and Kümmel M. Ananalysis of nitrogen removal and controlstrategies in an alternating activated sludgeprocess. Wat. Res. 29. 2. pp.535-544.(1995)
Zhao H, Mavinic DS, Oldham WK, and Koch FA.Factors affecting phosphorus removal in a two-stage intermittent aeration process treatingdomestic sewage. Wat. Sci. Tech. 38. 1.pp.H5-122.(1998)
Zilio-Grandi F and Szpyrkowicz L. Seasonalphosphorus removal in a phostrip process-II.Phosphorus fractionation and sludgemicrobiology during start-up. Wat. Res. 29. 10.pp.2327-2338.(1995)
BIBLIOGRAFÍA 305
U N I V E R S I T A T AUTÓNOMA DE BARCELONA
D E P A R T A M E N T D ' E N G I N Y E R I A Q U Í M I C AE S C O L A T È C N I C A S U P E R I O R D ' E N G I N Y E R I E S
DESARROLLO EIMPLEMENTACIÓN DE UN
SISTEMA SUPERVISOR PARALA GESTIÓN Y CONTROL
DE EDAR
APÉNDICES
Memoria que para optar al grado dedoctor por la Universitat Autónomade Barcelona presenta
Juan Antonio Baeza Labat
13 de Julio de 1999
U N I V E R S I T A T AUTÒNOMA DE BARCELONA
D E P A R T A M E N T D ' E N G I N Y E R I A Q U Í M I C AE S C O L A T È C N I C A S U P E R I O R D ' E N G I N Y E R I E S
DESARROLLO EIMPLEMENTACIÓN DE UN
SISTEMA SUPERVISOR PARALA GESTIÓN Y CONTROL
DE EDAR
APÉNDICES
Memoria que para optar al grado dedoctor por la Universitat Autónomade Barcelona presenta
Juan Antonio Baeza Labat
13 de Julio de 1999
1 Programa de monitorización y control planta piloto A-l
2 Programa de monitorización y control del sistema analítico A-99
3 Programa del PLC A-155
4 Servidor de datos A-161
5 Comunicación GSI-Servidor de datos A-191
6 Sistema experto A-217
T'PROGRAMA•
***
J!',l>
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZAO
ÓN
Y C
ONT
ROL
PLAN
TA P
ILOTO
DEPURA.C - FUNCIÓN PRINCIPAL DEL PROGRAMA DEPURA.EXE
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 11/12/98
#include "depura.h"
/*Fichero con definiciones generales*/
void main(void)
i/*Lee especificaciones de depura.dat*/
/*Lee el fichero de posible perfil de alimento*/
/*Inicializa los relojes*/
/•Entra en modo gr fico*/
/•Dibuja la pantalla gr fica*/
/'Copyright'/
/*Lectura ficheros de seguridad gr fieos*/
lectura_configuraciont);
lectura_alimentacionO ;
inicializar tiempos O;
modo_grafico();
graf Jbase(};
graf_presentacion(};
seguro_graficas(0) ;
inicializar_variables();
inicio_filtro_digital();
inicia_guardian();
guarda_mensaje( "Inicio programa\t\t\xO");
imprime("Inicio programa\v\v\n\xO");
mensaje_a_SUN("Inicio programa\t\xO");
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
/*Actualiza los gr fieos de pantalla*/
puesta_en_marcha();
planta.variable_actual=3;
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
*/ do{
contador_guardian=0;
actualizar_tiempos(};
/* Actualiza tiempos y detecta tareas */
seleccionar_accion(};
/" Selecciona la acciCn a efectuar */
selectmenu();
graf_reloj();
while (fi =
/* Tratamiento de peticiones de teclado */
/'Gráfica el radar de detección de sobrecargas*/
guarda_mensaje( "Fin programa\t\t\xO");
imprime("Fin programa\v\v\n\xO");
mensaje_a_SUN("Fin programa\t\xO");
finaliza_guardian();
setvideomode( DEFAULTMODE );
/*Acaba con el modo gr fico, pasa a texto*/
/'Función para el tratamiento de peticiones de teclado*/
void selectmenu(void)
i int tecla,i;
int debug=0;
if (planta.variable_actual==20) debug=l;
teclaa_bios_keybrd(_NKEYBRD_READY)
,- /'Comprueba si se ha presionado una tecla*/
if (tecla==0) return;
if (debug)
graf_mensa je ("Tratamiento de petición de teclado"),-
_bios_keybrd(_NKEYBRD_READ); /*Vac;a el buffer, lee el Eltimo carácter*/
APÉN
DICE
S A -
1
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL D
E ED
AR
/*printf("%x\n",tecla);*/
switch(tecla){
/'Actuación en funciín de la tecla presionada*/
case Fl:
/*Cambio del menú de ayuda*/
ayuda++;
if (ayuda==l) graf ayuda_general();
el3e { graf_ayuda_graficas O ;
ayuda=O,•
}break;
case F2:
/*VariaciCn manual de una salida de la placa PCL726*/
graf_actuacion_externa_pcl?26 O ;
break;
case F3:
/'Enciende programa pie*/
plc_on();
break;
case F4:
/*Apaga programa pie*/
plc_off();
break,- graf_control_agitador(1);
break;
case F6:
/'Apaga agitador/es*/
graf_control_agitador(0);
break;
case F7:
/*Parada de emergencia agitadores*/
control_variador( 2 , O };
break;
case F8:
/*Variaci4n velocidad agitadores*/
graf_velocidad_agitadores();
break;
case F9:
/*Eneiende/apaga salida PLC*/
graf_actuacion_externa_salidas();
break;
case ALTQ: /*Salida de programa parando todo*/
pc!726( O,4.OF);
plc_off();
seguro_graficas(1);
fi = 0;
break;
case FIO:
/*Salida del programa dejando PLC encendido*/
/*
pCl726( 0,4.0F);*/
seguro_graficas(1);
fi = 0;
break;
case Fll:
/*Reinicializar todas las variables*/
inicializar_tiemposO ;
reset__control_O2 (O) ;
planta. conexion__SUN=l ;
planta.com_PLC=l;
planta.control_nivel=l;
planta.sondas=1;
alarma (-1)
,-break;
case F12:
inicializar_tiempos() ;
alarma(5);
break;
case ALTC: /*DesconexiCn toma de medidas de las sondas*/
if (planta.sondasosl)
{ planta.sondas=O ;
guarda_mensaje{"Desconexión sondas manual\t\xO");
ielse if (planta.sondas==o)
{ planta. sondas=l
,-guarda_mensaje("ConexiCn sondas manual\t\xO");
}break;
case ÀLTD: /'Salida al DOS*/
dos=l;
salir_al_dos();
dos = O ;
break;
case ALTP:
A-2
APÉNDICES
APÉNDICES. PROGRAMA re MoNrroRiZAdÓ
N Y CONTROL PLANTA PILOTO
if (debug) graf_mensaje("Toma de medidas pHrocon");
for (i=20;i<23;i++)
estado_salida(i,l); /*para leer redox*/
delay (2500);
phrocon_lecturaa();
for (i=20;i<23;i++)
estado_salida(i,0); /*dejatnos
leyendo oxigeno*/
if (debug) graf_mensaje (Tin
toma de medidas pHrocon"};
delay (1600) ;
break;
case ALTS:
if (debug) graf_mensaje("Supervisitn PLC");
supervision_plc();
if (debug) graf_menaaje("Pin supervision PLC");
break;
case ESC:
/*Gr fica copyright*/
graf_presentacion();
break;
case BACKSP:
_clearscreen(_GCLEARSCREEN);
graf base();
break;
case o:
/*Gr fica oxjgeno*/
case O:
planea.variable_actual= 3 ;
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case h:
/*Gr fica pH*/
case H;
planta.variable_actual= 0 ;
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case r:
/*Gr fica redox*/
case R:
planta.variable_actual= 2 ;
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case t:
/*Gr fica temperatura*/
case T:
planta.varíable_actual= i;
graf_nuevo_grafico( planta,variable_actual, planta.escala_actual);
break;
case a:
/*Gr fica mA*/
case A:
planta.variable_actual= 4;
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case e:
/*Cambio de escala*/
case E:
planta.escala_actual++;
if (planta.escala_actual>3) planta.escala_actual=l;
graf_nuevo_grafico( planta.variable actual, planta.escala_actual);
break
,-case NUM1:
/*Gr fica tangue I*/
case NUM1E:
planta.variable_actual= 5;
/*Tanque I*/
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case NUM2:
/*Gr fica tanque 2*/
case NUM2E:
planta.variable_actual= 6;
/*Tanque 2*/
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case NUM3:
/*Gr fica tanque 3*/
case HUM3E:
planta.variable_actual= 7;
./*Tanque 3*/
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case d:
case D:
planta.variable_actual= 20;
graf_nuevo_grafico( planta.variable_actual, planta.escala_actual);
break;
case BARRA:
/*Actualiza el gr fico actual*/
graf_valores_displayO ;
graf_actualizacion_grafico( planta.variable_actual, planta.escala_actual);
break;
case ALTO:
if (p
lan
ta.re
gistro
_O
2=
=l)
APÉNDICES
A - 3
DESARROLLO E IHPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
<if (planta.variable_actuals=20)
graf_mensaje("Registro de datos O2 inactivo");
planta.registro_02=0;
break;
iplanta. registro_02 = l ,-
if (planta.variable_actual==20)
graf__mensaje ("Registro de datos O2 activado");
break;
case ALTF1:
if (planta.PID[0) .activo==l) our_estitnacion (1,1) ;
else our_estimacion(1,0);
break;
case ALTF2:
if (planta.PID[1].activo==l) our_estimacion(2,1);
else our_estimacion(2, 0} ,-
break;
case ALTF3:
if (planta.PID[2] .activo= = l) our_estimacion(3,1);
else our_estimacion(3,0);
break;
/*
Inicializacion de tiempos
*/
void inicializar_tiempos(void)
«define ACTUALIZA(A) planta.A.tiempo=time(NULL)
t_actual=time(NULL);
ACTUALIZA(t_antic);
ACTUALIZA(t_inicio);
ACTUALIZA(t_phrocon);
ACTUALIZA(t_archivo);
ACTUALIZA(t_COntrol_O2);
ACTUALIZA(t_seguro);
ACTUALIZA(t_grafica);
ACTUALIZA(t_actualizacion_matrices);
ACTUALIZA(t_reloj);
ACTUALIZA(t_SUK);
ACTUALIZA(t_pantalla);
ACTUALIZA(t_perfil);
ACTUALIZA(t_OUR);
return ;
i/* Calcula el día actual respecto el d¡a de referencia, 132.
El d;a 1 es el viernes 17 de marzo de 1995
float dia_absoluto(void)
{float dias=0;
time_t t_referencia=3015817200L;
float
dia_referencia=132.OF;
dias= (float) (dia_referencia-t-dif f time (t_actual, t_referencia) /3600.0F/24.0F) ;
return días;
int puesta_en_marcha(void)
(int debug=0, status ;
float mA=O.OP;
char mensaje[100J ;
if (planta.variable_actua1==2O) debug=l;
A-4
APÉNDICES
APÉN
DIC
ES.
PRO
GRA
MA
DE M
ON
ITO
RIZ
ACIÓ
N Y
CO
NTR
OL
PLAN
TA P
ILO
TO
if (debug) graf_mensaje("Inicializando PLC") ;
stiatus=inicializar_plc() ;
/*Inicializa PLC*/
it (debug)
if .(status-!) graf_menaaje ( "Error inicializando PLC")
,-else graf_mensaje ("InicializaciCn PLC OK"),-
if (debug) graf_mensa je (" Inicializando Danfoss") ;
inicializar_variador_f recuencia () ; /*lnicializa los danfoss 2100*/
if (debug) graf_mensaje ( " Inicializaciin Danfoss OK") ;
if (debug) graf_mensaje ("Variando velocidad agitadores"),-
for (i=0; i<2; i++)
í•delay (200)
,-v
ari
ar_
velo
cid
ad
(p
lan
ta. v
elo
cid
ad
[0
] ,
1) ;
de
lay(2
00
) ,-
vari
ar_
velo
cid
ad
(p
lan
ta. v
elo
cid
ad
fl]
, 2
) ;
de
lay
{20
0) ;
vari
ar_
velo
cid
ad
(p
lan
ta. v
elo
cid
ad
[2
] ,
3) ;
de
lay
(30
0)
; -
. .
.control_variador ( 1 ", 0 . ) ;
}
/«Env¡a la velocidad de los tres agitadores dos veces*/
if (debug) graf_mensaje(rlnicio activación PLC");
plc_on();
/«Enciende las salidas del pic e inicia el programa del PLC*/
if (debug)
graf _mensa je ("Programa PLC activado") ;
if (debug)
graf_mensaje ("Inicio abertura v Ivula agua"),-
status = mA_caudal ( "c: \\depura\\v_agua.dat" , planta. caudal_agua, &mA) ;
if (status==0)
í pcl726(0,mA) ;
/*Abre la v Ivula de entrada de agua*/
sprintf (mensaje, " V Ivula de agua abierta: Q * %4 . If ml/min, %4.2f mA",
planta. caudal_agua,mA)
,-if (debug) graf_mensaje (mensaje)
,-
}else if (debug) graf__mensaje { "V Ivula de agua no abierta");
if (debug) graf_mensaje ("RegulaciCn caudal dosificadora 1 (RE)"),-
status o mAjraudal ( "c:\\depura\\bombal.dat" , planta. caudal_RE, 4mA) ;
if (status==0)
{ pcl726(l,mA) ;
/'Regula el caudal*/
sprintf (mensaje, " Caudal recirculaciCn externa: Q = %4.1f ml/min, %4.2f mA" ,
planta .caudal_RE,mA)
,-if (debug) graf_mensaje (mensaje) ;
}else if (debug)
graf_mensaje ("RecirculaciCn externa no regulada");
if (debug) graf_mensaje ("Regulación caudal dosificadora 2 (RI)");
status = mA_caudal( Bc: \\depura\\bomba2 .dat" , planta. caudal_RI, &mA) ;
if (status"0)
í pc!726 (2,mA) ;
/*Regula el caudal*/
sprintf (mensaje, " Caudal recirculaciín interna: Q = %4.1f ml/min, %4.2f niA"
planta. caudal_RI,mA) ;
if (debug) graf_mensaje (mensaje) ;
}else if (debug) graf_mensaje ("Recirculaciín interna no regulada"), •
if (debug)
graf_mensaje ("Supervisiin PLC") ;
supervision_plc () ;
if (debug)
graf_mensaje("Fin supervisitn PLC") ;
if (planta. perfil==D
{ if (debug) graf_mensaje ("Variando alimentación programada1*);
cambiar_alitnentacion() ;
if (debug) graf_mensaje ("Fin variación alimentación11 ) ;
for (i=0,-i<3;i++)
/* ActuaciCn fija de aireación */
if (planta. PIDti] .activo==2)
í medidas [i] .mA=planta.mAti+3] ;
/* Guarda la actuación */
pcl726 {i+3, planta. mA[i+3J );
/* Actuaciin */
APÉN
DICE
S A
- 5
DESA
RRO
LLO
E IM
PLEM
ENTA
QO
N D
E UN
SIS
TEM
A S
UPE
RVI
SOR
PAR
A LA
GES
TIÓ
N Y
CO
NTR
OL
DE E
DA
R
if (debug)
{ sprintf (mensaje, "PID %i desactivado, actuaciín constante de %4.2f mA" ,
i+1, planta. mA[i+3] ) ;
graf_mensa je (mensaje) ;
}
if (debug)
graf_mensaje ("Inicializando sondas") ;
status«inicializar_sondas () ;
/*Inicializa los pHroconia*/
if (debug)
if (status!=3) graf _mensa je { "Error inicializando sondas") ;
else graf_mensaje ("Inicializaciín sondas OK" ) ;
delay(lOOO) ;
return 1 ;
void actualizar tiempos (void)
í «define RELOJ(A.B) if ( (int) dif f time (t_actual, planta. A. tiempo) >=B) planta. A. Cin-1;
struct tm *temps;
t_actual=time(NULL);
/«AC
ali
i empo */
RELOJ ( t_relo j , 1 ) ;
RELOJ ( t_control_O2 , planta . intervalo_control_O2 ) ;
RELOJ(t_actualizacion__tnatrices, 10) ;
RELOJ(t_antic, planta . intervalo_control_nivel) ;
RELOJ (t_phrocon, 30) ;
RELOJ <t_archivo, planta. intervalo_toma_de_datos) ;
RELOJ (t_graf i ca, planta. actual i zacion_graf i ca) ;
RELOJ(t_seguro,600) ;
RELOJ(t_SUH, planta. intervalo_SUN) ;
RELOJ (t_pantal la, 600) ;
RELOJ(t_OUR, planta. intervalo_OUR) ;
planta. t_actual=time (NULL) ;
temps = localtimeí &planta. t_actual ) ;
/*Si el minuto es O y han pasado m s de 100 segundos desde el Eltimo cambio*/
if ( planta. perfil==l &&
temps ->tm__min ==• 0 &&
( int ) dif f t irae(t_actual, planta. t_perf il. tiempo) >100)
planta . t jperf il . f in=l ;
/*,*,,....... ,.*,*.....*.,.it.. >.*......... ...,,,,.....,, ,...,.. ......*....
int seleccionar_accion(void)
í ^define ACTUALIZARÍA) planta. A. tiempo=time (NULL) ; planta . A. f in=0;
int debug=0, status;
if (planta.variable_actual==20) debug=l;
if < planta. t_control_02 . f in==±l &&
planta . sondas ==1)
{ ACTUALIZAR(t_COntrol_O2) ;
if (debug)
graf_mensaje ("Actuaciín control oxigeno"),-
control_oxigeno () ;
if (debug) graf_mensaje("Fin actuaciCn control ox¡geno");
return I ;
}
/*Activa el control de oxigeno*/
if ( planta. t_phrocon. fin==l &&
planta . sondas==l )
í ACTUALIZAR(t_phrocon) ;
if (debug)
graf_mensaje ("Toma de medidas pHrocon");
for (i=.20;i<23;i-t- + ) estado_salida (i , 1 ) ;
/*para leer redox*/
while (di f f time (time (NULL) .planta. t_phrocon. tiempo) <
=-3) selectmenuf) ;
phrocon_rav { ) ;
A-6
APÉNDICES
APÉNDICES. PROGRAMA DE M
ONITO
RIZACIÓN
Y COPÍTRO
L PLANTA PILOTO
estado_salida{i,0);
/*dejamo3 leyendo oxigeno*/
for (i=20;i<23,
phrocon_T();
phrocon_ph();
/*phrocon_lecturas();*/
if (debug) graf_mensaje ("Fin toma de medidas pHrocon"),-
while (di
f f time (time (HULL) .planta. t_phrocon. tiempo) <=8) selectmenuO
,-return 2;
J /«Activa la lectura de valores de los pl·lroconlS*/
if ( planta.t_antic.fin==l &&
planta.control_nivel==l)
íACTUALIZAR(t_antic);
if (debug) graf_mensaje("Supervision PLC");
supervision_plc(};
if (debug) graf_mensaje("Fin supervision PLC");
return 3 ;
}
/*Si la planta est funcionado, activa la supervision del PLC*/
if ( planta.t_actualizacion matrices.fin==l)
íplanta. t_actualizacion__matrices. tiempo+=10;
planta.t_actualizacion_matrices.fin=0;
if (debug) graf_mensaje("Actualización display y matrices"),-
actualizar_matrices_graficas ()
,-graf_valores_display();
return 4;
}
/«Actualiza las matrices gr ficas y display de valores*/
if ( planta.t_SUN.fin==l &&
planta.sondaa==l &&
planta.conexion_SUN==l )
ACTUALIZAR(t_SUN);
if (debug) graf_men3aje("Inicio comunicaci<n SUN");
statua=aockets_pasa_datos();
if (debug)
if (status!=0) graf_mensaje("Comunicación SUN incorrecta");
else
graf_mensaje ( "Comunicación SUN correcta"),-
return 5;
}
/* Transmite datos a la SUN */
if ( planta.t_archivo.fin==l)
ACTUALIZAR(t_archÍvo);
if (debug) graf_mensaje("Archivando datos medida");
archivar_datos_medida();
if (debug) graf_mensaje("Fin archivo datos medida");
return 6 ;
}
/«Almacena los valorea en un fichero*/
if ( planta.t_seguro.fin==l)
ACTUALIZAR(t_seguro);
if (debug) graf_mensaje("Archivando datos de aeguridad");
seguro_graficas(1);
if (debug) graf_mensaje ("Fin archivo datos de
seguridad")
,-return 7;
}
/«Guarda fichero de seguridad con loa valores de las gr ficas*/
if ( planta.t_grafica.fin==l)
íACTUALIZAR(t_grafica);
graf_actualizacion_grafico( planta.variable_actual, planta.escala_actual>;
return 8;
}
/«Actualiza la gr fica en pantalla*/
if ( planta.t_reloj.fin==l )
íACTUALIZAR(t_reloj);
graf_hora() ,-
return 9;
• •
}
/«Actualiza reloj gr fico*/
if ( planta.t_pantalla.£ino=l )
ACTUALIZAR(t_pantalla);
APÉNDICES A
- 7
DESARROLLO
E IMPLEM
EOTACIÓ
N DE UN
SISTEMA SUPERVISO
R PARA LA G
ESTIÓN
Y CONTRO
L DE EDAR
_clearscreen(_GCLEARSCREEN) ;
graf_base ()
;return 10;
}
/*Actualiza toda la pantalla*/
if ( planta. perfil==l &&
planta. t__perf i
l . f in= = l &&
planta.control_nivel==l)
{ACTUALIZAR(t_perfil) ;
if (debug) graf_mensaje ("Variando alimentación programada" ) ;
cambiar_alimentacion ( ) ;
if (debug) graf_mensaje ("Fin variaciín alimentaciCn" } ;
return 11;
if ( planta. conexion_SUN == O &&
di f f time (planta . t_actual, planta. t_SON. tiempo) > 3600 )
planta. conexion_SUN = 1;
if ( planta. t_OUR.fin==l &&
planta . sondas==l &&
planta. OUR == 1 )
íACTUALIZAR (t OUR) ;
if (debug) graf_mensaje("Ini
if (planta.PIDÍO].activo=
planta.PIDIÓ].s
if (planta.PIDÍ1]-a
planta.PIDÍ1].s
if (planta,PID[2].a
planta.PID[2].s
t_poin
tivo==
t_poin
tivo==
t_poin
io estimación consumo ox¡geno") ;
&&=0 . OF) our_estimacion (1,1) ;
=O.OF) our_estimacion(2, 1)
;
=O.OF) our_estimacion(3, 1) ;
delay(3000);
if (debug)
graf_mensaje("Fin inicio estimación consumo ox¡geno">;
return 12;
}
/«Activa la estimación del consumo de oxigeno*/
return O;
ivoid inicializar_variables(void)
í/*int i;
for (i=0;i<3;i++) planta.PIDEi]-activo=l;*/
sprintf (medidas[0].nom, "%s","REACTOR 1");
sprintf (medidas(1].nom, "%s","REACTOR 2");
sprintf (medidas[2].nom, "%s","REACTOR 3");
medidas[OJ.controlador=l;
medidas[1].controlador=2;
medidas[2],controlador=3;
planta.variable_actual=20; /* Gr fico de debug */
planta.escala_actual=l;
planta.control_nivel=l;
planta.sondas=l;
planta.conexion_SUN=l;
planta.com_PLC=l;
planta.intervalo_SUN=30;
planta.registro_O2=0;
planta.alarma=-3 ;
old_intervalo_o2=planta.intervalo_control_02;
iA-8
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
ONT
ROL
PLAN
TA P
ILOTO
DEPURA.H - DEFINICIÓN DE VARIABLES GENERALES PARA EL PROGRAMA DEPURA
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 30/4/97
fi include
Sinclude
«include
Sinclude
«include
«include
«include
«include
«include
ft include
fi include
<stdio.h>
<do3.h>
<bios,h>
<time.h>
<process.h>
<conio.h>
«ctype. h>
<stdlib.h>
<graph.h>
••teclas.h
;;
"nombres.h"
Subrutinas externas necesarias
/* danfoss */
extern void inicializar_variador_frecuencia(void);
extern int variar_velocidad(double velocidad, int variador);
extern int control_variador(int estado, int variador);
extern void graf_control_agitador{int on_off);
extern void graf_velocidad_agitadores(void);
/* pcl?26 */
extern int pcl?26 (int canal, float miliamperios);
extern void graf_actuacion_externa_pc!726(void);
/• pic •/
extern void plc_on(void);
extern void plc_o£f(void);
extern void estado_salida{unsigned int numero, unsigned int off_on);
extern void graf_actuacion externa_salidas(void);
extern void supervision_plc(void);
extern void alarma(int motivo);
extern int inicializar_plc(void);
extern int cambiar_alimentacion(void);
/* crison */
extern int inicializar_sondas(void);
extern void phrocon_lecturas(void);
extern void phrocon_ph(void);
extern void phrocon_T(void);
extern void phrocon_mv (void)
-,
I* cont_oxi */
extern void control_oxigeno(void);
extern void reset_control_02(int reactor);
extern void inicio_filtro_digital(void);
extern void our_estimacion(int reactor, int step);
/* delay */
extern void delay( clock_t wait );
/* gráficos */
extern void
extern void
extern void
extern void
extern void
extern void
extern void
extern void
extern void
extern void
extern void
extern void
extern void
extern void
modo_grafico(void);
graf_colorines(int ordení;
graf_base (void)
,-graf_ayuda_general(void);
graf_ayuda_graficas(void);
graf_reloj(void);
aalir_al_dos(void);
gra
f_v
alo
res,
_d
isp
lay
(v
oid
) ;
actu
ali
zar_
jnatr
ices_
gra
£ic
as
(vo
id)
;g
raf_
ho
ra(v
oid
);g
raf_
actu
ali
zacio
n_
gra
fico
(in
t v
ari
ab
le,
int
escala
);g
raf_
_n
uev
o_
gra
fico
( in
t v
ari
ab
le,
int
esc
ala
) ;
gra
f_p
rese
nta
cio
n(v
oid
);g
raf_
men
saje
(ch
ar
*m
en
saje
);
APÉN
DICE
S A
- 9
DESA
RRO
LLO
E IM
PLEM
ENTA
QO
N D
E UN
SIS
TEM
A SU
PERV
ISO
R P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
OAR
/* ficheros */
extern void lectura_configuracion(void);
extern void lectura_alimentación(void);
extern void archivar_datos__medida (void) ;
extern void fichero_semanal(void);
extern void guarda_mensaje{ char *mensaje);
extern void seguro_graficas(int orden);
/* cliente */
ex
tern
in
t so
cJt
ets
_p
asa
_d
ato
s (v
oid
) ;
ex
tern
in
t m
ensa
je_
a_S
UN
(ch
ar
*m
en
saje
);
/* p
rin
ter
*/
extern void imprime(char "mensaje);
/* calibra */
extern int mA^caudal{ char *fichero, float caudal, float *mA);
/* guardian */
extern void inicia_guardian(void);
extern void finaliza_guardian(void);
/* depura */
void selectmenu(void);
void inicializar_tiempos(void);
float dia_absoluto(void);
int puesta_en_marcha(void);
void actualizar_tiempos(void);
int seleccionar_accion(void);
void inicializar variables(void);
/* depura.c */
time t t_actual;
int £1=1;
/'variable que controla el final del programa*/
int i=0,j=0;
int ayuda=l;
int contador_guardian=0;
int dos=0;
.int old_intervalo_o2;
estado_planta planta;
primera medidas[3];
A-1
0AP
ÉNDI
CES
APÉNDICES. PROGRAMA DE MO
NITORIZACIÔ
N Y CONTROL PLANTA PILO
TO
NOMBRES.H - DEFINICIÓN DE ESTRUCTURAS COMUNES PARA EL PROGRAMA DEPURA
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 21/9/98
typedef struct {
int activo;
float set_point;
float Kc;
float Ti;
float Td;
}controlador ;
typedef struct{
tirae__t t iempo ;
unsigned char fin;
}temporal;
/*Par metros del controlador*/
/* Para activar o desactivar el coi
/*Set point*/
/•Ganancia*/
/•Constante de tiempo integral*/
/•Constante de tiempo derivado*/
typedef struct {
int
carbono;
int
nitrógeno,-float agua;
}alimentación;
typedef struct{
int
/•Par metros del perfil de alimentación*/
/* Intervalo dosificación carbono */
/* Intervalo dosificación nitrógeno */
/* Caudal de agua */
sondas;
/* Para'activar o desactivar la lectura */
int
variadores;
int . control_nivel;
int
conexion_SUN;
int
com_PLC;
int
alarma;
time_t
t_actual
,-temporal
t_reloj;
temporal
t__antic;temporal
t_archivo;
temporal
t_inicio;
temporal
t_control_O2;
temporal
t_actualizacion_matrice3;
temporal
t_phrocon;
temporal
t_intervalo__toma_de_datos ;
temporal
t_gra fica;
temporal
t_seguro;
témpora1
t_SUN;
temporal
t_pantalla;
temporal
t_perfil;
temporal
t_OUR;
controlador
PID[3J;
float
velocidad[3];
float
caudal_agua;
float
caudal_RE;
float
caudal_RI;
int
entradas_plc[16];/*Guarda estado de las entradas*/
int
salidas_plc[24]; /*Guarda estado de las salidas*/
float
mA[6];
/*Guarda miliamperios PCL726*/
int
variable_actual;
int
escala_actual;
int
intervalo_control_O2;
int
intervalo_dosificacion[2];
int
intervalo_limp_do3if[2] ;
int
pistonadas_limp_dosif[2] ;
int
intervalo_control_nivel;
int
intervalo_toma_de_datos;
int
tiempo_purga;
int
duracion_purga;
int
actualizacion_graCica;
int
intervalo_SUN;
int
régi s t ro_O2;
int
intervalo_flojet_on;
int
intervalo_flojet_off ;
int
perfil;
int
intervalo_OUR;
int
OUR;
alimentación alimentot24];
AP
ÉN
DIC
ES
A-1
1
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓ
N Y CO
NTROL DE ED
AR
} es tado__planta
;
typedef struct {
cont roladors */
char nom[10];
int controlador;
float ph;
float temperatura;
float potencial;
float oxigeno;
float mA;
float velocidad;
}primera;
/•Estructura
per
paramètres
referents
als
/•Nom del controlador*/
/•Numero del controlador */
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable*/
A-12
APÉNDICES
APÉNDICES. PR
OGRAMA OE MONTTORIZACIÓN Y CO
MTROI PLANTA PILOTO
TECLAS. H - DEFINICIÓN DE CÓDIGOS DE TECLADO
PROGRAMADOR:
Juan Antonio Baezâ Labat
ULTIMA REVISIÓN: 14/5/98
«define ESC
OxOllB
«define CTRLC
OX2E03
«define CTRLQ
0x1011
«define CTRLBS OxOETF
«define CTRLRET OxICOA
«define CTRLO
OxlSOF
«define ALTO
0x1000
«define ALTP
0x1900
«define ALTS
OxlFOO
«define ALTO
0x2000
«define ALTF
0x2100
«define ALTO
0x2200
«define Al/rc
Ox2E
OO«define ALTN
0x3100
«define
AI/TU
0x3200
«define ALTO
0x1800
«define RETURN
OxlCOD
«define INTRO
OxEOOD
«define BACKSP
OxOEOS
«define TAB
OXOF09
«define BARRA
0x3920
«define AMUNT
OX48EO
«define ABAIX
OxSOEO
«define DRETA
OX4DEO
«define ESQUERRA Ox4bEO
«define INSERT
OX52EO
«define SUPR
OX53EO
«define INICIO
Ox47EO
«define FIN
OX4FEO
«define REPAG
OxSlEO
«define AVPAG
Ox49EO
«define Fl
0x3800
«define F2
OX3COO
«define F3
OX3DOO
«define F4
Ox3EOO
«define F5
0x3 FOO
«define FS
0x4000
«define F7
0x4100
«define F8
0x4200
«define F9
0x4300
«define FIO
0x4400
«define FU
0x8500
«define F12
0x8600
«define ALTF1
0x6800
«define ALTF2
0x6900
«define ALTF3
Ox6AOO
«define ALTF4
OX6BOO
«define ALTF5
OX6COO
«define ALTF6
0x6000
«define ALTF7
OxSEOO
«define ALTF8
OX6FOO
•define ALTF9
0x7000
«define ALTF10
0x7100
«define o
OX186F
«define 0
Oxl84F
«define p
0x1970
«define P
0x1950
«define m
OX326D
«define M
Ox324D
«define
c.
0x1474
«define T
0x1454
«define e
0x1265
«define E
0x1245
APÉNDICES
A - 1
3
DESARROaO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
«define a
OX1E61
«define A
OX1E41
«define r
0x1372
«define R
0x1352
«define h
0x2368
«define H
0x2348
«define d
0x2064
«define D
0x2044
«define NUM1
0x0231
«define NUM2
0x0332
«define NUM3
0x0433
«define NUM1E
OX4FOO
«define HUM2E
0x5000
«define NUM3E
0x5100
A - 14
APÉNDICES
APÉNDICES. PROGRAMA DE MONITORIZAOÓN Y CONTROL PLANTA PILOTO
CALCULO. C - FUNCIONES PARA REALIZAR CÁLCULOS
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 27/10/98
«include <stdio.h>
/•«define TEST*/
int regresion_lineal( float *x, float *y, int n,
float *a, float *b, float *r);
/*•*.**.•.******.**.**.».*«.»•*.*».*.*.,*,**.***.**..***.**»»..*.*******.***/
/* Calcula la regresión lineal con los datos de x e y.
Devuelve ordenada (a),
pendiente (b) y coeficiente correlación (r) */
int regresion_lineal( float *x, float *y, int n,
float *a, float *b, float *r)
ífloat 3umx=O.OF,
sumy=0-0F,
sumxy=0.0F,
sumx2=0.0F,
sumy2=O.OF;
float parcial;
int i ;
if (n<2) return -1;
for (i=0;i<n;i++>
sumx=sum
x+x[í];sum
y=surny+y [i];sum
xy=sum
xy+x[i]*y[i] ;
sumx2=
sumx2+
x[i]*x[i];sum
y2=sumy2+y[ij *
y[i];
parcial=(n*sumx2-sumx*sumx) ;
if (parcial !=0)
*b=(n*sumxy-sumx*suroy)/parcial;
*b=O.OF;
*a=O.OF;
*r=O.OF;
return -1;
*aa(sumy-(*b)*sumx)/n;
parcial=((n*sumx2-sumx*sumx)•(n*sumy2-sumy*sumy));
if (parcial !=0) *r=(n*sumxy-sumx*sumy)*(n*sumxy-sumx*sumy)/parcial;
else *r=0.OF;
return 1;
«ifdef TEST
void main(void)
float misx[5]={l.OF,2.0F,3.0F,4.0F,S.OFj;
float misy[5]={2.OF,4.OF,6.OF,S.OF,10.5FJ;
float a,b,r;
regresion_lineal( misx, misy, 5, &a, &b, &r)
printf("\ta: %f\tb: %f\tr: %f\nn,a,b,r);
«endif
/******
APÉNDICES A
- 15
DE
SA
RR
OaO
E iM
PLE
ME
NTA
dÓN
DE
UN
SIS
TEM
A S
UP
ER
VIS
OR
PAR
A LA
GE
STIÓ
N Y
CO
NTR
OL
DE
ED
AR
CA
LIB
RA
. C
- FU
NC
ION
ES
PAR
A
CA
LIB
RA
DO
S D
OSIFIC
AD
OR
AS
Y A
GU
A
PRO
GR
AM
AD
OR
: Ju
an A
nto
nio
B
aeza
Lab
at
UL
TIM
A
RE
VIS
ION
: 3
0/5
/97
rias a incluir
«include <stdio.h>
«include <io.h>
«include <time.h>
«include <stdlib.h>
«include <memory-h>
«include "nombres.h"
/•«define TEST*/
Subrutinas del fichero
int
mA
cau
dal (
ch
ar
*fic
hero
, flo
at
cau
dal,
float
*mA
)
/******************* variables comunes del program
extern estado_planta planta;
int
mA_caudal( char *fichero, float caudal, float *mA)
FILE *obert;
char lineal 1150);
int numero=0,
punto=0;
int i;
float cal_caudal[25] ,
cal_mA[25] ;
float xl,x2,yl,y2,x;
if ( access(fichero,0) != 0) return -1;
obert=fopen(fichero, "rt" ) ;
memset(lineal,0,sizeof(lineal));
fgets(lineal,sizeof (lineal) ,obert)
,- /* Lee
1 l;nea del
fichero */
sscanf(lineal,"%d",&numero);
for (i=0; i<numero; i+-t-)
{fgets(lineal,sizeof(lineal).obert);
sscanf (lineal,·%flf·. &cal_mMi], ical_caudal [i] ) ;
}fclose(obert);
for (i=0;i<numero;i++)
ii£
(ca
l_c
au
da
l[i]>c
au
da
l)
pu
nto
=i;
bre
ak
;
}
if (p
un
too
nO
) re
turn
-2
;
xl=
cal_
cau
dal(p
un
to-1
];x
2=
cal_
cau
dal{
pu
nto
];y
l=cal_
mA
[pu
nto
-1];
y2
=c
al_
mA
[pu
nto
];x
=cau
dal;
*m
A=
yl+
(y2
-yl)/(x
2-x
l)*(x
-xI);
A - 16
APÉNDICES
********
APÉN
DICE
S. P
ROG
RAM
A DE
MO
NIT
OR
IZAC
IÔN
Y C
ONT
ROL
PLAN
TA P
ILO
TO
retu
rn
0;
t ,
Kifdef TEST
void main (void)
f float a=400'.OF,b=O.OF;
inc retorno;
int i;
a=
10
0.0
F*
i;retomos mA_caudal í "c: \\depura\\bombal .dat" , a, &b) ;
printfC'a: %f\tb: %f\t retorno: %i\n", a,b, retorno) ;
} for (i=0;i<10; Í-I-+)
{a=200.0F*i; "
retorno= mA__caudal( "c : \\depura\\bomba2 .dat" , a, &b) ;
print f ("a: %f\tb: %f\t retorno: %i\nn , a, b, retorno) ;
} for ti=0;i<10; Í++)
{a=50.0F*i;
retorno=- mA_caudal ( "c: \\depura\\v_agua .dat" , a, &b) ;
print f ("a: %f\tb: %f\t retorno: %i\n" , a,b, retorno) ;
ï Î ttendif
/+...*.****„**.*.*****.**»*..***.****+***.**.**»+.**.
APÉN
DICE
S A
-17
DESA
RRO
LLO
E IM
PLEM
ENTA
QO
N O
E UN
SIS
TEM
A S
UPER
VISO
R P
ARA
LA G
ESTI
ÓN
Y C
ON
TRO
L DE
ED
AR
CLIENTE.C - FUNCIONES PARA LA COMUNICACIÓN CON LA SUN
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISION: 24/10/98
«include <stdio.h>
# include <string.h>
«include «memory .h>
# include <process.h
«include <3tdlib.h>
if include
«include
«include
«include
io.h>
conio.h>
time.h>
nombres .h"
«include "c : \sockets\devkit\include\pctcp\types . h"
«include "c-. \sockets\devkit\include\sys\types ,h"
«include "c: \sockets\devkit\include\sys\ioctl .h"
«include "C: \socketa\devkit\include\pctcp\errno.h"
«include "c:\sockets\devkit\include\sys\gocket.h"
«include "c: \socket9\devkit\include\netinet\in.h"
«include "c : \sockets\devkit\include\netdb.h"
/'«include "c: \sockets\devkit\include\arpa\inet .h"*/
«include "c : \sockets\devkit\include\pctcp\pctcp . h"
«include "c: \sockets\devkit\include\pctcp\ipconfig.h"
«include "c: \sockets\devkit\include\pctcp\sockets.h"
«include "c:\3ocketa\devkit\include\pctcp\options.h"
«include "c: \sockets\devkit\include\fcntl ._h"
«include <sys\time.h>
/««define DEPURA
«define TEST
«define extern*/
/* «de fine svrName "eq3.uab.es"
«define svrName "158.109.13.2"
«define Port (ushort) 32323
«define TAMANY 512
«define TAMANY_PETIT 32
«define TAMANY M
100
typedef unsigned short ushort;
typedef unsigned long ulong;
/* Direcciin SUN */
/* Direcciin num,rica SUN */
/* Numero de puerto del socket */
/* Tamaoo del buffer */
/* Tama°o del mensaje cliente */
/* Definición de tipo de variables */
/e********************** subrutinas del fichero *****
int sockets_pasa_datos(void) ;
int sockets_lee_datos_SUN(void);
void medidas_al_buffer(void);
int cambio_consignas(void);
int nuevo9_datos_SUN (void)
,-int mensaje_a_SUN(char 'mensaje);
void medida_a_SUN_varios(char variable, float valor);
int sockets_pasa_datosjpetit(void);
int connectToServer(char *serverName, ushort port);
int discpnnectToServer(int toServerSocket);
void error_send(int errno);
void error_socket(int errno);
void error_connect(int errno);
Sifdef TEST
void main(void);
«define extern
«endif
A-18
APÉNDICES
AP
ÉN
DIC
ES
. P
RO
GR
AM
A D
E M
ON
rTO
RIZ
AC
IÓN
Y C
ON
TRO
L P
LAN
TA P
ILO
TO
ex
tern
u
lon
g
inet_
ad
dr(c
har
'serv
ido
r};
/**
JB*
*/
ex
tern
in
t clo
se(in
t e
lso
ck
et);
/**
JB*
*/
ex
tern
in
t v
aria
r_v
elo
cid
ad
(do
ub
le v
elo
cid
ad
, in
t v
aria
do
r);ex
tern
v
oid
g
uard
a_
tnen
saje (
ch
ar
*m
en
3aje
) ;ex
tern
v
oid
im
prim
e(c
har
«m
en
saje
);ex
tern
in
t m
A_
caud
al ( ch
ar
*fic
hero
, flo
at
cau
dal,
float
*mA
) ,-ex
tern
in
t p
c!7
26
(int
can
al,
floa
t m
iliam
pe
rios);
ex
tern
in
t p
lc_
time
r(int
valo
r, in
t n
um
ero
);exte
rn void
ala
rma(in
t m
otiv
o);
ex
tern
v
oid
g
ra£
_tn
en
saje (c
har
*m
en
saje
);
orau
nes
del
pro
gra
ma
**
**
**
**
**
**
**
**
**
**
/
/*
Varia
ble
a tra
nsm
itir o recib
ir *
/ch
ar
bu
ffer[TA
MA
NY
]¡ch
ar
bu
ffer_p
[TA
MA
NY
_P
ET
IT];
ex
tern
esta
do
_p
lan
ta p
lan
ta;
ex
tern
p
rimera
m
ed
ida
s[3}
;
/****„*.*,.„.*..****.*******,
******.*«.*»*..*.**********.**.****/
/* FunciCn para establecer la comunicación y controlar el env¡o y la
recepciCn de datos */
int sockets_pasa_datos(void)
int toServerSocket = -1;
int i ;
char carácter[1]={'S'};
/* Variables de control */
/* Si la conexifn anterior no ha sido correcta, vuelve */
if (planta.conexion_SUN == 0} return -2;
/* ConexiCn con la SUN */
toServerSocket = connectToServer(svrName, Port);
/* Si la conexiín no es correcta, devuelve -1 */
i f (toServerSocket = = -1)
{ftifdef
DEPURA
printf ("Error en la conexitn\n");
ttendifplanta. conexion_SUN=0
;'guarda_mensaje( "La conexiCn con la SUN no es correcta\t\t\xO");
imprime( "La conexiCn con la SUN no es correcta\v\v\n\xO");
return -1;
Î
ffifdef DEPURAprintf("CONEXIO A %s REALITZADA, %i\n",svrName,toServerSocket);
Sendif
/* Pedimos nuevas consignas */
carácter[Oj « *C';
send (toServerSocket, carácter, sizeof (carácter), O)
,-
recv(toServerSocket, carácter, sizeof(carácter), 0);
if (caracter[0)=='S')
í/*
printf("Tenemos consignas\n");*/
recvítoServerSocket, buffer, sizeof(buffer), 0);
if (cambio_consignas()==l)
{carácter[0]»'O1;
send(toServerSocket, carácter, sizeof(carácter), 0);
/•printf("Consignas correctas\n");*/
carácter[0]='N';
send(toServerSocket, carácter, sizeof(carácter) , 0);
/*printf("Las consignas no son correctas\n");*/
APÉNDICES A
-19
DESARROLLO
E IMPLEM
ENTAQ
ÓN
DE UN SISTEM
A SUPERVISO
R PARA LA G
ESTIÓN
Y CO
NTR
OL DE E
DA
R
/* Introducimos los datos en el buffer */
medida3_al_buffer()
,-
carácter[0]='S';
/* Mandamos una S, queremos establecer los valores, set */
send(toServerSocket, carácter, sizeof(carácter), 0);
/* Mandamos el buffer */
i = send(toServerSocket, buffer, sizeof(buffer), 0);
ttifdef DEPURA
if (io=r-i)
error_send (errno) ;
ttendif
/* Recibimos respuesta */
recv(toServerSocket, carácter, sizeof(carácter), O);
/* Lo env¡a de nuevo si no ha sido bien recibido */
if (caracter[0]!-'O')
ííf i
f de f DEPURA
printf("Recibimos mal\nn);
#endifcarácter [Oj
s» *S • ;sendítoServerSocket, carácter, sizeof(carácter), 0);
send(toServerSocket, buffer, sizeof(buffer), 0);
recv(toServerSocket, carácter, sizeof(carácter), 0);
if (carácter(0]!='0')
/* Si lo recibe mal de nuevo, desconecta */
{(t i
f de f DEPURA
printf("Recibimos mal de nuevo\nn);
Sendif
disconnectToServer(toServerSocket);
return -3;
/* Pedimos desconexitn */
carácter[0J ='F';
sendítoServerSocket, carácter, sizeof(carácter), 0);
disconnectToServer(toServerSocket);
return O ;
j/* Función para pedir las lectura de la SUN */
int sockets_lee datos_SUN(void)
int
toS
erv
erS
ock
et
= -1
;in
t i ,-
ch
ar
ca
rac
ter[l]=
{·R
'};
/* Variables de control */
/* Conexiín con la SUN */
toServerSocket = connectToServer (svrName, Port) ;
/* Si la conexiCn no es correcta, devuelve -I */
if (toServerSocket==-l)
íit i
f de f DEPURA
printf ("Error en la conexiín\n" ) ;
Sendifplanta . conexion_SUN=0 ;
retu
rn
-1;
#ifdef DEPURA
printf ("CONEXIO A %s REALITZADA, %i\n" , avrName, toServerSocket ) ;
Sendif
/* Mandamos una R, queremos leer los valores */
sendítoServerSocket, caràcter, gizeof (caràcter) , 0) ;
A-2
0APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ON
ITO
RIZ
ACIÓ
N Y
CO
NTRO
L PL
ANTA
PIL
OTO
/* Recibimos el buffer */
recvttoServerSocket, buffer, sizeof(buffer), 0);
if (nuevos_datos_SUN()==l)
ífif
de
f D
EPU
RA
pri
ntf
("D
ato
s en
via
do
s p
or
la
SU
N:\
n"
);it en
d i
fC
or
(Í=
0;Í
<3
;i+
+)
prin
tft
"%s\
n",
m
ed
ida
s[i
].n
om
>
;p
rin
tfí
"pH
; %
7.4
f\n
",
me
did
as[i
].p
h
);
prin
tf(
"T:
%7
.4f\
n"
, m
ed
ida
s[i
]-te
mp
era
tura
);
prin
tf(
"mV
: %
7.4
f\n
",
med
idas[i
]-p
ote
ncia
l );
prin
tfí
°O2
: %
7.4
f\n
",
med
idas[i
]-o
xig
en
o
);
prin
tfí
"mA
: %
7.4
f\n
",
me
did
as[
i]-m
A
);
prin
tf(
"V
: %
7.4
f\n
",
med
idas[i
].v
elo
cid
ad
);
}
/* Pedimos desconexión */
carácter[0]='F';
sendttoServerSocket, carácter, sizeof(carácter), 0);
disconnectToserver(toServerSocket);
return 0;
t •
/* Introduce los datos de la estructura medidas en el buffer,
añadiendo un cheksum
*/
void medidas_al_buffer(void)
í str
uct
seg
un
da{
ch
ar
no
m[3
][1
0],
co
ntr
ola
do
r[3
][1
0],
ph
{3
] [1
0],
tem
pera
tura
[3]
[10J
,p
ote
ncia
l[3
] [1
0]
,o
xig
en
o[3
] [1
0] ,
mA
[3]
110]
,v
elo
cid
ad
[3]
[10]
,c
au
da
les[3
][1
0],
set_
po
int_
ox
igen
o[3
] [1
0]
,set_
po
int_
ag
itacio
n[3
][1
0],
en
trad
as_
plc
[16
],sa
lid
as_
plc
[24
],eata
do
s_
vari
os
[20
],ti
em
po
s[1
0][
10
];}
dato
s;
int i;
unsigned long chequeo=OL;
memset(buffer, O, sizeof(buffer));
memset(&datos. O, sizeof(datos));
/* Borra las estructuras */
/*
Intr
od
ucim
os
las
med
idas
en
la
estr
uctu
ra
qu
e p
asa
mo
s a
la
SU
N
*/
for
(i=
0;i
<3
;i+
+)
sp
rin
tf(
da
tos.n
om
[i],
"%
s",
me
did
as[i
].n
om
);
sp
rin
tf(
dato
s.c
on
tro
lad
or[
i],
"%4
i",
med
ídas[i
}.c
on
tro
lad
or
);
sp
rin
tfí
da
tos.p
h[i
],
"%
7.4
fn,
me
did
as[i
].p
h )
;
sp
rin
tfl
dato
s.t
em
pera
tura
[i]
, "
%7
.4f"
, m
ed
idas[i
j.te
mp
era
tura
);
sp
rin
tfí
da
tos.p
ote
nc
ial[
i],
n%
7.4
f",
med
idas[i
}.p
ote
ncia
l );
sp
rin
tf (
d
ato
s -o
xig
en
o [
i] ,
"%
7 . 4
f " ,
med
idas
[i]
.ox
igen
o
) ,-
sp
rin
tfl
da
tos.m
A[i
],
"%
7.4
f",
me
did
as[
i].m
A );
sp
rin
tft
dato
s.v
elo
cid
ad
fi],
"
%7
.4f"
, m
ed
idas[i
]-v
elo
cid
ad
);
sp
rin
tf(
da
tos.s
et_
po
int_
ag
ita
cio
n[i
],
"%
7.4
f",
pla
nta
.velo
cid
ad
[i]
);
sp
rin
tfí
dato
s.s
et_
po
int_
ox
igen
o[i
] ,
"%
7.4
f",
pla
nta
. P
ID[i
] .s
et_
po
int
) ,- AP
ÉNDI
CES
A -
21
DESA
RRO
LLO
E IM
PLEM
ENTA
QO
N D
E UN
SIS
TEM
A S
UPER
VISO
R P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
OE
ED
AR
sprintf( datos.caudales[0], "%7-4f"
sprintf( datos.caudales[1], "%7.4f"
sprintf( datos.caudales[21 , -%7.4f"
planta.caudal_agua);
planta.caudal_RE);
planta.caudal_RI);
for
(i=
0;i
<1
6;i
++
)if
(p
lan
ta.e
ntr
ad
as_
plc
[i]=
=1
) d
ato
s.e
ntr
ad
as_
plc
[i]=
49
;els
e
da
tos-e
ntr
ad
as_
plc
[i]=
48
;
for (i = 0;i<24;i-H->
if (planta.salidas_plc[i]==1) datos.salidas_plc[i]=49;
else datos.salidas_plc[i]=48;
for (i = 0;i<3;i++) datos.estados_varios [i] = (char) (planta.PID[i] .activo+48);
for (i=3,-i<20; i++) datos . estados_varios [i] =48;
sprintf (datos . tiempos [O] , "%4i" , planta. intervalo_SUN) ;
sprintf(datos.tiempos El],"%5i", planta.duracion_purga);
sprintf(datos.tiempos[2],"%4i", planta.tiempo_purga);
sprintf (datos . tiempos [3] , "%4i" , planta . intervalo__dosif i cae ion [0] ) ;
sprintf(datos.tiempos[4],"%4i"
sorintf(datos.tiempos[5],"%4i"
sprintf(datos.tiempos[6] ,"%4i"
planta.intervalo_dosificacion[1]);
planta.intervalo_flojet_on);
planta.intervalo_flojet_off);
for (i=7;i-c9;i + + ) sprintf ( datos .tiempos [i] , "100") ;
sprintf( datos.tiempos[9], "%2i" , planta.alarma);
/* Copiamos la estructura de datos al buffer */
memcpy(buffer, ¿datos, sizeof(datos));
/* Calculamos el cheksum del buffer */
for (i=0;i< (TAMANY-12) ;i-n-J
chequeo+=buf f er [i] ;
/* Introducimos el cheksum como cadena de caracteres en la posiciín 500 */
sprintf(Sbuffer[500],"%lllu",chequeo);
/*•************»******,*******.*******..******,,**.**,****************.**/
/* A partir de las consignas mandadas por la SUN en el buffer, efectua las
acciones necesarias para establecerlas en la planta piloto */
int cambio_consignas(void)
{ struct consignas{
char cambio_oxigeno[3],
cambio_agitacion[3],
cambio_caudales[3],
cambio_tiempos[10] ,
valor_oxigeno[3][10],
valor_agitacion[3][10],
valor_caudales[3][10],
tiempos[10][10],
cambio_variable[20] ,
valor_variable[20] [10] ;
}datos;
unsigned long chequeol=OL,
chequeo2=OL;
int
i ,-
float consigna;
int consignai;
int intervalo;
float tnA=O.OF;
char mensaje[100];
int status=0;
int debug=0;
if (planta.variable_actual«20) debug=l;
for (i = 0,-i< (TAMANY-12) ;i+-t-> chequeol+=buf f er [i] ;
chequeo2= atol(¿buffer[500]);
/* Si falla el chequeo, devuelve un cídígo de error -1 */
if (chequeol!=chequeo2) return -1;
/* Copiamos el buffer a la estructura de datos */
memcpy(¿datos,buffer,sizeof(datos));
A-22
APÉNDICES
APÉNDICES. PROGRAMA DE M
ONITO
RIZACIÓN
Y CONTRO
L PLANTA PILOTO
for (i=0;i<3;i++)
íi f (datos.cambio_oxigeno[i J =
='1' )
if (debug) graf_mensaje("Cambio consigna oxigeno G2">;
consigna = (float) atof(datos,valor_oxigeno{i]);
if ( (consigna <= 10.0) &&
(consigna >= 0.0) )
planta.PID[i].set_point = consigna;
sprintf(mensaje,
"Nueva consigna oxigeno reactor %i: %4.2f ppm", i+l, consigna);
guarda_mensaje( mensaje );
if (datos.cambio_agitacion ti]=='1')
fif (debug) graf_mensaje("Cambio consigna agitación G2n);
consigna = (float) atof(datos.valor_agitacionEil);
if ( (consigna <= 100.0) && (consigna >= 0.0) )
variar_velocidad( consigna, i+l);
planta.velocidad[i]=consigna;
sprintf(mensaje,
"Nueva consigna agitación reactor %i: %4.2f ppm", i+l, consigna);
guarda_mensaje( mensaje );
í
if (datos.cambio caudales [0]=='1')
íif (debug)
graf_mensaje("Cambio consigna caudal G2");
consigna =
(float) atof(datos.valor_caudales[O]);
if ( (consigna <= 500.0) && (consigna >=
0.0) )
ístatus = mA_caudal( "c:\\depura\\v_agua.dath, consigna, &mA);
if (status==0)
íplanta.caudal_agua=consigna;
pc!726 (0,mA)
,- /*Abre la v Ivula de entrada de agua*/
sprintf(mensaje,
"Nueva consigna: v Ivula de agua abierta: Q = %4.If ml/min, %4.2f mA
planta.caudal_agua,mA);
guarda_mensaje( mensaje );
else
guarda_mensaje( "Consigna de caudal de agua recibida incorrecta\t\xO") ;
if (datos . c
ambio_caudales [i]
== ' i
* )(if (debug)
graf_mensaje ("Cambio consigna caudal G2") ;
consigna =
(float) atof ( datos. valor__caudales [1] ) ;
if ( (consigna <= 1000.0) && (consigna
>=» 0.0} )
status = mA_caudal( "c:
\\depura\\bombal.dat11 ,
consigna, &mA) ;
if (status==0)
íplanta. caudal_RE=consigna;
pcl726(l,mA) ;
/«Regula la bombai, RE*/
sprintf (mensaje,
"Nueva consignas bomba RE: Q =
%4.lf ml/min, %4.2f mA
",planta. caudal_RE,mAÍ ;
guarda_mensaje ( mensaje );
}else
guarda_mensaje ( "Consigna de caudal bomba-1 RE recibida incorrecta\t\xO" )
,-
if (datos.cambio_caudales [2]
= =< '
1 ' )
íif (debug)
graf_mensa je ("Cambio consigna caudal G2");
consigna =
(float) atoE (datos. valor_caudales [2]
) ;
if ( (consigna <= 2000.0) && (consigna >= 0.0) )
status = mA_caudal( "c:
\\depura\\bomba2 .dat" , consigna, &mA) ,-
if (status==0)
APÉNDICES A
- 23
DESARROLLO
E IMPLEM
ENTAOO
N DE UN
SISTEMA
SUPERVISOR PARA LA G
ESTIÓN
Y CONTRO
L DE EDAR
planta . caudal_RI=consigna ;
pc!726 (2,mA) ;
/*Regula la bomba2, RI*/
sprintf (mensaje,
"Nueva consigna: bomba RI : Q = %4.1f ml/min, %4.2f mA
" ,
planta. caudal_RI,mA) ;
guarda_mensaje( mensaje );
}else
guarda_mensaje( "Consigna de caudal bomba-2 RI recibida incorrecta\t\xO" ) ;
if (d
ato
s. c
am
bio
_tie
mp
os [O
] o=
'i' ){if (debug)
graf_mensaje(nCambio consigna comunicaciCn G2°);
consignai = a toi (datos. tiempos [0]
) ;
if ( (consignai <= 2000) && (consignai >~ 10) )
íplanta . intervalo_SUN=consignai ;
sprintf (mensaje, " Nueva consigna: intervalo SUN, t = %4i seg" .consignai) ;
guarda_mensaje ( mensaje ) ;
}else guarda_mensaje ( "Consigna intervalo SUN recibida incorrecta\t\xO" ) ;
}if
(dato
s .cam
bio
_tie
mp
os [1
] ==
'!'}{if (debug)
graf_mensaje( "Cambio consigna purga G2") ;
consignai = atoi (datos . tiempos [1]
) ;
if ( (consignai <= 9999) && (consignai >= 0) )
íplanta. duracion_purga consignai;
intervalo=planta . d
uracion_purga ;
plc_timer( intervalo, 3) ;
sprintf (mensaje,
"Nueva consigna: duración purga, t
=• %5i /10 =segn , c
onsignai) ;
guarda_mensaje ( mensaje );
}else guarda_mensaje( "Consigna duracitn purga recibida incorrecta\t\xO" ) ;
}if (datos.cambio_tiempos [2]
oo1 i
' )tif (debug)
graf_mensaje ("Cambio consigna intervalo purga G2") ;
consignai = atoi (datos. tiempos [2]
) ;
if ( (consignai <= 1000) && (consignai >= O) )
{planta . tiempo_purga=consignai ;
intervalo^planta. tiempo_purga*10-planta.duracion_purga;
plc_timer( intervalo, 4) ;
sprintf (mensaje,
"Nueva consigna: intervalo purga, t = %4í seg" , c
onsignai) ;
guarda_mensaje ( mensaje ) ;
ielse guarda_mensaje ( "Consigna intervalo purga recibida incorrecta\t\xO") ;
tif (datos . cambio_tiempos [3] «
' 1 ' )
{if (debug)
graf_mensaje ("Cambio consigna intervalo N G2") ;
consignai = atoi (datos . t
iempos [3]
) ;
if ( (consignai <= 1000) && (consignai >= 1) }
íplanta. intervalo_dosif icacion [O]
«consignai;
intervalo=planta.intervalo_dosificacionlO] *10-1;
if (plc_timer( intervalo, 11)!=0) plc_timer( intervalo, 11);
sprintf (mensaje,
"Nueva consigna: intervalo dosificación N, t - %4i seg" , c
onsignai) ;
guarda_mensaje ( mensaje );
- else guarda_mensaje( "Consigna intervalo dosificaciín N recibida incorrecta\t\xO" ) ;
}if (datos. cambio_tiempos [4]
=='!')
(if (debug)
graf_mensaje ("Cambio consigna intervalo C G2") ;
consignai =
atoi (datos. tiempos [4]
} ;
if ( (consignai <= 1000) 6& (consignai >= 1) )
A-24
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONi
TORi
zAaó
N Y
CON
TROL
PLA
NTA
PILOT
O
í planta.intervalo_dosificacion [1]^consignai;
intervalo=planta.intervalo_dosificacion[1] *10-1;
i£ (plc_timer( intervalo, 13}!=0> plc_timer( intervalo, 13);
sprintf(mensaje,
"Nueva consigna: intervalo dosificaciCn C, t = %4i seg",consignai);
guarda_mensaje( mensaje );
ielae guarda_mensaje( "Consigna intervalo dosificaciCn c recibida incorrecta\t\xO");
}if (datos.cambio_tiempos[S]=='l')
í if (debug)
graf_tnensaje ("Cambio consigna flojet on G2");
consignai = atoi(datos.tiempos[5] ) ;
if ( (consignai <= 30) && (consignai >= 0) )
{ planta.intervalo_flojet_on=consignai;
planta.intervalo_flojet_off=30-planta.intervalo_flojet_on;
intervalo=planta.intervalo_flojet_on*10;
if (plc_timer( intervalo, 30)¡«0) plc_timer( intervalo, 30);
if (plc_timer( intervalo, 32)1=0) plc_timer( intervalo, 32j;
:
intervalo=planta.intervalo_flojet_off*10;
if (plc_timer( intervalo, 31)!=0) plc_timer( intervalo, 31);
if (plc_timer( intervalo, 33)!=0) plc_timer( intervalo, 33);
sprintf(mensaje,
"Nueva consigna: intervalo flojet on, t = %4i seg",consignai);
guarda_mensaje( mensaje );
}elae guarda_mensaje( "Consigna intervalo flojet on incorrecta\t\xO"í ;
)if (datos.cambio tiempos[9]=='1')
{ if (debug)
graf_mensaje("On-off G2");
consignai = atoi(datos.tiempos[9});
if
(consignai ==> 10)
alarma (6) ;
else if
(consignai == 11) alarma(-2);
elae guarda_mensaje( "Alarma SUN incorrecta\t\xO") ;
for (i=0;i<3;i++)
/* Cambio de estado PIDs */
if (datos.cambio_variable[i]=='1')
i consignai
=• atoi (datos . valor_variable [i] ) ;
if (planta.PID[i].activo!=0) /* Si no est
estimando OUR */
( if (consignai == l)
planta.PID[i).activo=l;
sprintf(mensaje,"PID %i activado",i+1);
guarda_mensaje( mensaje };
if (consignai == 2)
planta.PID[i}.activo=2;
sprintf(mensaje,"PID %i desactivado",i+l);
guarda_mensaje( mensaje );
}
for (i-4;i<6;i+t)
/* Cambio de salida PCL726 >/
if (datos.cambio_variable[i]—'1')
{ consigna = (float) atof(datos.valor_variable[ij);
if (consigna >= 4.0 && consigna <= 20.0)
{ pcl726 (i, consigna);
/* Actuación */
sprintf(mensaje,"PCL726 *i, %7.4f mA", i, consigna);
guarda mensaje(mensaje);
ielse guarda_mensaje( "Consigna PCL726 incorrecta\t\xO");
APÉN
DICE
S
A -
25
DESA
RROL
LO E
IMPL
EMEN
TADÓ
N DE
UN
SISTE
MA S
UPER
VISO
R PA
RA LA
GES
TIÓN
Y CO
NTRO
L DE
EDAR
/* Toma el buffer mandado por la SUN y da valores a la estructura
de las medidas */
int nuevos_datog_SUN(void)
{ 81ruc t s egunda{
char nom[10],
controlador[10],
ph[10],
temperatura[10],
potencial[10],
oxigeno[10] ,
mA[10] ,
velocidad[10];
}datos(3];
int
chequeólaOL,
chequeo2=OL;
for
(i=
0,-
i< (
TA
MA
NY
-12)
;i
cheq
ueo
l+=
bu
f f er
[ij
;
chequeo2= atoi (&buf fer (500] );
i f (chequeol«chequeo2 )
printf ("Cheltsum OK\n");
else
{ printf ("Falla el cheksum\n") ;
retu
rn
-1;
mema e t (medidas. O, sizeof (medidas) ) ;
memcpy ( datos, buf fer, sizeof (datos) ) ;
í memcpy (medidas [i] .nom, datos [i] .nom, sizeof (medidas [i] .nom)) ;
medidag[i] .controlador =(short int) atoi (datos [i] .controlador) ;
medidas [i] .ph = (f loatïatof (datos [i] .ph) ;
medidas [i] . temperatura = (float) atof (datos [i] .temperatura) ;
medidas [i] -potencial = (float) atof (datos [i] .potencial) ;
medidas [i] .oxigeno = (float) atof (datos [i] .oxígeno)
,-medidas [i] .mA - (float) atof (datos [i] .mA) ;
medidas[i] .velocidad = (float) atof (datos [i] .velocidad) ;
Î
return 1;
i
/* Variables de control */
int
men
saje
a
S
UN
(ch
ar
*m
en
saje
){ in
t to
Serv
erS
ocíc
et
= -1
;in
t i;
unsigned long chequeo=OL;
char caracter[l]={'M'î;
time_t Itime;
char mensaje_cliente[TAMANY_M];
/*if (planta.conexion_SUN =» 0} return -2;*/
memset(buffer. O, sizeof(buffer));
/* Borra las estructuras */
memset (mensaje_cliente. O, sizeof(mensaje_cliente));
time (Sltime);
sprintf(mensaje^cliente,"%s*s", mensaje, ctime( <ime ));
/* Copiamos el mensaje al buffer */
memcpy(buffer, mensaje_cliente, sizeof(mensaje_cliente)};
/* Calculamos el cheksum del buffer */
A-26
APÉNDICES
APÉNDICES. PROGRAMA DE MO
NITORIZACIÓ
N Y CO
NTROL PLANTA PILO
TO
for (i = 0
;i<(TAMANY-12) ;i + + )
chequeo+=buf f e
r [i]
;
/* Introducimos el cheksum como cadena de caracteres en la posicíín 500 */
sprint f (
¿buffer [500]
, "Illlu" , c
hequeo) ;
/* Conexión con
la SUN
*/
toServerSocket = connectToserver ísvrName, Port) ;
/* Si la conexiín no es correcta, devuelve -1
*/
if ( toServerSocket ==-1)
fftifdef
DEPURA
printf ("Error
en
la conexiínXn"}
,-tenditplanta . c
onexion_SUN=0 ;
return -l;
)else planta. conexion_SUN=l;
ftifdef DEPURA
printf ("CONEXIO A %s REALITZADA, %i\n" , s
vrName, toServerSocket ) ;
ftendif
/* Mandamos una M, queremos mandar mensaje */
send (toServerSocket, carácter, sizeof (carácter) , 0) ;
/* Mandamos el buffer */
sendttoServerSocket, buffer, sizeof (buffer) , 0) ;
/* Recibimos respuesta */
recv(toServerSocket, carácter, sizeof (carácter) , 0)
;/* Lo env¡a de nuevo si no ha sido bien recibido */
if (caractériel ¡='O'}
ícarácter [0]
= 'M' ;sendttoServerSocket, carácter, sizeof (carácter) , o) ;
send {toServerSocket, buffer, sizeof (buffer) , 0) ;
recv( toServerSocket, carácter, sizeof (carácter) , 0)
;if (carácter [0]
¡s'O' }
/* si lo recibe mal de nuevo, desconecta */
disconnectToserver (toServerSocket) ,-
return -3;
/* Pedimos desconexión */
carácter [0]
= ' F
r ;send (toServerSocket, carácter, sizeof (carácter) , 0) ;
disconnectToserver (toServerSocket) ;
return 1;
/* Introduce los datos de la estructura medidas en el buffer,
a°adiendo un cheksum y
llama a otra funciCn que manda los datos */
void medida a SUN varios (char
variable, float valor)
{struct variable_texto{
char
variable [5]
;char
valor [10]
;}var_texto;
int i;
unsigned long chequeo=OL;
memset (buf
fer_p. O, sizeof (buf
f er_p) ) ;
memset (&var_texto, O,
sizeof (var_texto) ) ;
/* Borra las estructuras */
/* Introducimos las medidas en la estructura que pasamos a la SUN */
sprint f ( va r_texto. variable, "%3i" , v
ariable) ;
sprint f ( var_texto. valor, "%9.
5 f n , valor) ;
APÉNDICES A
- 27
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISO
R PARA LA G
ESTIÓN
Y CONTRO
L DE EDAR
/* Copiamos la estructura de datos al buffer */
memcpy(buffer_p, &var_texto, sizeof(var_texto));
/* Calculamos el cheksum del buffer */
for (i=0;i<(TAMANY_PETIT-12);i++> chequeo+=buf f er__p [i]
;
/* Introducimos el cheksum como cadena de caracteres en la posición 20 */
sprintf (&buffer_p [20] ,-"%lllu"
, chequeo)
,-
/* Pasamos los datos a la SUN */
sockets_pasa_datos_petitO ;
í/*******
******
*.*,**************.*****.
********
//* Funcitn para establecer la comunicaciín y controlar el env;o y la
recepción de datos */
int sockets_pasa_datos_petit(void)
int toServerSocket =
-1 ;int
i;
char carácter [1];
/* Variables de control */
if (planta. conexion_SUN == O) return -2;
/* Conexitn con la SUN */
toServerSocket = connectToserver (svrName, Port) ;
/* Si la conexión no es correcta, devuelve -1 */
if (toServerSocket ==-1)
{ftifdef DEPURA
printf ("Error en la conexiín\n" ) ;
ttendif
planta . conexion_SUN=0 ;
guarda_mensaje( "La
conexiCn con la SUN no es correcta\t\t\xO" ) ;
imprime ( "La conexiCn con la SUN no es correct a\v\v\n\xO" ) ;
retu
rn
-1;
(t i f de f DEPURA
printf ("CONEXIO A %s REALITZADA, %i\n", svrName, toServerSocket) ;
ftendif
carácter [0]
=' V ,-
/* Mandamos una V, queremos establecer un valor */
send (toServerSocket, carácter, sizeof (carácter) , 0) ;
/* Mandamos el buffer */
i = sendttoServerSocket, buffer_p, sizeof (buf
fer_p) , 0) ;
ftifdef DEPURA
if (i==-i) error_send(errno) ;
ftendif
/* Recibimos respuesta */
recv (toServerSocket, carácter, sizeof (carácter) , 0)
,-/* LO envja de nuevo si no ha sido bien recibido */
if (caracterfO] lo'O')
í» i f d
e f DEPURA
printf ( "miserver recibe mal\nn) ;
Sendifcaracter[0] ='V' ;
sendttoServerSocket, carácter, sizeof (carácter) ,
0) ;
send (toServerSocket, buffer_p, sizeof (buf
f er_p) ,
recv(toServerSocket, carácter, sizeof (carácter) ,
if (carácter [O]
¡='O' )
/* Si lo recibe mal de nuevo, desconecta •/
«i f d
e f D
EPUR
Ap
rintf ("m
iserv
er
recib
e
ma
l\n"
);ftendif
disconnectToserver (toServerSocket) ;
return -3;
i
A-2
8A
PÉ
ND
ICE
S
•••••••••••••••••••••••••+
*•••+
•••••»
•••+
•
APÉN
DIC
ES.
PRO
GRA
MA
DE M
ON
ITO
RIZ
AOÓ
N Y
CO
NTRO
L PL
ANTA
PIL
OTO
/* Pedimos desconexión */
carácter [01 = ' F
1 ;
send (toServerSocket, carácter, sizeo
disconnectToServer (toServerSocket) ,•
return 0;
r) , 0) ;
/••*•• ........
*•••• ................. ............... ....... ... ....... ...../
/* connectToServer es usada por el cliente para abrir una conexiCn
*/
/*
con el servidor
*/
/.............. ............. ..................... ......... ...........„../
int connectToServer (char *9erverName, ushort port)
struct sockaddr_in serverSockAddr;
int toServerSocket = (-1) ;
ulong hostAddr;
int result = (-1) ;
int error=0;
struct linger{
int l_onof f ;
int l_linger;
}mi_linger;
/* Variable dirección del host remoto */
/* Puntero direcciín del host remoto */
/* Descriptor del socket local */
/* Dirección del host */
/* Supone fallo */
/*
Borra y establece la estructura de la direcciCn del servidor
memset(&serverSockAddr, O, sizeof(serverSockAddr) };
hostAddr = inet_addr (serverName) ;
if ( (long)hostAddr != {long)(-l)}
/* Devuelve la direcciCn */
/* Hay direcciCn */
ttifdef DEPURA
printf (
n\nconnectToServer : se ha obtenido la dirección de %s i es %lx \n", serverName,
hostAddr);
Sendif
memcpyí & {serverSockAddr .sin_addr), &hostAddr, sizeof (hostAddr) ) ,-
else
/* No hay direcciín */
ffifdef DEPURA
printf("\nconnectToServer: no se ha obtenido directamente la direcciín \n" );
«endif
/* Se consulta al servidor de nombres para determinar la direcciCn del host */
serverHostEnt = gethostbyname(serverName); /* Asignación de la direcciín remota */
if(NULL == BerverHostEnt)
{«ifdef DEPURA
fprintf(stderr, "Imposible localizar host \" %s \"\n", serverName};
«endit
goto egress ;
}/* Se copia la direcciín de entrada del host a la estructura del socket */
memcpy(&(serverSockAddr.ain_addr), serverHostEnt->h_addr,serverHostEnt->h_length);
serverSockAddr.sin_family = AF_INET;
/* Asignaciín de direcciones */
serverSockAddr.sin_port = (ushort)htons(port); /* Asignación del puerto */
Se crea el socket
0;
toServerSocket = socket ( AF_INET, SOCK_STREAM, 0) ;
if (toServerSocket == -1)
Sifdef DEPURA
error socket (errno) ;
APÉN
DICE
S A
- 2
9
DESA
RRO
LLO
E IM
PLEM
ENTA
OÓ
N D
E UN
SIS
TEM
A S
UPE
RVI
SOR
PAR
A LA
GES
TIÓ
N Y
CO
NTR
OL
DE E
DA
R
goto egress;
}ftífdef DEPURA
printf("El socket vale %i \n",toServerSocket);
ítendif
if (setsockopt (toServerSocket, SOL_SOCKET, SO_REUSEADDR, "sisi", 4)= = -1)
printf ("Error en setsockopt, reusa\n");
mi_linger.l_onoff=l;
mi_linger.l_linger=10;
if (setsockopt (toServerSocket, SOL_SOCKET, SO_LINGER, (char *} &mi_linger,
sizeof(mi_linger))==-l)
printf ("Error en setsockopt, linger\n")
,-
if (connect(toServerSocket, &serverSockAddr, sizeof(serverSockAddr)) « -1)
{ err
or
= i;
ffif
de
f D
EPU
RA
err
or_
co
nn
ec
t(e
rrn
o);
Sen
dif goto
eg
ress
;}
result n toServerSocket;
egress :
return result;
/* FunciCn para cerrar la conexión con el servidor */
int disconnectToServer(int toServerSocket)
{ int shut,clo;
shut=shutdown(toServerSocket, 2);
clo=close(toServerSocket);
ífifdef DEPURA
if (shut== -1)
printf(" Error en shutdown toServerSocket.\n"
else
printf("Shutdown toServerSocket ok.\n");
if(clo « -1)
printf{"Error en close toServerSocket.\n");
ítendif
return clo;
void error_send(int errno)
switch (errno)
A-30
case EACCES:
printf ("ERROR: EACCESXn");
break;
case EFAULT:
printf ("ERROR: EFAULT\n")¡
break;
case ENOBUF5:
printf ("ERROR: ENOBUFSXn");
break;
case ENOTCONN:
printf ("ERROR: ENOTCONN\n " ) ;
break;
case ENOTSOCK:
printf ( "ERROR: ENORSOCK\n" ) ;
break;
case ESHUTDOWN:
printf ("ERROR: ESHUTDOWN\n") ;
break;
case EHOULDBLOCK:
printf ( "ERROR: EWOLULDBLOCKXn" )
;
APÉNDICES
APÉNDICES. PROGRAMA DE MONITOFUZACION Y CONTROL PLANTA PILOTO
da
tfti] .xf
- d
at£
[i) . lamb
da*
datf [i] .x
* (1
.OF
-datf [i] . lam
bd
a) *d
atf (i] .x
f_o
ld;
da
tfli] .xf_
old
-
da
tflil.xf;
med
idasli] .o
xig
en
o=
datf [i] .x
f;
if (p
lan
ta. ré
gis t ro
_0
2=
=l)
ístream
=
f op
en ( "c
:\\da
tos\\f iltro
O2
.dat" ,
"a+
"};
time
i<im
e) ;t
- lo
caltim
e(
sltitne
),-
for
(i=0
;i<3
;it- + ) fp
rintfl
stream
, "
%6
.4f
" , datf [i] .x
) ;fo
r (i = 0
,-i<3
;i + + ) fp
rintfl
stream
, "
%6
.4f
" ,datf [i] .x
f ) ;fo
r (i=
0;i<
3;i+
+)
fprin
tf ( stre
am
, "
%6
.4f
", datf [i] . lam
bd
a) ;fo
r (i=
0;i<
3;i+
+)
fprin
tf( stre
am
, "
%6
.4f " , d
atf [i] -d
elta
fs) ;for
(i = 0;i<
3,-i+
+)
fprin
tf { stre
am
, "
%6
.4f ", m
edid
as [i] .m
A) ,-
fprin
tf (stre
am
, "
%2d
%0
2d %
02dfp
rintf
( stre
am
, "
\n
") ;t->
tm h
ou
r, t->
tm m
in,
t->tm
sec);
f clo
se (stre
am
) ;
retu
rn
1;
ivoid inicio_filtro_digital(void)
{int i;
for (i=0;i<3;i++)
{da
tf[il .x_
old
=m
ed
ida
s[ij.ox
ige
no
;d
atf[i]-x
f_o
ld=
med
idas[i].o
xig
en
o;
datf [il -E
=0
.5F
;d
atfli]-d
elta
fss.0.1
25
F;
int registro_O2(void)
íint i;
FILE *stream;
struct tm *t;
tirae_t Itíme;
stream = fopen( "c :\\datos\\O2.dat", "a+");
time (ultime);
t =
localtimeí <ime );
for (i=0;i<3;i++) fprintf( stream, " %6.4f ",medidas[i].oxigeno);
for <i=0;i<3;i++) fprintf( stream, "
%6 .4f
",medidas[i]-mA);
fprintf(stream, "
%2d %02d %02d
", t->tm_hour, t->tm_min, t->tm_sec);
fprintf(stream, "%s", ctime(filtime));
fclo
se(stre
am
);
int
co
nta
do
r_o
ur[3
];flo
at
ox
ig[3
][10
];flo
at
t_o
xig
[3][1
0];
time_
t t_
ini_
ou
r[3];
float
ou
r a[3
], o
ur_
b[3
] , o
ur_
r[3];
float
old
^ma [3
] ;flo
at
r_m
inl=
0.7
5F
, r_
min
2 = 0.8
5F
, r_m
in3=.o .7
5F
, b_m
in=O
.OF
, b
_m
ax=
0.0
5F
;
void our estimación(int reactor, int step)
{ch
ar
me
nsa
je[2
00
];
APÉNDICES A
- 35
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓ
N Y CONTROL DE ED
AR
switch(step)ícase 0:
/* Fin estimaciÇn */
planta.PID[reactor-1].activo=l;
/* Activa PID •/
if ( planta.PIDfOJ .activo==l && planta.PID[1].activo==l £,&
planta.PID[2].activo«l)
planta.intervalo_control_O2 = old_intervalo_o2;
/* Recupera intervalo 02 */
medidas[reactor-lj.mA=old_ma[reactor-lj;
/* Recupera Cltima accitn de control */
pcl726 ( {reactor-D+3, old_ma[reactor-1]);
/* Abre la v Ivula
variar_velocidad (planta.velocidad[reactor-1], reactor);
delay(200);
/* Recupera la agitación */
variar_velocidad (planta.velocidad[reactor-1], reactor);
break;
/* Guarda actuación */
case
It
/*
Inic
io estim
ació
n *
/p
lan
ta.P
ID[re
ac
tor-l].a
ctiv
o=
0;
/*o
ld_
ma[re
acto
r-1]=
med
ídas[re
acto
r-1].m
A;
me
did
as[re
ac
tor-l].m
A=
4.0
F;
pc!7
26
((re
ac
tor-1
)+3
, 4
.OF
); /*
C
ierra
la
v
Ivu
la
*/
varia
r_v
elo
cid
ad
(2
5.0
F,
reacto
r);d
ela
y(2
00
); /*
D
ismin
uy
e ag
itació
n
*/
varia
r_v
elo
cid
ad
(2
5.0
F,
reacto
r) ,- /*
D
ismin
uy
e a
gita
ció
n
*/
pla
nta
.inte
rvalo
_co
ntro
l_0
2=
5;
/*
Aum
enta fre
cu
en
cia
lectu
ra
*/
co
nta
do
r_o
ur[re
acto
r-1]=
0;
/*
Resé
tea
co
nta
do
r *
/p
lan
ta.t_
ph
roco
n.tie
mp
o=
pla
nta
.t_actu
al+
45
; /*
E
vita
lectu
ra
pH
roco
n
*/
pla
nta
.t_p
hro
co
n.fin
=0
;m
emset (o
xig
. O, siz
eo
f (ox
ig} ) ,-
/*
Bo
rra d
ato
s an
terio
res
*/
me
mse
t(t_o
xig
,O,siz
eo
f(t_o
xig
));t_
ini_
ou
r[rea
cto
r-1]stim
e(H
UL
L);
/*
Gu
arda
t in
icio
*
/b
reak
;case
2
; /*
R
eg
istro O
UR
*/
switc
h(re
ac
tor){
case
1:
/* R
eacto
r 1
"/
ox
ig[0
][co
nta
do
r_o
ur[0
]J=m
ed
ida
s[0].o
xig
en
o;
/*
Gu
arda
med
ida
*/
t_o
xig
[0][c
on
tad
or_
ou
r[O]]=
(floa
t)difftim
e(tim
e(N
UL
L),t_
ini_
ou
r[0]);
/*
Gu
arda
t m
edid
a *
/if
(co
nta
do
r_o
ur[0
] >
4)
/*
Para
a la
5|
*/
íreg
resio
n_
lineal(
t_o
xig
[0],
oxig
[O],
6,
&(o
ur_
a[0] ) ,
&(o
ur_
b[0
] ) , &
(ou
r_r [0
] ) ) ,-/*
C
alc
ula
n
uev
os
valo
res
*/
ou
r_e
stima
cio
n(1
,0);
/*
Desa
ctiv
a la
estim
ac
ión
*/
sprin
tf(me
nsa
je,
"Nuevo
Q O
2 calc
ula
do
reacto
r 1
: %
6.4
e m
g O
2
/ (1
ou
r_r[0
]);if
(pla
nta
.va
riab
le_
ac
tua
l==
20
) g
raf_
me
nsa
je(m
en
saje
);/*
g
uard
a_m
ensaje(
men
saje );
*/
if (o
ur_
r[0]
> r_
min
l &&
-ou
r__
b[0
] >
b_
min
&& -o
ur_
b[0
] <
b_max
)m
edid
a_a_
SU
K_
vario
s( O
, -o
ur_
b [0
]);sp
rintf(m
en
saje
, "%
6.4
e %
6.4
e", -o
ur_
b[0
], o
ur_
r[0]);
gu
arda_
med
ida(
men
saje, "c
:\\da
tos\\o
url.d
at"
);
/*
sp
rintf(
me
nsa
je,
" %
6.4
f ",m
ed
ida
s[0].o
xig
en
o);
gu
arda_
med
ida (
men
saje, "c : \\d
ato
s\\o
ur-l .d
at" } ,-
*/
bre
ak
;case
2 :
/*
Reacto
r 2 *
/o
xig
tl] [con
tado
r__
ou
r [1] ] =
med
idas [1
] .ox
igen
o;
/*
Gu
arda
med
ida
*/
t_o
xig
[l] [co
nta
do
r_o
ur[1
] ] =(flo
at)d
ifftime
(time
(NU
LL
),t_in
i_o
ur[1
]); /*
G
uard
a t
med
ida
•/if
(co
nta
do
r_o
ur[1
] >
4)
/*
Para
a la
5¡
*/
reg
resio
n_
lineal(
t_o
xig
[i], o
xig
[1],
6,
&(o
ur_
a[l]),
&(o
ur_
b[l]),
&(o
ur_
r [1] ) ) ;/* Calcula nuevos valores */
our_estimacion(2,0);
/* Desactiva la estimación */
sprintf(mensaje,
"Nuevo Q O2 calculado reactor 2: %6.4e mg O2 / (1 s) .
%6.4e", -our_b[0] ,
%6.4e-, -our_b[l] ,
ou
r_r[l]);
A-3
6
if (p
lan
ta.v
aria
ble
_a
ctu
al=
°2
0)
gra
f_m
en
saje
(me
nsa
je);
/*
gu
ard
a_
men
saje
( m
ensaje
);
"/
if (o
ur_
r[l] >
r_m
in2
&& -o
ur_
b[l]
> b m
in &&
-ou
r_b
(l] <
b_max
)m
edid
a_a_
SU
N_
vario
s ( 1,
-ou
r_b
[l] ) ,-sp
rintf(m
en
saje
, "%
6.4
e %
6.4
e", -o
ur_
b[1
], o
ur_
r[1]);
APÉNDICES
APÉN
DICES
. PR
OGRA
MA D
E M
ONrro
RiZA
dÓN
Y CO
NTRO
L PL
ANTA
PILO
TO
gu
ard
a_
med
ida(
me
nsa
je,
"c
:\\d
ato
s\\
ou
r2.d
at"
);}
/*
sp
rin
tf(
me
nsa
je,
" %
6.4
f ",m
ed
ida
s[1
).o
xig
en
o);
gu
ard
a_
med
ida(
me
nsa
je,
"c :
\\d
ato
s\\
ou
r-2
.da
t");
*
/b
reak
;case
3
: /*
R
eacto
r 3 *
/oxig
12]
[co
nta
do
r__
ou
r [2
] ]
=m
edid
as [
2]
.ox
igen
o;
/*
Gu
ard
a m
edid
a *
/t_
ox
ig[2
][c
on
tad
or^
ou
r[2
]]=
(flo
at)
dif
ftim
e(t
ime
(NU
LL
),t_
ini_
ou
r[2
]);
/*
Gu
ard
a t
med
ida
*/
if
(co
nta
do
r_o
ur[
2]
> 4
) /*
P
ara
a
la
5|
*/
{ reg
resi
on
_li
ne
alC
t_
ox
ig[2
],
ox
ig[2
],
6,
&(o
ur_
a[2
]),
&(o
ur_
b[2
]),
&(o
ur_
r [2
] )
) ;
/* Calcula nuevos valores */
our_estimacion(3, 0};
/* Desactiva la estimación */
sprintf(mensaje,
"Nuevo Q 02 calculado reactor 3: %6.4e mg O2 / (1 s) . r: %6.4e", -our_b[2] ,
if (planta.variable_actual==20) graf_mensaje (mensaje)
,-/* guarda_mensaje( mensaje );*/
medida_a_SUN_varios ( 2,
~" -our_b[2])~
sprintf(mensaje, "%6.4e
%6.4e", -ourjb [2], our_r[2]);
guarda_medida ( mensaje, "c.-\\datos\\our3 .dat") ;
}/* sprintf( mensaje, " %6.4f ".medidas[2].oxigeno);
guarda_medida( mensaje, "c:\\datos\\our-3.dat"); */
break;
} contador_our [reactor-1] ++,-
break;
APÉN
DICE
S A
- 3
7
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SISTE
MA S
UPER
VISOR
PARA
LA
GEST
IÓN
Y CO
NTRO
L DE
EDA
R
CRISON.C - FUNCIONES. PARA LA COMUNICACIÓN CON LOS CONTROLADORES DE
SONDAS CRISON-PHROCONia
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 30/4/98
«include <stdio.h>
«include <string.h>
((include <stdlib.h>
«include <bios . h>
«include <conio.h>
«include <dos.h>
«include <math.h>
«include <time.h>
«include "nombres.h"
«define COM4
3«define SETTINGS4 (_COM_9600 | __COM_CHR7 | _COM__STOP1
j _COM_EVENPARITY)
«define DTR
0x01
/* Data Terminal Ready */
«define RTS
0x02
/* Ready To Send */
«define DCOM3
Ox3E8
«define DCOM4
Ox2E8
«define THRE
0x2000
/* Bit 13, Transmission-hold register empty */
/'define TEST*/
/**************».***.*** subrutinas del fichero **************«****«***/
int inicializar_sondas(void);
int recibe(void);
int phrocon_orden(char «orden, char «respuesta);
void phrocon_lecturas(void);
void phrocon_ph(void);
void phrocon_T(void);
void phrocon__mv(void) ;
void phrocon_02(void);
float lectura_ph(void);
float lectura_T(void);
float lectura_mv(void);
void lectura_valores(int sonda);
extern void dec_to_bin(int numero_decimal);
extern float minutos_desde_inicio(void)
,-
/****.**********•*** variables comunes del programa •*******************/
extern estado_planta planta;
extern primera medidas[3];
struct correlacion{
float a;
/* ordenada origen correlación O2-mV */
float b;
/« pendiente correlación O2-mV */
}corr{3];
char entrada[100];
/*Variable de lectura PhroconlS*/
/***...**.*.*.*.****.******..****.*.***..»*..»..***».***.***.**.*****.**.*.**
.*******..*********.********
PHROCON-18
***.*********.*******.**.***•**
**********..****.******.**«•****.***************.*.********.*,**.**.***.****/
/******"********
*****
„.**..********.*
***/
/* Obliga a los pHrocon 18 a leer los dos canales.
A-38
APÉNDICES
APÉNDICES. PROGRAMA DE MONITORIZAOÓN Y CONTROL PLANTA PILOTO
cambia de hold a lectura, reinicializa
*/
int inicializar_sondas(void)
íint sonda,in;
int suma=0;
char obliga_lectura [3J [26]={°
S01I01ClM02WrC2M02WrK3C ",
" S01I02ClM02WrC2M02WrK3D ",
" S01I03ClM02WrC2M02WrK3E "};
in~_bios_serialcom(_COM_INIT, COM4, SETTINGS4);
/"Inicializa el port com.*/
/*fputs(BSTATUS COM4: \t",Stdout);
dec_to_bin(in);*/
for (sonda=0;sonda<3 ; sonda*+)
suma=suma+phrocon_orden(obiiga_lectura[sonda] ,entrada);
return suma;
/
i***.****.*******.*.*.*.*.*****
***..******...»*.*
**/
/* Recibe la respuesta a las Crdenes enviadas a los pHrocon 18
*/
/" La respuesta debe comenzar por un char 5 y acabar por un char 4.
Para evitar el bloqueo si no existe comunicaciÇn, se establecen unos
limites de 15 lecturas para el comienzo y 50 lecturas para el total. */
int recibe(void)
int j =0,error=0;
int kk=0;
_OUtp ( DCOM4 * 4, 0);
memset(entrada,O,sizeof(entrada));
do {error**;
kk=0;
do kk*+;
wh
ile ((0
x1
00
& _bios_serialcom
<_C
OM
_ST
AT
US
, C
OM
4,0))==
0 &&
kk
<3
00
00
);en
trad
a[0
] =
(char)
_in
p
(DC
OM
4) ,-}
wh
ile (e
ntra
da [0
]!=S
&
í e
rror<
15
);if
(erro
r«i5
) re
turn
1;
erro
r=0
;do
{erro
r**
;
kk
=0 ;
do
k
k+
*;
while ((OxlOO & _bios_serialcom(_COM_STATUS, COM4,0))==0 && kk<30000);
entrada[j] = (char)
_inp (DCOM4);
} while (entradatj] i=4
&& error<50) ,-
if (erro
r==
50
) re
turn
2
;
print f ("fc
return 0;
" , entrada) ;
/* Manda una orden a un pHrocon 18 y recibe la respuesta.
La respuesta debe comenzar por un char 5 y acabar por un char 4.
Para evitar el bloqueo si no existe comunicación, se establecen unos
limites de 15 lecturas para el comienzo y 50 lecturas para el total.
Devuelve los siguientes valores:
-1 En 15 lecturas no ha existido un 5 de inicio
-2 En 50 lecturas no ha existido un 4 de finalizaciín
-3 Orden no correcta
-4 Existe respuesta pero no cumple el checksum
1 Existe respuesta y cumple el checksum
int phrocon_orden(char "orden, char "respuesta)
int
j=0,kk=0.
APÉNDICES A
- 39
DESARROLLO E IM
PLEMENTAQ
ON
DE UN SISTEMA SUPERVISOR PARA LA G
ESTIÓN
Y CONTROL DE EDAR
largo,
error=0,
chequeo=0;
char cheksum[3] ;
/"printf("%s\nn,orden);*/
if (strchr(orden,' ')==NULL) return -3;
memset(entrada,O,sizeof(entrada));
/* Para determinar la longitud de la orden */
wh
ile(o
rde
n[j]¡=
4)
JHla
rgo
=j;
_OUtp ( DCOM4 + 4, DTR | RTS );
for (j=0;j<=largo;j**)
_outp ( DCOM4 , orden[j]);
kk=0;
do kk*+;
while ((THRE & _bios_serialcom(_COM_STATUS, COM4,0))==0 && kk<30000);
_OUtp ( DCOM4 +4, O );
do {error*+;
kk=0;
do kk*-»-;
while ((0x100 & _bios_serialcom(_COM_STATUS, COM4,0))«0 G.&
kk<30000) ;
respuesta [OJ
=(char) _inp (DCOM4);
} while (respuesta[0]!=5 && error<15);
if (error==15) return -1 ;
error=0;
do {error**;
J++Í
do kk*+;
while ((0x100 & _bios_serialcom(_COM_STATUS, COM4,0))==0 && kk<30000);
respuesta [j]
=•
(char) _inp (DCOM4) ;
} while (respuesta[j]1=4 && error<50);
if (error=="50)
return -2;
respuesta[j *1]=0 ;
for (kk=0;kk<=j-4;kk+*> chequeo=chequeo*respuesta[xkj;
chequeo=OxFF & chequeo;
sprintf(cheksum,"%02XB,chequeo);
/*p
rintf(
B%
X\t%
B\n
n.ch
eq
ue
o,c
he
ksu
m);
prin
tf ("%a\n
t1, resp
uesta
) ;
if (c
he
ksu
m[0
]==
resp
ue
sta[j-2
] &&
ch
ek
sum
[1]=
=re
spu
esta
[j-lj) re
turn
1;
els
e
retu
rn
-4 ;
/* Pide la lectura de todos los valores de los pHrocon 18.
Si la lectura es correcta llama a una funciCn que transforma la
respuesta en los valores float de la estructura medidas.
void phrocon_lecturas(void)
{int sonda, estado_lectura
,-char salida[3][28]={n S01I01C1M03RM04RC2M03RK53 ",
" S01I02C1M03RM04RC2M03RK54 °,
" S01I03C1M03RM04RC2M03RK55 "};
for (sonda=0;sonda<3;sonda++)
iestado lectura=phrocon_orden( salida[sonda], entrada);
/* Si la lectura phrocon es correcta leemos los valores */
if (estado_lectura==l) lectura_valores(sonda);
A-40
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
onrro
Riz
Adó
N Y
CON
TROL
PLA
NTA
PILO
TO
retu
rn;
) /* Pide la lectura de los valorea de pH de los pHroconlS
Si la lectura 63 correcta llama a una funciín que transforma la
reapuesta en loa valores float de la estructura medidas.
void phrocon__ph(void)
int sonda,estado_lectura;
char aalida_ph[3] [18]={n S01I01C1M03RKD9 ",
11 S01I02C1M03RKDA »,
" SÛ1I03C1M03RKDB •};
for (sonda=0; sonda<3 ,-sonda+ + )
i estado_lectura°phrocon_orden{ salida_ph[sonda], entrada);
/* Si la lectura phrocon es correcta leemos los valores */
íf (estado_lectura==l) medidas[sonda].ph =lectura_ph();
}return;
i /* Pide la lectura de los valores de T de loa pHroconlS
Si la lectura es correcta llama a una funciín que transforma la
reapuesta en los valores float de la estructura medidas.
void phrocon_T(void)
{ int
son
da,e
stad
o_
lectu
ra;
Ch
ar
sali
da_
T[3
] [1
8]=
{n
S01I
01C
1M04
RK
DA
",
11 S0
1I02
C1M
04R
KD
B
","
S01I
03C
1M04
RK
DC
"}
;
for
(so
nd
a=0
;so
nd
a<3
; so
nd
a+ +
){ estado_lectura=phrocon_orden( salida_T[sonda] , entrada);
/* Si la lectura phrocon es correcta leemos los valores */
if (estado_lectura==l) medidas[sonda].temperatura =lectura_T();
}return;
i /* Pide la lectura de los valores de mV de los pHroconlS
Si la lectura es correcta llama a una funciín que transforma la
respuesta en los valores float de la estructura medidas.
void phrocon_mv(void)
{ int sonda,estado_lectura;
char salida_mv[3][18]={" S01I01C2M03RKDA ",
" S01I02C2M03RKDB ",
" S01I03C2M03RKDC "};
for (sonda=O;sonda<3 ; sonda + +}
{ estado_lectura=pnrocon__orden( salida_mv[sonda], entrada);
/* Si la lectura phrocon es correcta leemos los valores */
if (estado_lectura=s>l) medidas[sonda].potencial =lectura_mv();
/* Pide la lectura de los valores de O2 de los pHroconlS.
Primero debe asegurarse que los rel,s correspondientes a las salidas
20 a 22 est n apagados. Despu.s se pide la lectura de los milivoltios.
Si la lectura es correcta llama a una funciín que transforma la
respuesta en valores float. Utilizando la correlaciín itw-O2 se transforma
esa lectura en los valores de 02 de la estructura medidas. Por £ltimo
debe asegurarse que los rel,s quedan encendidos para leer mV.
*/
void phrocon_O2(void)
AP
ÉN
DIC
ES
A -
41
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR
PAR
A LA
GES
TIÓN
Y C
ONTR
OL D
E ED
AR
int
son
da,e
stad
o_
lectu
ra;
flo
at
mvs
O;
char salida__mv [3] [18]={" S01I01C2M03RKDA ",
" S01I02C2M03RKDB ",
" S01I03C2M03RKDC "};
/*for (j=20;j<23;
delay (1500) ;*/
estado_salida { j , 0) ;
for (sonda = 0;sonda<3 ; sonda* + )
( estado_lectura=phrocon_orden ( salida_mv [sonda]
, entrada)
,-/* Si la lectura phrocon es correcta leemos los valores */
if (estado_lectura==l) mv =lectura_mv () ;
else continue;
medidas [sonda] . oxigeno=corr [sonda] .a+corr [sonda] .b*mv;
if (medidas [sonda] .oxigeno < 0.07) medidas [sonda] .oxigenólo;
dela
y(lO
OO
) ;*
/
retu
rn;
y...».*..**.*....*.,,,******»*****»»***»**.*.**.**.*.**,****.*********.*****/
/* Funciín que transforma la respuesta a la peticiín de pH al pHrocon 18
en un valor float que devuelve.
*/
float lectura_ph (void)
int i, inicio, final;
char ph[6] ;
char *ptr, el = 'M
* , c2='p' ;
float valor_medidO;
ptr = strchr (entrada, el) ;
inicio = ptr-entrada+3 ;
ptr = strchr (entrada, c2) ;
final = ptr-entrada;
nicio] =entrada [i]
for (i=0;i<6;i++) ph[i]=' ';
for (i=inicio; i<f inal; i++) ph [i
valor_medido= (float) atof (ph) ;
return valor_medido;
i /* Funciín que transforma la respuesta a la petición de T al pHrocon 18
en un valor float que devuelve.
*/
float lectura_T(void)
íint i, inicio. final;
char TES] ;
char *ptr, el = 'M' , c2= ' c ' ;
float valor_medido;
ptr = strchr(entrada, el} ;
inicio » ptr-entrada+i;
ptr
= strchr (entrada, c2)
,-final = ptr-entrada;
for (i=0; i<5; Í+-+)
T [i] =' ' ;
for (i= inicio; i<f inal; i + +
í T [i -inicio] sent rada [i
J ;
valor_medido= (float) atof (T) ;
return valor_medido;
} / .......... ****** ....... *** ........ * ....... * .......... ************.*.*.**./
/* Funciín que transforma la respuesta a la peticiín de mV al pHrocon 18
en un valor float que devuelve.
*/
float lectura_mv (void)
{int i, inicio, final;
A-4
2A
PÉ
ND
ICE
S
APÉNDICES. PROGRAMA DE MONTTORIZACIÓN
Y CONTROL PLANTA PILOTO
ch
ar
mv [5] ;
ch
ar
*p
tr, el
=
'M',
c2
='m
';flo
at
valo
r_m
ed
ido
;p
tr =
strc
hr (e
ntra
da
, el) ;
inicio = ptr-entrada+3;
ptr o atrchr (entrada, c2) ;
final = ptr-entrada;
for {i=
0;i<5;i-t"
»-) m
v[i] = '
';fo
r (i=
inic
io; i<
final; i+
+)
mv [i -in
icio
] en
trad
a [i] ;v
alo
r_m
edid
o=
(flo
at)a
tof (m
v) ,-
retu
rn v
alo
r m
edid
o;
/*
Fu
nciín
q
ue
tran
sform
a la
resp
uesta
a
la
petic
iín d
e tod
os
los
va
lores
al
pH
roconlS
en
los
va
lores
floa
t d
e las
varia
ble
s en la
estru
ctu
ram
edid
as.
*/
void lectura valores (int
sonda)
íint i;
char ph[6j , T{6] , mv{6] ;
memset (ph.
O, sizeof (ph)
) ;
memset (T,
O, sizeof (T)
) ;
memset (mv.
O, sizeof (mv)
) ;
if (entrada 112]
==49)
{for (iaQ;i<5;i++) ph [ i ] =6ntrada [12+i]
;for
(i«l;ic48;i++) entrada [il
=entrada [i+1]
;}
elsefor (i=0;i<4;i++) ph[i] =entrada 1 12
+ i]
;medidas [sonda]
.ph= (float) atof (ph)
;
for (i = 0;i<4,-i +
+ ) Ti i] =entrada [21+iJ
;medidas [sonda]
. temperatura= (float) atof (T)
;
if (entrada[31] !=45)
{mv[0] =48;
for (i=0; i
<3;i++) mv[i+l] =entrada [31+i]
;
for
íi=0
;i<4
;i*+
) m
vti) =
en
trad
a 13
1+
i] ;ímedidas [sonda]
-potencial= (float) atof (mv)
;
/* CCdigo necesario si desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
Sifdef TEST
int main(void)
iinicializar_sondas ( );
phrocon_lecturasO ;
phrocon_ph();
phrocon_T();
phrocon_mv();
phrocon_02 O ;
return 0;
ivoid dec to bin(int numero_decimal)
{int binds] ;
APÉNDICES A
- 43
DESARROLLO E IM
PLEMENTAO
ÓN
DE UN SISTCMA SUPERVISOR
PARA LA GESTIÓN Y CONTROL DE ED
AR
int
i;
for
(i.0;i<
16
;i**
>
bin
(i] =
nu
mero
_d
ecimal
& 1;
nu
mero
_d
ecimal
»=
1;
retu
rn;
itime_t t_actual, t_phrocon, t_inicio;
float dia_absoluto(void)
float dias=0;
time_t t referencia=3015817200L;
float dïa_referencia»132.OF;
dias=(float) (dia_referencia+difftime(t_actual,t_referencia)/3600.0F/24.OF)
return dias;
ifloat minutos_desde_inicio(void)
(float segundos=0,
minutos^O;
segundos= (float) t_phrocon-t_inicio;
minutos=segundos/60.OF;
A-4
4APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
OM
TTO
L PI
ANTA
PILO
TO
'DANFOSS.C - FUNCIONES PARA LA COMUNICACIÓN CON LOS VARIADORES DE
FRECUENCIA DANFOSS 2100-LT
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISION: 17/9/95
ftinclude <stdio.h>
ttinclude <string.h>
- ttinclude <bios.h>
{(include <conio.h>
ftinclude <stdlib.h>
(tinclude <dos. h>
ttinclude <graph.h>
ftinclude <time.h>
Binclude -nombre».¡i~
/*************
** Definiciones
****
*
****.*/
ttdefine COM2
1ftdefine SETTIKGS2 (_COM_300 |
_COM_CHR8 | _COM_STOP1 | _COM_NOPARITY)
«define DCOM2
Ox2F8
((define THRE
0x2000
/* Bit 13, Transmission-hold register empty */
/*ftdefine TEST*/
/*****.***************** Subrutinas del fichero **««****••*•**********•/
void inicializar_variador_frecuencia(void);
int danfoss_orden(char *orden, char «respuesta);
int variar_velocidad(double velocidad, int variador);
int control_variador(int estado, int variador);
void graf_control_agitador(int on_off);
void graf_velocidad_agitadore3(void);
extern void dec_to_bin(int numero_decimal);
extern void graf_borra__ayuda (void) ;
extern void graf_ayuda_general(void);
8ifdef TEST
void dec_to_bin(int numero_decimal);
void graf_borra_ayuda(void);
void graf_ayuda_general(void);
void selectmenu(void);
void main(void);
ífendif
/*********+**»****** Variables comunes del programa
extern primera medidas[3];
extern estado_planta planta;
/*
Inicializa el puerto de comunicaciones COM2 con las variables
definidas en SETTINGS2.
*/
void inicializar_variador_frecuencia(void)
í int in;
/•char out[23]={"0<OOCOOE@0516+800003??>"}; */
/*
bytes
chrSO
ASCII
•
*/*
1
60
/* start byte
/* address
.
2,3
/* control char.
4/* control/status word
5,6,7,8
)
<
(inicio) */
48,48
0,0 (enviar a todos) */
67
C
(control) */
APÉN
DICE
S A
- 45
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL D
E ED
AR
/* menu/para me ter ft
/* sign
/* data
/* comma
/* check sum
./* stop byte
9,10,11,12
•/
13
43
+
(signo) */
14,15,16,17,18
*/
19
*/20,21
63,63
?,? (pasar de checksum) */
22
62
> (fin)
*/
/*Inicíaliza el puerto com.*/
in=_bios_serialcom(_COM_INIT, COM2, SETTINGS2);
/*fputs{"STATUS COM2; \t",Stdout);
dec_to_bin(in);*/
return;
í /*********.*********.********»***..,**..***.*.»**..***.***...*.*,*.*******/
/* Esta funciín sClo funciona si hay un solo variador encendido.*/
/* Manda una orden a un danfoss y recibe la respuesta.
La respuesta debe comenzar por un char 60 y acabar por un char 62.
Para evitar el bloqueo si no existe comunicaciín, se establecen unos
limites de 15 lecturas para el comienzo y 50 lecturas para el total.
Devuelve los siguientes valores:
-1
En 15 lecturas no ha existido un 60 de inicio
-2
En 50 lecturas no ha existido un 62 de finalización
-3
Orden no correcta
-4
Existe respuesta pero no cumple el checksum
1 Existe respuesta y cumple el checksum
*/ int danfoss orden(char *orden, char «respuesta)
{ int
j=0,kkoO,
largo=21,
errorsO,
ch
eq
ueo
=0
;ch
ar
ch
ek
sum
(5];
if
(str
ch
r(o
rde
n,6
2)=
=N
UL
L)
retu
rn
-3;
for
(kk
=l;
kk
<=
l8;k
k+
+)
ch
eq
ueo
=ch
eq
ueo
+o
rden
[kk
];sp
rin
tf (
chek
sum
, "%
i" ,
cheq
ueo
) ,-
ord
en
[19
1 =
ch
ek
sum
[2j;
ord
en
[20
]=c
he
ksu
m[3
];
pri
ntf
C^
sXn
" , o
rden
) ;
for ( j=0;j<=largo;j++)
{_outp ( DCOM2 , ordentj]);
kk=0;
do kk++;
while ((THRE & _bios_serialcom(_COM_STATUS, COM2,0))==0 && kk<30000);
}
do {error++;
kk=0;
do kk++;
while ((0x100 & _bios_serialcom(_COM_STATUS, COM2,0))==0 &6 kk<30000);
respuesta(0] =(char) _inp (DCOM2);
} while (respuesta[OJ¡=60 && error<15);
if (error==15) return -1;
error=0;
j-O;
do {error++;
j++;
kk=0;
do kk++;
while ((0x100 & _bios_serialcom(_COM_STATUS, COM2,0)}==-0 && kk<30000) ;
respuesta[j] =
(char) _inp (DCOM2);
} while (respuestatj]!=62 &t error<50);
if
(err
or*
=5
0)
retu
rn
-2;
A-4
6AP
ÉNDI
CES
APÉNDICES. PROGRAMA DE M
ONITO
RIZACIÒN
Y CONTROL PLANTA PILOTO
respuesta!j+1] =0;
cheq
ueo
=0
;fo
r (k
ka
l;kk
< = j-3
;kk
++ )
ch
eq
ueo
=ch
eq
ueo
+re
spu
esta
[kk
];sp
rintf(c
he
ksu
m,"%
i",ch
eq
ue
o);
prin
tf("%
i\n".c
he
qu
eo
);p
rint f ("%
s\n", re
spu
esta
) ;
if (c
he
ksu
m[O
]==
resp
ue
sta[j-2
] &&
ch
ek
sum
[1]=
=re
spu
esta
[j-1])
retu
rn
1;
els
e
retu
rn
-4 ;
î/ **********
**
**
**
**
**
**
* *
*.*
**
**
**
*/
/* Funciín para variar la velocidad de cualquier variador independientemente,
o los tres a la vez.
*/
int variar velocidad(double velocidad, int variador)
íchar out[23}={B0<OOUOOE@0516+500003\?\?>"};
char "string;
int j, dec, sign;
int ndig=5;
if (velocidad<-100 )]
velocidad>100) return 1;
if (variador<0 || variador>3)
return 2;
/*Si los par metros no son posibles devuelve un cídigo de error*/
out 13]=
(char) (48+variador);
string = ecvt(velocidad, ndig, &dec, &sign);
if (sign==0) out
[13] = '•»•';
/*Signo de
la velocidad*/
else out[13]
for (j=0;j<5;j++) outtl4 + j]-Btring[j] ;
/'Velocidad*/
out [19]*
(char)
(5-dec+48);
/*NEmero de decimales*/
for (j-l;j<23;j++) _bios_serialcom(_COM_SEND, COM2, out[j]>;
/* envia el carácter por el puerto de com.*/
/*if (variador!=0)
for (j-l;j<23;j++) out [ j J =
__bios_serialcom(_COH_RECEIVE, COM2, O);*/
/* recibe el mensaje devuelto por el variador */
/* solo si utilizamos checksum */
if (variador==0) for (j=0;j<3;j++) medidas[j].velocidad=(float)velocidad;
else medidas[variador-1].velocidad=(float)velocidad;
/*.******..
******
********
***************
//* FunciCn para encender, apagar o apagada de emergencia de cualquiera
de los variadores o de los tres a la vez.
*/
int control__variador (int
estado, int variador)
int j;
Char out[23]={"0<OOCOOE®0000+000000\?\?>"};
if (estado!=0 && estado!=l &&
estado!=2) return 1;
if (variador<0 || variador>3)
return 2;
/*Si los par metros no son posibles devuelve un cídigo de error*/
out[3]= (char)
(48+variador);
if (estado==0) out[5]=78;
if (estado==l) out[5]=79;
if (estado==2) out[5]=75;
for (j*l;j<23;j + + ) _bios_serialcom(_COM_SEND, COM2, out
[j] ).;
/* envia el carácter por el puerto de com.*/
/"for (j=l;j<23;j++) printf("%c",out[j]);
printf("\n");*/
return 0;
APÉNDICES A
- 47
DESARROLLO E IM
PLEMENTAQ
ON
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓ
N Y CO
NTROL DE ED
AR
/** *
************************
****************.*
***/
/* Funciín para llamar a control_variador desde la pantalla gr fica.
*/
void graf_control_agitador(int on_off)
(int var;
char fuente [20]
="t 'Tms
Rmn'hl2w50b" ,-
graf_borra_ayuda();
/*Borra la zona de la ayuda*/
_setgtextvector( 1, O );
/*Texto horizontal*/
_setfont( fuente );
/*Fuente utilizada*/
_setcolor(7);
_moveto(5,2);
if (on_off==1) _outgtext("Encendido agitador(es):
if (on_off==0) _outgtext("Apagado agitador(es);
_moveto(5,19);
_setcolor(29);
_outgtext("NEmero de variador: ");
_settextposition(2,17);
fscanf (stdin, "%dn, frvar);
control_variador( on_off , var );
1,2,3 ç
O (todos)");
1,2,3 C
O (todos)");
graf ayuda general!);
i/*Deja las cosas como estaban*/
/* Funciín para llamar
ir_velocidad desde la pantalla gr fica.
void graf_velocidad_agitadores(void)
tint var;
double vel;
char fuente(20)="t'Tms Rmn'hl2w50b";
graf_borra_ayuda();
/*Borra la zona
de la ayuda*/
_setgtextvector( 1, O );
/*Texto horizontal*/
_setfont( fuente );
/*Fuente utilizada*/
1,2,3 C
O (todos)");
_setcolor(7);
_moveto(5,2);
_outgtext("Variación velocidad agitador(es):
_moveto{5,19);
_setcolor(29);
_outgtext("N£mero de variador: ");
_settextposition(2,17);
fscanf (stdin, "%dh, &var);
_moveto(250,18);
_outgtext("Velocidad:
") ;
_settextposition(2,46);
fscanf (stdin, "%lf", &vel);
variar_velocidad (vel, var);
graf_ayuda_general();
/«Deja las cosas como estaban*/
/* Cídigo necesario si desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
Sifdef TEST
int £i=i;
void main(void)
Îchar out[23]={n<OOUOOE@0516+000003\?\?>"};
char entrada[100);
inicializar_variador_frecuenciaO;
danfos3_orden(out, entrada);
A-48
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONITO
RIZA
CIÓN
Y C
ONTR
OL PL
ANTA
PILO
TO
control_variador(1,1);
do{
selectmenuO ;
while (fi=»l);
*/ void selectmenu(void)
f int tecla;
int va
re-
double vel;
• tecla=_bios_keybrd(_NKEYBRD_READY) ;
if (tecla==>0) return;
_bios_keybrd(_NKEYBRD_READ} ; /*Vac;a el buffer, lee el £ltimo carácter*/
switch(tecla) {
case ux
iiíg
u :
:
printf ("NEmero de variador: ") ;
fscanf (stdin, "%dn, &var) ;
break;
case 0x4000:
printf ("NEmero de variador: ");
fscanf (stdín, "%d", &var) ;
control_variador ( O , var ) ;
break;
case 0x4100:
controlava r i ador ( 2 , O )
,-break;
case 0x4200:
printf { "N£mero de variador: " ) ;
fscanf (stdin, "%d", &var) ;
printf ("Velocidad:
") ;
fscanf (stdin, n%lf " , &vel} ;
variar_velocidad (vel, var) ;
break;
case 0x4400:
fi=0;
break;
vo
id d
ec_
to_
bin
(in
t n
um
ero
_d
ecim
al)
int
bin
ds] ;
int
i;
for
(i=
0;i
<1
6;i
-nO
bin
[i]
=
nu
mer
o_
dec
imal
&
1;
nu
mer
o_
dec
imal
»
= 1;
for (i=0;i<16;i
printf (
n\nn) ;
return;
t void graf_borra_ayuda(void)
{} vo
id
gra
f ay
uda
gen
era
l (v
oid
)
printf (ni- , bin [15-i]) ;
APÉN
DICE
S A
- 4
9
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SISTE
MA S
UPER
VISOR
PARA
LA G
ESTIÓ
N Y C
ONTR
OL DE
EDA
R
FUNCIÓN PARA ESPERAR LOS MILISEGUNDOS DETERMINADOS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISION: 23/6/9S
/********************* Libreriras a incluir *********
ífinclude <time.h>
Sinclude <conio.h>
«include <stdio.h>
/*•.*******»***********• subrutinas del fichero ******
void delayí clock_t wait );
/* Pauses for a specified number of microseconds. */
void delayí clock_t wait )
clock_t goal;
goal = wait + clock () ;
while ( goal > clock
t ) >
ftifdef TEST
void main (void)
íint duracion=lOOO;
clock_t
cstart, cend;
cstart = clock();
delay ( duración };
cend = clock();
printf ( "\nTietnpo tranacurrido:\t\t%6.4f seconds \n"
((float)cend - cstart) / CLOCKS_PER_SEC ),-
A-50
APÉNDICES
APÉNDICES. PROGRAMA DE M
ONTTORIZACIÓN Y CO
NTROL PLANTA PILOTO
PARA CONVERSIÓN DE ENTEROS A BINARIOS
PROGRAMADOR:
Juan AnConio Baeza Labat
ULTIMA REVISIÓN: 26/6/95
y*****************»**. Librerías a incluir *******
ffinclude <math.h>
ftinclude <stdio.h>
/*S
ub
rutin
as
del
fich
ero
*
**
**
**
**
**
**
jfifdef
TE
STv
oid
m
ain
(vo
id);
ffend
ifvoid dec_to_bin(int numero__decimal) ;
Subrutina de conversion de un numéro décimal en un binario
void dec_to_bin(int numero_decimal)
int bin
[16];int
i;
for (i=0;i<16;i++
bin
[ij =
nu
mero
_d
ecimal
& 1;
numéro
décim
al
»*
1;
for
(i=0
,-i<1
6;i+
+)
prin
tf ("%i
n , bin
{1
5-i] ) ;
prin
tf ( n\n" ) ;
*/
retu
rn;
if i f de f T
EST
vo
id
main (v
oid
)
int
i;fo
r (i=
0,-i<
10
; i + + ) d
ec to
b
in(i);
AP
ÉN
DIC
ES
A - 5
1
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN
Y CONTRO
L DE EDAR
FICH
ERO
S.c -FUNCIONES PARA LA LECTURA Y ESCRITURA DE FICHEROS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 21/9/98
Sifdef TEST
ífdefine extern
Sendif
ftinclu
de
ftinclu
de
tí inclu
de
ft inclu
de
stdio.h>
stdlib.h>
process ,
ftinclu
de
<co
nio
.h>
ftinclu
de
<tim
e .h>
ffinclu
de
ffinclu
de
(f include
dos.h>
direct. h>
errno.h>
ftinclu
de
"no
mb
res . h"
/*•*
**
**
**
*•*
**
*.*
•**
**
*
Su
bru
tinas
del
fich
ero
*
**
**
**
**
**
**
**
**
**
**
**
/
void
le
ctu
ra_
co
nfig
ura
cio
n(v
oid
);v
oid
le
ctu
ra_
alim
en
tacio
n(v
oid
);v
oid
arc
hiv
ar_
dato
s_tn
ed
ida (v
oid
) ;v
oid
fic
he
ro_
sem
an
al(v
oid
);v
oid
g
uard
a_m
ensaje(
ch
ar
"me
nsa
je);
vo
id
gu
arda_
med
ida(
ch
ar
"men
saje, ch
ar
"fic
he
ro);
vo
id
seg
uro
_g
rafic
as(in
t o
rde
n);
vo
id
arc
hiv
ar_
dato
s_esc
alo
n(v
oid
);
ex
tern
flo
at
dia
_a
bso
luto
(vo
id);
/ft**
**
**
**
**
**
**
**
**
Varia
ble
s co
munes
del
pro
gra
ma
**
**
**
**
**
**
**
**
**
**
/
ex
tern
in
t h
ora
, d
ia;
ex
tern
p
rimera m
ed
ida
s[3];
ex
tern
estad
o_
_p
lanta
pla
nta
;
floa
t a;
/*
ord
en
ad
a o
rigen
co
rrela
ció
n
O2-m
V
*/
floa
t b
; /*
p
en
die
nte
co
rrela
ciín
O
2-mV
*
/}
co
rr[3] ;
ex
tern
flo
at
raat_
gra
f_el[3
][6][3
60
]; /"
Ma
trice
s p
ara
las
gr
fica
s*
/ex
tern
flo
at
ma
t_g
raf_
e2
[3]
[6J [4
80
] ;ex
tern
flo
at
ma
t_g
raf_
e3
[3][6
][48
0];
ex
tern
tim
e_
t tie
mp
o_
el[3
60
]; /«
Ma
trice
s tiem
po g
r fic
as*
/ex
tern
tim
e_
t tie
mp
o_
e2
[48
0];
ex
tern
tim
e_
t tie
mp
o_
e3
[48
0];
/**
**
*
**
**
*»
**
**
*.*
*..*
*.*
**
*...*
**
**
**
*.*
*.*
**
**
**
.**
*/
/* Fichero para leer la configuraciCn base inicial del fichero de
datos depura.dat
* /
void lectura_configuracion(void)
íFILE "obert;
ch
ar
linea
[15
0];
int
i;in
t si;
if { access ("c:
\\depura\\depura.dat" ,0)
=•=
0)
obert = f
open ( "c:
\\depura\\depura -dat" ,
"r t" )
,-
/*En primer lugar se lee la l¡nea y despu.s se traduce a n£meros*/
A-5
2A
PÉ
ND
ICE
S
tplanta.intervalo_dosificacion[0],
APÉN
DICE
S. P
ROGR
AMA
DE M
ONITO
RIZA
CIÓN
Y C
ONTR
OL P
LANT
A PIL
OTO
fgets(linea,sizeof(linea),obert);
aacanf(linea,"%d", &planta.intervalo_control_O2);
fgets(linea,sizeof(linea),obert);
ascanf (linea, n%d" , &planta . intervalo_OUR) ;
if (planta.intervalo OOR==-1) planta.OUR=0;
else planta.OUR=1;
fgets(linea,sizeof(linea),obert);
sscanf(linea,"%d%d",
fiplanta.intervalo_dosificacionll] ) ;
fgets(linea,sizeof(linea),obert) ;
sscanf (linea, "%d%d" , &planta.intervalo_limp_dosif [01 ,
fiplanta.intervalo_limp_dosif
[1] )
,-fgets(linea,sizeof(linea),obert) ;
sscanf (linea, n%d%d1', &planta.pistonadas_limp_dosif [0] , &planta.pistonadas_limp_dosif [1] ) ;
fgets(linea,sizeof(linea),obert) ;
sscanf(linea,"%d", &planta.intervalo_control_nivel);
fgets(linea,sizeof(linea),obert);
sscanf(linea,"%dn, &planta.intervalo_toma_de_datos);
fgets(linea,sizeof(linea),obert);
sscanf(linea,"%d", &planta.tiempojpurga);
¿gets(iinea,sizeof(linea),obert);
sscanf (linea, "%d" , &planta .duracion_purga) ;
fgets(linea,sizeof(linea),obert);
sscanf(linea,"%d", &planta.actualizacion_grafica);
fgets(linea,sizeof(linea),obert) ;
sscanf(linea,"%f", splanta.caudal_agua);
fgets(línea,sizeof(linea),obert);
sscanf(linea,"%f", &planta.cauda1_RI);
fgets(linea,sizeof(linea),obert);
sscanf (linea, "%f ", &planta .caudal_RE)
,-fgets(linea,sizeof(linea),obert);
sscanf(linea,"%d", &planta.intervalo_flojet_on);
fgets(linea,sizeof(linea),obert);
sscanf(linea,"%d", &planta.intervalo_flojet_off);
for (ioO;i<3;i++)
fscanf (obert, tl%*[
for (i=0,-i<3;i + + )
fscanf (obert, "%* [~
for
(i = 0;i<3;i-f+)
fscanf (obert, "%* [
for
(i=0;i<3,-i +
-»-)
fscanf (obert, "%* 1
for (i=0;i<3,-i-n-)
fscanf (obert, "%• [*
for (i=0;i<3;i-f + )
fscanf (obert, "%*[
for (i=3;i<6;i-n-)
fscanf (obert, "%* [
for (i=0;i<3;i++)
fscanf (obert, "%* [*
for (i=0,-i<3;i++}
si=f scanf (obert, H%
if (si==EOP)
printf ( "\nError :
fclose (obert) ;
exit(l);
fscanf (obert, "%f " , ¿planta. velocidad [i] ) ;
01234S6789]n);
fscanf (obert, "%f ", «.planta .PID [i] . set_point) ;
0123456789] ") ;
fscanf (obert, "%f " , &planta ,PID [i] . Kc) ;
0123456799] n);
fscanf (obert, "%f B,tplanta.PID[i] ,Ti) ;
0123456789] ") ;
f scanf (obert , "%f ", &planta.PID [i] .Td) ;
-0123456789] " ) ;
fscanf (obert, B%d11 , &planta.PID [i] .activo) ;
'-01234567B9]1');
fscanf (obert, "%f " , Splanta.raA[i] ) ;
-0123456789] ") ;
facanf (obert, "%f " , &corr [i] .a) ;
-0123456789] n) ;
f acanf (obert , " %f " , &corr [i] .b) ;
(*0123456789] ") ;
/*Si hay menos datos de los necesarios"/
Faltan datoa en el fichero de conf iguraciín depura.dat \n"
fclose (obert)
,-
ielse { printf("\nError: El fichero de configuración depura.dat no existe\n"
exit (II;
/* Fichero para leer el perfil de alimentación en alimento.dat
void lectura_alimentacion(void)
{ FILE «obert;
APÉN
DICE
S A
- 53
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SIST
EMA
SUPE
RVISO
R PA
RA LA
GES
TIÓN
Y CO
NTRO
L DE
EDAR
char linea [150] ;
int i;
int si;
if ( access(nc:\\depura\\alimento.datn,0) == 0)
{ obert =f open ("c: \\depura\\alimento. dat" , nrt") ;
/*En primer lugar ae lee la l¡nea y despu.s se traduce a nEmeros*/
f ge ta (linea, sizeof (linea) , obert) ;
sscanf (linea, "%d", fiplanta.perf il) ;
for (i=0;i<3;i++)
fgeCs (linea/ sizeof (linea) , obert) ;
for (i=0,-i<24;i + +-
) f scanf (obert , "%d" , &planta. alimento [i] .nitrogeno) ;
fscanf (obert, "%* [*-01234567B9]
n ) ;
for (i=0;i<24;i++) f acanf (obert, "%d" , &planta. alimento [i] .carbono) ;
fscanf (obert, "%* ["-01234567B9] ") ;
for (i=0;i<24;i++) si=fscanf (obert, n%f " , &planta. alimento [il .agua) ;
if (si==EOF)
/*Si hay menos datos de los necesarios*/
pri
ntf
{"\n
Err
or:
F
alt
an d
ato
s en
el
fich
ero
d
e conf
igu
racií
n
ali
me
nto
.da
t \n
");
fclo
se (
ob
ert
) ;
ex
it (
1) ;
}
f close (obert) ;
}else { printf ("\nError: El fichero de conf iguraciín alimento.dat no existe\nn);
exit (1) ;
/•**"***'***'•** ..... * ................ ***.****************.* ...... ********/
/* Guarda los valores de los datos de la estructura "medidas" en
el fichero depura.dat. Si es lunes a las ocho de la ma°ana, llama a
fichero semanal, que renombra depura.dat a la fecha actual.
*/
void archivar_dato3_medida (void)
íFILE «stream;
int i ;
float dias=0;
struct _dosdate_t d;
struct
tm *t;
time_t Itime;
time í<ime) ;
t
=• localtimeí <ime );
dias=dia_absoluto() ;
stream = fopen ("c: \\datos\\depura.dat" , "a+") ;
f printf (stream, "%5.4f
" , diaa) ;
for
(i=
0; i<
3 ;
i++
) /«
Escri
bim
os
el
pro
med
io d
e
los
£1 t
irn
os
3 m
inu
tos*
/{ fp
rin
tf (s
tre
am
, "
%4
-2f
" , m
at_
gra
f_e
2 [
i] [
0]
[47
91
) ;
/*p
H*
/fp
rin
tf (s
tream
, "
%4
. If
" ,m
at_
gra
f_e
2 [
i] {
!] [
47
9]
) ;
/*T
*/
fpri
ntf
(s
tream
, "
%4
.0f
" ,m
at_
gra
f_e2 [
i] [
2]
[47
9])
; /*
mV
*/
fpri
ntf
(s
tream
, •
%4 . I
f "
,mat_
gra
f_e2 (
i] [
3]
[47
9J
) ;
/*O
2*
/fp
rin
tf
(str
eam
, •
") ;
}fp
rin
tf
(str
eam
, "
%4 . 2
f "
,mat_
gra
f_e2
[O
j [4
] [4
79
] )
;fp
rin
tf
(str
ea
m,
" %
4 .2
f" ,
ma
t_g
raf_
e2 [
1]
[4]
[47
9]
) ;
fpri
ntf
(s
tream
, °
%4
. 2f
" ,m
at_
gra
f_e
2 [
2]
[4]
[47
9])
;fp
rin
tf (s
tream
, "
") ;
fpri
ntf
(s
tream
, "%
2d
%0
2d
%02
d "
, t-
>tm
_h
ou
r,
t->
tm_
min
, t-
>tm
_se
c);
fpri
ntf
(s
tream
, "ts
" ,
cti
me ( ti ti
me
) )
,-
A-54
APÉNDICES
APÉNDICES. PROGRAMA DE MO
NITORIZACIÓ
N Y CONTROL PLANTA PILO
TO
f close (stream) ;
time (il
time) ;
t = localtimeí tltime );
_dos_getdate (&d)
;if
( (t->tm_hour==8)
(t->tm_min<=9) && (d.dayofweek==l) ) f ichero_semanal (} ;
/*******.*..*.*,*,**.**.*.*.********.*.*******»****.**.*..***.*.***,***..,/
/* Renombra depura.dat a la fecha actual, comprobando primero que el
fichero no exista ya. Tambi.n copia el fichero de seguridad de las
gr ficas a otro fichero con la fecha actual.
*/
void fichero semanal (void)
{char fitxer [25}
;struct tm *time_ara;
time_t segns_ara;
tzsetO ;
time (&segns_ara)
,-time_ara = localtime (&segns_ara) ;
strftimeí fitxer, 21, "c:
\\datos\\%d%b%y -dat" ,
time_ara) ;
if ( access! fitxer, 0) ==
0) return;
rename ("c:
\\datos\\depura. dat" , f
itxer) ;
strftime ( fitxer, 21, "c : \
\datos\\%d%b%y.gra" , time_ara) ;
if ( access { fitxer, 0) ==
0) return;
systemí"copy c : \
\depura\\tmp\\sec-graf .dat
c: \\datos\\sec-graf .dat
> copy.tmp /y">;
remove ( " c
opy . tmp
d ) ;
rename ("c:
\\datos\\sec-graf .dat"
, fitxer) ;
return;
/ ............... .************.*.* ..... .****** ......... *********.„* ........ /
/" Guarda el mensaje pasado como argumento en el fichero depura.dat,
añadiendo la hora y la fecha.
*/
void guarda_mensaje { char *mensaje)
FILE *stream;
time_t Itime;
time Ultime) ;
stream
*»
f open (" c
: \\datos\\depura. dat" ,
f print f (stream, n%9n , m
ensaje) ;
f print f (stream, "%sn , c
time ( <ime ) )
;
fclose (stream) ;
return;
void guarda medida( char "mensaje, char *fichero)
{FILE «stream;
struct tm *t;
time_t Itime;
time (tltime);
t = localtimet tltime ) ;
AP
ÉN
DIC
ES
A - 5
5
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓ
N Y CO
NTROL DE ED
AR
stream = fopen( fichero, "a*");
f print f (stream, "%s"
, mensaje) ;
fprintf (stream, "
%2d %02d %02d
\t", t->tm_hour, t->tm_min, t->tm_sec);
fprintf (stream, "%s"
, ctime (<ime) ) ;
fclose (stream) ;
return;
J/ .......... * ..... *****,*********..*..********..******.*.**»***********..*./
/*
Subrutina de seguridad para los datos de las gr ficas y de medidas.
Con ordensO, lee los datos; con orde=l los sobreescribe .
*/
void seguro_graf icas (int
orden)
{FILE *obert;
/* Si comienza el programa y existe el fichero de seguridad, lo lee */
if (orden==0 && access ("c:
\\depura\\tmp\\sec-graf.dat11 ,0)
== O)
fobert=fopen( "c:
\\depura\\tmp\\sec-graf .dat" , "
rb") ;
f read (&hora,
sizeof (hora)
, 1, obert) ;
freadí&dia, sizeof (dia)
, 1,
obert) ,-
fread(&mat_graf_el, sizeof (mat_graf_el) , 1,
obert) ;
fread(6mat_graf_e2 , s
izeof (mat_graf_e2) , 1,
obert) ;
fread(&mat_graf_e3 , s
izeof (mat_graf_e3) , 1,
obert) ;
fread(&tiempo_el, sizeof (tiempo_el) , 1,
obert)
,-fread(&tiempo_e2, sizeof (tiempo_e2) , 1,
obert) ;
f read(&tiempo_e3 , s
izeof (tiempo_e3) , 1,
obert) ;
f readí&medidas, sizeof (medidas) , 1,
obert) ;
fclose (obert) ;
/* Sobreescribe el fichero con datos actuales */
if (orden==l)
{obert =f o
pen ( "c : \\depura\\tmp\\sec-graf . dat " , " w
b" ) ;
fwrite (&hora, sizeof (hora)
, 1, obert) ;
fwrite(&dia, sizeof (día)
, 1, obert) ;
fwrite(&mat_graf_el, sizeof (mat_graf_el) ,1,
obert) ;
fwrite(&mat_graf_e2, sizeof (mat_graf_e2) ,1,
obert)
,-fwrite (&mat_graf_e3 .sizeof (mat_graf_e3) ,1,
obert) ;
fwrite(&tiempo_el, sizeof (tiempo_el) , 1,
obert) ;
fwrite(&tiempo_e2, sizeof (
t iempo_e2) , 1,
obert) ;
fwrite (&tiempo_e3, sizeof (tiempo_e3) , 1,
obert) ;
f wri te (smedidas, sizeof (medidas) .1,
obert) ;
"
fclose (obert) ;
/*****»»***********..**** + **
***.*******
...********.***.*/
/* Funcitn que guarda los valores de oxigeno y mA en un fichero, con la
hora actual.
*/
void archivar_datos_escalon(void)
{FILE * fichero;
int i=0;
struct
tm "t;
time_t Itime;
f ichero=fopen ( "c :
\\datos\\escalon.dat" , "at-t-" )
;
time (<ime);
A-56
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
ONTR
OL P
LANT
A PI
LOTO
t = localtimeí fcltime );
for ' <i-0;i<3;i++) fprintf(fichero, " %4.2f ".medidas[i].mA);
for (i=0; i<3; i-
n-l
f print f (fichero, " %4 ,2f " .medidas [i] .oxigeno) ;
fprintf(fichero, "
%2d %02d %02d
", t->tm_hour, t->tm_min, t->tm_sec);
fprintf(fichero,"\h"};
fclose (fichero);
/* Cídigo necesario si desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
ffifdef TEST
float dia_absoluto(void)
{return 0.OF;
void main (void)
i /*lectura_conf iguracionO ; */
/*archivar_datos_escalon() ;
archivar_datos_medida() ;*/
lectura alimentación ();
ftendif
/.****.
APÉN
DICE
S A
- 5
7
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONTR
OL D
E ED
AR
GRÁFICOS.C -
FUNCIONES PARA LA PRESENTACIÓN DE DATOS Y GRÁFICAS
POR PANTALLA
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 10/10/96
tfinclude <conio.h>
#include
If include
Sinclude
Sinclude
«include
íí include
stdlib.h>
string.h>
stdio.h>
graph.h>
math.h>
time.h>
nombres-h"
/*#define TEST*/
tfifdef TEST
^define extern
ííendif
fídefine PATHFONTS "c : \\depura\\fonts\\* . fon"
/*************.********* subrutinas del fichero ***********************/
void modo_graf ico (void)
,-void graf_colorinea(int orden);
void graf_base(void);
void graf_plc(void) ,•
void graf_led( int led, int on_off );
void graf_nivel(int nivel, int on_off);
void graf_reloj(void);
void graf_hora(void);
void graf_sombra_grafica(void);
void graf_ayuda_general(void);
void graf_ayuda_graficas(void);
void graf_borra_ayuda(void);
void graf_display(void);
void graf_valores_display(void);
void salir_al_doa(void);
void graf_mA(float *mA);
void actualizar_matrices_graficas(void);
void graf_ejes_tierapo(int escala);
void graf_eje_pH (void)
,-void graf_eje_T(void);
void graf_eje_mV(void);
void graf_eje_O2(void);
void graf_eje_raA(void);
void graf_eje_multiple(void);
void graf_eje_debug{void);
void graf_tanques(void);
void graf_tanque(int tanque),-
vo
id g
rafi
ca_
vari
ab
le(i
nt
vari
ab
le,
int
tan
qu
e,
int
esc
ala
, sh
ort
co
lor)
;void
g
raf_
actu
ali
zacio
n_
gra
fico
(in
t v
ari
ab
le,
int
escala
);v
oid
g
raf_
nu
evo
__
gra
f ic
o (
in
t v
ari
ab
le,
int
escala
);v
oid
g
raf_
pre
sen
tac
ion
(vo
id);
vo
id
gra
f_m
en
saje
(ch
ar
*m
en
saje
);
/**
•**
**
**
**
**
**
**
**
vari
ab
les
com
un
es d
el
pro
gra
ma
**
**
**
**
**
**
**
**
*»
**
/
flo
at
mat_
gra
f_el
[3] [6
] [3
60
]; /
'Matr
ices
para
la
s g
r fi
cas*
/fl
oat
ma
t_g
raf_
e2
[3]
[6]
(48
0]
,-fl
oat
ma
t_g
raf_
e3
[3][
6]
Í4B
O];
tim
e_
t ti
em
po
_e
l[3
60
);
/*M
atr
ices
tiem
po g
r fi
ca
s*
/ti
me_
t ti
emp
o_
e2 [
48
0]
,•ti
me_
t ti
emp
o_
e3[4
80
];
int
ho
ra,d
ia;
A-5
8AP
ÉNDI
ŒS
APÉNDIOES. PROGRAMA DE M
ON
iroRizAaÓ
N Y CCW
TROL PLANTA PILOTO
extern primera medidas [3];
extern estado_planta planta;
/* FunciCn para dar un poco de color a la vida en una esqui:
void graf_colorines(int orden)
{int i,k;
switch(orden)
case O :
for (i=116;i>20;i--)
for (k=40;k>0,-k--)
_setcolor( (short) (i-t-k)
);_moveto( (short)(600+k), 430 );
_lineto( (short) (600+k), 480 );
break;
case 1:for (i=20;i<116;i++)
for (k=0;k<40;k+-O
_setcolor{ (short) (i-t-k)
) ;
_rooveto( (short) (600-t-k) ,
430 ) ;
_lineto( (short) (600+k)
, 480
)
,-
/* Pasa del modo texto al gr fico.
void modo_graf ico (void)
{if( ¡_setvideomode( _MAXRESMODE ) )
exit ( 1 );
_registerf onts ( PATHFONTS ); /«Fuentes gr ficas*/
/*******•********************+***********.****.*. *********.• *****. *..*.****/
/* Función que llama a las funciones necesarias para dibujar la pantalla. */
void graf_base(void)
graf_plc ()
;graf_nivel{ 1,1);
graf_reloj O ;
graf_sombra_grafica () ;
/*gra£_ayuda_graf icas ()
;*/graf_ayuda_general O ;
graf_display() ,•
graf_hora O ;
graf_nuevo_graf ico ( planta. variable_actual, planta. escala actual) ;
Î/
******
**
**********
****.****..
.*//* Función para dibujar el recuadro y los cjrculos inferiores de los leds
indicadores del estado del PLC.
*/
void graf_plc(void)
APÉND
ICES
A
- 59
DESARROLLO E IMPLEMETÍTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN
Y CONTROL DE EDAR
short i, x;
char fuente(2OJ ="t "Tros
Rmn'hlOwSOb";
char numero[3];
_setcolor(242);
/'Establece el color activo*/
_rectangle( _GFILLINTERIOR, 600, O ,639, 365);
/'Dibuja rect ngulo relleno*/
_rectangle( _GBOÍÍDER,
600, O ,639, 365);
_setcolor(7);
_setgtextvector( 1, O ) ;
_setfont( fuente );
for (Í=0;Í<24;Í++)
/*Dibuja rect ngulo silo borde*/
/'Orientación del texto*/
/*Selecciín de la fuente»/
í= 605;
/*Se posciona en x-y indicado*/
/*Escribe en el buffer el n§*/
/'Escribe el buffer en pantalla*/
if ( i>=10 )
else x = 610;
_moveto ( x, (short)
(5 + i*15)
sprint f (
numero, "%liB , i) ,-
_outgtext(numero);
_setcolor(183);
for (Í=0;Í<24; Í-4-+)
_ellipse( _GFILLINTERIOR, 620, (short) (i*15
+ 5), 630, (short)
(15 + 1*15) );
_setcolor(130);
/*Dibuja cjrculo*/
for (i=0;i<24;i++}
_ellipse( _GBORDER, 620, (short)
(i*15+5), 630, (short) (15+i*15) );
/*Dibuja circunferencia*/
i/* Dibuja un led del color indicado, para indicar su estado,
void graf_led{ int led, int on_off )
short xl= 621, x2°629;
short yl, y2;
if ( led<0 || led>23 ) return;
if ( on_off!=0 && on_off!=l &&
on_off!=2 ) return;
yl = (short)
(led*15+6);
y2 o (short) (led*15
+ 14) ,-
switch(on_off )
case O:
/'Apagado*/
_setcolor(183);
break;
case 1 :
/'Encendido*/
_setcolor(4);
break;
case 2:
/*Error cotnunicacitn*/
_setcolor(0);
break;
_ellipse( _GFILLINTERIOR, xl, yl, x2, y2
/***'"****"* ..................... ********** .............. ****..**..**.***/
/* Dibuja el indicador del estado del tanque 3, es decir si se est vaciando
o llenando demasiadas veces seguidas. Tambi.n indica si existe alguna
alarma de funcionamiento.
*/
void graf_nivel(int nivel, int on_off)
ichar
fuen
te[20
]="t'T
ras R
mn'hlO
wSO
b";
_setcolor(242);
_rectangle( _GFILLINTERIOR, 600, 370 ,639, 420);
_setcolor(29);
_rectangle( _GBORDER, 600, 370 ,639, 420);
_setcolor(24);
_rectangle( _GFILLINTERIOR, 615, 375 ,634, 415) ;
A-60APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONITO
RIZA
CIÓN
Y C
ONTR
OL P
LANT
A PI
LOTO
_aetcolor (7) ;
_setfont( fuente ) ;
_moveto ( 603, 407 )
;_setgtextvector ( O, 1 )
;_outgtext ("Nivel" )
,-
_movetO ( 615, 400 ) ;
_lineto ( 634, 400 )
;
_setcolor (187) ;
switch(on off)
{case 0:
/*Bomba apagada*/
_rectangle( _GFILLINTERIOR, 615, 401 ,634, (short)
(400-t-nivel/2) );
break;
case i:
/'Bomba encendida*/
rectangle! _GFILLINTERIOR, 615, 399 ,634, (short) (400-nivel/2) ) ;
break;
case -1:
/*Alarma de nivel. Tanques 1 C 2*/
_setcoior Í4i ;
_rectangle ( J3FILLINTERIOR, 615, 375 ,634, 415);
_aetcolor (7)
,-_moveto ( 620, 412 )
;_outgtext ("A.Tanc") ;
break;
case
-2:
/*Alarma de nivel, bomba*/
_setcolor{6) ;
_rectangle( _GFILLINTERIOR, 615, 375 ,634, 415);
_setcolor (7) ;
_moveto (620, 415 );
_outgtext ("A. Bomba"
ï ;
break;
case
-3
i /*Alarma escape*/
_setcolor(12) ;
_rectangle( _GFILLINTERIOR, 615, 375 ,634, 415);
_setcolor (7) ;
_moveto ( 620, 415 )
;_outgtext ( "A. Escape" ) ;
break;
case
-4:
/"Alarma manual*/
_setcolor (110) ;
_rectangle( _GFILLINTERIOR, 615, 375
,634, 415);
_setcolor (7) ;
_moveto ( 620, 415 ) ;
_out9text("A. Manual")
,-break;
/*.**•**. .*******.*+.**.. .*++***„********. **•**********+*.** .............. */
/* Gr fica del indicador de deteccifn de sobrecargas, el reloj que da
vueltas en la esquina inferior derecha. Es llamada una vez cada ciclo
del do while del programa principal.
*/
void graf_reloj (void)
f short x, y;
short radio=19
;double alfa;
static int i=0;
if U>=180) i = 0;
_setcolor(242) ; /*antes 17l*/
_rectangle( _GFILLINTERIOR, 601, 426, 638, 473);
_setcolor{29) ;
_rectangle( _GBORDER, 600, 425 ,639, 474);
alfa= (double)
(2*3 . 14159265*i*2 . /360. ) ;
x= (short) (619 - radio * sin (alfa));
y= (short) (449
+ radio
* cos (alfa)), •
/*_setcolor( (short)
i) ;-/
APÉN
DICE
S A
- 6
1
DE
SA
RR
OLL
O E
IMP
LEM
EN
TAQ
ÓN
DE
UN
SIS
TEM
A S
UP
ER
VIS
OR
PAR
A L
A G
ES
TIÓ
N Y
CO
NTR
OL
DE
ED
AR
_setcolor (3l) ;
_moveto ( 619, 449) ;
__lineto ( x, y) ;
_lineto { 618, 450) ;
/***** ........................ **** ......... **** ..... * ......... .*****..**./
/* Reloj digital, con fecha y hora.
*/
void graf_hora (void)
{ time_t Itime;
short x=445,
y=460;
char fuente (20J ="
t 'Tms Rmn'hl2w50bn ;
char buf fer [30] ;
_setgtextvector ( 1, 0 );
_setfont ( fuente ) ;
time (<ime) ;
sprintf (buffer, "%s" , ctime( <ime ));
_setcolor(242) ;
_rectangle( _GFILLIKTERIOR, 441, 459
,587, 471);
_setcolor(28) ;
__rectangle( _GBORDER, 441, 459 ,587, 471);
_setcolor (29) ;
_moveto(x,y) ;
_outgtext (buffer) ;
} / ............... **** ....... ******.***.***** .............. ****.*»******..*. + /
/* Escribe la pantalla de ayuda general del programa.
*/
void graf_ayuda_general (void)
{ int i;
short x,y;
char
fu
ente
(20
] =" t
'Tm
s R
mn'
hSw
Sb" ;
char
b
uff
ert
lS]
[28]
={/
****
****
****
****
****
****
*/"F
l A
yuda
gr
fic
as"
,"F
2 V
aria
r mA
PC
L72
6",
"F3
En
cen
der
PL
C 1
-4",
"F4
Apa
gar
PL
C 1
-4",
"F5
Encender agitador",
"F6
Apagar agitador",
"F7
Parada emerg.
agit.",
"F8
Variar vel.
agit.",
"F9
Encender salida PLC",
"FIO
Salir del programa",
"Fll Reinicializar ",
"F12
Parada manual
",
"ALT-Q Salida + parada",
"ALT-D Salida al DOS",
"ESC Cr, ditos programa"};
_setgtextvector ( 1, O ) ;
_setfont( fuente
);
_setcolor (242) ;/*antes 19*/
_rectangle( _GFILLINTERIOR, O, O, 595, 38);
_setcolor (29) ;
_rectangle( _GBORDER, O, O, 595, 38);
for (i=0;i<15;i++)
{ x= (short) (5+i*120- (int) (i/5) *600)
;y= (short) (2 + 12* (int) (i/S) } ;
_moveto(x, y) ;
_outgtext (buffer
[i} ) ;
A-62
APÉNDICES
APÉNDICES. PROGRAMA DE MONITORIZACIÓN Y CONTROL PLANTA PILOTO
/* Escribe la pantalla de ayuda referida a las gr ficas.
void graf_ayuda_graf icas (void)
iint i ,-
short x,y;
char fuente [20]
="t 'Tms
Rmn'hSwSb" ;
char buf fer 115]
[26] ={/********""**•*********•/
"Fl Ayuda general",
"O
Gr fica Oxigeno" ,
"H
Gr fica pH",
"R Gr fica Redox" ,
"T
Gr fica Temperatura" ,
"A
Gr fica mA",
" 1
Variables tanque 1 " ,
" 2
Variables tanque 2 " ,
"3 Variables tanque 3"
,"E
Cambio de escala" ,
"ESPACIO
Actualizar" ,
"D
Debug programa"};
_setgtextvector ( 1, O ) ;
_setfont ( fuente ) ;
_3etcolor(l7l) ;
_rectangle( _GF ILL
INTERIOR, O, O, 595, 3B) ;
_setcolor (30)
;_rectangle( _GBORD8R, O, O, 595, 38);
for
íx= (short) (5+i*120- (int)
(i/5) *600) ;
y= (short) (2+12*
(int) (i/5)
) ;
_moveto(x,y) ;
_outgtext (buffer [i]
) ;
/***•**•*****
**********
**********
*****.*****/
/* Dibuja un rect ngulo negro para borrar el cuadro de ayuda, y as¡ poder
escribir un mensaje en esa zona.
*/
void graf_borra_ayuda(void)
t_setcolor(0);
_rectangle( _GFILLINTERIOR, O, O, 595, 38);
_setcolor(29);
_rectangle( J3BORDER, O, O, 595, 38);
/*****
*
***
******..****************.*,*********,
/*• Dibuja el rect ngulo, las rayas interiores y los títulos del display
donde se muestran los valores.
*/
void graf_display(void)
íint i, j;
short x, y;
char fuente[20]="t "Tms
Rmn'hSwSb";
char variables[6] [12]={/**********/
pH
T (C)
-,"Redox (mV)n,
" O2 (ppm) ",
" mA pcl726",
"V (%)
agit"};
char tanques[3] [12)=
{/*•***»*•**/
" Tanque 1 ",
" Tanque 2 ",
" Tanque 3 "};
_setgtextvector( 1, O );
_setfont( fuente );
_setcolor(171);
APÉNDICES A
- 63
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
_re
cta
ng
le(
_GFIL
·L·IN
TE
RIO
R,
O,
41
, 5
95
, 97
);_
se
tco
lor(2
9);
_re
cta
ng
leí
_GB
OR
DE
R,
O,
41
, 5
95
, 97
) ;
for
(i=l; i<
7; Í + -O
_se
tco
lor(3
0);
x=
(sho
rt)(3+
i*7
0);
y=
(sh
ort)(4
5);
_re
cta
ng
le(
_GB
OR
DER
, x
, y
, (sh
ort)(x
+7
0),
(sho
rt)(y+
12
)};
__
setc
olo
r (10) ;_
mo
ve
to((sh
ort)(x
+1
0),y
);_
ou
tgte
xt(v
aria
ble
s[i-1
]};
ifo
r (j=
l;j<4
;j++
)
_setc
olo
r(30
);x
=(s
ho
rt)(3);
y=
(sho
rt) (45
+j*
12
);_
recta
ng
le(
_GB
OR
DER
, x
, y
, (sh
ort)(x
+7
0),
(sho
rt)(y+
12
));_
setc
olo
r (10) ,-_
mo
ve
to((sh
ort)(x
+1
0),y
);_
ou
tgte
xt(ta
nq
ue
s[j-1
]);
gra
f_v
alo
res_
disp
lay
() ;
/** ....... **********.******.*********.********************...*.** ...... ****/
/* Escribe los valores de las variables medidas del sistema en el display.*/
void graf_valores_display (void)
íint i ,
j ;
short x, y;
ch
ar
fue
nte [2
0] =
"t'Tm
s R
mn'hB
wS
b";ch
ar
bu
f fer [6
] [10] ;
_setg
tex
tvecto
r( 1
, 0
);se
t f on
t ( fu
en
te } ;
_setcolor(0);
_rectangle( _GFILLINTERIOR, 73, 57, 493, 93);
_setcolor(242);
for (j=l; j<4; j++)
{for
(i = l;i<7;i-f +
)íx= (short) (3+i*70);
y=(short)(45+J-12);
_rectangle ( _GBORDER, x, y, (short)
(x+70) , (short) (y-t-12) )
;
_rectangle( _GBORDER, 73, 57, 493, 93);
_setcolor(30);
for (i°0;i<3,-i
+ + )
{sprintf (buffer[0], "%2.2f",
sprintf (buffertl], "%2.1f",
sprintf (buffer[2], "%4.0f,
sprintf (buffer[3], "%2.1f,
sprintf (buffer[4], "%2.2f",
sprintf (buffer[5], "%2.lf",
for (j=0; j<6; j++)
{_moveto((short)(100+j*70),
_outgtext(buffer[jj ) ;
ma
t_g
raf_
el[i]
[0] [35
9]);
ma
t_g
raf_
el[i]
[1] [3
59
]);m
at_
gra
f_e
l[i] [2
] [35
9]);
ma
t_g
raf_
el[i][3
][35
9]);
mat_
gra
f_el [i]
[4] [3
59
] ) ,-m
at_
gra
f_el (i]
[5] [359] ) ,-
(short)(5e*i"12));
/* Dibuja la sombra de la gr fica, la pantalla base.
A-64
APÉNDICES
APÉN
DICE
S. P
ROG
RAM
A DE
MO
NITO
RIZA
CIÓ
N Y
CO
NTRO
L PL
ANTA
PILO
TO
void graf_sombra gráfica(void)
( _setcolor(23);
/*sombra*/
_rectangle( _GFILLINTERIOR, 5, 105, 595, 479);
_setcolor{171);
_setcolor(29);
_rectangle( _GBORDER, O, 100 , 590, 474);
_setcolor(0);
_rectangle{ J3FILLINTERIOR, 80, 115 , 560, 434);
_setcolor(29);
_rectangle( _GBORDER, 80, 115 , 560, 434);
/****••••* ................... * ........... ******.****..*****.* ........ **.***/
/* FunciCn para salir al dos. Cambio de modo gr fico a texto, ejecuta un
command y despu.s redibuja la pantalla, leds incluidos.
*/.
int i;
_setvideomode ( _DEFAULTMODE ) ;
printf ("\nEscribe 'exit' para volver al programa\n") ;
system ("COMMAND. COM") ;
if ( !_setvideomode( _MAXRESMODE ) )
exit( 1 );
gra
f_b
ase
() ;
for
(i=
0,-
i<2
4;i
+ *
) g
raf_
led
( i,
p
lan
ta. s
ali
dag
_p
lc [
ij )
;
/.*.....*...,...............+.........+...,,...,,.....,.*...*.*..,*.*..,,,,/
/* Funciin temporal utilizada para mostrar los valores de aire introducidos
en los tanques.
*/
void graf mA(float "mA)
i ch
ar
fue
nte
[20
J =
"t'T
ms
Rm
n'h
líw
SO
b";
ch
ar
bu
ffe
r[8
0];
sp
rin
t f
(bu
ffe
r,
"mA
: %
5.2
f %
5.2
f %
5.2
f,m
A[0
],m
A[l
],m
A[2
]);
_setcolor(0);
_rectangle( _GFILLIKTERIOR,
setcolor(7) ;
O, 10, 400, 30);
_setgtextvectorí 1, O );
_setfont( fuente ) ;
_moveto(0,10) ; /"arreglo temporal*/
_outgtext(buffer);
í /,**..***.,.****.******.******•****»
Actu
ali
za la
s m
atr
ices
uti
lizad
as
para
d
ibu
jar
las
gr
ficas.
mat_
gra
f_el[
3]
[6]
[360
1 ;
dato
s d
e u
na
ho
ra,
cad
a
10 s
egundos
mat_
gra
f_e2
[3]
[6]
{480
] ;
dato
s d
e u
n d
;a,
cada
3 m
inu
tos
mat_
gra
f_e3
[3)
[6]
[48
0];
dato
s d
e u
na
sem
ana,
cad
a 2
1 m
inu
tos
Lo
s d
ato
s d
e cada
ma
triz
eat
n p
rom
ed
iad
os
de
las
an
teri
ore
s.
18 d
e
el
->
1 d
e
e2
. 7 d
e
e2
->
1 d
e
e3
void
actu
ali
zar_
matr
ices_
gra
ficas(v
oid
}( int
sonda,i,j ;
float sum;
double temp;
for
(so
nd
a=
0;s
on
da<
3;s
on
da-n
-)fo
r (i
=0
;i<
6;i
*+
)fo
r (j
=0
;j<
35
9,-
j* +
) m
at_
gra
f_el
[so
nd
a] [
i]
[ j]
=m
at_
gra
f_el
[so
nd
a]
[i]
[j+
lj ;
for
(j=
0;j
<3
59
;j+
+)
tie
mp
o_
el[
j]=
tie
mp
o_
el[
j+1
];/•
Hac
emo
s sit
io p
ara
el
Clt
imo v
alo
r d
e _
el*
/
for
(3o
nd
a=
0;s
on
da<
3;s
on
da+
+)
APÉN
DICE
S A
- 65
DESA
RROL
LO E
IMPL
EMEN
TAQ
ON
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DAR
t mat_
gra
f_el[
son
da]
[0]
[35
9]=
med
idas
ma
t_g
raf_
el[
son
da
][1
][3
59
]=m
ed
ida
sm
at_
gra
f_e
l[so
nd
a][
2][
35
9]-
me
did
as
ma
t_g
raf_
el[
son
da
][3
]{3
59
]=m
ed
ida
sm
at_
gra
f_e
l[so
nd
a][
4][
35
9]=
me
did
as
ma
t_g
raf_
el[
son
da
][5
][3
59
]=m
ed
ida
si
tiem
po
_el
[35
9]
=ti
me{
NU
LL
) ;
sonda].ph;
sonda].temperatura;
sonda].potencial;
sonda].oxigeno;
sonda].mA;
sonda].velocidad;
/•Asignamos el £ltimo valor*/
ho
ra+
+;
. if
(h
ora
>-1
8)
{ ho
ra=
0;
for
( so
nd
a=0 ;
son
da<
3 ;
sond
a*-*
-)fo
r (i
=0
; i<
6;
i++
)fo
r (j
=0
; j<
47
9; J
+-4-
) m
at_
gra
f_e
2 [
son
da]
[i]
[j]
=m
at_
gra
f_e2 [
son
da]
[i]
[j+
1]
;/*
Hac
emo
s sit
io p
ara
el
Elt
imo v
alo
r d
e _
e2
*/
for
(j=
0;j
<4
79
;j+
+)
tiem
po
_e2
[j]
=ti
emp
o_
e2 [
j+1
] ;
for
(so
nd
ado ;
so
nd
a<3
¡so
nda*
-*-)
for
(i=
0; i
<6
; i+
+)
{ sum
=0
,-fo
r (j
=3
42
; j<
36
0; j
-»-+
) su
mo
sum
+m
at_
gra
f_el
[so
nd
a]
{ij
[j]
;m
at_
gra
f_e
2 (
son
da)
[i)
[47
9]
=su
m/i
a .O
F;
} /"
Pro
med
iam
os
y
asi
gn
am
os
el
Clt
imo v
alo
r*/
tem
p=
0. O
F;
for
( j
=3
4 2
; j<
36
0; j
++
) te
mp
=te
mp
+-t
iem
po
_el
[j
] ;
tiem
po
_e2
[4
79
] =
(lo
ng
int)
(te
mp
/18 .
OF)
;
if
(dia
>=
7)
for
(so
nd
a =
0; s
on
da<
3 ;
sond
a+-f
>)
for
(Í=
0;Í
<6
;Í+
+)
for
(j=
0;j
<4
79
;j+
+)
ma
t_g
raf_
e3
[so
nd
a][
i][j
]=m
at_
gra
f_e
3[s
on
da
][i]
[j+
l];
for
(j-0
;j<
47
9; j*
+ )
tiem
po
_e3
[ j
] =
tiem
po
_e3
[ j
-t-1]
;/•
Hac
ern
os
sit
io p
ara
el
Elt
imo v
alo
r d
e _
e3
*/
for
(so
nd
a=0
,- s
on
da<
3 ;
son
da*
*)
for
(isO
,-i<
6;i
+ *
)i su
maO
;fo
r (
j=4
73
;j<
48
0;j
+ +
) su
m=
sum
+m
at_
gra
f_e2
[so
nd
a]
[i]
[j]
;m
at_
gra
f_e
3[s
on
da
][i]
[47
9]=
sum
/7.O
F;
} /*
Pro
med
iam
os
y asi
gn
am
os
el
Elt
imo v
alo
r*/
tem
p=
O.O
F;
for
(j=
47
3;j
<4
80
;j+
*)
tem
p=
tem
p+
tie
mp
o_
e2
[j];
tie
mp
o_
e3
[47
9]=
(lo
ng
in
t)(t
em
p/7
.0F
);J/*
if
(dia
>=
7)*
/
}/*
if
(ho
ra>
=1
8)*
/
} /• Dibuja el eje horizontal del tiempo, en tres escalas diferentes,
void graf_ejes tiempoíint escala)
{ int i ;
short x,-
char fuente[20]="t'Tms Rmn'hl2w50bn;
char buffer[20];
_setgtextvector ( 1, O
),-
_setfont{ fuente );
_setcolor (30);
switch(escala)
case 1 :
for (Í=0;Í<13;Í*+)
/•Escala de una hora*/
A-66
APÉNDICES
APÉNOIŒS. PROGRAMA DE MONITORIZACIÓN Y CONTROL PLANTA Pnoro
íx=
(sho
rt) (80-t-iMO
) ;_
mo
ve
to(x
,43
4) ;
_lin
eto
(x,4
39
);_
mo
ve
to((s
ho
rt)(x-5
),44
1);
sp
rintf(b
uffe
r, "%
2i", i*
5) ;
_p
utg
tex
t(bu
ffer);
_moveto(150,460);
_outgtext("Tiempo
(minutos)"};
break;
case 2:
/*Escala de un d¡a*/
for (Í=0;Í<25;Í++)
íx=(short)(80+i*20);
_moveto(x,434);
_lineto(x,439);
_moveto((short)(x-5),441);
sprintf(buffer, "%2in,i);
_outgtext(buffer);
_moveto(150,460);
__outgtext {"Tiempo
(horas) ")
,-break
,-case 3 :
for (i=0;i<8;i++)
íx*(short)(80+i*68.5BF);
_moveto(x,434) ;
_lineto(x,439);
_moveto((short)(x-5),441);
sprintf(buffer, "%2i",i);
_outgtext{buffer);
}__moveto(150, 460) ;
_outgtext("Tiempo
(días)"};
break;
/*Escala de una semana*/
/*_rectangle( _GBORDER, 80, 115 , 560, 434);
/* Dibuja el eje vertical del pH.
void graf_eje_pH(void)
{int i;
short y;
ch
ar
fue
nte [2
0] =
"t"Tm
s R
mn
'hl2
w5
0b
" ;ch
ar
bu
ffer[2
0];
^setc
olo
r (3
0);
^setg
tex
tvecto
rt 1,
O )
;_
ae
tfon
t( fu
en
te );
for (i=0;i<5;i++)
/*Escala 5 a 9*/
íy=(short)(434-i*79.75F);
_moveto(75,y);
_lineto(80,y);
_moveto(65,(short)(y-5));
sprintf(buffer, "%2ifl,i+5);
_outgtext(buffer);
_setgtextvector( O, 1);
_moveto(30,270);
"outgtext ("pH")
,-
/* Dibuja el eje vertical de la Temperatura.
void graf_eje_T{void)
{int i;
APÉNDICES
A - 6
7
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
short y,-
char fuente [20]
="t "Tms
Rtnn'hl2w50b" ;
char buffer[20];
_setcolor (30);
_setgtextvector( 1, O );
_setfonc( fuente );
for (i=0;i<6;i++)
/'Escala 10 a 35*/
íy=(short) (434-i*63 . 8F);
_moveto(75,y);
_lineto(80,y);
_moveto(65,(short)(y-5));
sprintf(buffer, n%2i", (i*5+lO));
_outgtext(buffer) ;
_setgtextvector( O, 1) ;
_moveto(30, 300) ;
_outgtext("Temperatura (C)"};
/* Dibuja el eje vertical del redox.
void graf_eje_mV(void)
íint i;
short y;
char fuente[20]="t'Tms Rmn'hl2w50b";
char buffer[20];
_setcolor (30);
_setgtextvector( 1, O );
_setfont( fuente Ï;
for (i = 0;i<ll,-i
+ + )
/*Escala -600 a 400*/
íy=(short)(434-i*31.9F);
_moveto(75,y);
_lineto(80,y);
_moveto(55,(short)(y-5));
sprintf(buffer, "%4in, (i*100-600));
_outgtext(buffer);
_setgtextvector( O, 1);
_move to(30,290);
_outgtext("Redox (mv)");
/* Dibuja el eje vertical del oxigeno.
void graf_eje_02(void)
{int i;
short y;
ch
ar
fue
nte
[20
]="t "T
ras R
mn
'hl2
w5
0b
n;ch
ar
bu
ffer [2
0];
_setc
olo
r (3
0);
_eetg
tex
tvecto
r ( 1,
O
) ,-_
se
tfon
t( fu
en
te );
for
(i=0
;i<9
;i+-O
/*
Esc
ala
O
a 8
*/
íya
(sh
ort)(4
34
-i*3
9.8
7F
);_
mo
ve
to(7
5,y
);_
line
to(8
0,y
);_
mo
ve
to(6
5,(s
ho
rt)(y-5
));sp
rintf(b
uffe
r, "%
2i", i)
;
_o
utg
tex
t(bu
ffer);
}_
setg
tex
tvecto
r( O
, 1
);_
tno
vetO
(30
, 30
0) ;
_o
utg
tex
t("O
xig
en
o
(pp
m)");
A-6
8APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZAO
ÓN
Y C
ONT
ROL
PLAN
TA P
ILO
TO
/* Dibuja el eje vertical de los miliamperios de la v Ivula de aire.
void graf_eje_mA(void)
{ int i;
short Vi
-char fuente [20] ="t "Tras Rmn'hl2w50b" ;
char buffer [20] ;
_setcolor (30)
;_setgtextvector ( i, O ) ;
_setfont( fuente ) ;
for
= 0;i<17;i+-O
/*Escala 4 a 20*/
y= (short) (434-i*19 . 93F> ;
_moveto(75,y) ;
_lineto (80, y) ;
_moveto(65, (short) (y-5)},-
sprintf (buffer, "%2in, i+4) ;
_outgtext (buf fer) ;
_aetgtextvector( O, 1) ;
_moveto(30,340) ;
_outgtext ("Abertura v Ivulaa de aire (mA)
" ) ;
/* Dibuja el eje vertical m£ltiple de cada tanque: pH, T, mV, O2, mA.
void graf_eje_multiple (void)
{ int i ;
short y;
char fuente [20] ="t'Tm9 Rmn'hSwSOb";
char buf fer [20]
,-
_setcolor (40) ;
_setgtextvector< O, 1 ) ;
set f ont ( fuente ) ;
_moveto(16, 115) ;
_lineto(16,434);
for (i=0;i<S;i++)
/*pH escala 5 a 9*/
y= (Short) (434-Í-79 . 75F) ;
_moveto(14 ,y) ;
_lineto(16,y);
_moveto(4, (short) (y+5) ) ;
sprintf (buffer, "%2i" , i+5
> ;
_outgtext (buf fer) ;
}_moveto(6,471) ;
_outgtext ("pH") ;
_setcolor (44) ;
_moveto(32,115) ;
_lineto(32,434) ;
for (i=0; i<6; i++)
/*T escala 10 a 35*/
y=(short) (434-i*63 .8F) ;
_moveto (30, y) ;
_lineto(32,y) ;
_moveto(20, (short) (y+5) ) ;
sprintf (buffer, "%2i", (i*5+10) ) ;
_outgtext (buf fer) ;
_moveto(22,471) ;
_outgtext(nT(C)") ;
setcolor (48) ;
APÉN
DICE
S A
- 69
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DA
R
_raoveto(48, 115) ;
_lineto(48,434) ;
for (i=0;i<ll;i++)
/*mv escala -600 a 400*/
y=(short)(434-i*31.9F) ;
_moveto(46,y);
_lineto(48,y);
_moveto(36,(short)(y+10));
sprintf(buffer, "%4iD, (i*100-600)) ;
_outgtext(buffer);
_raoveto(38,471);
_outgtext("mV"};
_setcolor (52);
_moveto(64,115);
_lineto(64,434);
for (i=0;i<9;i++) /*O2 escala O a 8*/
y=(short)(434-i*39.87F);
_moveto(62,y);
_lineto(64,y);
_moveto(52,(short)(y+5));
sprintf(buffer, "%2i",i);
_outgtext(buffer);
_moveto(54,471);
_outgtext("ppm");
_setcolor (56);
_moveto(80,115}
,-_lineto(80,434};
for (Í=0;Í<17;Í++
/*mA
escala 4 a 20*/
y=(Short) (434-1*19. 93F) ;
_moveto (78, y) ;
_lineto (80, y) ;
_moveto(68, (short) (y+5) ) ;
sprintf (buf fer, 0%2i" , i+4)
_outgtext (buf fer) ;
}_moveto(70,471) ;
_outgtext ("iiiA") ;
/* Dibuja el eje de debug.
void graf_eje_debug(void)
í. char fuente[20]="t'Tms Rmn'hl2w50b";
_setcolor (30);
_setfont( fuente );
_setgtextvector( O, 1);
__moveto (30, 350) ;
_outgtext("Seguimiento del programa");
/* Dibuja el recuadro donde se indica el color correspondiente
a cada tanque.
void graf_tanques(void)
í int j;
short x=3,
y;ch
ar
fue
nte
[20
] =
nt'
Tn
is
Rm
n'hl
Ow
SO
b" ;
ch
ar
bu
ffe
r[2
0]
;
_setg
tex
tvecto
r(
1,
0
);
_se
tfo
nt(
fu
en
te
) ,-
_setcolor(0)
,-_rectangle(_GFILLINTERIOR,3,434,53,468) ;
A-70
APÉNDICES
APÉNDICES. PROGRAMA DE MONTTORIZACIÓN Y CONTROL PLANTA PILOTO
for (j=l;j<4;j++)
{_setcolor(30);
y=(short) (422
+ j*12) ;
_rectangle( _GBORDER, x, y, (short)(x+50), (short) (y+12)ï
;_setcolor((short)(j*8+44));
_moveto((short)(x+6),y);
sprintf(buffer,"Tanque %li",j},-
outgtext (buffer)
,-
/* Dibuja el nombre del tanque al que corresponde la gr fica mEltiple.
void graf_tanque(int tanque)
char fuente[20]="t "Tras
Rmn'hl2w50bn;
char buffer[30];
_setgtextvector( 1, O ) ;
_setfont ( fuente ) ;
_setcolor (0) ;
_rectangle( _GFILLINTERIOR, 300, 459 ,370, 471);
_setcolor (30)
;_rectangle( J3BORDER, 300, 459 ,370, 471);
_moveto(310 ,460) ;
sprintf (buffer, "Tanque %li" , t
anque) ;
_setcolor (51)
;_outgtext (buffer) ;
/* Gráfica las l¡neas correspondientes para una variable de un tanque
determinado, en la escala de tiempo y con el color proporcionado.
void graf ica_variable (int
variable, int tanque, int escala, short color)
{int i;
sho
rt x
,y,x
t;flo
at
xO
=8
0.0
F,
yO
=4
33
.0F
,a
ltO=
31
7.0
F;
float
sets [6] [3] =
{/*
min
imo
, m
xim
o,
ran
go
*/
{5
. OF
, 9. O
F, 4 .O
F} ,
{1
0. O
F, 35
. OF, 2
5. O
F},
{-6
00
. OF, 4
00
. OF, 1
00
0. O
F},
JO. O
F, 8
. OF
, 8. O
F},
{4
. OF, 2
0. O
F, 1
6. O
F} ,{O.OF, 100. OF, 100.
OF} } ;
double increm_t, increm_tt ;
/*PH*/
/*T
em
pera
tura
*/
/*m
v*
//*
02
*/
/*n**/
/*V
elo
cid
ad
*/
switc
h(e
sca
la)
tcase
1
: /"
Esc
ala
para
un
a h
ora
*/
increm
_tts6
0.O
F*
6O
.OF
; /*
! ho
ra,
60
min
uto
s*6
0 seg
un
do
s*/
x=
(sho
rt)(xO
+1
);y
=(s
ho
rt)(yO
-alto
/sets
[varia
ble
][2]*
(ma
t_g
raf_
eltta
nq
ue
-1][v
aria
ble
][1]-se
ts[va
riab
le][0
]) );
if (y<
116) y
=1
16
;if
(y>433)
y=
43
3;
_m
ov
eto
(x,y
);for
(Ío2
;Í<3
60
;Í + -t-){in
cre
m_
t=(d
ou
ble
) d
ifftime (tie
mp
o_
el[3
59
],tiem
po
_e
l[i] ) ;i f
(increm
_t > in
crem_
t t) co
nt in
ue;
xt=
(sho
rt) (55
9-in
cre
m_
t/inc
rem
_tt*
47
8.0
F) ;
if ((xt-x)>10) _setlinestyle(OxAAAA>;
else _setlinestyle(OxFFFF);
x=xt;
y=
(sh
ort)(y
O-a
lto/s
ets
[va
riab
le][2
]*(m
at_
gra
f_e
l[tan
qu
e-lj
[va
riab
le](i)-s
ets
(va
riab
le][0
]}
);
AP
ÉN
DIC
ES
A - 7
1
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓN Y CONTROL DE ED
AR
if (y<116) y-116;
if (y>433)
y=433;
_lineto(x,y);
break;
case 2:
/*Escala para un d;a*/
increm_tt=24.0F*60.0F*60.0F; /*24 horas* 60 minutos*60 segundos*/
x= (short)
(xO + 1);
y=
(sh
ort)(y
O-a
lto/s
ets
[va
riab
le][2
]*(m
at_
gra
f_e
2[ta
nq
ue
-1][v
aria
ble
][1]-se
ts[va
riab
le][0
]) );
if (y<
116>
y=
11
6;
if (y
>4
33
) y
=4
33
;_
mo
ve
to(x
,y);
for
(i=2
; i<4
80
; i•*--*-)
{incre
m_
t-(do
ub
le)
difftim
e(tie
mp
o_
e2
[47
9],tie
rap
o_
e2 [
i]);
if (in
cre
ra_
t>in
cre
m_
tt) co
ntin
ue;
xt=
(sho
rt)(S5
9-in
cre
m_
t/inc
rem
_tt*
47
8.0
F);
if ((xt-x)>lO) _setlinestyle(OxAAAA)
,-else _setlinestyle(OxFFFF);
x=xt ;
y=
(sh
ort)(y
O-a
lto/s
ets
[va
riab
le][2
]*(m
at_
gra
f_e
2[ta
nq
ue
-1][v
aria
ble
](i]-se
ts[v
aria
ble
][0])
};
if (y<
116) y
=H
6;
if (y
>4
33
) y
=4
33
;_
line
to(x
,y);
break;
case 3:
/*E3cala para una semana*/
increm_tt»7.OF*24.OF*6O.OF"6O.OF;/*7 d¡as*24 horas*60 minutos*60 segundos*/
x=(short) (XÛ+-1) ;
y=
(sho
rt) (yO
-alto
/se
ts[v
aria
ble
] [2]*
(ma
t_g
raf_
e3
[tan
qu
e-1
](va
riab
le][1
]-sets(v
aria
ble
][0])
);
if (y<
116) y-1
16;
if (y
>4
33
) y
=4
33
;_
mo
ve
to(x
,y);
for
(Í=2
;Í<4
80
;Í+-t-)
{incretn
_t=
(do
ub
le)
dif f tim
e (tiemp
o_
e3 [4
79
] , tiemp
o_
e3 [i] } ;
i f (in
cre
m_
t >in
cre
m_
tt) co
ntin
ue;
xt=
(sho
rt)(5S
9-in
cre
m_
t/inc
rem
_tt*
47
8.0
F);
if ((xt-x)>10) _setlinestyle(OxAAAA);
else _setlinestyle(OxFFFF);
X=Xt ;
y=
(sh
ort)(y
O-a
lto/s
ets
[va
riab
le][2
J*
(ma
t_g
raf_
e3
[tan
qu
e-1
] [v
aria
ble
] [i]-sets
[varia
ble
] [OJ)
);
if (y<
116) y=
116;
if (y
>4
33
) y
=4
33
;_
line
to(x
,y);
bre
ak
;}_se
tline
style
(Ox
FF
FF
);}/*
**
**
**
**
*.*
*.*
*.*
**
.**
*.*
**
.**
**
**
**
*.*
**
.**
**
*...*
**
**
**
**
**
**
**
.//* Llama a la funciín grafica_variable las veces necesarias para dibujar
todas las variables que aparecer n en el gr fico. El tratamiento es
diferente si se trata de la gr fica de una variable para los tres
tanques o de las variables de un tanque.
*/
void graf_actualizacion_graficotint variable, int escala)
iint i;
if (variable!=20!
f_setcolor (0);
_rectangle( _GFILLINTERIOR, 81, 116 , 559, 433);
íf (variable>nO && variable<5)
/*Una variable de los tres tanques*/
for (i=l;i<4;i + + )
grafica_variable( variable, i, escala, (short)
(i*8+44));
if (variable>=5 &&
variable<8)
/«Variables de un tanque*/
for (i=0;i<5;i + + )
grafica_variable( i, variable-4, escala, (short) (i*4+40));
A-72
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONÍ
TORI
ZAO
ÓN
Y C
ONTR
OL P
LANT
A PI
LOTO
/* FunciCn con el copyright, presentacitn del programa.
void graf_presentacion{void)
{ ch
ar
fue
nte
l {2
0j =
"t "
Tm
s R
mn'
h60w
50bn ;
ch
ar
fue
nte
2 [
20
] =
"t'T
m3
Rin
n'hl
6wS
Obn ;
ch
ar
fuen
tes
[20
] = "
t"T
ms
Rm
n'h
l2w
50
bB ;
_set
gtex
tvec
tor
( 1,
O ) ,-
_setcolor (104) ;
_rectangle( _GFILLINTERIOR, 61, 116 , 559, 433);
_moveto(250 , 150) ;
_aetcolor (79) ,-
_setfont( fuentel ) ;
_outgtext ( "DEPURA" ) ;
_moveto(160 ,200) ;
_setf ont ( fuente2 ) ;
_outgtext ( "Programa per la Monitoritzacií i Control");
_moveto{130 ,225) ;
_outgtext ("de plantes depuradores d'aigues residuals urbanes");
_setcolor(77) ;
_moveto(100 , 362) ;
_setfont ( fuente3 ) ;
_outgtext ( "Copyright : Juan Baeza 1996") ;
_moveto(100 ,380) ;
_outgtext ("Unitat d1 Enginyeria Química") ;
_moveto(100 ,398);
__
ou
tgte
xt
("U
niv
ers
itat
Au
t-n
om
a d
e B
arc
elo
na")
;
/*
80
, 1
15
, 5
60
, 4
34
*/
/•*.*.**.•**••** ..... * ......................................... ************/
/* FunciCn que hace las llamadas necesarias a otras funciones, para dibujar
la gr fica de la variable en la escala determinada.
*/
void graf nuevo graficoí int variable, int escala)
( graf_sombra_graf ica () ;
/"Sombra inferior*/
graf_hora()
,- /*Reloj digital, hora actual*/
if (variable>=0 && variable<8) graf_ejes_tiempo (escala) ;
/•Escala horizontal tiempo*/
if (variable>=o && variable<5) graf_tanques () ;
/'Leyenda tanques*/
switch (variable)
/*Eje/s vertical/es*/
{ case O :
graf_eje_pH();
break;
case 1 :
graf_eje_T() ;
break;
case 2 :
graf_eje_mv() ;
break ;
case 3 :
graf_eje_02{) ;
break ;
case 4 :
graf_eje_mA() ;
break;
case 5:
graf_tanque (1) ;
graf_eje_multiple ()
,-break;
case 6 :
graf _tanque ( 2 ) ;
graf_eje_multiple() ;
break;
case 7 :
graf_tanque (3) ;
APÉN
DICE
S A
- 73
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONTR
OL D
E ED
AR
graf_eje_multiple ();
break;
case 20:
graf_eje_debug(}
,-break;
}graf_actualizacion_grafico(variable, escala);
/* Salida de un mensaje por pantalla gr fica */
void graf_mensaje(char *mensaje)
t char fuente (20j ="t "Tms Rmn'hl2wSOb"
,-char buffer [100]
,-
static short yd=125;
short xd =100;
if (strlen(mensaje)>B2) mensaje[81] =0;
_setgtextvector( 1, O );
_setfont( fuente );
if (yd>410)
í _setcolor(0);
yd=125;
}sprintf(buffer, mensaje);
_moveto(xd,yd);
yd= (short) (yd-4-15) ;
_aetcolor (30);
_outgtext(buffer) ;
j /* CÇdîgo necesario si desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
ítifdef TEST
void main()
í /* int i;*/
modo_grafico();
graf_display();
graf_base ()
,-/*
fo
r (i
=0
;i<
10
00
;i+
+)
gra
f_re
loj(
);*
/g
raf_
nu
evo
__
gra
f ic
o (
5, 3
) ;
ge
tch
O ;
gra
f_n
uev
o_
gra
fico
(1,
3) ;
getc
hO ;
graf_nuevo_grafico(2,3);
getch ( ) ,-
graf_nuevo_grafico(3,3);
getch{);
gra
f_n
ue
vo
_g
rafi
co
(4,3
);g
etc
hO
;g
raf_
nu
ev
o_
gra
fico
(5,
3}
;g
etc
h()
;_
setv
ideo
mo
de(
_DEP
AU
LTM
OD
E );
} ttend
if
A-7
4AP
ÉNDI
CES
APÉNDICES. PROGRAMA DE MONUORIZACIÔN Y CONTROL PLANTA PILOTO
GUARDIAN.C -
FUNCIONES PARA WATCHDOG
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 6/6/97
«include <stdio.h>
«include <dos.h>
«include «conio. ti>
«include <process.h>
«include <sya\types.h>
«define INTR OX1C
/* Interrupción del reloj */
/•«define TEST*/
/t.******.*..*.********. Subrutinas del fichero **
void (interrupt *oldhandler)();
void reboot(void);
void inicia_guardian(void);
void finaliza_guardian(void) ;
/*Variables comunes del programa
extern int contador_guardian;
extern int dos;
void interrupt guardian()
(int rebotar=0;
_disable(); /* desactiva interrupciones durante el tratamiento
if (doa==0) contador_guardian-n-¡
if (contador_guardian>2000) rebotar=l;
_enable();
/* reactiva la interrupción al finalizar el tratami
oldhandler ( ) ,- /*
llama a la rutina inicial */
if {rebctar= = D
reboot () ;
ffdefine MAGIC
/* «define MAGIC
«define BOOT_SEG
«define BOOT_OFF
Sdefine BOOT_ADR
«define DOS_SEG
«define RESET_FL·AG
«define RESET_ADR
void reboot(void)
/* for cold restart */
OxffffL
OxOOOOL
({BOOT_SEG « 16) | BOOT_OFF)
0x004OL
OX0072L
((DOS_SEG «: 16) | RESET_FLAG)
void ((far *fp)()) =
(void (far *) O ï BOOT_ADR;
*(int far *)RESET_ADR = MAGIC;
(*fp) O ;
void inicia_guardian(void)
(oldhandler = _dos_getvect(INTR) ;
/* Guarda el vector de interrupciones inicial */
_dos_setvect(INTR, guardian); /* Instala el nuevo vector de interrupciones */
void finaliza guardian(void)
{_dos_setvect(INTR, oldhandler);
/* Recupera el vector de interrupciones inicial */
APÉNDICES A
- 75
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
ftifdef TEST
int fi=0;
int main(void)
{inícia_guardian(} ;
printf("Antes; %i\n ",contador_guardian);
dos=l
,-system("command.com");
dos=0;
printf("Después : %i\n ",contador_guardian)
while ífi==0)
íprintf ("%i\n " , c
ontador_guardian) ¡
f inaliza_guardian () ;
return 0;
ittendif
A-76
APÉNDICES
APÉN
DIŒ
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
ONT
ROL
PLAN
TA P
ILOTO
PCL726.C - FUNCIONES PARA UTILIZAR LA PLACA DE SALIDAS 4-20 mA PCL726
PROGRAMADOR: Juan Antonio Ba
ULTIMA REVISIÓN: 21/9/98
«include <stdio.h>
Sinclude <conio.h>
ftinclude <graph.h>
«include <time.h>
«include "nombres.h"
«define BASE Ox2cO
/•direccii base de la plaça pc!726*/
int pc!726 (int canal, float miliamperios);
void actuacion_externa_pcl726(void);
/*********************** Subrutinas externas **********•***************/
extern void graf_borra_ayuda(void);
extern void graf_ayuda_general(void);
extern void delayí clock_t wait );
/*************•***** variables comunes del programa *****•*******»****•*/
extern estado__planta planta;
extern primera medidas[3];
/********
*.***********.****.*.******************/
/* FunciCn para pedir por pantalla en modo texto los par metros para
ejecutar la funciín pc!726, que varia los mA de salida de un canal. */
void actuacion_externa_pcl726(void)
int canal;
float miliamperios;
printf ("NEmero de canal: ") ;
fscanf (stdin, "%d", &canal);
printf ("Miliamperios: M;
fscanf (stdin, "%f", fimiliamperios);
pc!726 (canal, miliamperios);
/******
*.*.*****..
******
*
*//* Funciin para pedir por pantalla en modo gr fico los par metros' para
ejecutar la funciín pc!726, que var;a los mA de salida de un canal. */
void graf__actuacion_externa_pcl726 (void)
int canal;
float miliamperios;
char fuente[20]="t'Tms Rmn'hl2w50bn;
graf_borra_ayuda();
_setgtextvector( 1, O );
_setfont( fuente );
_setcolor(7);
_moveto(5,2);
_outgtext("Variación de los miliamperios de salida de la placa PCL726");
_moveto(S,19);
_setcolor(29);
_outgtext("NEmero de canal: ");
_settextposition(2,17) ;
fscanf (stdin, "%d", scanal);
_moveto(250,18) ;
APÉN
DICE
S A
- 7
7
DES
ARR
oao
E IM
PLEM
ENTA
QÓ
N D
E UN
SIS
TEM
A SU
PERV
ISOR
PAR
A LA
GES
TIÓ
N Y
CO
NTRO
L DE
ED
AR
_outgtext ("Miliamperios;
"} ;
_settextposition(2,46) ;
fscanf (stdin, n%f", tmiliamperios) ;
graf_ayuda_general () ;
pc!726 (canal, miliamperios) ;
/****•**** ..... ***.*.*.******.* ....... *********,*..****.*.******.****.*.,./
/* Control de la placa pcl726.
Funciín para variar los mA de salida de un canal de la placa pcl726.
*/
int peí 72 6 (int canal, float miliamperios)
í unsigned char high_byte, low_byte;
int rango=20-4 ;
int consigna;
if (miliamperios>20 | |
miliamperios<4) return 1 ;
if (canal>5 j j canal<0) return 2;
/*Si los par metros no son correctos, devuelve un cCdigo de error*/
if (canalo=s && miliamperios»a4 . OF && planta .mA [5] ! =4 . OF)
/* Para abrir un poco la v Ivula antes de cerrarla*/
{ _outp(BASE+canal*2, (charl 11);
_outp(BASE+l+canal*2, (char) 0) ;
delayUOO) ,•
co
nsi
gn
a=
(in
t)
(40
95
* (m
ilia
mp
eri
os-
4 .
) /r
an
go
) ;
hig
h_
by
te=
(ch
ar)
(c
on
sig
na»
B)
;lo
w__
byte
= (
ch
ar)
(c
on
sig
na
&
25
5);
_o
utp
(BA
SE
+can
al*
2,h
igh
_b
yte
) ;
_o
utp
(B
AS
E+
l-h
can
al*
2, lo
w_
by
te)
;
planta. mAlcanall =miliamperios; /• Guarda mA •/
if (canal>2 && canal<6) medidas [canal-3] .mA=miliamperios;
/* Guarda mA actuaciín oxigeno */
A-78
APÉNDICES
APÉNDICES. PROG
RAMA DE
MO
NITO
RIZAC
IÓN
Y C
ON
TRO
L PLANTA PILO
TO
PL
C.C
-
FUN
CIO
NE
S PA
RA
L
A C
OM
UN
ICA
CIÓ
N
CO
N E
L
PLC
IZ
UM
I/FA
2J
PRO
GR
AM
AD
OR
: Ju
an
A
nto
nio
B
aeza
Lab
at
UL
TIM
A
RE
VIS
ION
: 2
0/1
/99
ffinclu
de
<std
io.h
>«
inclu
de
<std
lib.h
>((in
clu
de
<strin
g.h
>ffin
clu
de
<b
ios.h
>ffin
clu
de
<c
on
io.h
>ffin
clu
de
<d
os.h
>ffin
clu
de
<tim
e.h
>ffin
clu
de
<g
rap
h.h
>ffin
clu
de
"n
om
bre
s.h"
/*ftd
efin
e T
ES
T*/
ffifde
f T
ES
Tffd
efin
e ex
tern
Jfend
if
«d
efin
e
CO
MÍ
Ottd
efin
e S
ET
TIN
GS
1 (
CO
M 9
60
0_C
OM
_CH
R8
| _C
OM
_ST
OP
1 |
_CO
M_E
VE
NP
AR
ITY
)
/*
Sub ru tina3 del fichero
void plc_on(void);
void plc_off(void);
void do3ifica(int bomba);
void alarma(int motivo);
void estado_salida(unsigned int
numero, unsigned int
of f_on)
,-int envia_orden(unsigned char orden[8]>;
void actuacion_externa_3alidas(void);
void purgaíint duración);
void graf_actuacion_externa_salidas(void);
void supervision_plc(void);
int inicializar_plc(void);
int plc_inputs(void);
int plc_outputs(void);
int plc_monitor(int tipo, int numero);
int plc_9et(int acción, int numero);
int plc_timer(int valor, int numero);
int plc_counter(int valor, int numero);
int plc_programa{int on_off);
int cambiar_alimentacion(void);
extern void dec_to_bin(int numero_decimal);
extern int pc!726 (unsigned char canal, float miliamperios);
extern void delayt clock_t wait );
extern void graf_led( int led, int on_off );
extern void graf_nivel(int nivel, int on_off);
extern void guarda_menaaje( char *mensaje);
extern void graf_borra_ayuda(void);
extern void graf_ayuda_general(void);
extern void inicializar_tiempos(void);
extern void imprime(char *mensaje);
extern int mensaje_a_SUH(char *mensaje);
extern int mA_caudal( char «fichero, float caudal, float *mA) ;
/******************* Variables comunes del programa **********
extern estado_planta planta;
int monitortlS];
APÉNDICES A
- 79
DESARROLLO
E IMPLEM
ENTAQ
ON
DE UN SISTEM
A SUPERVISO
R PARA LA G
ESTIÓN
Y CO
NTR
OL O
E ED
AR
/* Enciende las salidas del pic indicadas en salidas_iniciales.
*/
void plc_on(void)
funsigned int in;
in=_bios_serialcom(_COM_INIT, COMÍ, SETTINGS1);
/*Inicializa el port com.*/
/*fputs("STATUS COMÍ: \t",stdout);
dec_to_bin(in);*/
plc_programa[l);
/* Prepara programa PLC */
return;
/* Apaga las salidas del pic indicadas en salidas_iniciales.
void plc_off(void)
iplc_programa(0); /* Apaga programa PLC */
return;
/* Supervisa el funcionamiento del PLC
*/
void supervision_plc(void)
int i;
int status=0;
if (planta.com_PLC==0) return;
if (inicializar_plc()==0)
/*Si la comunicación es correcta*/
/* Gr fica del nivel en el tercer tanque */
plc_monitor(5,O); /*Contador bomba encendida*/
for (i = 0;i<10;i + + ) statu3=status | ( (monitor [i] & 1) «i> ;
if (status>0 i& status< 31) graf_nivel ( status, 1) ;
else {plc_monitor(5,1); /'Contador bomba apagada*/
status=0;
for (i=C;i<10;i++)
status=status | ( (monitor [i] & 1) «i) ;
if (status>0 && status< 21)
graf_nivel ( status, 0);
}
/* Deteccíín de alarmas PLC*/
plc_monitor(2, 40);
/*Rel,s internos M50-M57*/
if (monitor 10]==1 || monitor [1]=
= 1 || monitor{2]==1 || monitor[3]==1
|| monitor[4]==1) plc_monitor(2,40);
/* Comprobamos el estado */
if (monitor (0] ==1 |] monitor [1] = = 1 || monitor 12]
==1 || monitor [3] =•=!
|| monitor [4] ==•!)
plc_monitor {2,
40) ; /* Comprobamos el estado */
if (monitor JO]==1) alarma(O); /*M50 encendido, 30 veces bomba encendida*/
if (monitor[1]==1) alarma(l);
/*M51 encendido, 20 veces bomba apagada*/
if (monitor[2]==1) alarma(2);
/*M52 encendido, nivel tanque 1 alto*/
if (monitor [3]==!) alarma<3);
/*M53 encendido, nivel tanque 2 alto*/
if (monitor [4]
=*i) alarma (4
),- /*M54 encendido, escape de agua*/
/* Estado de las salidas del PLC */
plc_outputsO ;
/*Mira el estado de la salidas*/
for (i=0;i<24;i+-O graf_led( i, planta.salidas_plc[i]);
}else
guarda_mensaje( "No es posible la comunicación con el PLCt\t\xO">;
imprime("No es posible la comunicación con el PLC\v\v\n\xO");
/* planta.com_PLC=0;*/
/* Tratamiento de las alarmas detectadas por control_de_nivel.
A-80
APÉNDICES
DESA
RRO
LLO
e IM
PIEM
ENTA
QO
N D
E UN
SIS
TEM
A S
UPER
VISO
R P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DA
R
planta.com_PLC=l;
supervision_plc() ;
guarda_mensaje( "ReinicializaciCn\t\t\xO");
imprime("Reinicializaciín\v\v\n\xO");
mensaje_a_SUN(nReinicializaciCn\t\xO");
planta. alarma=-1
,-break;
case -2:
/* Reinicia la planta desde la SUN*/
pichón();
mA_caudal( "c:\\depura\\v_agua.dat", planta.caudal_agua, &m
pcl726(0,mA);
/*Abre la v Ivula de entrada de agua*/
planta. control__nivel = l;
/* React iva la planta*/
planta.sondas = l ;
planta.conexion_SUN=l ;
planta.com_PLC=l;
guarda_mensaje( "ReinicializaciCn SUN\t\t\xO");
imprime("ReinicializaciCn SUN\v\v\n\xO");
planta.alarraa=-2;
break;
} plc_outputs();
/*Mira el estado de la salidas*/
for (i=0;i<24,-i + + ) graf _led ( i, planta.salidas_plc [i] ) ;
return,-
i /* Funciín para encender o apagar una salida del PLC.
void estado salida(unsigned int numero, unsigned int off on)
í int j.O ;
int datai,data2,data3;
unsigned char estado[5] = {Ox4B,0x31,0x38,0x30,OxOD};
if (off_on==l) estado [1J =0x39; /'Salida encendida'/
if (numero<OxlO)
/'Adapta el nfmero a su nomenclatura*/
estado [3]
= (unsigned char) ( 0x30-t-numero) ;
else esta
do
[2]=
0x
39
;e
sta
do
[3]=
(un
sig
ne
d
ch
ar)
(O
x2
0+
nu
me
ro);
for (j=0; j
/*Escribimo3 y leemos en el puerto*/
_bios_serialcom(_COM_SEND, COMÍ, estadotj] ) ;
_bi03_serialcom(_COM_RECEIVE, COMÍ, 0) ;
datal._bio3_serialcom(_COM_RECEIVE, COMÍ, 0) ;
data2=_bios_serialcom(_COM_RECEIVE, COMÍ, 0) ;
if
(da
tal=
=0
x6
3)
{ gra
f_le
d (
nu
mero
, o
ff_
on
í ;
pla
nta
. sali
das_
plc
[n
um
ero
] =
o
ff_
on
;}
if
(da
tal=
=0
x6
4)
{ data
3=
_b
ios_
seri
alc
om
(_C
OM
_R
EC
EIV
E,
CO
MÍ,
0
) ;
gra
f _
led
(n
um
ero
, 2
) ;
pla
nta
. sali
das_
plc
[n
um
ero
) =
2
;
}if
(d
ata
l!=
0x
63
&
& d
ata
l!=
0x
64
){ gra
f_le
d (
nu
mero
, 2
) ;
pla
nta
. sali
das_
plc
[n
um
ero
] =
2
;
/•Encendido o apagado*/
/'Guardamos estado*/
/*Error mensaje*/
/•Guardamos estado'/
/'Error comunicaciín*/
/'Guardamos estado*/
retu
rn;
i /**••
*••
.................../
/* Funciín para pedir por pantalla en modo texto los par metros para
A-82
APÉNDICES
APÉN
DIC
ES.
PRO
GRA
MA
DE M
ON
ITO
RIZ
ACIÓ
N Y
CO
NTRO
L PL
ANTA
PIL
OTO
void alarma(int motivo)
{ float mAoO.OF;
int
i; -
switch(motivo)
{case 0: '
' /*Posible escape*/
/* pc!726(0,4);
/*cierra entrada*/
planta.control_nivel=0;
/*desactiva la planta*/
gra f __ni ve 1 ( O, - 2
). ;
guarda_mensaje( "Alarma, de funcionamiento bombas, 30 veces encendida\t\t\xO");
imprime("Alarma de funcionamiento bombas, 30 veces encendida\v\v\n\xO");
mensaje_a_SUN("Alarma, de funcionamiento bombas, 30 veces encendida\t\xO");
planta.alarma=0;
break;
case 1:
/'Posible escape*/
/* pc!726(O,4);
/'cierra entrada*/
planta.control_nivel=O,•
/*desactiva la planta*/
graf_nivel { O, -2);
guarda_mensaje ( "Alarma, de funcionamiento bombas, 20 veces apagada\t\t\xO"}
,-imprime("Alarma de funcionamiento bombas, 20 veces apagada\v\v\n\xO");
mensaje_a_SUN("Alarma, de funcionamiento bombas, 20 veces apagada\t\xO");
planta.alarma=l;
break;
case 2:
/*Nivel alto T-l*/
planta.control_nivel=0;
/'desactiva la planta*/
graf_nivel ( O, -i);
guarda_mensaje( "Alarma de nivel alto tanque l\t\t\xO");
imprime("Alarma de nivel alto tanque l\v\v\n\xO");
mensaje_a_SUN("Alarma de nivel alto tanque I\t\x0n);
planta.alarman2 ;
break;
case 3:
/*Nivel alto T-2*/
planta.control_nivel=0;
/*desactiva la planta*/
graf_nivel ( O, -1);
guarda_mensaje( "Alarma de nivel alto tanque 2\t\t\xO" )
,-imprime("Alarma de nivel alto tanque 2\v\v\n\xO");
mensaje_a_SUN("Alarma de nivel alto tanque 2\t\xO");
planta.alarmaos ;
break;
case 4:
/*Alarma escape detectado*/
/* pcl726(0,4);
/'cierra entrada*/
planta.control_nivel=0;
/'desactiva la planta*/
graf_nivel ( O, -3};
guarda_mensaje( "Alarma, escape de agua\t\t\xO"};
imprime("Alarma de funcionamiento, escape de agua\v\v\n\xOn);
mensaje_a_SUN("Alarma, escape de agua\t\xO"),-
planta.alarma=4 ;
break;
case 5:
/*Parada manual*/
pc!726(0,4);
/«cierra entrada*/
plc_pff();
/*apaga bombas*/
planta.control_nivel=>0;
/*desactiva la planta*/
graf_nivel ( O, -4) ;
guarda_mensaje( "Parada manual\t\t\xO");
imprime("Alarma de funcionamiento, parada manual\v\v\n\xO");
mensaje_a_SUN("Alarma, parada manual\t\xO");
planta.alarmaos,-
break;
case 6:
/'Parada SUN*/
pc!726(0,4);
/*cierra entrada*/
plc_off();
/*apaga bombas*/
planta.control_nivel=0;
/*desactiva la planta*/
gra£__nivel ( O, -4) ;
guarda_mensaje( "Parada SUN\t\t\xO");
imprime{"Alarma de funcionamiento, parada SUN\v\v\n\xO");
planta.alarmare ;
break;
case -1:
/* Reinicia la planta */
plc_on();
mA_caudal( "c:\\depura\\v_agua.dat", planta.caudal_agua/ &mA);
pcl726 (0,mA)
,- /'Abre la v Ivula de entrada de agua*/
planta.control_nivel=l;
/«Reactiva la planta*/
planta. sondas=l
,-planta.conexion_SUN=l;
APÉN
DICE
S A
- 81
APÉNDICES. PROGRAMA DE M
ONTTÜRIZACIÓ
N Y CO
NTROL PLANTA PILO
TO
ejecutar estado_salida, que enciende o apaga una salida del PLC.
void actuacion_externa_salidas (void)
íint salida, status;
printf ("NEmero de salida: ");
fscanf (stdin, "%d", &salida) ;
printf C "
Estado (Abierto 1, Cerrado 0): ");
fscanf (stdin, "%d
lt,
&status) ;
estado_salida (salida, status)
,-
return;
/* FunciCn para pedir por pantalla en modo gr fico los par metros para
ejecutar estado_salida, que enciende o apaga una salida del PLC.
*/
void graf_actuacion_externa_salida3 (void)
tint salida, status;
char fuente [20J =
"t 'Tms
Rmn'hl2w50b'1 ;
graf_borra_ayuda() ;
_setgtextvector ( 1,0);
_setfont( fuente );
_setcolor (7)
;_moveto(5, 2) ;
_outgtext ("ActuaciCn sobre las salidas del PLC FA2J") ;
_moveto(5, 19) ;
_setcolor (29)
;_outgtext ( "NEmero de salida: ") ;
_settextposition(2, 17) ;
fscanf (stdin, "%d", isalida) ;
_movetO(250, 18) ;
_outgtext { "Estado (Abierto 1, cerrado 0) :");
_settextpositíon (2,
55) ;
fscanf (stdin, "%d", ftstatus) ;
estado_salida (salida, status) ;
graf ayuda general ( ) ;
Î/********* i***»*************.*.******.*. *.+*******•********»»********.»» ..**/
/* ImplementaciCn purga. Enciende durante el intervalo de tiempo especificado
la salida correspondiente a la purga.
*/
void purga (int
duración)
{estado__salida(17,l) ;
delay (duración) ;
estado_salida(17, 0) ;
int pic inputs(void)
íint j=0;
unsigned char ord
enl[5
j =
{0x42,0x31,0x30,0x30,OxO
D};
unsigned char orden2[5]
= {0x42,0x31,0x30,0x38,0x00};unsigned char
respu
esta [4];
int
status=
0;
/* orden
l0x42 monitor de seoales
0x31 I/O, entradas y salidas
0x30,0x30 con esto, según la pagina 21, le estoy pidiendo el estado de 8 de
las entradas, a partir de la 00, según la pagina 20 debe añadirseAPÉNDICES
A - 8
3
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEM
A SUPERVISOR
PARA LA GESTIÓ
N Y O
WTR
OL DE ED
AR
Ox3_ y Ox3_ donde _ son los números 00
OxOO fin de mensaje*/
/* orden 2
0x42 monitor de sedales
0x31 I/O, entradas y salidas
0x30,0x38 con esto, según la pagina 21, le estoy pidiendo el estado de 8 de
las entradas, a partir de la 08, según la pagina 20 debe a°adirse
Ox3_ y Ox3_ donde _ son los números 08
OxOD fin de mensaje*/
for (jsO;j<5;j++)
/*mando y recibo mensaje*/
{_bios_serialcom(_COM_SEND, COMÍ, ordeni(j]);
_bios_serialcom(_COM_RECEIVE, COMÍ, O);
for (j=0;j<4;j++)
/'recibo respuesta*/
respuesta[j]=(unsigned char)_bios_serialcom(_COM_RECElVE, COMÍ, 0);
if (respuesta{0]!=0x66) return -1;
/*si no ha leido bien sale devolviendo error*/
status = respuesta[2]-0x30;
/*en el byte 2 de la respuesta est
lo que quiero, según pagina 26
el estado de las 4 primeras entradas*/
/*el formato de respuesta es el 66, esta en la pagina 16*/
for (j=0;j<8;J+-O
{planta.entradas_plc(j] = status & 1;
status »= 1;
/*transformo de decimal a binario, bit a bit*/
if (j==3) status = respuesta[l)-0x30;
/*en el byte 1 de la respuesta est
lo que quiero, según pagina 26
el estado de las 4 siguientes entradas*/
i
/*aqui repetimos el procedimiento, pero a partir de la entrada numero 8*/
for {j=0;j<5¡;j+
+ )
{_bios_serialcom(_COM_SEND, COMÍ, orden2[j]);
_bios_serialcom{_COM_RECEIVE, COMÍ, 0);
}for (j=0;
j<4; j-n-)
respuesta[j]=(unsigned char)_bios_serialcom(_COM_RECEIVE, COMÍ, 0);
status * respuesta{2]-0x30;
for (j°8;j«16;.j++)
{planta.entradas_plc(j] = status & 1;
status »° 1;
if (j==ll) status = respuestaIlJ-0x30;
int plc_outputs(void)
{int j=0;
unsigned char ordeni[5J = {0x42,0x31,0x38,0x30,OxOD};
unsigned char orden2[5] = {0x42,0x31,0x38,0x38,0x00};
unsigned char orden3[5] =
{0x42,0x31,0x39,0x30,OxODJ;
unsigned char respuesta [4];
int status=0;
/* orden l
0x42 monitor de sedales
0x31 I/O, entradas y salidas
0x38,0x30 con esto, según la pagina 21, le estoy pidiendo el estado de 8 de
las salidas, a partir de la 80, según la pagina 20 debe añadirse
Ox3_ y Ox3_ donde _ son los números 80
OxOD fin de mensaje*/
/* orden 2
0x42 monitor de sedales
0x31 I/O, entradas y salidas
A-84
APÉNDICES
APÉN
DICE
S. PR
OGRA
MA D
E MO
NITO
RIZA
CIÓN
Y CO
NTRO
L PL
ANTA
PILO
TO
0x38,0x38 con esto, según la pagina 21, le estoy pidiendo el estado de 8 de
las salidas, a partir de la 38, según la pagina 20 debe añadirse
Ox3_
_ y Ox3_ donde _ son los números 88
OxOD fin de mensaje*/
/* orden 3
0x42 monitor de senales
0x31 I/O, entradas y salidas
0x39,0x30 con cato, según la pagina 21, le estoy pidiendo el estado de 8 de
las salidas, a partir de la 08, según la pagina 20 debe añadirse
Ox3_ y Ox3_ donde _ son los números 90
OxOD fin de mensaje*/
for (j=0; j<5; j++)
{ _bi03_serialcom(_COM_SEND, COMÍ, ordeni [j]);
_bios_serialcom(_COM_RECEIVE, COMÍ, 0) ;
for (j=0; j<4; j++)
respuesta [j]
= (unsigned char)_bios_9erialcom(_COM_RECEIVE, COMÍ, 0} ;
if (respuesta [0] ! =0x66) return -1;
status = respuesta [2) -0x30;
for (j«0;j<8;j++)
í planta. salidas_plc [j] = status & 1;
status •»
= 1;
if (j==3) status = respuesta!!] -0x30;
}
for (j=0;j<5;j++)
í Jbio
s_se
rial
com
(_C
OM
_S
EN
D,
CO
MÍ,
ord
en2
[j]
) ;
~b
ios_
seri
alco
m(_
OO
M_
RE
CE
IVE
, C
OM
Í, O
) ;}
for
( j =
0; j
<4
; j-t
-+)
respuesta []) .(unsigned char)_bios_serialcom(_COM_RECEIVE, COMÍ, 0);
status = respuesta [2] -0x30;
for (j.8,-j«16,-j**l
( pla
nta
. sali
das_
plc
[j]
= s
tatu
s &
1;
sta
tus
»=
1;
if (j==ll) status = respuesta [1] -0x30;
1
for (j=0; j<5; j++)
( _bios_serialcom(_COM_SEND, COMÍ, orden31j]),-
_bio3_3erialcom(_COM_RECEIVE, COMÍ, 0)
;
for (j.0;j<4;j+*)
respuesta [jj. (unsigned charl_bio3_serialcom(_COM_RECEIVE, COMÍ, O) ;
status
=• respuesta [2] -0x30;
for
(j=
16
; j<
24
; j+
+)
( pla
nta
. sali
das_
plc
[j]
= s
tatu
s &
1;
sta
tus
»=
1;
if
( j —
19)
sta
tus
- re
spu
est
a [
1]
-0x
30
;
retu
rn O
;i int inicializar__plc(void)'
unsigned int in;
int j=0;
unsigned char orden[2] = {0x45,OxOD};
unsigned char respuesta [3];
int status=0;
APÉN
DICE
S A
- 85
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DAR
in=_bios_serialcom(_COM_INIT, COMÍ, SETTINGSl);
/'Inicializa el port com.*/
for (j=0; j<2; j-
f-f)
{ _bios_serialcom{_COH_SEND, COMÍ, ordenEj]);
bios serialcomf COM RECEIVE, COMÍ, 0);
y -
- -
for (j=0;j<3;j++)
respuesta [j J = (unsigned char)_bios_serialcom(_COM_RECEIVE, COMÍ, 0);
status » respuesta[1] & OxOF ;
if (respuesta[0]¡=0x61) return -1;
return O;
} /.».***.*..*********.**.***************.**.
»*
/
/* FunciÇn general para raonitorizar el estado de entradas, salidas,
rel,s internos... del PLC.
*/
int pie monitoríint tipo, int numero)
{ /*Tipo : 1
> Input /output
I/O
Tipo: 2
> Internal relay
IR
Tipo: 3
> Shift register
SFR
Tipo; 4
> Timer
TIM
Tipo: 5
> Counter
CNT
Tipo: 7
> D register
DR
int j=0;
unsigned char orden[5] = {0x42,0x30,0x30,0x30,OxOD};
unsigned char respuesta[6];
int status=0;
if ( tipo<l || tipo >7 I I tipo==6 ) return -2;
orden [1] = (unsigned char) (0x30
•*• tipo) ;
if (numero<0 |[ numero >255) return -2;
orden [2] = (unsigned char) (0x30 | ((numero»4) & OxOF) ) ;
orden[3]=(unsigned char) (0x30 | (numero & OxOF));
for (j=0;j<S;j++)
í _bios_aerialcom( COM_SEND, COMÍ, orden [j]);
bios serialcom(~"cOM RECEIVE, COMÍ, O) ;
T
"
~ "
switch(tipo)
{ case 1 :
case 2 :
case 3 :
for (j=0; j<4; j+ + )
respuestalj]-(unsigned char)_bios_serialcom(_COM_RECEIVE, COMÍ, O);
status = ( (respuesta [1] S OxOF) « 4)
-»•
(respuesta [2] & OxOF) ;
break;
case 4 :
case 5 :
case 7 :
for (j=0;j<6;j+*)
respuestafj]«(unsigned char)_bios_serialcom(_COM_RECEIVE, COMÍ, O);
status =
((respuesta[11 & OxOF) « 12) + ((respuesta[2] & OxOF) « 8)
•f ( (respuesta [3] & OxOF) « 4) +
(respuesta [4] & OxOF) ;
break;
Î
for (j=0; j<16; j+ + )
{ monitor[j] = status & 1;
status »= 1;
• i
retu
rn 0
;i A
-86
APÉN
DICE
S
APÉNDICES. PROGRAMA DE M
ONITORIZAOÓN Y CONTROL PLANTA PILOTO
int plc_set{int acción, int numero)
Acción: 1
Acción: 2
Acción : 3
Acción: 9
Acción: A(10) -
Acción: 8(11) -
> Input/output
> Internal relay
> Shift register
> Input/output
--> Internal relay
--> Shift register
I/O
IRSFR
I/O
IRSFR
OFF
OFF
OFF
ONONON
int j=0;
unsigned char orden[5j = {Ox4b, 0x30, 0x30, 0x30, OxOD} ;
unsigned char respuesta [3]
,•
if ( accion<l | |
acción >ll ) return -2;
orden [1]
a (unsigned char) (0x30
+• acción);
if (numero<0
J |
numero >255) return -2;
orden [2]
= (unsigned char) (0x30 | ( (numero»4) & OxOF));
orden [3J =
(unsigned char) (0x30 | (numero & OxOF) ) ;
for
(j=0
;j<:5
; j+ + )
í_b
ios_
seria
lco
m(_
CO
M_
SE
ND
, C
OM
Í, o
rden
[j] ) ;_
bio
s_se
rialc
om
i_C
OM
_R
EC
EIV
E,
CO
MÍ,
O) ;
respuesta [0] - (unsigned char)_bios_serialcom
(_CO
M_R
EC
EIV
E,
COM
Í, O) ;
respu
esta [1] = (unsigned char)_bios_serialcom(_C
OM
_RE
CE
IVE
, CO
MÍ,
0) ;if
(respu
esta [0] ==0x64){respuesta [2] = (unsigned char)__bios_serialcom(_COM_RECEIVE, COMÍ, 0) ;
return -1;
int pic timer ( int valor, int numero)
íint j=0;
unsigned char orden[8] = {0x43, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, OxOD} ;
unsigned char respuesta [3J
;
if ( valor<0 || valor > OxFFFF ) return -2;
if (numero<o | |
numero =>255)
return -2;
orden [1]
=> (unsigned char) (0x30 | ((numero»4) í OxOF) ) ;
orden [2
]= (unsigned char) (0x30
j (numero & OxOF) )
;
orden [3]
=• (unsigned char) (0x30 | ((valor»12) & OxOF) ) ;
orden [4]
= (unsigned char) (0x30 | ( (valor»8) & OxOF) ) ;
orden [5J
= (unsigned char) (0x30 j <(valor»4) & OxOF) ) ;
orden [6] » (unsigned char) (0x30 |
(valor & OxOF)};
for
(j*0
;j<8
;J+
+>
{_bios_serialcom(_C
OM
_SEN
D,
COM
Í, o
rden
fjj ) ;_bios_serialcom
(_CO
M R
ECEIV
E, COM
Í, O
) ;}
reapu
esta (O] « (unsigned char)_bios__serialcom
(_CO
M_R
EC
EIV
E,
COM
l, 0) ,-
respuesta [1] « (unsigned char)_bios__serialcom
(_CO
M_R
EC
EIV
E,
COM
l, 0) ,•
if (resp
uesta [o] ==0x64)
~"írespuesta [2]
a (unsigned char)_bios_serialcom(_COM_RECEIVE, COMl, o) ;
return -1;
APÉNDICES A
- 87
DESARROLLO E IMPLEM
ENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
int pic counter ( int valor, int numéro)
íint j=0;
unsigned char orden[8] = {0x44 , 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, OxOD) ;
unsigned char respuesta [3]
;
if ( valor<0 | |
valor > OxFFPF ) return -2,-
if (numero<0 | |
numéro >255) return -2,-
orden [1] = (unsigned char) (0x30 | ( (numero»4) & OxOF) ) ;
orden f2J =
(unsigned char) (0x30 [ (numéro & OxOF) ) ;
orden [3] = (unsigned char) (0x30 | ((valor»12) & OxOF) ) ;
orden [4] = (unsigned char) (0x30 | ((valor»8) & OxOF) ) ;
orden [5] = (unsigned char) (0x30 j ( (valor»4) & OxOF) )
,-orden {6]
» (unsigned char) (0x30 j (valor & OxOF) ) ;
for (js=0;
j<8; j+ + >
íJbios_serialcom( COM_SEND, COMÍ, orden [j]
) ;
_bios_serialcom(~COM_RECEIVE, COMl, 0)
,-
respuesta [0] = (unsigned char)_bios_gerialcom(__COM_RECEIVE, COMl, 0) ;
respuesta [1J =
(unsigned char)_bios_serialcom(_COM_RECEIVE, COMl, 0) ;
if ( respuesta [0} «0x64)
{respuesta (2]
= (unsigned char)_bios_serialcom (_COM_RECEIVE, COMl, 0) ;
return -1;
int plc_programa(int on_off)
int intervalo;
switch(on off)
{case 1 ;
intervalo=planta.duracion__purga,-
if (plc_timer( intervalo, 3)!=0) plc_timer( intervalo, 3);
intervalo=planta.tiempo__purga*10-planta.duracion_purga;
if (plc_timer( intervalo, 4)!=0) plc_timer( intervalo, 4);
intervalo=planta.intervalo_dosificacion[0}*10-1;
if (plc_timer( intervalo, 11)!=0) plc_timer( intervalo, 11);
intervalo=planca.intervalo dosificacionfl]*10-l;
if (plc—timer( intervalo, 13)!=0) plc_timer( intervalo, 13);
intervalo=planta.intervalo_limp_dosif(0] *10-1;
if (plc_timer( intervalo, 14)í =0) pic timer( intervalo, 14);
plc_counter( planta .pistonadas__limp_dosif [0] , 10) ;
intervalo=planta.intervalo flojet_on*lO;
if (plc_timer( intervalo, 30)!=0) plc_timer( intervalo, 30);
if (plc_timer( intervalo, 32)1=0) plc_timer( intervalo, 32);
intervalo=planta.intervalo_flojet_off*10;
if (plc_timer( intervalo, 31)!=0) plc_timer( intervalo, 31);
if (plc_timer( intervalo, 33)!=0) plc__timer{ intervalo, 33);
if (plc_set (10,48) !=0) plc_set (10,48) ,- /
'Enciende programa PLC*/
break;
case 0:
if (plc_set(10,49)!=0) plc_set(10,49); /*Apaga programa PLC*/
break;
~
A-88
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ON
rroR
iZA
dóN
Y C
ONTR
OL P
IANT
A PH
OTO
int
cam
bia
r_ali
men
tacio
n(v
oid
)i char mensaje [100];
int intervalo,hora ;
float mAoO.OF;
struct tm *t;
planta. t_actual = time {NULL<) ;
t = localtime í ¿planta.t_actual );
hora = t->tm_hour;
planta.intervalo_dosificacion[0]=planta.alimento[hora].nitrógeno;
planta.intervalo_dosificacion[1]=planta.alimento[hora].carbono;
planta.caudal_agua=planta.alimento[hora].agua;
intervalo=planta.intervalo_dosificacion[O]*10-1;
if (plc_timer( intervalo, 11)!=0) plc_timer( intervalo, 11};
intervaloaplanta.intervalo_dosificacion[1]*10-1;
if (plc_timer( intervalo, 13)!»0) plc_timer{ intervalo, 13);
mA_caudal( "c;\\depura\\v_agua.dat", planta.caudal_agua, &mA);
pc!726(0,mA);
/«Abre la v Ivula de entrada de agua*/
sprintf(mensaje,"Cambio alimentación: N %4i seg, C %4i seg, Q %5.2f ral/min"
planta.intervalo_dosificacion[0], planta.intervalo_dosificacion[1],
planta.caudal_agua);
guarda_menaaje( mensaje };
return 0;
/* CCdigo necesario si desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
flifdef TEST
void dec_to_bin (int numero__ decimal)
{numero_decimal=0; }
int pc!726 (unsigned char canal, float miliamperios)
{canal=0; miliamperios=0. OF; return 0; }
void delay { clock_t wait }
{wait=0;}
void graf_led{ int led, int on_off )
{led=0; on_of f=0; }
void graf_nivel (int nivel, int on_off)
{nivel=0; on_off=0;}
void guarda_mensaje ( char *mensaje)
{mensaje=0; }
void graf_borra_ayuda(void) { }
void graf_ayuda__general (void) { }
void inicializar_tiempos (void) {}
int mensaje_a_SUN(char *mensaje)
(men9aje=0; return 0;}
void
im
prim
e (c
har
*men
saje
){m
ensa
je=0
; }
int main ( int argc, char *argv[])
{int acción, numero;
if largc—l)
( printf ("\nUtiliza: pic
valor numero \n")
,-return -i;
accio
naato
i (a
rgv
[lj
) ;n
um
ero
=at
oi
(arg
v{
2)
) ;
if
(in
icia
liz
ar_
plc
() ¡
=0)
printf ("ERROR: PLC no conectado, o comunicación incorrecta");
return -2;
if (plc_timer( acción, numero) «0) printf ("\nSet OK\nn) ;
else printf("\nSet NO OK\n");
AP
ÉN
DIC
ES
A -
89
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONTR
OL D
E ED
AR
retu
rn
0 ;
p) A-9
0A
PÉ
ND
ICE
S
APÉNDICES. PROGRAMA DE MONITORIZAOÓN Y CONTROL PLANTA PILOTO
PRINTER.C - FUNCIONES PARA MANEJAR LA IMPRESORA
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 4/10/95
«include <dos.h>
^include <bios.h>
ff include <conio.h>
Sine lude <stdio.h>
ftinclude <time.h>
ffdefine LPT1 O
void imprime (char
*mensaje) ;
/* Mira el estado de la impresora, y si es correcto, imprime el mensaje.
*/
void imprime (char
*raensa j
e)
funsigned
patatús ;
int i = 0,
largo;
time_t Itíme;
char hora [30]
;
time (tltime) ;
sprint f (hora,
"%sn ,
c time ( <ime ) )
,-
while (mensaje [i]
¡=10 t& i<80 )
i + +
;
largo=i;
if (largo==80) return;
/* Fail if any error bit is on, or if either operation bit is off. */
pstatus - _bios_printer ( _PRINTER_STATUS, LPT1, 0 ) ;
if( (pstatus & 0x29) || !
(pstatus & 0x80)
|| ¡
(psCatus & 0x10)
}
pstatus = 0;
elsepstatus = 1 ;
if (pstatus==l)
{for (i=0;i<26;i++) _bio3_printer { _PRINTER_WRITE, LPT1, horati] ) ;
for (i-0;i<largo;i+»l _bio3_printer( _PRINTER_WRITE, LPT1, mensajelij );
ttifdef TEST
void main (void)
char aviso[] ="Hola hola pepsicola\v\v\n\xO" ;
imprime (aviso) ;
iendif
/"••«
APÉNDICES A
- 91
DESARROLLO E IMPLEMENTAQON DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
TROVIS.C - FUNCIONES PARA LA COMUNICACIÓN CON EL PID TROVIS 6497
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISION: 9/4/97
{(include <bios.h>
ftinclude <conio. h>
#include <stdio.h>
((include <stdlib.h>
(I include <memory.h>
it inc lude < t itne-. h
>
«define TEST
((define COM3
2((define
SETTINGS3 (_COM_9600 | _COM_CHR8 | _COM_STOP1 ( _
COM_NOPARITY)
/»*****************•»*** Subrutinas del fichero ******************•****/
int inicio_comunica (void) ;
int comunica (unsigned char «orden, unsigned char 'respuesta) ;
unsigned short CRC16 (unsigned char *puchHsg, unsigned short usDataLen) ;
int orden_MODBUS { int dirección, int función, int param_a, int param_b) ;
y********************* Subrutinas externas necesarias ******************/
^****. ************** variables comunes del programa *****•**********»***/
int registros [60]
;int
coils [16]
,-
/ ......... **•** ................ ****.*****.**** ....... *.******. ..... /
/* Manda una orden de comprobación de la comunicación entre el PC */
/* y el equipo a controlar.
*/
/•
•//* Como la lectura del primer registro siempre da lo mismo
*/
/* se aprovecha esta lectura para comprobar el estado de la
*/
/* comunicación
*//*
*//* Si no la lectura no es la prevista se devuelven los siguientes */
/* valores :
*/
/* */
/*
O Respuesta correcta.
*//*
1 Comunicación no establecida correctamente.
*/
/* */
/**.*******.**.**.***********************.*.****.********•******..*/
int inicio comunica (void)
{unsigned char mensaje_comprobacion [9)
={0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00} ;
unsigned char respueata_comprobacion [8]
;
memset (respuesta_comprobacion, 0, sizeof (respuesta_comprobacion) ) ;
_bios_serialcom(_COM_INIT, COM3, SETTINGS3) ; /«Inicializacion del puerto serie*/
if {comunica (mensaje_comprobacion, respuesta_comprobacion) )
return 1;
/*.*****..*********•.»***.***..*************,.*»»******************/
/« Manda una orden al equipo a controlar y recibe la respuesta.
*/
/* Como hay que enviar un checksum (CRC)
high y low se llama a la */
/* sub rut i na CRC16 para calcularlo.
*/
/*
*//* Para evitar problemas en el programa si no existe comunicación */
A-92
APÉNDICES
)••••••••••••••*••••••••••••€
APÉN
DICE
S. PR
OGRA
MA D
E M
oNrro
RizA
cióN
Y CON
TROL
PLAN
TA P
ILOTO
/*
en
tre
el
PC
y el
eq
uip
o
se
dev
uelv
en
los
sig
uie
nte
s v
alo
resi
*/
/*
*/
/*
' 0 R
esp
uest
a
co
rrecta
. *
//*
1
Ord
en
inco
rrecta
. •
*/
/*
.2 R
esp
uest
a n
ula
. *
//*
3
C
hec
ksu
m d
e en
vió
in
co
rrecto
. *
//*
4
C
hec
ksu
m
de
recep
ció
n
inco
rrecto
. *
//*
*/
int
com
un
ica
(un
sig
ned
ch
ar
*o
rden
, un
sig
ned ch
ar
*re
spu
est
a)
{ int
i=0
, la
rgo
=0 ;
- u
nsi
gn
ed sh
ort
ou
t;
out=
CR
C16
(o
rden
, 6)
,-o
rden
[7
] = (
un
sig
ned
ch
ar)
(O
xFF
& o
ut)
;o
rden
[6
] o
(un
sig
ned
ch
ar)
(O
xFF
& {
out
»
8)
);
for
(i=
0;i
<8
; i
+ +
) _
bio
s_se
rial
com
{_
CO
M_
SE
ND
, CO
M3
, ord
en (
i] )
;
í resp
ue
sta
fi]
=
(un
sig
ned
ch
ar)
b
ios
seri
alc
om
(
CO
M
RE
CE
IVE
, C
OM
3,}
/*
pri
ntf
("\n
" ) ;
for
(i=
0;i
<7
;i+
+)
pri
ntf
("
%02
X",
re
sp
ue
sta
[ij
) ;p
rin
tf (
B\n
n ) ;
*/
retu
rn
0;
i /*T
he
fun
cti
on
tak
es
two
arg
um
en
ts:
*p
uch
Msg
;
Pu
nte
ro
a
la
cad
ena
de cara
cte
res
del
men
saje
q
ue
se
qu
iere
calc
ula
r C
RC
usD
ataL
en
; L
on
git
ud
del
men
saje
(n
§ d
e b
yte
s)
Th
e fu
ncti
on
retu
rns
the
CR
C
as
a ty
pe u
nsi
gn
ed sh
ort
*/
un
sig
ned sh
ort
C
RC
16 (
un
sig
ned ch
ar
"pu
chM
sg, u
nsi
gn
ed sh
ort
u
sDat
aLen
)(
un
sig
ned
ch
ar
uchC
RC
Hi
o
OxF
F ;
/*
Inic
iali
zacio
n
hig
h C
RC
wu
nsi
gn
ed ch
ar
uchC
RC
Lo
= O
xFF
; /*
In
icia
lizacio
n
low
CR
C b
yte
,u
nsi
gn
ed
u
lnd
ex
; /*
w
ill
ind
ex in
to
CR
C lo
ok
up
*/
/*
Tab
le
of
CR
C v
alu
es
for
hig
h-o
rder
by
te
*/
sta
tic
u
nsi
gn
ed
ch
ar
auch
CR
CH
il]
= {
0x
00
, O
xC
l,
0x81,
0x
40
, 0
x0
1, O
xCO
, 0
x8
0,
0x
41
, 0x
01
, O
xCO
,0
x8
0,
0X
41
, 0
x0
0,
Ox
Cl,
0
X8
1,
0x
40
, 0x01,
OxC
O,
0x
80
, 0x
41
,0
x0
0,
Ox
Cl,
0x81,
0x
40
, 0
x0
0,
Ox
Cl,
0x81,
0x
40
, 0
x0
1,
OxC
O,
0x
80
, 0
x4
1,
0x
01
, O
xCO
, 0
x8
0,
0x
41
, 0x
00
, O
xC
l,
0x
81
, 0
x4
0,
0x
00
, O
xC
l, 0
x8
1, 0
x4
0,
0x
01
, OxC
O,
0x
80
, 0
x4
1,
0x
00
, O
xC
l,0x81,
0x
40
, 0
x0
1, O
xCO
, 0
x8
0,
0x
41
, 0x
01
, O
xCO
, 0
x8
0, 0
x4
1,
0x
00
, O
xC
l,
0x81,
0x
40
, 0
x0
1,
OxC
O,
0x
80
, 0
x4
1, 0
x0
0,
Ox
Cl,
0x8 1
,
0x
4 0
, 0
x0
0 ,
OxC
l ,
0x81 ,
0x
40
, 0
x0
1 ,
OxC
O ,
0x
80 ,
0x4 1
,0
x0
0,
OxC
l ,
0x81,
0x
40
, 0
x0
1 ,
OxC
O ,
0x
80
, 0
x4
1 ,
0x01
, O
xCO
,0
x8
0,
0x
41
, 0x
00
, O
xC
l,
0x
81
, 0x
40
, 0
x0
0,
Ox
Cl,
0x81,
0x
40
,0
x0
1,
OxC
O,
0x
80
, 0
x4
1,
0x
01
, OxC
O,
0x
80
, 0
x4
1,
0x
00
, O
xC
l,0x81,
0x
40
, 0
x0
1,
OxC
O,
0x
80
, 0
x4
1,
0x
00
, O
xC
l,
0x81,
0x
40
,0
x0
0 ,
OxC
l ,
0x81
, 0
x4
0 ,
0x
01 ,
OxC
O,
0x
80
, 0
x4
1 ,
0x
01 ,
OxC
O ,
0x
8 0
, 0x
4 1
,
0x
00 ,
OxC
l ,
0x8 1
,
0x
4 0
, 0
x0
0 ,
OxC
l ,
0x
8 1
,
0x
4 0
,0
x0
1,
OxC
O,
0x
80
, 0
x4
1, 0
x0
0,
Ox
Cl,
0x
81
, 0
x4
0,
0x
01
, O
xCO
,0
x8
0,
0x
41
, 0
x0
1, O
xCO
, 0
x8
0,
0x
41
, 0x
00
, O
xC
l,
0x
81
, 0
x4
0,
0x
00
, O
xC
l,
0x81,
0x
40
, 0
x0
1,
OxC
O,
0x
80
, 0
x4
1, 0
x0
1,
OxC
O,
0x
80
, 0
x4
1,
0x
00
, O
xC
l,
0x
81
, 0
x4
0,
0x
01
, OxC
O,
0x
80
, 0
x4
1,
0x
00
, O
xCl,
0x
81
, 0
x4
0,
0x
00
, O
xC
l,
0x81,
0x
40
, 0
x0
1,
OxC
O,
0x
8 0
, 0x
4 1
,
0x
00 ,
OxC
l ,
0x8 1
, 0
x4
0 ,
0x
0 1
,
OxC
O ,
0x
80 ,
0x4 1
,0
x0
1,
OxC
O,
0x
80
, 0
x4
1,
0x
00
, O
xC
l,
0x81,
0x
40
, 0
x0
1,
OxC
O,
0) ; by
te.
Todos
los
bit
s a
Todos
los b
its a
I*/
APÉN
DICE
S A
- 93
1 (>
••••••••*•••••••••••••••••••
DES
AR
RO
aO E
iMPL
EMEN
TAaÓ
N D
E U
N S
ISTE
MA
SU
PERV
ISO
R PA
RA U
GES
TIÓ
N Y
CO
NTR
OL
DE E
DA
R
0x
60
, 0
x4
1, 0
x0
0,
Ox
Cl,
0x81,
0x
40
, 0
x0
0,
Ox
Cl,
0x
81
, 0
x4
0,
0x01
, O
xCO
, 0
x8
0,
0x
41
, 0x
01
, OxC
O,
0x
80
, 0
x4
1, 0
x0
0,
Ox
Cl,
0x81
, 0
x4
0,
0x
00
, O
xC
l,
0x81,
0x
40
, 0
x0
1,
OxC
O,
0x
80
, 0x
41
,0
x0
0,
Ox
Cl,
0x81,
0x
40
, 0
x0
1,
OxC
O,
0x
80
, 0
x4
1, 0
x0
1, O
xCO
,0
x8
0,
0x
41
, 0
x0
0,
Ox
Cl,
0x81, 0
x4
0)•
;
/*
Tab
le
of
CR
C
valu
es
for
low
-ord
er
by
te
*/
sta
tic
u
nsi
gn
ed
/**
/ ch
ar
auch
CR
CL
o[]
=
{0
x0
0,
OxC
O,
Ox
Cl,
0x
01
, OxC
3,
0x
03
, 0
x0
2,
OxC
2,
OxC
6,
0x
06
,0
x0
7,
OxC
7,
0x
05
, O
xCS
, O
xC4,
0
x0
4,
OxC
C,
OxO
C,
OxO
D,
OxC
D,
OxO
F,
OxC
F,
OxC
E,
OxO
E,
OxO
A,
OxC
A,
OxC
B,
OxO
B,
OxC
9,
0x
09
,0
x0
8,
OxC
B,
OxD
8,
0x18,
0x19,
OxD
9,
Ox
lB,
OxD
B,
OxD
A,
Ox
lA,
Ox
lE,
OxD
E,
OxD
F,
Ox
lP,
OxD
D,
Ox
lD,
Ox
lC,
OxD
C,
0x
14
, O
XD
4,O
xD5,
0x15,
OxD
7,
0x17, 0x16,
OxD
6,
OxD
2,
0x
12
, 0x13,
OxD
3,O
xll
, O
xD
l,
OxD
O,
0x10,
OxF
O,
0x
30
, 0x31,
Ox
Fl,
0
x3
3,
OxF
3,O
xF2,
0
x3
2,
0x
36
, O
xF6,
O
xF7,
0
x3
7,
OxF
S,
0x
35
, 0
x3
4,
OxF
4,O
x3C
, O
xFC
, O
xFD
, O
x3D
, O
xFF
, O
x3F
, O
x3E
, O
xFE
, O
xFA
, O
x3A
,O
x3B
, O
xFB
, 0
x3
9,
OxF
9,
OxF
8,
0x
38
, 0
x2
8,
OxE
8,
OxE
9,
0x
29
,O
xEB
, O
x2B
, O
x2A
, O
xEA
, O
xEE
, O
x2E
, O
x2F
, O
xEF
, O
x2D
, O
xED
,O
xEC
, O
x2C
, O
xE4,
0
x2
4,
0x
25
, O
xE5,
0
x2
7,
OxE
7,
OxE
6,
0x
26
,0
x2
2,
OxE
2,
OxE
3,
0x
23
, O
xE
l,
0x
21
, 0x
20
, O
xEO
, O
xAO
, 0
x6
0,
0x
6 1
,
OxA
l ,
0x
63 ,
OxA
3 ,
OxA
2 ,
0x
62
, 0
x6
6 ,
OxA
6 ,
OxA
7 ,
0x
67
,O
xA5,
0
x6
5,
0x
64
, O
xA4
, O
x6C
, O
xAC
, O
xAD
, O
x6D
, O
xAF
, O
x6F
,O
x6E
, O
xAE
, O
xAA
, O
x6A
, O
x6B
, O
xAB
, 0
x6
9,
OxA
9 ,
OxA
S,
0x
68
,0
x7
8 ,
OxB
8 ,
OxB
9 ,
0x7
9 ,
OxB
B ,
Ox7
B ,
Ox7
A,
OxB
A,
OxB
E ,
Ox7
E ,
Ox7
F,
OxB
F,
Ox7
D,
OxB
D,
OxB
C,
Ox7
C,
OxB
4 ,
0x
74
, 0
x7
5,
OxB
S,
0x
70
, O
xBO
, 0
x5
0,
0x
90
, 0x91,
0x
51
, 0
x9
3,
0x
53
, 0
x5
2,
0x
92
,0
x9
6,
0x
56
, 0
x5
7,
0x
97
, 0
x5
5,
0x
95
, 0
x9
4,
0x
54
, O
x9C
, O
xSC
,O
xSD
, O
x9D
, O
xSF
, O
x9F
, O
x9E
, O
xSE
, O
xSA
, O
x9A
, O
x9B
, O
x5B
,0
x9
9,
0x
59
, 0
x5
8,
0x
98
, 0
x8
8,
0x
48
, 0
x4
9,
0x
89
, O
x4B
, O
x8B
,O
xSA
, 0x
4 A
, O
x4E
, O
x8E
, O
x8F
, 0x
4 F
, O
x8D
, O
x4D
, O
x4C
, O
xSC
,0
x4
4,
0x
84
, 0
x8
5,
0x
45
, 0
x8
7,
0x
47
, 0
x4
6,
0x
86
, 0
x8
2,
0x
42
,0
x4
3,
0x
83
, 0
x4
1, 0
x8
1, 0
x8
0,
0x
40
} .-
í uln
dex
=
uch
CR
CH
i *
*p
uchM
sg+
+
; /*
calc
ula
te
the
CR
C *
/uc
hCR
CH
i =
(un
sig
ned
ch
ar)
(u
chC
RC
Lo
"
auch
CR
CH
i [u
lnd
ex
j )
;uc
hCR
CL
o H
auc
hCR
CL
o [u
lnd
ex
] ;
}re
turn
(u
nsi
gn
ed
sh
ort
) (
(uch
CR
CH
i «
8)
| uc
hCR
CL
o)
;
/»
En
v¡a
u
na
ord
en
a
TR
OV
is
med
ian
te p
roto
co
lo
MO
DB
US
y re
cib
e
la
resp
uesta
.
dir
ecció
n
->
Iden
tif
icati
vo
d
el
esc
lav
ofu
nció
n
->
Fu
nci
Cn
Mod
bus
a eje
cu
tar
para
m__
b ->
S
egu
nd
o
par
metr
o
de
la
fun
ciC
n
CC
dig
os
de
reto
rno
:
-2
-> O
rden
en
via
da
y re
cib
ido
m
en
saje
d
e err
or
-3
->
Ord
en
en
via
da,
resp
uesta
re
cib
ida
co
n c
hek
sum
co
rrecto
, p
ero
int
ord
en_
MO
DB
US
(in
t d
irecció
n,
int
fun
ció
n,
int
para
m_
a,
int
par
am_
b)
«d
efi
ne
RE
SPU
EST
AS
(A, B
) fo
r (i
=A
; i<
B; i
++
) re
spu
est
a [
i]
=
(un
sig
ned
ch
ar)
_b
ios_
seri
alco
m(_
CO
M_
RE
CE
lVE
, C
OM
3,
0)
int
i=0
;u
nsi
gn
ed sh
ort
ou
t;u
nsi
gn
ed
ch
ar
ord
en
(8];
un
sig
ned ch
ar
resp
uest
a [
14
0] ;
mem
set (r
esp
uesta
, 0
, siz
eo
f (r
esp
uest
a)
) ;
A -
94
APÉN
DICE
S
orden [1]
=orden[2]=
orden [3]
=orden [4]
=orden[5]=
unsigned char) (OxFF
& función);
APÉNDICES. PROGRAMA DE MONITORIZACIÓN Y CONTROL PLANTA PILOTO
/* Funcitn a realizar */
unsigned char) (OxFP & (param_a » 8)}; /* Par metro a High */
unsigned char) (OxFF
& param_a)
,-/* Par metro a Low */
unsigned char) (OxFF
& (param_b » 8)); /* Par metro b High */
unsigned char) (OxFF
& param_b);
/* Par metro b Low */
out=CRC16(orden,6);
orden[6] =
(unsigned char) (OxFF
& (out
» 8));
orden{7]= (unsigned
char) (OxFF
& out);
/" Cheksum High */
/* Cheksum Low */
for (i=0;i<8;i++) _bios_serialcom{_COM_SEND, COM3, ordenti] );
/* Envja orden */
switch(funcion) {
case 1:
/*** Read Coil Status ***/
RES PUESTAS (0,
3) ;
/* Lee 3 primeros bytes */
if (respuesta [1]
! =orden [1]
)
/* Mensaje de error */
RES PUESTAS (3, 5)
;return -2;
/* Lee 2 bytes finales*/
RESPUESTAS(3, (3+respuesta[2]+2)) ;
/* Lee resto de la respuesta */
out=CRC16(respuesta,(unsigned short) (i-1)); /'Comprueba cheksum */
if ( ((unsigned char) (OxFF
& (out
» 8))) 1= respuesta [i-lj
||
((unsigned char) (OxFF & out)) !=
respuesta[i]) return -i¡
for (i=param_a;i<param_a+param b;i++)
/* Asigna valores */
coils [i]=
(respuesta (3+
(i/8)] » (i-param_a-(i/8*8)) ) & 1;
break;
case 3:
/*** Read Holding Register ***/
RESPUESTAS(O,3);
/* Lee 3 primeros bytes */
if (respuesta[1]!=orden[1])
/* Mensaje de error */
iRESPUESTAS(3,5);
/* Lee 2 bytes finales*/
return -2;
RESPUESTAS (3, (3-t-respuesta
[2] +2) ) ;
/* Lee resto de la respuesta "/
out=CRC16(respuesta,{unsigned short)(i-1)); /'Comprueba cheksum */
if ( ((unsigned char) {OxFF & (out
» 8}))
!=>
respuesta [i-1]
|)
((unsigned char) (OxFF & out)) !=
respuesta[i]) return -1;
for (i=param_a;i<param_a+param_b;i++)
/* Asigna valores */
registros(i]= (respuesta[3+2*(i-param_a)] « 8) |
respuesta[4+2*(i-param_a));
break;
case 5:
/*** Forcé Single Coil ***/
RESPUESTAS(O,3);
/* Lee 3 primeros bytes */
if (respuesta[1]!=ordenll])
/* Mensaje de error */
íRESPUESTAS(3,5);
return.-2;
}RESPUESTAS(3,8);
/* L
ee 2 by
tes fin
ales*/
/* L
ee resto de b
ytes
*/
out»CR
C16(respuesta,(unsigned sh
ort) (i-1
) ),- /'C
omprueba
cheksum
*/if
( ((unsigned ch
ar) (O
xFF & (out
»
8)))
i= respuesta (i-U
||
((unsigned char) (O
xFF &
ou
t)) != resp
uesta[i])
return
-1;
if ( respuesta{6]!=
orden[6] || resp
uesta!?]!*
ord
en[7
] )
return
-3;
break
;case
6: .
/**
* Preset
Sin
gle R
egister ***/
RESPU
ESTAS(0,8);
/* L
ee respuesta */
out=C
RC
16(respuesta, (unsigned sho
rt) (i-1) );
/'Com
prueba cheksum
*/
if (
((unsigned char) (O
xFF &
(out »
8)))
!= resp
uesta[i-1
] J|
((unsigned char) (O
xFF &
ou
t)) != resp
uesta[i])
return
-1;if
( respu
esta [6] !=orden[6]
| | respuesta[7J !=>orden[7J
) return -3
;b
reak;
Î
printf("\nOrden: \n");
for (i=0;i<8;i++) printf(" %02X".orden[i]);
printf("\nRespuesta: \n");
for (i=0;i<20,-i
+ + ) printf ("
%02X", respuesta[i] ) ;
printf(" ,.,\n");
APÉNDICES A
- 95
DESARROLLO E IMPLEMENTAGÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
retu
rn
0 ;
i/* CCdigo necesario si desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
«ifdef TEST
void delayí clock_t wait )
(clock_t goal;
goal = wait
+- clocM);
while! goal > clock!) )
int
ma
int
int
arg
c,
ch
ar
*a
rgv
[])(
int
reto
rno
;in
t i;
if (a
rgc
==
l){prin
tf ("\n
Utiliz
a:
trov
is fu
nció
n
para
metro
_a
para
metro
_b
\n"
í;re
turn
- 1
;i
if (inicio_comunica () )
{printf ( "\nComunicacion no establecida. Comprobar conexiones");
return -1;
}else printf (" \
nComunicacion OK !¡!\n");
delay (500)
;
retorno = orden_MODBUS ( l , a
toi (argv[l] ) , atoi (argv[2] ) , atoi (argv
[3] ) );
printf ("\nValor de retorno de la función:
%i\n", retorno);
if (retorno !=0)
return -2 ;
if (retorno==0) printf ( "\nOrden OK! ! ! \n"
) ;
if (atoi
(argv[l] } ==1)
(printf ("Coils: \n") ;
for
(i=0
; i<1
6;i + + )
prin
tf ("
}if
(ato
i (argv [1
] ) ==
3)
prin
tf ("R
eg
istros:
\n"
) ,-fo
r (i = 0
;i<5
8;i+
+)
prin
tf ("tt
", co
ils [i]}
;
" , i, re
gis
tros lij ) ;
orden_MODBUS(1,3,1,1);
orden_MODBUS(Oxb,1,4,4);
orden~MODBUS(Oxf,5,Oxc,OxffOO);
orden__MODBUS (1,3,0,1);
orden~MODBUS(0x12,6,9,0x64);
retu
rn
0;
iA-9
6APÉNDICES
»•••••••••••••••••••••••••••«
APÉN
DICE
S. PR
OGRA
MA D
E MO
NO-O
RIZAC
IÓN
Y CON
TROL
PLAN
TA PI
LOTO
DE
PU
RA
.DA
T
- F
ICH
ER
O
DE
CO
NFI
GU
RA
CIÓ
N
10
INT
ER
VA
LO
D
E
CO
NT
RO
L D
E O
XIG
EN
O60
0 IN
TE
RV
AL
O
DE
E
ST
IMA
CIÓ
N
DE
L
CO
NSU
MO
D
E O
XIG
EN
O
30
0 3
00
INT
ER
VA
LO
LIM
PIE
ZA
D
OS
IFIC
AD
OR
A
NIT
RÓ
GE
NO
/
CA
RB
ON
O5
5 N
UM
ERO
D
E P
IST
ON
AD
AS
LIM
PIE
ZA
D
OS
IFIC
AD
OR
A
NIT
RÓ
GE
NO
/
CA
RB
ON
O15
IN
TE
RV
AL
O
AC
TU
AC
IÓN
S
UP
ER
VIS
IÓN
P
LC
300
INT
ER
VA
LO
TO
MA
D
E
DA
TOS
EN
FI
CH
ER
O50
0 T
IEM
PO
IN
TE
RV
AL
O
EN
TR
E
PUR
GA
S (M
xim
o
10
00
) + 4
*1
00
0
60
TIE
MP
O
AC
TU
AL
IZA
CIÓ
N
DE
L
A G
RÁ
FIC
A
EN
PA
NT
AL
LA
(S
EG
)3
00
C
AU
DA
L
EN
TR
AD
A A
GU
A60
0 C
AU
DA
L R
EC
IRC
UL
AC
ION
IN
TE
RN
A
(RE
AT
OR
3
->
RE
AC
TO
R
1)
7 T
IEM
PO
F
LO
JET
S
EN
CE
ND
IDA
S23
T
IEM
PO
F
LO
JET
S
APA
GA
DA
S30
50
50
V
EL
OC
IDA
D A
GIT
AD
OR
ES
(%)
2.5
2
.5
2.5
G
AN
AC
IA C
ON
TR
OL
AD
OR
100
100
100
CO
NST
AN
TE
DE
TIE
MP
O
INT
EG
RA
L0
.00
2
0.0
02
0
.00
2 C
ON
STA
NT
E
DE
TIE
MP
O
DE
RIV
AD
O1
11
P
ID A
CT
IVO
(U
NO
) 0
IN
AC
TIV
O (
DO
S)
4.0
1
2.0
1
2.0
S
I E
L P
ID
EST
A
INA
CT
IVO
, S
AL
IDA
m
A V
ÁL
VU
LA
-1.3
44
3
0.9
96
4
-1.7
84
4
OR
DEN
AD
A
OR
IGE
N
CO
RR
EL
AC
IÓN
O
XIG
EN
O
MV
0.0
52
88
0
.05
81
8
0.0
81
19
P
EN
DIE
NT
E
CO
RR
EL
AC
IÓN
OX
IGE
NO
_MV
AL
IME
NT
O.D
AT
-
FIC
HE
RO
D
E C
ON
FIG
UR
AC
IÓN
1
TIP
O
DE
AL
IME
NT
AC
IÓN
(0
C
ON
STA
NT
E,
1
PE
RF
IL.)
HO
RA
S
28
35
65
100
200
200
160
100
45
25
18
13
10
8 7
6 6
7 7
8 10
12
15
23
DO
SIF
ICA
CIa
N
CA
RB
ON
O
(CA
DE
NC
IA E
N S
EG
UN
DO
S)30
37
67
10
2 20
2 20
2 16
2 10
2 47
27
20
15
11
10
9
7 7
8 8
9 11
14
16
24
108
100
95
90
90
93
100
113
128
143
115
184
APÉN
DICE
S A
- 97
(>
••••••••••••••••••€
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SISTE
MA SU
PERV
ISOR
PARA
LA GE
STIÓ
N Y C
ONTR
OL D
E ED
AR
V_A
GU
A.D
AT
-
FIC
HE
RO
D
E C
ON
FIG
UR
AC
IÓN
9 4.0
00
.
0.0
00
8.0
00
36
.43
01
0.0
00
92
.16
61
2.0
00
15
6.6
58
14
.00
0
22
3.0
48
16
.00
0
29
5.5
67
20
.00
0
44
1 .1
76
BO
MB
A1.
DA
T
- F
ICH
ER
O
DE
CO
NFI
GU
RA
CIÓ
N
15 4.0
00
0
.00
05
.00
0 5
3.0
5.5
00 8
0.0
6.0
00
10
5.6
6.5
00
13
3.0
7.0
00
15
3.0
7.5
00 1
85.0
10
.00
0
26
0.0
12
.00
0
27
5.0
14
.00
0
34
7.0
18
.00
0
48
8.0
20
.00
0
55
0.0
BO
MB
A2.
DA
T
- F
ICH
ER
O
DE
CO
NF
IGU
RA
CIÓ
N
4.0
00
0.0
00
5.0
00 1
70
.06
.00
0
34
0.0
8.0
00
69
0.0
10
.00
0
92
5.0
12
.00
0
10
00
.01
4.0
00
11
80
.0
•1
6.0
00
13
65
.01
8.0
00
15
40
.01
9.9
00
15
60
.02
0.0
00
20
00
.0
A -
98
APÉN
DICE
S
>••••••••
+
APÉN
DICE
S. P
ROGR
AMA
DE M
ONFT
ORIZA
CION
Y C
ONTR
OL D
EL SI
STEM
A AN
ALÍTI
CO
PROGRAMA PRINCIPAL DE GESTIÓ DELS ANALITZADORS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIO: 4/1/99
«include "fiacfa.h"
int maint int argc, char *argv[])
{ if (argc==2)
/* Lo hace si entramos l par metro */
{ if
( !_
str
icm
p(a
rgv
[l],
"/o
ffli
ne
"))
o
ffli
ne
=l;
/*
Co
n e
ste
p
ar
met
ro
fun
cio
nar
emo
s o
ffli
ne
, si
n
lectu
ras
*/
if
(!_
stri
cm
p(a
rgv
[l],
"/s
olo
no
B")
) so
lón
os=
1;
if
(!_
3tr
icm
p(a
rgv
[l]
, "/s
incal"
) )
.
sin
cal=
l;}
if (access("c;\\fiacfa\\tmp\\secur.tmp",0) == 0) sincal=l;
inicia_sistema();
do
/*Actualitzacit temps FIA*/
dat.t_actual=time(NULL);
ftimet&t);
dat.t_milli=t.time*1000*t.millitm;
acciones__comunes O ;
switch (estado)
{case 0: /***** C-lcul Ijnia base FIA *****/
if ((difftime(dat.t_actual,dat.t_inici)>=dat.inici_lectura_base)
£,&
(dif
f time (dat.
t actual, da?
- t_inici) <=dat. f i lectura base))
íif (difftime(dat.t_milli,dat.t_milli_old)>=200)
da
t.t_
mil
li_
old
=t.
tim
e*
10
00
*t.
mil
litm
;if
(l
ec
tura
_a
bso
r()=
=0
)
for
(i =
0;i
-; =
18;
i +
+ )
mes
ur_
abs
[i]
=m
esu
r_ab
s [i
*l]
;m
esu
r_a
bs[
19
]=v
alo
r.a
bso
r;su
raa=
0.O
F;
for (i=0; i<=19; i**) suma= suma * mesur_abs[i];
dat.linea_base=suma/20.OF;
if (difftimetdat.t_actual,dat.t inici)>dat.fi_lectura base)
( sprintf(mensaje,"Línia base calculada: %5.3f ",dat.linea_base);
graf_texto(mensaje,1,1,594,37,1,1);
~estado**;
}break;
case 1:
/***** c_rrega del loop ******/
reinicializa__puerto(í ;
comunica (load, retorno)
,-reinicializa_puertob();
valor.punt_nitrits=dat.punt_mostreig; /* Guardem punt de mostreig */
valor.punt_nitrats=dat.punt_mostreig;
if (dat.numero injeccio>=dat.inj entre calibrats)
( comunica(valv_sup_off,retorno);
comunica (valv
inf
of f, retorno)
,-}
estado**;
break;
case 2 :
if (difftime(dat.t_actual.dat.t inici)>=dat.inici lectura maxl)
í graf_texto("Iniciem deteccií Pic de nitrits",1,1,594,37,1,1);
dat.t_milli_old=dat.t_milli;
contador=0;
APÉN
DICE
S A
- 9
9
DESA
RROL
LO E
IMPL
EMEM
TAQÓ
N DE
UN SI
STEM
A SU
PERV
ISOR
PARA
LA G
ESTIÓ
N Y
CONT
ROL D
E ED
AR
bre
ak
;case
3
: /*
In
ici
de l
a
lectu
ra
del
pri
mer
nujt
im
*/
if
(dif
fcim
e(d
at.
t m
illi
.da
t.t_
mil
li_
old
)>=
20
0)
{ dat.t_milli_old=t.time*1000+t.millitm;
if(lectura_absor()!=o) break;
/* Si no ha llegit b,, surt del switch*/
if (valor.absor>max)
f max^valor.absor;
contadorsO;
}else (contador**);
if(contador>50)
í hpicl=max-dac.linea_base,-
concentracio_nitrits () ;
max=0.OF;
estado**;
contadoraO;
sprintf(mensaje,"Pic de nitrits detectat, hpicl = %6.4f °,hpicl);
graf_texto(mensaje, 1,1,594, 37,1,1} ;
}
break;
case 4 :
if (difftime(dat.t_actual,dat.t_inici)>=dat.inici_lectura_max2)
{ dat.t_milli_old=dat.t_milli;
contador=0;
graf_texto("Iniciem detecciC Pic de nitrats" , 1, 1, 594, 37,1,1) ,-
estado**;
}break;
case 5 :
/***** 'Deteccií segon m..jcim *****/
if (difftimetdat.t milli,dat.t milli old)>=200)
{ dat.t_milli_old=t.time-1000+t.millitm;
if(lectura_absor()!=0) break; /* Si no ha llegit b,, surt del switch*/
if (valor.absor>max)
( max=valor.absor;
contadoraO;
ielse (contador**);
if(contador>50)
( hpic2=max-dat.linea_base;
concentracio_nitrats(};
max= 0.O F;
estado**;
contadoraO;
sprintf(mensaje, "Pic de nitrats detectat, hpic2 = %6.4f n,hpic2);
graf_texto(mensaje,1, 1,594, 37,1,1);
}
break;
case 6: /***** injecció de nova mostra *****/
if (difftime(dat.t_actual,dat.t_inici)>=dat.t_inj eccio)
{dat.t_inici=time(NULL);
/**** Desactivación del env;o sClo del segundo valor
if (dat.repeticion==OÍ dat.repeticíon=l;
else dat.repeticion=0; /*Para mandar un solo dato a la SUN*/
reinicializajpuertoO ;
comunica(inject,retorno);
reinicializa_puertob();
graf_texto("Nova injecciC de mostra" , 1,1, 594, 37, l, l)
,-printf("\a\a\a");
if(dat-numero_injeccio>=dat.inj_entre_calibrats)
/*carregar */
f dat.nuraero_injeccio=0;
Posat
aquí per donar
temps a
A-100
APÉNDICES
APÉNDICES. PROGRAMA DE MONITORIZACIÓN Y CONTROL DEL SISTEMA ANALÍTICO
calibra_no3();
dat-numero_injeccio++;/* contador per calibrar nitrats */
for (i=0;i<20;i++) mesur_abs[i]=O.OF;
estado=0;
ïbreak;
} /**Fin switch **/
switch(estado2){
case O:
if(difftime(dat.t_actual.dat.t_cicle)>=(dat.t_canvi_punt_mostreig-60))
valor.punt_amoni=dat.punt_mostreig;
if (dat.mostra_manual==0)
graf_texto("Permta per mostreig manual (F8)",1,1,594,37,1,1);
if (dat.mostra_manual==l)
graf_texto(nPerm¡s per mostreig autom_tic (F9)",1,1,594,37,l,l);
estado2++;
break;
case 1: /** Canvi del punt de presa de mostra (-17
min. desde t=0) **/
if(difftime(dat.t_actual,dat.t_cicle)>=dat.t_canvi_punt_mostreig)
if (dat.mo3tra_manualn=0) /* Mostra normal */
/*
dat.punt_mostreig++;*/
/*
if(dat.punt_mostreig>=5) dat.punt_mostreig=0;*/
/•Cambio para tomar muestra silo de los reactores (puntos
1-2-3)*/
/*
if (dat
.punt_jnostreig>=4) dat .punt_mostreig=l,- */
/•Cambio para tomar muestra silo de dos reactores (puntos 1-3)*/
/*
if(dat,punt_mostreig==l) dat.punt_mostreig=3;
else dat.punt_mostreig=l;
*/
/*
presa_mostra(dat.punt_mostreig);
sprintf(mensaje,"Canvi de presa de mostres al punt %i ",dat.punt_mostreig);
graf_texto(mensaje,l,l,594,37,l,l); */
/* Cambio para tomar solo salida •/
estado2++;
break;
case 2:/** Lectura CFA per obtenir concentraciç als 18 minuts desde t=0 **/
if(difftime(dat.t_actual.dat.t cicle)>=dat.t lectura amoni)
(if(lectura_ammv()==0)
da t.numero_most ra_CFA+ +;
concentracio_amoni();
graf_texto("Nova concentració d'amoni calculada",1,1,594,37,1,l);
estado2++;
ibreak;
case 3: /** FinalitzaciC del cicle a un reactor **/
if( difftime(dat.t_actual,dat.t_cicle)>= /*2**/ dat.t_injeccio
&& estado==0 )
/* Para sincronizar los dos tiempos */
dat. t_cicle=titne (NULL) ;
dat.t_inici=time(NULL);
graf_texto("Finalizacií d'un cicle déla analitzadors",1,1,594,37,1,1);
/* Entrem a calibrat cada 24 hores */
/****
if(dat,numero_mostra_CFA>s72)
comunica2(amvalv_sup_on,retorno);
comunica2(amvalv_inf_off,retorno);
calibra_amoni();
dat. numero_mostra_CFA=0
,-]
************************** calibrado de amonio desactivado •*•/APÉNDICES
A-1
01
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
break;
} /**Fin switch **/
while (dat
. f i_programa=aO) ;
/i*********************** sortida del programa */
comunica (purap_of
f, retorno) ;
/*Para la bomba*/
_setvideomode ( _DEFAUI.TMODE );
/*Acaba con el modo gr fico, pasa a texto*/
remove ("C:
\\fiacfa\\tmp\\secur. tmp" ) ;
return 0;
ï
Subrutina actuacions desde teclat
*/
void selectmenu(void)
íint tecla;
int retorno[40];
tecla«_bios_keybrd(_NKEYSRD_READY); /«Comprueba si se ha presionado una tecla*/
if(tecla==0) return;
_bios_keybrd(_NKEYBRD_READ); /*Vac;a el buffer, lee el Cltirno
carácter*/
switch(tecla){
case FI :
reinicializa_puerto() ;
comunica(load,retorno);
reinicializa_puertob();
break;
case F2:
comunica (pump_on, retorno)
,-break;
, case F3:
comunica(pump_off,retorno);
break;
case F4:
reinicializa_puerto() ;
comunica(inject,retorno);
reinicializa_puertob();
break;
case F5:
reinicializa_puerto();
comunica(valv_inj,retorno);
reinicializa_puertob();
break;
case F6:
comunica(valv_sup_off.retorno);
break;
case F7:
comunica(va1v_sup_on,retorno) ;
break;
case F8:
comunica(valv_inf_on,retorno);
/* actuació manual */
dat,mostra_manual=l;
graf_texto("Mostreig manual activat",1,1,594,37,1,1);
break;
case F9:
comunica{valv_inf_off,retorno); /* Fi actuaciç manual */
dat-mostra_manual=0;
graf_texto("Mostreig automàtica activat",1,1,594,37,1,1);
break,-case FIO:
dat.fij>rograma=l;
/* parar programa */
break;
case Fll:
dat.fisl;
/* parar calibrat */
break;
case F12:
lectura_configuracioO ; /* lectura fitxer dades */
A-102APÉNDICES
APÉN
DICE
S. PR
OGRA
MA D
E MO
NITO
RIZA
CIÓN
Y CO
NTRO
L DEL
SIST
EMA
ANAL
ÍTICO
break;
Case ALTF2:
coraunica2(ampump_on,retorno);
break;
case ALTF3:
comunica2(ampurap_off,retorno);
break;
case ALTF6:
comunica2 (amvalv_sup_off,retorno);
break;
case ALTF7;
comunica2tamvalv_sup_on,retorno);
break;
case ALTF8;
comunica2(amvalv_inf_on,retorno); /*actuacio manual*/
break;
case ALTF9:
comunica2(amvalv_inf_off.retorno);
break;
case ALTQ:
/*graf_texto("Inventando valores de la gr fica",1,1,594,37,1,1);*/
/*inventa_valores O ;*/
break;
case CTRLC:
/* calibracio_manual=l;*/
break;
case CTRLQ:
_setvideomode( J3EFAULTMODE );
exit(O)
,-break;
case ALTO:
salir_al_dos() ;
break;
case ALTH:
graf ayuda_genera1(} ;
break;
case ESC:
graf_presentacion();
break;
case RETURN:
break;
Case BARRA:
dat-t_grafica=time(NULL);
botoní 1, "Barra", 503, 3, 636, 20, 1);
grafica_variable(0);
grafica_variable(1);
graf_valores_display () ,-*/
graf_valor_absor();
graf_valor_mv();
graf_hora O ;
botont O, "Barra", 603, 3, 636, 20, 1) ;
break;
case AMUNT:
boton( 1, "Ar", 610, 30, 629, 50, 2);
seleccionar_graf ico
(1)
,-botont O, "Ar", 610, 30, 629, 50, 2);
break;
case ABAIX:
botont 1, "Ab", 610, 60, 629, 80, 2);
seleccionar_grafico(2);
botoni O, "Ab", 610, 60, 629, 80, 2);
break;
case DRETA:
botonf 1, "De", 610, 90, 629, 110, 2);
seleccionar_graf ico (3)
,-botont O, "De", 610, 90, 629, 110, 2);
break;
case ESQUERRA:
botoní 1. "Iz", 610, 120, 629, 140, 2);
seleccionar_grafico(4);
botont O, "Izn, 610, 120, 629, 140, 2);
break;
case CTRLBS:
break;
default :
break;
APÉN
DICE
S A
-10
3
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SISTE
MA SU
PERV
ISOR
PARA
LA GE
STIÓ
N Y C
ONTR
OL D
E ED
AR
retu
rn;
)
InicialitzaciC de temps
void inicializar_tiempos(void)
í dat.t_actual=time(NULL);
dat.t_cicle=dat.t_actual;
dat. t__inici=dat. t_actual ;
dat.t_grafica=dat.t_actual;
dat.t_lectura=dat.t_actual;
dat.t_milli=dat.t_actual;
dat.t_reloj=dat.t_actual;
dat.t_estab=dat.t_actual;
valor.t_amoni=dat.t_actual;
valor.t_nitrats=dat.t_actual;
valor.t nitrits=dat.t_actual;
Inicialitzacií de les variables
void inicializar_variables(void)
{ dat.contrôlai;
/* Cambio reactores
dat.punt_raostreig=0;*/
/*dat .punt_mostreig=l,- */
dat.punt_mostreig=4; /*Solo salida*/
dat.numero_injeccio=0;
dat,numero_mostra_CFA=0;
dat.fi=0;
dat.fi_programa=0;
dat.inicio_graf=3 ;
dat.fin_graf=4 ;
dat.mostra_manual=0;
dat .posada_en__marxa=l;
dat. conexion_SUN=l
,-/*dat.repeticion=0;*/
dat.repeticion^l; /* Para enviar todas las medidas */
i
Calcul i arxiu de la concentració d'amoni
void concentracio_amoni(void)
i char medida[25];
valor .amonis (14 . OF/18 . OF) * (f loat)pow(10 . , (valor .mv-dat .ordenada) /dat .pendent)
,-valor. t_amoni=titne (NULL) ;
if (dat.mostra_manual==l) valor.punt_amoni=-l; /* La mostra ,s off-line */
if (dat.mostra_manual==0)
medida_a_SUN (3 , (char) valor.punt_amoni, valor.amoni)
,-sprintf(medida,"%6.4f \t%2i \t".valor.amoni.valor.punt_amoni);
guarda_medida ( medida, "c : \\fiacfa\\datos\\amoni .his")
,-sprintf(medida,"%8.4f \t%2i
\t".valor.mv,valor.punt_amoni);
guarda_medida( medida, "c:\\fiacfa\\datos\\mv.his");
graf_valores_display{);
return;
i
Calcul de la concentració de nitrits
void concentració nitrits(void)
valor.nitrits=> (dat .a+dat .b'hpicl) *14 .OF/46.0F;
if ( valor.nitrits<0.OF ) valor.nitrits=0.OF;
valor.t_nitrits=time(NULL);
if (dat .mo9tra_manual«l) valor.punt_nitrits = -l; /* La mostra ,s off-line */
if (dat .mostra_manual"0 && dat. repeticion= = l)
A-104
APÉNDICES
APÉNDICES. PROGRAMA DE MO
NTORIZACIÓ
N Y CONTROL DEL SISTEM
A ANALÍTICO
medida_a_SUN {1,
(char)valor.punt_nitrits, valor.nitrits);
graf_valores_diaplay();
return;
}/..*Calcul i arxiu de la concentració de nitrats
»**»**«•*•/
void concentracio_nitrats (void)
{char medida [25]
;
valor. nit rat s*
(dat
.e+dat . f * ( (dat
.d*hpic2- (dat
-a+dat .b*hpicl) +dat.c) /dat.d) ) *14
.OF/62 .OF;
if ( valor. nitrats<:0.
OF ) valor. nitrats=0 . O
F;
valor. t_nitratsotime (NULL)
;if
(dat .mostra_manual==l) valor .punt_nitrats=-l; /* La mostra , 3
off-line */
if (dat.mostra_manual==0 &&
dat .repeticion==l)
medida_a_SUN(2, (char)
valor. punt_nitrats, valor. nitrats) ;
sprintf {medida, "%6.4f \t%6.4f \t%2i
\t",
valor .nitrits, valor . nitrats , v
alor . p
unt_ni trata) ;
guarda_medida ( medida, nc:\\f iacfa\\datos\\nitr.his")
,-sprintf (medida, "%6.4f \t%6.4f \t%2i \t",
hpicl, hpic2, valor. punt_nitrats) ;
guarda_medida ( medida, nc:\\f iacfa\\datos\\hpic.his" ) ;
graf_valores_display () ;
return;
}
Acciones comunes del programa utilizadas en varias funciones
*****/
void acciones comunes (void)
{selectmenuO ;
lectura_ammv() ;
/***** Actualiza reloj gr fico *****/
if ( (int)
dif f t
ime (dat
. t_actual, dat . t reloj ) >oio>
ídat. t_reloj=time (HULL)
;graf_hora O ;
j/*•*** Lectures per fer gràfiques *****/
if ( (int)
dif t time (dat.
t_actual.dat. t lectura) >=4)
íif ( lectura_absor () ==0/* && lectura_ammv() ==o*/ )
/* Si lee bien */
{dat .t__lectura=time
(NULL) ;
lectura__amnrv() ;lectura_ammv() ;
actualizar_matrices_graficas ()
,-graf_valor_absor O ;
graf_valor_mv() ;
delay(lOO) ;
í}
/***** Gràfiques per pantalla *****/
if ( (int)
dif f time (dat
. t_actual, dat . t gràfica) >=20)
ídat. t_grafica=time (NULL)
;grafica_variable(0) ;
gràfica variable(l);
i
Inicia tot el sistema FIA CFA
void inicia sistema O
APÉNDICES A-105
DE
SA
RR
OLLO
E iM
PLE
ME
NTA
dÓ
N D
E U
N S
ISTE
MA
SU
PE
RV
ISO
R P
AR
A L
A G
ES
TIÓ
N Y
CO
NTR
OL
DE
ED
AR
FILE -obert;
inicializar_variables(! ;
inicializar_tiempos O ;
lectura_conf iguracioO ;
/* Lectura de los Eltimos calibrados */
if (lee_calibrado( "c:\\f iacfa\\datos\\calilno2.his", &dat.a, &dat.b}!
{ dat. a = -0.009499F; dat. b = 8.355F;}
i£ (dat.b--0.OFI
printf ("\nError: Fitxer de calibrat calilno2.his incorrecte\nB
exit(l);
}if (lee_calibrado( -c:
\\fiacfa\\datos\\cali2no2 .his"
, sdat.c, sdat.d)
{ dat. c - 0.20377F; dat.d .
76.2797P;}
if (dat.d«O.OF)
printf (
B\nError: Fitxer de calibrat cali2no2.his incorrecte\n" }
èxit íl) ;
if (lee_calibrado( -c:\\£iacfa\\datos\\calibno3.his", sdat.e, ldat.£)I
( dat. e - -0.2976F; dat . f - 132.2938F;}
if (dat
-f ==0. OF)
(printf ("\nError: Fitxer de calibrat calibno3.his incorrecteVn")
exit(l);
)if (lee_calibrado( "c:
\\fiacf a\\datos\\calibnh4 .his"
,&dat. ordenada, &dat .pendent) ! =0)
{ dat. ordenada = -79.954F; dat. pendent = -66.296F;}
if (dat
.ordenada—O. OF
¡| dat
.pendent ==0. OF)
printf ("\nError : F
itxer de calibrat calibnh4.his incorrecteXn" )
èxit (I)
;
modo_graf ico() ;
graf_baae O ;
graf_presentacion ()
;
reinicializa_puertob() ;
if (sincal ==
1>
ícomunica (valv_inf_of f , retorno) ;
comunica (valv_sup_on, retorno) ;
comunica 2 (amvalv_inf_of f , r
etorno) ;
comunica2 (amvalv_sup_of f , r
etorno) ;
tif
(sincal == O && solono3==0)
icomunica (valv_inf_on, retorno)
,- /"necessari per
entrar i calibrar no2-*/
comunica (valv_sup_of f, retorno) ;
comunica2 (amvalv_inf_of f , r
etorno) ;
/*necessari
per
entrar
passant
patri
50 ppm
comunica2 (amvalv sup_on, retorno) ;
if (solono3==l)
com
un
ica (valv
_in
f_o
f f, reto
rno
) ,-co
mu
nica (v
alv_
sup
_o
f f, reto
rno
) ;co
mu
nica2 (am
valv
_in
f_o
f f .reto
rno
) ;com
ún i ca 2 (amv
alv_
sup
_o
f f , reto
rno
) ;
/*n
ecessa
ri p
er e
ntra
r i
calib
rar
no
3-*
/
/'necessari
per
en
trar
mo
stra*
/
rein
icia
liza_
pu
erto
() ;co
mu
nica (v
alv
_in
j , reto
rno
) ,-d
elay(S
OO
) ;co
mu
nica (lo
ad
, reto
rno
) ;re
inic
ializ
a_
pu
erto
b () ;
com
un
ica (pump_on,
reto
rno
) ;co
mu
nica2 (am
pump_on, re
torn
o) ;
sic
io d
e c
_rre
ga
a l'in
ici*
/
A-106
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONFT
ORIZA
CIÓN
Y C
ONTR
OL D
EL S
ISTEM
A AN
ALÍTI
CO
presa_mostra(dat.punt_mostreig);
/* comencem amb poaicií de mostreig de TO */
if (sincal « 0 && solono3 = =>0)
í graf_texto("Espereu uns minuts, el sistema est- estabilitzant-se...",1,1,594,12,1,1);
graf_texto(nATENCIÓ, ai no voleu que m'enfadi, cal que ara mateix poseu el patrC de 3 PPM
NITRITS per calibrar el sistema.",1,13,594,24,0,1);
graf_texto("NO MARXEU ENCARA, espereu a que aparegui el missatge : 'Introduiu patri 7 PPM
NITRITS', que ja hauries de tenir preparat.",1,25,594,37,O,1);
}
while(difftime(dat.t_actual,dat.t_estab)<=dat.t_estabilit)
í dat. t__actual=time (NULL} ;
selectmenuO ;
reinicializa_puertob();
comunica(colorimEOJ, retorno);
/***delay(1000);*****/
/*Calibracio del colorimetre*/
/** y una M.
for (i=l;i«=3;i++)
delay(1000);
comunica(colorim[1], retorno);
****/
delay(8500);
reinicializa_puerto();
comunica(inject,retorno); /*Injeccio a temps O */
reinicializa_puertob();
inicializar_tiempos();
dat.control=0;
/•Reset del colorimetre*/
/* permetem carrega del loop als calibrats */
if (sincal ==
O && solono3==0)
í dat.posada_en_marxa=0; /*calibrem amoni 50 amb nitrits pic 1
i calibrem amoni 5 amb nitrats sols a l'inici*/
calibra_picl_no2 () ;
/*comencem calibrant el sistema*/
calibra_pic2_no2 O ;
calibra_no3 {) ;
graf texto ("Calibrats finalitzats".!, 1, 594,37, i, i) ;
íf (solono3==l)
( dat.posada_en_marxa=l; /* no calibrem amoni ni nitrits»/
calibra_no3 () ;
graf_texto( "Calibrat Nitrats f inalitzat" , 1, 1, 594
, 37, 1, lï ;
/* En cas de reboot evita la posada en marxa amb calibrats */
obert = f open ("c: \\fiacfa\\tmp\\secur. ttnp" , "wt" ) ;
fprintf (obert, "Hola\n") ;
fclose (obert) ;
ï
APÉN
DICE
S A
-107
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN SI
STEM
A SU
PERV
ISOR
PARA
LA
GEST
IÓN
y CO
NTRO
L DE
EDA
R
DEFINICIONS DEL PROGRAMA PRINCIPAL DE GESTIÓ DELS ANALITZADORS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓ: 4/1/99
#include <time.h>
it include <bios . h>
Sinclude <sys\timeb.h>
it include <stdio.h>
# include <graph.h>
ítinclude <stdlib.h>
íiinclude <string.h>
ítinclude <math.h>
Sinclude <io.h>
ffinclude "nombres -h"
(finclude "teclas .h"
void selectmenu(void);
void inicializar_tiempos(void);
void inicializar_variables(void);
void concentracio_amoni(void);
void concentracio_nitrits(void);
void concentracio_nitrats(void);
void acciones_comune3(void);
void inicia_sistema(void);
extern void modo_grafico(void);
extern void graf_base(void);
extern void graf_hora(void);
extern graf_presentacion(void);
extern void grafica_variable(int variable);
extern int botón ( int on_off, char *nombre, short xl, short yl,
short x2, short y2, short font);
extern int graf_texto (char *nombre, short xl, short yl,
short x2, short y2, int font, int fondo);
extern void salir_al_dos(void);
extern void seleccionar_graficoíint orden);
extern void graf_valor_absor(void);
extern void graf_valor_mv(void);
extern void actualizar_matrices_graficas(void);
extern void graf_valores_display(void);
extern void graf_ayuda_general(void);
extern void reinicializa_puerto(void);
extern void reinicializa_puertob(void);
extern int comunicatint *frase, int *salida);
extern int comunica2(int *frase, int *salida);
extern int lectura_absor(void);
extern int lectura_ammv(void);
extern int calibra_picl_rto2(void);
extern int calibra_pic2_no2(void);
extern int calibra_no3(void);
extern int calibra_amoni(void);
extern void presa__mostra (int la_mostra) ;
extern void guarda_medida( char *mensaje, char *fichero);
extern void lectura_configuracio(void);
extern int lee_calibrado( char *fichero, float *param_a, float *param_b)
,-
extern void delay ( docket wait ) ;
extern void medida_a_SUN (char parámetro, char punto, float medida) ,-
datos_fia
dat;
valores_fia
valor;
struct timeb t;
/* Estructura de temps en mil.lisegons */
int offline«0; /* Opciones de inicio */
int solono3=0;
int sincal=0;
int retorno [40] ;
A-108
APÉNDICES
APÉNDICES. PROGRAMA DÉ MoNiroRizAaÓN Y CONTROL DEL SISTEMA ANALÍTICO
float mesur_abs[20];
float suma;
int i;
int estado«0;
int estado2=0;
float max;
int contador =0;
float hpicl;
float hpic2;
char mensaje [200]
;
Instruccions per actuar sobre modul EASI
int
valv
_in
j [20
]={
'\r', '/'.'l
'.'Z'.'S
'.'R'
int
pu
mp
_o
n[2
0]=
{*
\r','O',' 1
' ,'M1,'O
1,'1' ,
int
pu
mp
_o
ff[20
]={
'\r','O','!','M
1,'O','O
1
int
colo
rim[3
] [20
]={{'\r
', 'O', '3
', 'R','S
',{
'\r', 'O
', '3' , 'T
', 'C{
'\r'. 'O
1,'3',-R
-,'Cin
t v
alv
_in
f_o
n[2
0]=
{'\r','0
1,'2','V
1,'l1,
int
va
lv_
inf_
off
[20
]={
'\r', 'O1, '2
', 'V, 'I
int
loa
d[1
5]=
{'\r', '/
'.'l'.'Y
'.^'.'A
1,'!
'in
t in
jec
t[15
J=
{'\r', '/
'.'l'.'Y
'.'IS
'A',
1
int
valv
_su
p_
on
[20
J ={
'\r',
10
',I2
1,'V
','S1
,in
t v
alv
_su
p_
off (2
0)-{
'\r', 'O','2
', 'V, 'S
1
int
am
pu
mp
_o
n[2
0]=
{t\r',
1l','l','M','O
1,':in
t a
mp
um
p_
off[2
0]=
{'\r','!','!','M
','O',
int
amv
alv_
inf_
on
[20
] ={
'\r', '!
', '2', 'V
, • :in
ferio
r*/
int amvalv_inf_off[20]={'\r',ll','21,'V',
inferior*/
int amvalv_3Up_on [20]={'\r', *!',
'2', 'V,
'íinferior*/
int amvalv_sup_off[20]={'\r','1','2',W,
int ampotenciometre[20]={'\r1,'l','5','R'1
int
ampotenciometrel[20] »{ ' \r* ,
'!', '51, '
potenciometre*/
int amcorreccio[20]={'\r','!',' 5 ' ,'T','U',
,'\r','O'};
'\r','Q'};
,'\r'.'°'};
'T','\r','°
','A','\r',
','!','\r',
'!','\r',-a
,'O','\r','
, 'R', '\r', '
2','R-,(\r'
'\r',, '\r''!',
''\r',, '\r'•T',
"
/*Inicialitza vàlvula injecció*/
/* Posa bomba en marxa*/
/* Para bomba*/
'},
/* Reset colorimetre*/
'°'}' /* Calibraciç color¡metre*/
'D|}}; /* Lectura colorïmetre*/
/* Encen vmlvula inferior*/
/* Apaga v._lvula
inferior*/
/* Carrega del loop*/
/* Injeccií de mostra*/
/* Encén vàlvula inferior*/
/* Apaga v_.lvula
inferior*/
/* Posa
bomba en marxa*/
/* Para bomba*/
/*
Encen
vàlvula
/*
Apaga
v—lvula
/*
Encén
v...lvula
/* Apaga v._lvula
inferior*/
; /*
Lectura de
mV*/
11 } ;
/*
Reset
del
/* Tecla up */
APÉNDICES A
-109
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVKO
R PARA LA G
ESTIÓN
Y CONTRO
L DE EDAR
NOMBRES.H - DEFINICIÓN DE ESTRUCTURAS COMUNES PARA EL PROGRAMA
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 15/4/97
typedef struc
ime
ntntf loafloa
f loafloa
floa
floa
floa
fiofio
fiofiofiointintintintintintintint
intintintintfloat
intintfloat
float
intintintintintint
int}datos_fia;
t_actual;
t_cicle;
t_inici ;
t_graf ica;
t_lectura;
t_reloj ;
__
t^estab;
fi;
f i_programa;
a;b;rl;
C;d;r2;
e;f;r3;
ordenada ;
pendent ;
linea_base;
t_estabilit;
inici_lectura_base;
f i_lectura_base;
ínj_entre_calibrats;
inici_lectura_maxl;
inici__lectura_max2;
t_carrega_loop ;
t_injeccio;
t_canvi_punt_mostreig;
t_lectura_amoni
,-delta_t [4]
;delta_picl [3}
,-delta_pic2[3]
,-inici_lectura_base_calibratno
fi_lectura base_calibratno3 ;
diferencia_entre_pics;
posada_en__ma rxa ;
control;
ammvSppm;
inicio_graf ;
f in_graf ;
punt_mostreig ;
o_injeccio;
o_mos t ra_CFA ;
a_manual ;
typedef struct {
controladors*/
float
time_t
intfloat
time_t
intfloat
time_t
intfloat
amoni;
t_amoni;
punt_amoni;
nitrats;
t_nitrats;
punt_n i t rat s ;
nitrits;
t_nitrits;
punt_nitrita;
ab
sor;
/•Estructura
per
paràmetres
referents
als
/*Valor mesurat de la variable*/
'
/*Valor mesurat de la variable*/
/*Valor mesurat de la variable*/
A-110
AP
ÉN
DIC
ES
9999999999999999999999999999*
APÉN
DICE
S. PR
OGRA
MA D
E M
onrro
RiZA
aóN
Y CON
TROL
oa
SISTE
MA A
NALÍT
ICO
t itn
e t
t ab
sor ;
flo
at
mv;
tim
e_t
t_m
v;}v
alo
rea_
_fi
a;
typ
edef
st
ruct
{fl
oa
t ab
sor;
flo
at
mv
;ti
me
t t_
ab
sor;
tim
e_t
t_m
v;}
mat
riz
grá
fica;
APÉN
DICE
S A
- 1
1 1
i QÍ999999999 9
99
99
99
99
99
99
9 9
99
99
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SISTE
MA S
UPER
VISO
R PA
RA LA
GEST
IÓN
Y CON
TROL
DE E
DAR
TEC
LAS.
H
- D
EFIN
ICIÓ
N
DE
CÓD
IGO
S D
E TE
CLA
DO
PRO
GRA
MA
DO
R:
Juan
An
ton
io
Bae
za
Lab
atU
LTIM
A
RE
VIS
IÓN
: 14/1
1/9
6
«d
efin
e E
SC
O
xOll
B«
def
ine
CTRL
C
OX
2E03
«d
efin
e CT
RLQ
0x
1011
«d
efin
e C
TRLB
S O
XO
E7F
«d
efin
e CT
RLRE
T O
xlC
OA
«d
efin
e A
LTQ
0x
1000
«d
efin
e A
LTP
0x19
00«
def
ine
ALT
S O
xlFO
O«
def
ine
ALT
D
0x20
00«
def
ine
ALT
F 0x
2100
«d
efin
e A
LTO
0x
2200
«d
efin
e A
LTH
0x
2300
«d
efin
e A
LTC
O
X2E
OO
«d
efin
e A
LTN
0x
3100
«d
efin
e AL
TM
0x32
00
«d
efin
e RE
TURN
O
xlC
OD
«d
efin
e IN
TRO
O
xEO
OD
«d
efin
e BA
CKSP
O
xOEO
S«
def
ine
TA
B
OxO
F09
«d
efin
e BA
RRA
0x
3920
«d
efin
e AM
UNT
OX
48EO
«d
efin
e A
BA
IX
OxSO
EO«
def
ine
DRE
TA
OX4D
EO«
def
ine
ESQ
UER
RA
ox4b
EO
«d
efin
e IN
SER
T O
X52
ÈO«
def
ine
SUPR
O
X53
EO«
def
ine
INIC
IO
OX
47EO
«d
efin
e FI
N
OX
4FEO
«d
efin
e RE
PAG
O
xSlE
O«
def
ine
AV
PAG
OX
49EO
«d
efin
e F
I O
X3B
OO
«d
efin
e F2
OX
3COO
«d
efin
e F3
O
x3D
OO
«d
efin
e F4
O
X3E
OO
«d
efin
e F
5 O
x3FO
O«
def
ine
F6
0x40
00«
def
ine
F7
0x41
00«
def
ine
F8
0x42
00«
def
ine
F9
0x43
00«
def
ine
FIO
0x
4400
«d
efin
e F
ll
0x85
00«
def
ine
F12
0x
8600
«d
efin
e A
LTF1
0x
6800
«d
efin
e A
LTF2
0x
6900
«d
efin
e A
LTF3
OX
6AOO
«d
efin
e A
LTF4
Ox
fiBOO
«d
efin
e A
LTF5
O
xSCO
O«
def
ine
ALT
F6
0x60
00«
def
ine
ALT
F7
OX
6EO
O«
def
ine
ALT
F8
OX
6FO
O«
def
ine
ALT
F9
0x70
00«
def
ine
ALT
F10
0x71
00
«d
efin
e o
Oxl
86F
«d
efin
e O
O
X18
4F«
def
ine
p 0x
1970
«d
efin
e P
0x19
50«
def
ine
m
OX
326D
«d
efin
e M
O
x324
D«
def
ine
t 0x
1474
«d
efin
e T
0x
1454
«d
efin
e e
0x12
65«
def
ine
E
0X12
45
A -
112
AP
ÉNDI
CES
APÉNDICES. PROGRAMA DE MONITORIZACIÓN Y CONTROL DEL SISTEMA ANALÍTICO
«define a
«define A
ffdefine r
«define R
íídefine h
«define H
ffdefine d
«define D
*/
ffdefine NUM1
«define NUM2
«define NUM3
«define NUM1E
«define NUM2E
«define NUM3E
OxlESl
OxlE41
0x1372
0x1352
0x2368
0x2348
0x2064
0x2044
0x0231
0x0332
0x0433
OX4FOO
0x5000
0x5100
APÉNDICES A
-113
DESARROLLO
E IMPLEM
ENTACIÓN
DE UN SISTEM
A SUPERVISO
R PARA LA G
ESTIÓN
Y CONTRO
L DE EDAR
CALCULO.C - FUNCIONES PARA REALIZAR CÁLCULOS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 9/11/98
Sinclude <stdio.h>
/•ífdefine TEST*/
ínt regreaion_lineal( float *x, float *y, int n,
float "a, float *b, float *r);
/* Calcula la regresiCn lineal con los datos de x e y.
Devuelve ordenada (a)
, pendiente (b)
y coeficiente correlación (r)
*/
int regreaion_lineal ( float *x, float *y, int n,
float *a, float *b, float *r)
íif
(n<
l) re
turn
-1
; /*
**
*te
mp
ora
l**
**
//*flo
at
3umx=
0. OF
,sum
y 3 0 . O F
,sum
xysO . O
F,
sumx2=
0 . OF
,su
my
2=
0 . OF
;in
t i;
if (n
<2
) re
turn
-1
;
for
(i=0
; i<n,- i+
+)
{sum
x=
3u
mx
+x
li) ;su
tny
nsu
my
+y [ij ;
sum
xy
=su
mx
y+
x[i] *y
lij ;su
tnx
2=
sum
x2
+x [i] *
x [i] ;
sum
y2
=su
my
2+
y Ei] *y
[i] ;i
*b= in
*su
mx
y-su
mx
*su
my
} / (n*
sum
x2
-sum
x*
sum
x) ;
*a= (su
my
- (*b
) *sumx) /n
;*
r= (n
*su
mx
y-su
nix
*su
iny
} * (n
*su
mx
y-su
tnx
*su
my } /
( (n*
sum
x2
-sum
x*
sum
x) « (n
*su
my
2-su
my
*su
ray) ) ;
*/
/**** temporal****/
/*Solo utiliza el punto de mayor concentración M!!!!!!!*/
if (x[0]==O.OF) return -2;
*b=y[0]/x[0] ;
*a=0. OF;
*r=1.0F;
«ifdef TEST
void main(void)
{float «IÍ3X
[51= (1.
OF, 2. OF, 3. OF, 4. OF, 5. OF);
float misy[51-{2.OF,4.OF,6.OF,8.OF,10.OF);
float a.b.r;
,regresion_lineal( misx, misy, 5, &a, &b, &r);
print£("\ta: %f\tb: %f\tr: %£\n",a,b,r);
A-114
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
ONT
ROL
DEL
SIST
EMA
ANAL
ÍTIC
O
ften
dif
/***
**.
APÉN
DICE
S A
-11
5
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONTR
OL D
E ED
AR
CALIBRA.C - FUNCIONES.PARA EL CALIBRADO DEL SISTEMA
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 4/1/99
ttinclude <titne .h>
ff include < ay s \types .h>
n include <syg\tiroeb.h>
Sinclude <maCh.h>
Sinclude <string.h>
it include <stdio.h>
tfinclude "nombres.h"
/.*****».***««+*****»**** Definiciones *********************»**********/
/*»*»**+.**************» Subrutinaa del fichero *************»•***•«*-«/
int calibra_picl_no2(void);
int calibra_pic2_no2(void);
int calibra_no3(void);
int calibra_amoni(void);
void recta__amoni (void) ;
y********************* subrutinas externas necesarias ****»*************/
extern int comunica(int *fraae, int *salida);
/* Comunicació EASI-PC*/
extern int comunica2(int *frase, int *salida);
extern int regresion_lineal( float *x, float *y, int n,
float *a, float *b, float *r) ;
extern void reinicializa_puerto(void);
extern void reinicializa_puertob(void);
extern void delayt clock_t wait );
extern int lectura_absor(void);
extern int lectura_aramv(void);
extern void accione3_comunes(void);
extern int graf_texto (char *nombre, short xl, short yl,
short x2, short y2, int font, int fondo);
extern void concentracio__amoni (void) ;
extern void concentracio_nitrits(void);
extern void concentracio_nitrats(void);
extern void guarda_medida( char *mensaje, char *fichero);
extern void graf_valores_display(void);
/**********»*•****** Variables comunes del programa ******»********»****/
extern int
va
lv_
inj[
20
] ,
pu
mp
_o
n[2
0}
, p
ura
p_
off
[20
J,
co
lori
m[3
] [2
0] ,
va
lv_
inf_
on
[20
] ,
va
lv_
inf_
off
[20
] ,
load
[15
],
inje
ctf
lS],
valv
_su
p_
on
[20
],
va
lv_
au
p_
off
[20
J,
amp
um
p_
on
[20
],
arap
um
p_
off
[20
],am
val
v_
inf_
on
(2
0]
, am
val
v_
inf_
of
f [2
0] ,
ar
riv
alv
_su
p_
on [
20
] ,a
mv
alv
_su
p_
off
[20
J,
am
po
ten
cio
me
tre
[20
],
am
po
ten
cio
metr
el[
20
],am
co
rreccio
[20
];
ex
tern
d
ato
s fi
adat;
float hpic;
extern float hpicl;
extern float hpic2;
CalibraeiÇ pic 3 ppm de nitrit
int calibra_picl_no2(void)
int i;
. float mesur_abs[20];
float suma;
int estado=0;
float max=O.OF;
int contador=0;
A-1
16
AP
ÉN
DIC
ES
APÉNDICES. PROGRAMA DE MONITORIZACIÓN Y CONTROL DEL SISTEMA ANALÍTICO
time_t t_maximsO;
struct timeb t;
/'Estructura de temps amb mil . l
isegons*/
float h_pic(4]<={O.OF,O.OF,O.OF,O.OF};
float C_picl4] ={3 .OF, 2.0F, 1. OF, 0.5F} ;
int retorno [40]
;int
paeudo_pico=0 ;
char mensaje [200]
;
dat .mostra_manual=l; /*No envia datos a SUN*/
graf_texto( "Calibrad* electrónica PIC 1 DE NITRITS.
- . "
, 1, 1, 594, 37, l, l)
;
for
do{
mesur_ab3ti] =O.OF;
dat. t_actual=time (NULL)
,-ftime(&t);
dat.t_milli=t.time*10ÛO*t.millitm;
acciones_comunes();
/*ActualitzaciC dels temps */
/* Valor del patri de 50 ppm amoni
( calculat sols a 1'inici del programa )*/
/*Llegit 1 minut abans de tornar a injectar */
if((difftime(dat.t_actual.dat-t_inici)>=(dat.t_injeccio-60))
&& (difftime(dat.t_actual,dat.t_inici)<=dat. t_injeccio)
&& (dat.posada_en_marxa==0))
ícomunica2(amvalv_sup_on,retorno);
/* canviem a patri de S ppm amoni*/
comuníca2(amvalv_inf_on,retorno);
if (lectura_ammv()==0)
dat.ammv50ppm= valor.mv;
valor.punt_amoni=0;
concentracio_amoni();
dat.posada_en_marxa=l;
ï
/*•*********.* calibrat ********•*****•/
switch(estado){
case 0:
/* Calcul linia base */
if ((difftime(dat.t_actual.dat.t_inici)>=dat.inici_lectura_base)
&.Í (dif
f time (dat.
t_actual, dat. t_inici) <=dat. f i_lectura_base) )
if (difftime(dat.t_milli,dat.t_milli_old)>=200)
dat.t_milli_old=t.time*1000*t.millitm;
if (lectura_absor()==0)
mesur_abs[19]=valor.absor;
suma=O.OF;
for (i=0;
i<=19; i**) suma= suma * mesur_abs[i];
dat.linea_base=suma/20.OF;
í
if (difftime(dat.t_actual,dat.t_inici)>dat.fi_lectura_base)
sprintf(mensaje,"Linia base calculada: %5.3f ",dat.linea_base);
graf_texto(mensaje,l,1,594,37,1,1);
estado**;
break;
case 1:
/* Carrega del loop */
if (difftime(dat.t_actual,dat.t_inici)>=dat.t_carrega_loop)
reinicializa_puerto();
comunica(load,retorno);
reinicializa_puertob();
estado**;
break;
case 2:
APÉNDICES
A-1
17
DESARROLLO E IMPLEMENTAOÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
if (difftime(dat.t_actual,dat.t_inici)>=dat.inici_lectura_maxl) estado**;
break;
case 3:
/* Inici de la lectura del primer m..jcim
*/
if (difftimetdat.t milli,dat.t_milli_old)>=200)
idat.t_milli_old=t.time*1000+t.millitm;
if(lectura_absor()!=0) break; /* Si no ha llegit b,, surt del switch*/
if (valor.absor>max)
(max=valor. absor
-,contador=0;
t maxim^dat.t actual ;
)else (contador**);
if(contador>20)
fh_pic[0]=max-dat.linea_base;
sprintf (mensaje, "Pic 1 de nitrits 3 ppm detectat, hpic = %6.4f ", h
_pic [0]
) ,-
graf_texto(mensaje,1,1,594,37,l,l);
estado**;
}
break;
case 4:
/* Lectura de los pseudo picos */
/**********.* Desactivamos el calibrado electrónico
if (difftime(dat.t_actual,t_maxim+dat.delta_picl[pseudo_pico])>=0)
if (lectura__absor() ==o)
{h_pic [pseudo_pico+l]=valor.absor-dat.linea_base; '
pseudo_pico*+;
if (pseudo_pico>=3) estado**;
iestado*+;
break;
case 5 :
regresion_lineal( h_pic, c_pic, 4, &dat.a, &dat.b, &dat.rl);
sprintf(mensaje,"%6.4f\t%6.4f\t%6.4f\t",dat.a,dat.b.dat.rl);
guarda_medida( mensaje, "c:\\fiacfa\\datos\\calilno2.his");
hpic=h_pic10];
hpicl=hpic;
concentracio_nitrits();
sprintf(mensaje, "%6.4f \t%6.4f \t%6.4f \t%6.4f \t",h_pic [0] ,h_pic[1] ,h_pic[2],h_pic [31)
;guarda_medida( mensaje, "c:\\fiacfa\\datos\\hno21.his");
estado**;
break;
case 6:
/* Injeccií nova mostra */
if (difftime(dat.t_actual,dat.t_inici)>=dat.t_injeccio)
ídat.t_inici=time(NULL);
reinicializa_puerto();
comunica(inject,retorno);
reinicializa_j>uertob() ;
estado++;
}break;
}/*Fin switch*/
} while(estado!=7 && dat.fi = = 0),-
dat,mostra_raanual=0; /*Envia datos a SUN*/
dat.fi=0;
dat.posada_en_marxa=0;
return 0;
i/....................Calibrad? pic 7 ppm de nitrit
A-118
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
ONT
ROL
DEL
SIST
EMA
ANA
LÍTI
CO
int calibra_pic2_no2(void)
int estadosO;
float max=O.OF;
int contador=0;
time_t t_maxim=0;
struct timeb t;
/'Estructura de temps en mil.lisegona*/
float h_pic[4]={O.OF,O.OF,O.OF,O.OF};
float c_pic[4]a{7.0F,5.0F,3.0F,1.0F};
int retorno[40];
int pseudo_pico=0;
char mensaje[200];
dat.mostra_manual=l; /*No envia datos a SUN*/
graf_texto("Calibracií electrónica PIC 2 DE NITRITS...», 1,1,594,37,1,1);
do { /*
dat.t_actual=time(NULL);
ftime(&t);
dat.t_milli=t.time*1000+t.millitm;
acciones_comunes();
********* Calibrat ***************/
/*ActualitzaciC deis temps */
switch(estado){
case 0:
/* Calcul linia base */
/* Asumim que es la mateixa del calibrat anterior */
estado**;
break;
case 1:
/* Carrega del loop */
if (difftime(dat.t_actual.dat.t_inici)>=dat.t_carrega_loop)
reinicializa_puerto()
,-comunica(load,retorno);
reinicializa_puertob();
if(dat.posada_en_marxa==l)
comunica(valv_sup_on,retorno);
comunica(valv_inf_off,retorno);
îif(dat.posada_en_marxa==0) /*per tenir temps de carregar patri NO3- sols a l'inici del
programa*/
comunica(valv_sup_off,retorno);
comunica(valv_inf_off,retorno);
iestado**;
break
,-case 2 :
if
(dif
f tim
e (d
at .
t_actu
al,
dat.
t_
inic
i) >
=d
at.
inic
i_le
ctu
ra_
max
2)
est
ad
o*
*,-
bre
ak
;case
3
: /*
In
ici
de la
le
ctu
ra
del
pri
mer
m.j
tim
«
/if
(d
ifft
ime
(da
t.t_
mil
li,d
at.
t_m
illi
_o
ld)>
=.2
00
)
da
t.t_
mil
li_
old
=t.
tim
e*
10
00
+t.
mil
litm
;if(lectura_absor()!=0) break; /* Si no ha llegit b,, surt del switch*/
if (valor.absor>max)
max=valor.absor;
contador=0;
t_maxim=dat.t_actual;
ielse (contador**);
if(contador>20)
hjpic tO]=max-dat.linea_base;
sprintf(mensaje,"Pic 2 de nitrits 7 ppm detectat, hpic = %6.4f n,h_pic[0]);
graf_texto(mensaje,1,1,594,37,1,1);
estado**;
}break;
APÉN
DICE
S A
-11
9
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUP
ERVI
SOR
PAR
A LA
GES
TIÓ
N Y
CO
NTRO
L DE
ED
AR
case 4:
/*****»*****• Desactivamos el calibrado electrónico
if (difftime(dat.t_actual,t_maxim+dat.delta_pic2[pseudo_pico])>=0)
( if (lectura_absor()==0)
( h_
pic
[pseu
do
_p
ico
+l]
=v
alo
r.ab
so
r-d
at.
lin
ea_
base;
pse
ud
o_
pic
o-n
-,-
if
(pse
ud
o_
pic
o>
=3
) est
ad
o+
+;
i..**.******.**...*..*.*»..**********.****.******/
estado**;
break;
case 5 :
regresion_lineal( h_pic, c_pic, 4, &dat.c, &dat.d, &dat.r2);
sprintf (mensaje, "%6.4f \t%6.4f \t%6.4f \t" ,dat .c, dat .d,dat. r2)
,-guarda_medida ( mensaje, "c: \\fiacfa\\datos\\cali2no2 .his" )
,-
sprintf(mensaje,"%6.4f\c%6.4f\t%6.4f\t%6.4 f\t",h_pic[0] ,h_pic[l],h_pic[2],h_pic[3J);
guarda_medida( mensaje, "c:\\fiacfa\\datos\\hno22.his");
estado**;
break
,-case 6:
/* Injeccií nova mostra */
if (dif f time (dat. t_actual, dat. t__inici) >=dat. t_injeccio)
dat.t_inici °time(NULL);
reinicializa_puerto{);
comunica(inject,retorno);
reinicializa_puertob();
estado**;
ibreak;
}/*Fin switch*/
} while(estado!=7 &&
dat.fi==0);
dat-mostra_manual=0; /*Envia datos a SUN*/
dat.fi=0;
return 0;
i
Calibracií electrònica de nitrats
int calibra_no3(void)
{float mesur_abs[20];
float suma;
int i;
int estado=0;
float max=O.OF;
int contador=0;
time_t t__maxim=0 ;
struct timeb t;
/*Estructura de temps en mil.lisegons*/
floa
t h_
pic[
5]O
{O.O
F,O
.OF,
O.O
F,O
.OF,
O.O
F};
float c_pic[5]={50.OF, 30.OF,15.OF,5.OF,1.OF};
float h_pic_old=0;
/* Variable per comprobar la repetitivitat del pic */
int retorno[40];
int
pseudo_pico=0
,-char mensaje[200];
dat.mostra_manual=l; /'No envia datos a SUN*/
graf_texto("Calibraci<í electrònica de NITRATS. ..", 1,1, 594, 37,1,1) ;
ftime(&t);
dat.-t_milli = t.time*1000+t.millitm;
dat.t_milli_old=dat.t_milli;
for (i=0; i<20; i + + ) mesur_abs[i]=0.OF;
do í
dat.t_actual=time(NULL);
ftime(&t);
/*Actualitzaci4 dels temps */
A-120
APÉNDICES
APÉNDICES. PROGRAMA DE MoNiroRizAaóN Y CONTROL DEL SISTEMA ANALÍTICO
l*/
dat.t_milli=t.time*1000+t.millitm;
accioneB_comunes () ;
/* Valor del patrí de 5 ppm amoni */
/•Llegim quan calibrem nitrats sols a l'arrencar */
if ( (difftime(dat.t_actual,dat.t_inici) >=60)
4& (di
f f time (dat. t_actual.dat. t_inici) <=BO)
&& (dat .posada_en_marxa==0) )
(if (lectura_ammv{) ==0)
(comunica2 (amvalv_sup_of f, retorno) ;
/* canviem a most
comunica2 (amvalv_inf_of f, retorno) ;
dat .ammv5ppm= valor. mv;
valor . punt_amoni = O ;
dat . posada_en_marxa=l ;
/•Evita lectura amoni en calibrats de nitrats excepte a l'inici*/
concentracio_amoni {)
;recta_amoni () ;
sprint f (mensaje, "%6 .4f\t%6 .4f\ t" , dat .ordenada, da t .pendent) ,-
guarda_medida ( mensaje, "c ; \\fiacfa\\datos\\calibnh4 .his")
,-
/* Carrega del
loop */
if ( (di f f time (dat . t_actual , dat . t_
inici) >=dat . t_carrega_loop)
&.& (dat .control=
=0) )
treinicializa_puerto{) ;
comunica (load, retorno) ;
reinicializa_puertob() ;
dat .control=l;
}if (dif ftimetdat . t_actual, dat . t_inici) >=dat . t injecció)
{dat . t_inici=time (NULL) ;
dat . t_cicle=time (NULL) ;
reinicializa_puerto() ;
comunica (inject, retorno) ;
reinicializa_puertob() ;
dat . cont rol = O ;
if (estado==6) estado-»--»-;
/** El calibrat ha finalitzat i compleix la repetitivitat */
else if (estado == -1) eatado=0; /*Vuelve a calibrar*/
}/************* calibrat **********•****/
switch (estado) {
case 0:
/* Calcul linia base */
if ( (dif f time (dat . t_actual , dat . t_inici) >=dat . inici_lectura_base_calibratno3 )
&& (difftimeídat.t actual, dat. t inici) <=dat . fi
lectura base calibratno3) )
{
-
-
-
-
if (difftime(dat.t_milli,dat.t_milli_old)>=200)
ídat.t_milli_old=t.time*1000+t.millitm;
if (lectura_absor()==0)
{for
(i=0
; i<=
18
; i+
+)
mesu
r_ab
s [i] *m
esur_
ab
s [i+1
] ;m
esur_abs[19] -valor . abso
r;sum
a=O.O
F;for
(is-0; i<=19;
i + + ) suma=> sum
a + m
esur_abs li] ;dat.linea_base=
suma/20.0F
;ï
}if (difftime (dat.t actual.dat . t_inici) >dat . f i_lectura base calibratnoS)
{sprintf (mensaje, "Línia base calculada: %5.3f " , dat . linea_base) ;
graf_texto(mensaje, 1,1, 594, 37, 1,1) ;
estado*-*-;
APÉNDICES A
-121
DESARROLLO E IMPLEMENTAQON DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
if (difftime(dat.t_actual,dat.t_iniciï >=dat.inici_lectura_max2)
íestado**,-
graf_texto("Iniciem deteccií Pic de nitrats",1,1,594,37,1,1);
break;. .
case 2:
/* Inici de la lectura del segon m_xim */
if (difftime(dat.t_milli,dat.t_milli_old)>=200)
dat. t_milli_old=t. time* 1000-f
t .millitm;
if(lectura_absor<)!=0) break; /* Si no ha llegit b,, surt del switch*/
if (valor.absor>max)
imax=valor.absor;
contador=0;
t_maxim=dat.t_actual;
¡else (contador**);
if(contador>20)
h_j?ic [0] =max-dat. linea_base;
max=0.OF;
. sprintf(mensaje,"Pic de nitrats 50 ppm detectat, hpic = %6.4f n,h_pic[0]);
graf_texto(mensaje,1,1,594,37,1,1);
delaytlOOO)
,-contador=0;
estado++;
}break;
case 3 :
if ( (float) fabs (h_pic [0-]
-h_pic_old) <=dat-diferencia_entre_pics)
comunica(valv_sup_on,retorno);
/* Per entrar mostra real */
comunica(valv_inf_off,retorno);
graf_texto("Pic de nitrats repetitiu",1,1,594,37,1,1)
¡;estado-»-*
;
h_pic_old=h_pic[0];
graf_texto("Pic de nitrats no repetitiu",1,1,594,37,1,1);
estado =-1; /* El pic no ,s repetitiu,
s'ha de repetir el proc.s en una injeccií posterior */
isprintf(mensaje," %6-4f ",h_pic[0]);
guarda_medida( mensaje, "c:\\fiacfa\\datos\\hpicno3.his");
hpic=h_pic (0]
,-valor.nitrats= dat.e+dat.f*((dat-d*hpic-0.OF+dat.c)/dat.d);
valor.t_nitrats=time(NULL);
valor.punt_nitrats=0;
graf_valores_displayO ;
pseudo_pico=0;
/* ReinicialitzaciC de variables */
break;
case 4 :
/*********»** Desactivamos el calibrado electrónico
if (difftime(dat.t_actual,t_maxim+dat.delta_t[pseudo_pico])>=0)
if (lectura_absor O = = 0)
{sprintf(mensaje,"Detectando pseudo pico: %i ",pseudo_pico);
graf_texto(mensaje,1,1,594,37,1,1) ;
h_pic Ip3eudo_pico+lí =valor.absor-dat.linea_base;
pseudo_pico++;
if (pseudo_pico> = 4) estado-n-;
*•.******.****.*..****•******.***.,*********.***/
estado**;
break
,-case 5 :
regresion_lineal( h_pic, c_pic, 4, &dat.e, &dat.f, &dat.r3);
sprintf(mensaje,"%6.4f \t%6.4f \t%6.4f \t",dat.e,dat.f,dat-r3);
guarda_medida( mensaje, "c:\\fiacfa\\datos\\calibno3.his");
A-122
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
ONT
ROL
DEL
SIST
EMA
ANAL
ÍTIC
O
graf_texto("Nou calibrat de nitrats calculat",1,1,594,37,1,1);
sprintf(mensaje,"%6.4f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t",h_pic[0] ,h_pic[l] ,h_pic[2] ,h_pic[3] ,h_pi
C [4]);.
guarda_medida( mensaje, "c:\\fiacfa\\dato3\\hno3.his");
estado*-*-;
break;
}/*Fin switch*/
}
while (estado! =7 && dat. f i==
«0) ;
dat.mostra_manual=0; /*Envia datos a SUN*/
•dat.fi=0;
return 0;
CalibraciC d'araoni
int
calibra_amoni(void) •
í int estado=0;
int
reto
rno
[4
0] ;
ch
ar
me
nsa
je[2
00
];
gra
f_te
xto
("C
ali
bra
ciC
d
' A
MO
NI.
.."
,1,1
,59
4,3
7,1
,1)
,•d
at.
mo
stra
_m
an
ua
l=l;
/*
No
en
vía
d
ato
s a
SU
N*/
do {
dat.t_actual=time(NULL);
acciones comunes ();
/*Actualitzacií dels temps */
switch(estado){
case 0: /** Canvi per fer passar patri S ppm **/
if(difftime(dat.t_actual,dat.t_cicle)>=660)
í comunica2(amvalv_sup_on,retorno);
comunica2 (amvalv_inf_on, retorno)
,-estado*t;
ibreak;
case 1: /** Lectura CFA per pâtre 50 ppm als 11 minuts **/
iff
difftimetdat.t_actual.dat.t_cicle)>a665 )
{ if (lectura_ammv{)==0)
f dat.aramv50ppm= valor.mv;
valor.punt_amoni=0;
concentracio__amoni () ;
estado++;
i}
break;
case 2: /** Canvi per fer passar mostra al sortir de la subrutina **/
if( difftimetdat.t_actual.dat.t_cicle)>=16BO )
i comunica2(amvalv_sup_off,retorno);
comunica2 (amvalv_inf_of f, retorno)
,-estado*+• ;
)break;
case 3: /** Lectura CFA per pâtre 5 ppm aïs 30 minuts **/
if((difftime(dat.t_actual.dat.t_cicle)>=1790))
( if (lectura_ammv()==0)
{ dat.ammv5ppm= valor.mv;
valor.punt_amoni=0;
concentracio_amoni();
recta_amoni();
sprintf(mensaje,"%6.4f \t%6.4f \t",dat.ordenada,dat.pendent);
APÉN
DICE
S A
-12
3
DESA
RROL
LO E
IMPL
EMEN
TAQ
ON
DE
UN S
ISTE
MA
SUPE
RVIS
OR
PAR
A LA
GES
TIÓ
N Y
CO
NTRO
L DE
ED
AR
guarda_medida ( mensaje, "c: \\fiacfa\\datos\\calibnh4 .his") ;
estado++;
ibreak;
case 4 :
if ( dif ftimeidat. t_actual.dat .t_cicle) >=1800 )
com
un
ica2
(am
val
v_
sup
_o
f f
, reto
rno
) ;
com
un
ica2
(am
valv
_in
f_o
f f
, reto
rno
) ;
dat.
t_
cic
le=
tim
e (
NU
LL
) ;
dat.
t_
inic
i=ti
me
(H
UL
L) ;
rein
icia
liza_
pu
ert
o()
;co
mu
nic
a (i
nje
ct,
reto
rno
)re
inic
iali
za_
pu
ert
ob
() ;
est
ad
o-f
+;
ibreak;
}/*Fin switch*/
} while (estado! =5 && dat.fi==0);
dat .mostra_manual=0; /*Envia datos a SUN*/
dat.f i=0;
return
0,-
i
/*
can
vie
m
a m
ost
ra re
al*
/
/*
Inje
cció
p
er
FIA
*/
void recta_amoni(void)
{ flo
at
am
on
i[2
],h
_am
on
i[2
] ;
am
on
i[0
]=(f
loa
t)lo
glO
(50
.OF
);a
mo
ni[
l]=
(flo
at)
log
lO(5
.0F
) ,-
h_
amo
ni[
0]=
dat
.am
mv
SO
pp
m;
h_
amo
ni[
1]=
dat
.am
mv
Sp
pm
;
/"
Yl=
a*
b*
xi,
Y
2=
a+b
*X
2.
b=
(Y1
-Y2
)/(X
1-X
2).
a
=Y
l-b
*x
i.
*/
dat.
pen
den
t =
(h
_a
mo
ni[
0]-
h_
am
on
i[I]
)/(a
mo
ni[
Oj-
am
on
id
at.
ord
en
ad
a
= h
_a
mo
ni[
0]-
da
t-p
en
de
nt*
am
on
i[O
];U
I);
A-1
24
APÉN
DICE
S
APÉNDICES. PROGRAMA DE MoN
rrofuzAdóN
Y CONTROL DEL SISTEMA A
NA
LÍnco
CLIENTE.C - FUNCIONES PARA LA COMUNICACIÓN CON LA SUN
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 28/8/97
** Librerías a incluir
«include <stdio.h>
«include
«include
Sinclude
Sinclude
«include
Sinclude
Sinclude
Sinclude
string.h>
memory.h>
process-h>
stdlib.h>
io.h>
conio.h>
time.h>
nombres.h"
Sinclude "c:\sockets\devkit\include\pctcp\typea.h"
«include "c:
\sockets\devkit\include\sys\types.h"
Sinclude "c:\sockets\devkit\include\sys\ioctl.h11
ffinclude "c i \
sockets\devkit\include\pctcp\errno.h"
{(include "c : \sockets\devkit\include\sys\socket .h"
(tinclude "c:\sockets\devkit\include\netinet\in.h11
Sinclude "c:\sockets\devkit\include\netdb.h"
/*ftinclude "c:\sockets\devkit\include\arpa\inet.h"*/
ttinclude "c : \sockets\devkit\include\pctcp\pctcp.h"
Sinclude "c :\socket3\devkit\include\pctcp\ipconfig.h"
if include "c:\sockets\devkit\include\pctcp\socketa.h"
«include "c :
\sockets\devkit\include\pctcp\options.h"
ff include "c :
\aockets\devkit\include\fcntl .h"
Sinclude <sys\time.h>
/*Sdefine DEPURA*/
/*ftdefine TEST*/
/*Sdefine svrName "eq3.uab.es" */
«define svrName "158.109.13.2"
«define Port (ushort) 32323
«define TAMANY 512
Sdefine TAMANY_M
100
typedef unsigned short ushort;
typedef unsigned long ulong;
/* Díreccitn SUN */
/* Direcciín num.rica SUN */
/* Numero de puerto del socket */
/* TamaDo del buffer */
/* Tamaño del mensaje cliente */
/* Definición de tipo de variables */
int sockets_pasa_datos(void);
void medida_a_SUN(char parámetro, char punto, float medida);
int mensaje_a_SUN(char *mensaje);
int connectToServer(char *serverName, ushort port);
int disconnectToserver(int toServerSocket);
void error_send(int errno);
void error_socket(int errno);
void error_connect(int errno);
fiifdef TEST
void main(void);
«define extern
«endif
extern ulong inet_addr(char *servidor); /**JB**/
extern int closefint elsocket);
/**JB**/
extern int variar_velocidad(double velocidad, int variador);
extern void guarda_mensaje( char *mensaje);
extern void imprimefchar *mensaje);
Variables comunes del programa
AP
ÉN
DIC
ES
A -1
25
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓ
N Y CONTROL DE ED
AR
char buffer[TAMANY];
extern datos_fia
dat;
extern valores fía
valor;
/* Variable a transmitir o recibir */
/* Funciín para establecer la comunicación y controlar el env¡o y la
recepción de datos */
/* Variables de control */
int sockets_pasa_datos(void)
íint toServerSocket = -1 ;
int i;
char carácter[!)={'A1};
/* Si la conexión anterior no ha sido correcta, vuelve */
if (dat.conexion_SUN == 0} return -2;
/* ConexiCn con
la SUN
*/
toServerSocket = connectToServer(svrName, Port);
/* Si la conexión no es correcta, devuelve -1 */
if ( toServerSocket «-D
{«ifdef DEPURA
printf ("Error en la conexiín\n°);
Sendifdat,conexion_SUN=0;
return -1;
ftifdef DEPURA
printf("CONEXIO A %s REALITZADA, %i\n",svrName,toServerSocket);
«endif
/* Mandamos una A, queremos establecer los valores de los analizadores */
send (toServerSocket, carácter, sizeof (carácter) , 0)
,-
/* Mandamos el buffer */
i = send(toServerSocket, buffer, sizeof(buffer), 0);
«ifdef DEPURA
if (i==-l) error_send(errno)
,-flendif
/* Recibimos respuesta */
recvítoServerSocket, carácter, sizeof(carácter), 0);
/* Lo env¡a de nuevo si no ha sido bien recibido */
if (carácter[O]l~'O') '
í«ifdef DEPURA
printf("Recibimos mal\n");
Sendifcarácter[0]='A';
send(toServerSocket, carácter, sizeof(carácter), O) ;
aendftoServerSocket, buffer, sizeof(buffer), .0);
recv (toServerSocket, carácter, sizeof (carácter) ,
0) ,-
if (carácter[0]!a-o1}
/* Si lo recibe mal de nuevo, desconecta */
{«ifdef DEPURA
printf("Recibimos mal de nuevo\nn);
Sendif
disconnectToServer (toServerSocket)
,-return -3;
/* Pedimos desconexión */
carácter[O]='F';
send(toServerSocket, carácter, sizeof(carácter), O);
disconnectToServer(toServerSocket);
retu
rn
0;
iA-1
26
AP
ÉN
DIC
ES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
Y C
ONTR
OL D
EL S
ISTE
MA
ANAL
ÍTIC
O
/* Introduce los datos de la estructura medidas en el buffer,
aQadiendo un cheksum y llama a otra funciCn que manda los datos */
void medida_a_SUN(char parámetro, char punto, float medida)
í struct sexta{
char punto;
/* O R-Anaerobio, 1 R-l, 2 R-2, 3 R-3, 4 Salida */
char parámetro;
/* 1 nitrato, 2 nitrito, 3 amonio */
char valor[10];
}dato_analisis;
int
i;unsigned long chequeo*OL;
memset(buffer, O, sizeof(buffer));
/* Borra las estructuras */
memset(&dato_analisis, O, sizeof(dato_analisis));
/* Introducimos las medidas en la estructura que pasamos a la SUN */
dato_analisis .parámetro = parámetro,-
dato_analisia.punto = punto;
sprintf(dato_analisis.valor,"%7.4f", medida);
/* Copiamos la estructura de datos al buffer */
memcpy(buffer, &dato_analisis, sizeof(dato_analisis));
/* Calculamos el cheksum del buffer */
for (i=.0;i<(TAMANY-12) ;i++) chequeo+=buf fer [i]
,-
/* Introducimos el cheksum como cadena de caracteres en la posición 500 */
sprintf(&buffer[500),"%lllu",chequeo);
/* Pasamos los datos a la SUN */
sockets_pasa_datos();
int mensaje a SUN (char *mensaje)
i int toServerSocket =
- 1 ;
int i;
unsigned long chequeo=OL;
char carácter [IJ ={ 'M'
J ;
time_t Itirae;
char mensaje_cliente [TAMANY_M] ;
/* Variables de control */
/*if (dat.conexion_SUN =•=
0) return -2;*/
memset (buffer. O, sizeof (buffer) ) ;
/* Borra las estructuras */
memset (mensaje_cliente, O, sizeof (mensaje_cliente) ) ;
time t<ime) ;
sprint f (mensa j e_c li ente, "%s%s" , mensaje, ctime ( <ime ) )
;
/* Copiamos el mensaje al buffer */
memcpy (buffer, mensaje_cliente, sizeof (mensaje_cliente) ) ;
/* Calculamos el cheksum del buffer */
for
(i=0;i<(TAMANY-12) ;i
+-fr) chequeo+=buf fer [i
J ;
/* Introducimos el cheksum como cadena de caracteres en la posiciCn 500 */
sprint f UbuffertSOO] , "%lllu" , chequeo) ;
/* Conexión con la SUN */
toServerSocket = connectToServer(svrName, Port);
/* Si la conexiCn no es-correcta, devuelve -1 */
if (toServerSocket==-l)
{ftifdef DEPURA
printf ("Error en la conexiCn\n");
ifendifdat.conexión SUN=0;
AP
ÉN
DIC
ES
A -
127
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR
PAR
A LA
GES
TIO
N Y
CON
TROL
DE
EDAR
retu
rn -1
;i
els
e
dat.
co
nex
ion
_S
UN
=l;
.
ftifdef
DEPURA
printf ("CONEXIO A %s REALITZADA, %i\n" , svrName, toServerSocket) ;
«endif
/* Mandamos una M, queremos mandar mensaje */
send (toServerSocket, carácter, sizeof (carácter) , O) ,•
/* Mandamos el buffer */
send(toServerSocket, buffer, sizeof(buffer), 0);
/* Recibimos respuesta */
recv(toServerSocket, carácter, sizeof(carácter), 0);
/* Lo env¡a de nuevo si no ha sido bien recibido */
if (caracterlO] !=*'O')
í carácter 10] = 'M1;
send(toServerSocket, carácter, sizeof(carácter), 0};
send(toServerSocket, buffer, sizeof(buffer), 0};
recv(toServerSocket, carácter, sizeof(carácter), 0);
if (carácter[0]l='0')
/* Si lo recibe mal de nuevo, desconecta */
i disconnectToServer (toServerSocket)
,-return -3;
}
/* Pedimos desconexión */
carácter[OJ = 'F';
send(toServerSocket, carácter, sizeof(carácter), 0);
disconnectToServer(toServerSocket);
/*** ......... * ...... ..**.*.**.**.******..****.********* ...... *„„.** ...... /
/*************.********* ......... * ..... ******* .......... .****.******.****/
/*
connectToServer es usada por el cliente para abrir una conexiín
*/
/* con el servidor
*//****.********************.*..*****.*****.*..*......,...*.***********..***/
int connectToServer (char *serverName; ushort port)
/* Variable direccitn del host remoto */
/* Puntero direcciCn del host remoto */
/* Descriptor del socket local */
/* DirecciCn del host */
/* Supone fallo */
struct sockaddr_in serverSockAddr ;
struct hostent *serverHostEnt;
int toServerSocket =
(-1) ;
ulong hostAddr;
int result =
(-1) ;
int error=0;
struct linger {'
int l_onof f ;
int l_linger;
}mi_linger;
/************,******* ........ .*.****..* .................................. /
/*
Borra y establece la estructura de la dírecciín del servidor
*/
memset (&serverSockAddr, O, sizeof {serverSockAddr ) )
;
hostAddr = inet_addr(serverNatne) ;
/* Devuelve la direcciCn */
if ( (long) hostAddr l= (longj(-l)l
/* Hay direcciCn */
ííf i f de f DEPURA
printf ("\nconnectToServer: se ha obtenido la direcciCn de %s i es *lx \n"
hostAddr) ;
ft endif memcpy ( & (serverSockAddr. sin_addr) , shostAddr, sizeof (hostAddr) ) ;
serverName,
else
/* No hay direcciCn */
Sifdef DEPURA
printf ("\nconnectToServer : no se ha obtenido directamente la direcciCn \n" ) ;
A-128
APÉNDICES
APÉN
DICES. PROOTAM
A DE M
ON
ITORIZA
CION
Y CONTROL DEL SISTEM
A A
NA
LÍTICO
(tend i í
/*
Se c
on
sulta
al
serv
ido
r d
e n
om
bres
para
d
ete
rmin
ar
la
dire
ccic
n
del
ho
st *
/
if (NU
LL
»
serv
erl·lo
stEn
t)í
ffifdef
DE
PUR
Af p
rint f (s
tderr,
"Imp
osib
le lo
caliz
ar
ho
st \"
%
s \"
\n°,
serverN
ame) ;
ffend
ifg
oto
eg
ress;
}/*
S
e c
opia
la
d
irecció
n de e
ntra
da del
host
a la
estru
ctu
ra del
socket
*/
mem
cpy (& (se
rverS
ock
Ad
dr. sin
_ad
dr) ,
serv
erl·lo
stEn
t->h
ad
dr, a
erv
erl·lo
stEn
t->h
len
gth
) ;
serv
erS
ock
Ad
dr.sin
_fa
mily
=
AF
_INE
T;
/*
Asig
naciín
d
e d
ireccio
nes
*/
serv
erS
ock
Ad
dr. s in
_p
ort
=
(ush
ort)h
ton
s (po
rt) ; /*
A
sign
aciC
n
del
pu
erto
*/
/*
Se c
rea el
sock
et
*/
erro
r =
0
;
toS
erv
erS
ock
et
= so
ck
et (
AF
_INE
T,
SOC
K STR
EAM
, 0
) ;if
(toS
erv
erS
ock
et
==
-1)
{S
ifdef
DEPU
RA
erro
r so
ck
et (e
rmo
) ;tte
nd
if
}ttifd
ef
DE
PUR
Ap
rint f ("E
l so
ck
et
vale
%
i \n
" , toS
erv
erS
ock
et) ;
prin
tf ("
Erro
r en
setso
ck
op
t, re
usa
\n") ;
mi_
ling
er. l_
on
of f=
l;m
i_lin
ger.l_
ling
er=
lO;
if (se
tsock
op
t (to
Serv
erS
ock
et,
SOL
_SOC
KE
T,
SO_L
ING
ER
, (c
har
*)
&m
i_lin
ger,
sizeo
f (mi_
ling
er) ) =
=-1
)p
rintf
("E
rror
en
setso
ck
op
t, lin
ge
r\n");
(erro
r =
1;
it i f de f
DE
PUR
A
Sen
difg
oto
eg
ress;
}re
su
lt =
toS
erv
erS
ock
et;
eg
ress :
retu
rn re
su
lt;}in
t d
isco
nn
ectT
oS
erv
er {
int
toS
erv
erS
ock
et)
íint
sh
ut.c
lo;
shu
tosh
utd
ow
n (to
Serv
erS
ock
et,
2) ;
ftifde
f D
EPU
RA
if (sh
ut=
=
-1)
prin
tf (" E
rror
en
sh
utd
ow
n
toS
erv
erS
ock
et . \n
") ;
els
e
prin
tf ("Sh
utd
ow
n to
Serv
erS
ock
et
ok
.\nn);
if (clo
=
= -1
) p
rintf { "E
rror
en c
lose to
Serv
erS
ocket. \n
") ;
tten
dif
APÉNDICES A
- 129
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
retu
rn
clo
;tvo
id
erro
r se
nd (in
t errn
o)
{switc
h (e
rrno
)fcase
E
AC
CE
S:p
rint f ( " ER
RO
R :
EA
CC
ES
\n" ) ;b
reak
;case
E
FAU
LT
:p
rint f ( " E
RR
OR
: E
FA
Ul/r\n
" ) ;b
reak
;case
E
NO
BU
FS:p
rintf ("E
RR
OR
: E
HO
BU
FSXn" ) ;
bre
ak
;case
EN
OTC
ON
N:
bre
ak
;case
E
NO
TSO
CK
:p
rintf ("E
RR
OR
: E
NO
RS
OC
K\n") ;
bre
ak ;
case
ESH
UTD
OW
N:
prin
tf ("ER
RO
R:
ESH
UT
IX)W
N\n") ; .
bre
ak
;case
EW
OU
LDB
LOC
K:
prin
tf ("ER
RO
R:
EWO
LXH
/DB
LOC
KX
n" ) ;b
reak
;
)
{switc
h (e
rrno
) {case
E
PRO
TO
NO
SUPPO
RT
:p
rintf ("F
AIL
: E
PRO
TO
NO
SUPPO
RT
\n " ) ;b
reak
;case
E
MFIL
E:
prin
tf ("FA
IL:
EM
FIL
E\n
fl);b
reak
;case
E
NF
ILE
:
bre
ak
;case
E
NO
BU
FS:p
rintf ("F
AIL
: E
NO
BU
FS
\n") ;
case
E
PRO
TO
TY
PE:
prin
tf ("FA
IL:
PR
OT
OT
YP
E\n") ;
bre
ak
;d
efa
ult:p
rintf ("F
AIL
: d
efa
ult\n
") ;
*}
íswitc
h(e
rrno
) {case
E
AD
DR
INU
SE:
prin
tf ("ER
RO
R:
EA
DD
RIN
US
E\n" ) ;
bre
ak
;case
E
AD
DR
NO
TA
VA
IL:
bre
ak
;C
ase E
AFN
OSU
PPOR
T :
prin
tf ("ER
RO
R:
EA
FNO
SUPPO
RT
\n" ) ;b
reak
;case
E
CO
NN
RE
FUSE
D:
prin
tf ("ER
RO
R:
EC
OK
NR
EFU
SED
\n" ) ;b
reak
;
A- 130
APÉNDICES
APÉN
DICE
S. P
ROG
RAM
A D
E M
ON
ITO
RIZ
ACIO
N Y
Con
reen
. DEL
SIS
TEM
A A
NAL
ÍTIC
O
case EDESTADDRREQ:
printf ("ERROR: EDESTMDRRECAn" ) ;
break;
case EFAULT : '
printf("ERROR. EFAULT\n")¡
break;
case EINPROGRESS:
printf("ERROR: EDESTADDRREOAn");
break;
case EINVAi:
printf("ERROR: EINVAL\n");
break;
.case EISCONN:
print f("ERROR : EISCONN\n");
break;
case EMPILE:
printf("ERROR: EMFILE\n"l;
break;
case ENETUNREACH:
printf ("ERROR: ENETTJNREACHXn" ) ;
break;
case ENOBUFS:
printf("ERROR: ENOBUFSXn");
break;
case ENOTCONN:
printf("ERROR: ENOTCONN\n"ï ;
break;
case ENOTSOCK:
printf("ERROR: ENOTSOCK\n");
break;
Case ETIMEDOUT:
printf("ERROR: ETIMEDOUT\n");
break;
default: printf("default. errno: %d\n", errno);
/* Ctdigo necesario ai desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
«ifdef TEST
void main(void)
int i,j;
dat. conexion_SUN = 1 ;
for (i»l,-i<4,-i++)
for (j»0;j<5;ji-f) medida_a_SUN((charli,(char) j, 1.0F);
getch();
for (i=l;i<4;i++)
for (j=0;j<5;j++) medida_a_SUN((char)i,(char) j, O.OF);
} Kendif
/
*
*
•**
....................../
APÉN
DICE
S A
-131
DESA
RRO
LLO
E IM
PLEM
EMTA
QO
N D
E UN
SIS
TEM
A S
UPER
VISO
R P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DA
R
COM
UN
ICA
.c -
FU
NC
ION
ES
PAR
A
CO
MU
NIC
AR
C
ON
EA
SI
PROG
RAM
ADOR
: Ju
an A
nton
io B
aeza
L
abat
ULTI
MA
REV
ISIÓ
N:
4/1
/99
ífín
clud
e <
std
io.h
>^i
ncl
ud
e <
bios
.h>
ífin
clud
e <
coni
o.h>
tt inc
lude
< t
ime.
h >
8in
clu
de
«dos
.h>
fíin
clud
e <m
emor
y.h>
fí in
c lu
de
<mat
h. h
>#
incl
ud
e "n
ombr
es,h
"
/*tt
defi
ne
TEST
*/tti
fdef
TE
STft
defi
ne
exte
rníf
endi
f
cií
v
ia
CO
MÍ
tf de fine DTR
Jídefine RTS
«define COM1PORT
íídefine COMÍ
«define DCOM1
«define COM2
íídefine DCOM2
0x01
0x02
0X0000
O 0x3 F8
1 OX2F8
/*Data Terminal Ready*/
/*Ready To Send*/
/*Pointer to Location of COMl port*/
«define DATA_READY
0x100
«define FALSE
0«define TRUE
! FALSE
«define SETTINGS { OxEO | 0x00 |
«define SETTINGS2 ( OxEO | 0x00 |0x02 |
0x03
0x00)
| 0x00)/* 9600,N,7,1 */
/* 9600,N,8,1 */
int comunica(int *fraae, int *salida};
int comunica2(int *frase, int *salida);
void reinicializa_puerto(void);
void reinicializa_puertob(void)
,-void reinicializa_puerto2(void);
int lectura_absor(void);
int lectura_ammv(void);
extern void delay! clock_t wait );
extern valores_fia valor;
extern datos_fia dat;
extern int colorim(3] [20) , ampotenciometre[20];
extern int offline;
/* Subrutina per enviar/rebre dades bit a bit a trav,s del COMl
*/
int comunica(int *fra3e, int *salida)
íint in, ra=0,i=0, j=0, k=0, status, DONE = FALSE;
if (offline==l) return -3;
/*
delay(iO);*/
status = _bios_serialcom(_COM_STATUS, COMÍ, O); /'Comprueba estado*/
while ( (status & DATA READY)!=0 )
{_bios_serialcom(_COM_RECEIVE, COMl, 0);
status = _bios_serialcom(_COM_STATUS, COMl, 0);
m=l;
1 if (m==l) return -2;
A-132
APÉNDICES
APÉNDICES. PROGRAMA re MO
NITORIZAO
ÓN
y CONTRO
L DEL SISTEMA ANALÍTICO
salida CO] =
48;
while ( 1DONE
_outp ( DCOM1 + 4 , D
TR | RTS ) ;
iE ( (in » frase [i])
i. '°'
)
status = _bios_serialcO(n(_COM_STATUS, COMÍ, O) ;
_bios_serialcom(_COM_SEND, COMÍ, in);
while ( (status & DATA_READYÍ ==0 )
status = _bios_serialcom(_COM_STATUS, COMÍ, 0) ;
salidalj] - bios serialcoml COM RECEIVE, COMÍ, o) í Ox7F;
)
~ ~
status
=> _bios_serialcom(_COM_STATUS, COMÍ, 0) ;
if (status & DATA_READY)
{J+ + ;
salidalj] >
bios serialcoml COM RECEIVE, COMÍ, 0)
s, Ox7F ;
}
~ ~
if ( (fraseEi] ==
'°') && (j >3) && (salidatj] == '\r')) DONE=TRUE;
if (k>25000) return -1;
/* retorna error i no agafa lectura */
if (j>30)
return -2;
/* Subrutina per enviar/rebre dades bit a bit a trav,a del COM2
int comunica2 (int
*frase, int *salida)
{int
in, m=0,i=0, j=0, k=0, status, DONE = FALSE;
if (offline==l) return -3;
/*
delay(lO) ;*/
status " _bios_serialcom(_COM_STATUS, COM2, 0)
; /*Comprueba estado*/
while ( (status & DATA READY) 1=0 )
{_bio3_seríalcom(_COM_RECEIVE, COM2, 0) ;
status = _bios_serialcom(_COM_STATUS, COM2, 0);
mal;
salida (0]o4B;
while ( ¡DONE
)
_OUtp ( DCOM2
-t-
4, DTR | RTS ) ;
if ( (in = frasefi]) != -D-
)ístatus = _bios_serialcom(_COM_STATUS, COM2, O);
_bios_serialcom(_COM_SEND, COM2, in);
while ( (status s, D
ATA_READY) ==0 )
status = _bios_serialcom(_COM_STATUS, COM2, 0);
salidalj] = _bios_serialcom(_COM_RECEIVE, COM2.0) & Ox7F;
status a _bios_serialcom(_COM_STATUS, COM2, 0);
if(Status & DATA READY)
íj++;
sa
lida
tj] -
_b
ios_
serialcom
(_C
OM
_R
EC
EIV
E,
CO
M2,
0)
& O
x7F ;
if (
(frase
li] «
'd')
íf. (j
>3
) &&
(sa
lida
tj] ==
'\r')
) D
ON
E=TRU
E;if
(k>
25
00
0)
retu
rn
-1;
/*
reto
rna erro
r i
no
ag
afa
lectu
ra
*/
if (j>
30
) re
turn
-2
;
return O ;
ivoid reinicializa_puerto(void)
APÉNDICES A
-133
DESARROLLO E IM
PLEMENTAQ
ON
DE UN SISTEMA SUPERVISO
R PARA LA G
ESTIÓN
Y CONTROL DE EDAR
rialcom(_COM INIT, COMÍ, SETTINGS2);
void reinicializa_puertob(void)
(_bios_serialcom(_COM_INIT, COMÍ, SETTINGS);
void reinicializa_puerto2(void)
{_bios_serialcom(_COM_INIT, COM2, SETTINGS);
Su
bru
tina
lectu
ra
d'a
bso
rb..Jic
ia
int
lectu
ra_
ab
sor(v
oid
)
int
erro
r=0
, j =
0 ;ch
ar
tem
po
r[10
];flo
at
ab
sor;
int
reto
rno
[40
];
do
/*Borra la variable*/
memset(retorno,O,sizeof(retorno));
error=comunica(colorim[2].retorno);
while{error!=0 && j<4);
/*for (j=0;
j<25; j+*) print f ( " %c" , retorno [ j ] )
,- */
if (error==0)
if (re
torn
o[O
] 1=13
| j re
torn
o [2] ! = '3
' | | re
torn
o[8
] ! = 'A
1 j |
reto
rno
[7] ! =
' " ' | | re
torn
o [2
4] ! =* ' " '
) re
turn
-2
;/*
Ha
leíd
o p
ero
n
o e
s co
rrecto
*/
me
mse
t(tem
pe
r,0,siz
eo
f(tem
pe
r)); /*
Bo
rra la
varia
ble
*/
for
(j=0
;j<7
;j++
) te
mp
er[j]=
(ch
ar)
reto
rno
[12
+j];
/*A
sign
a lo
s cara
cte
res*
/a
bso
r=(flo
at)a
tof(te
mp
er)
; /'C
alc
ula
el
valo
r*/
if ((a
bso
r>-0
.IF)
&&
(ab
sor<
l.OF
)) /*
Co
mp
rueb
a ra
ng
o*
/if
( (abso
r< (v
alo
r .abso
r-t-0 . 6 OF) )
&&
( ab
sor > (v
alo
r, ab
sor-O
.6 O
F) ) ){
/'Co
mp
rueb
a v
aria
ció
n
resp
ecto
an
terio
r*/
valo
r.ab
sor=
ab
sor;
va
lor.t_
ab
sOr=
time
(NU
LL
);re
turn
O
;Subrutina lectura de mv
int inicio=l;
int lectura_ammv (void)
iint
amerro
r=0 ,
j =0 ;
ch
ar
temp
er [10] ;in
t am
reto
rno
[40
] ;flo
at
temp
;
memset (amretorno, O, sizeof (amretorno) ) ;
do
/*Borra la variable*/
amerror=comunica2 (ampotenciometre , a
mretorno) ;
)while (amerror!=0 &&
j«=4) ;
/•for (j=0;
j<25; j
-t--*-} print f ("%c"
, amretorno [j
] ) ;-/
A-134
APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
ON
rroR
EA
dóN
Y C
ONT
ROL
DEL
SIST
EMA
AN
AÜ
nco
it (amerror==0)
if
(am
reto
rno
[0
] 1=
13 | |
am
reto
rno
{2
) !
= '5
' | |
am
reto
rno
{7
] ¡
= '
" '
j j
am
reto
rno
[2
4]
! = '
" '
) re
turn
-2
;/*
Ha
le ¡do p
ero
no
es
co
rrecto
*/
mem
aet
(tem
po
r, 0
, siz
eo
f (t
emp
er)
) ;
/*B
orr
a la
v
ari
ab
le*
/fo
r (j
»0
; j<
6 ; j
+ +
) te
mp
er
[j) -
(c
ha
r) a
mre
torn
o [
8+
jl ;
/*
Asi
gn
a
los
cara
<te
mp
= (
flo
at)
ato
f (t
emp
or)
;
/*C
alc
ula
el
valo
r*/
if ({temp>-400.OF) && (temp<100.OF))
/*Comprueba rango*/
if((temp<(valor.mv+SO.OF)) && (temp>(valor.mv-50.OF)) ||
difftime(dat.t_actual,valor.t_mv)>60)
{
/*Comprueba variaciCn respecto anterior*/
valor,mv=temp;
valor.t_mv=time(NULL);
return 0;
}if (inicio==l)
if <(temp>-300.0F) ss, (temp<100 .OF) ÍÍ (temp!=0.OF) )
{ valor.mv= temp;
valor.t_mv=time(NULL);
inicio=0;
itifdef TEST
void main(void)
{ int i;
int tecla;
reinicializa_puertobO;
reinicializa_puerto2( ) ;
for (i=0;i<10000;i++)
{tecla=Jbios_keybrd(_NKEYBRD_READY); /*Comprueba si se ha presionado una tecla*/
if(tecla!=0) break;
lectura_ammv();
printf("\t%f\t%i\n",valor.mv,i);
lectura_absor();
printf(n\t%f\t%i\nn,valor.absor,i);
delay(lOO);
i void delay( clock_t wait )
fclock_t goal;
goal = wait
*• clockl);
whilet goal > clock() )
í int
co
lori
m[3
] [
20
]=
{{
'\r
1,'
0',
'3',
'R',
IS
','T
','\
r' )
ia
i}
, /*
R
ese
t co
lor¡
metr
e*
/{
'\r
','0
','3
-,'
T1
,'C
*,'
A',
'\r
' (-
a-
},
/* C
ali
bra
cií
co
lor¡
metr
e»
/{
'\r
','O
','3
','R
','D
','I
','\
r',
'Q'}
};
/* L
ectu
ra c
olo
r¡m
etr
e*
/in
t a
mp
ote
nc
iom
etr
e[2
0]=
{l\r
l('l
',15
','R
l,'
D',
'If,l
\r',
'o1}
; /*
L
ectu
ra
de
mV
*/
ítendif
/**
**
"•*
**
*
*
**
**
**
**
**
* *
**
**
**
**
**
**
**
* /
AP
ÉN
DIC
ES
A -
13
5
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR
PARA
LA
GES
TIÓ
N Y
CO
NTRO
L DE
ED
AR
FUNCIÓN PARA ESPERAR LOS MILISEGUNDOS DETERMINADOS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISION: 23/5/95
******** Libreriras a incluir
((include <time.h>
((include <conio.h>
(finclude <stdio.h>
Subrutina3 del fichero
void delay( clock_t wait );
/* Pauses for a specified number of microseconds. */
void delay( clock_t wait )
clock_t goal;
goal = wait + clockO ;
while! goal > clockO )
itifdef
TEST
void main (void)
<int duracion=1000;
clock_t cstart, cend;
cstart = clockO;
delay ( duración );
cend » clockO ;
printf( "\nTiempo transcurrido:\t\t%6.4f seconds \n"
((float)cend - cstart) / CLOCKS PER SEC };
A-136
APÉNDICES
APÉNDICES. PROGRAMA DE MONÏTOREACION Y COHTROL DEL SISTEMA ANALÍTICO
FICHERO
S.c -FUNCIONES PARA LA LECTURA Y ESCRITURA DE FICHEROS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 15/4/97
ffinclude <io.h>
ffinclude <time.h>ffinclude <stdio.h>ffinclude <stdlib.h>
ffinclude <memory.h>
ftinclude "nombres. h"
/•ffdefine TEST*/
Sifdef TEST
{(define extern
ftendif
Subrutinas del fichero
void lectura_configuracio(void);
void guarda_mensaje( char *mensaje, char «fichero);
void guarda_medida( char *mensaje, char "fichero);
int
lee_calibrado( char *fichero, float *param_a, float *param_b),-
/*************•**.»».* submtinas externas necesarias *************
extern datos_fia
extern valores fia
Variables comunes del programa
dat;
valor;
Subrutina lectura de la configuracií inicial del fitxer de dades fia4.dat */
void lectura_configuracio(void)
{FILE *obert;
int si,i;
char linea[150];
if ( access(nc:\\fiacfa\\fia4.daf,0) == 0)
{obert=fopen("c :\\fiacfa\\fia4.dat","rt");
/*En primer lugar se lee la l¡nea y despu,s ae traduce a nEmeros*/
fgets(linea,sizeof(linea),obert) ;
sscanf (linea, "IIo, sdat. t_estabilit) ,-
fgets(linea,sizeof(linea),obert);
sscanf(linea,"%In, &dat.inici_lectura_baae);
fgets(linea,sizeof(linea),obert);
aacanf(linea,"%I", &dat.fi_lectura_base);
fgets(linea,sizeof(linea),obert);
sacanf(linea,n%d", &dat.inj_entre_calibrats);
fgeta(linea,sizeof(linea),obert) ;
aacanf(linea,"%I", &dat.inici_lectura_maxl);
fgets(linea,sizeof(linea),obert) ;
~aacanf (linea, "%!", &dat.inici_lectura_max2) ,-
fgets(linea,sizeof(linea),obert);
sscanf(linea,"%!", &dat.t_carrega_loop);
fgeta(linea,sizeof(linea),obert) ;
ascanf(linea,"%l", sdat,t_injeccio),-
for (i=0;i<4;i++)
ífgets(linea,sizeof(linea),obert);
sscanf(linea,"%I", tdat.delta_t[i]);
APÉNDICES A
- 137
DESARROLLO E IMPLEMENTAOON DE UN SISTEMA SUPERVISOR PARA LA GESTION Y CONTROL DE EDAR
for (i.0;i<3;it+)
<f gets (linea, sizeof (linea) , obert) ;
sscanf (linea, "%I", &dat -delta_picl [ij
} ;
}for (i=0; i<3;i++)
ífgets (linea, sizeof (linea) , obert) ;
ascanf (linea, "%l", &dat .delta_pic2 [i]
) ;
}fgets (linea, sizeof (linea) , obert) ;
ascanf (linea, " %I" , &dat
- inici_lectura_base_calibratno3 )
,-fgeta (linea, aizeof (linea) , obert) ;
sscanf (linea, "%In , &dat. f i_lectura_base_calibratno3) ;
fgets (linea, sizeof (linea) , obert) ;
sscanf (linea, "%f " , &dat.diferencia_entre_pics) ;
f gets (linea, sizeof (linea) , obert) ;
sscanf (linea, "%I", &dat. t_canvi_punt_moatreig) ;
fscanf (obert, "li" , üdat . t_lectura_amoni)
,-ai=fscanf (obert, "%* [*0123456789] -);
if (si==EOF)
/*Si hay menoa datos de los necesarios*/
printf ( "\nError: Faltan dades en el fitxer de configuracit fia4.dat \n");
f close (obert) ;
exit(l) :
}f close (obert) ;
îelse(printf ("\nError: El fitxer de configuracií fia4.dat no existeix\n") ;
exit (1)
;
îreturn;
ivoid guarda mensaje( char *mensaje, char *fichero)
íFILE *stream;
time_t Itime;
char la_f
rase [160]
,-
time (<ime) ;
sprint f (la_frase, "%a
%s\n" , ctime ( <ime ) , mensaje) ;
la_frase [24]
=32;
atream = f open ( fichero, "a+");
fprintf (stream, "%s" , la_f rase) ;
f close(stream) ;
í void guarda_medida( char 'mensaje, char *fichero)
FILE *stream;
struct
tm *t;
time_t Itime;
time (<ime);
t = localtime( filtime ) ;
stream = fopen( fichero, "a+");
fprintf(stream, "%sn, mensaje);
fprintf(stream, "%2d %02d %02d
", t->tm_hour, t->tm_min, t->tm_sec);
fprintf (stream, n%sri, ctime ( & Itime ) ) ;
fclo
se
(atre
am
);
A-1
38
APÉNDICES
APÉN
DICES
. PRO
GRAM
A DE
MoN
rroRi
ZAaÓ
N Y
CONT
ROL D
EL S
ISTEM
A AN
ALÍTI
CO
return;
} /****•*•****
*
.«*******,****.
***,*,,**.**/
int
lee calibrado! char *fichero, float *param_a, float *parara b)
í FILE *obert;
char lineal[150], Iinea2[150];
if ( access(fichero,0} != 0) return -I ;
obert=fopen(fichero, "rt")
,-memset(lineal,O,sizeof(lineal));
while(fgets(lineal,sizeof(lineal).obert) != NULL} /* Lee linea mientras hay */
memcpy(linea2,lineal,sizeof(Iinea2));
/* Guarda la £ltima linea */
memset(lineal,O,sizeof(lineal));
f close (obert) ;
sscanf (Iinea2, "%f %f " , param_a, param__b) ;
return 0;
i
/* Convierte linea a par metros */
ííifdef TEST
void main(void)
í float a=.O.OF,b=O.OF;
int retorno;
retorno=lee_calibrado( "c:\\fiacfa\\datos\\calibnh4.his", &a, &b);
print f ("a: %f\tb: %f \t retorno: %i\n", a, b, retorno)
,-retorno=lee_calibrado( "c:\\fiacfa\\datos\\calilno2.his", &a, &bï;
printf ("a: %f\tb: %f\t retorno: %i\n" , a,b, retorno)
,-retomo=lee_calibirado( "c: \\fiacfa\\datos\\cali2no2. his" , ta, &b) ;
printf ("a: %f\tb: %f\t retorno: %i\n" , a, b, retorno)
,-retorao=lee_calibrado( "c:\\fiacfa\\datos\\calibno3.his", &a, &b) ;
printf("a: %f\tb: %f\t retorno: %i\nn,a,b,retorno);
«en
dif
/**
**
**
APÉN
DICE
S A
-13
9
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SISTE
MA S
UPER
VISOR
PARA
LA G
ESTIÓ
N Y C
ONTR
OL D
E ED
AR
GR
ÁF
ICO
S.C
-
FUN
CIO
NE
S P
AR
A L
A
PR
ESE
NT
AC
IÓN
DE
DA
TO
S Y
GR
ÁF
ICA
SPO
R
PAN
TA
LL
A
PRO
GR
AM
AD
OR
: Ju
an
A
nto
nio
B
aeza
Lab
at
UL
TIM
A
RE
VIS
ION
: 6
/5/9
7 Lib
reri
as
a in
du
ir
^in
clu
de
«ro
nio
.h>
ttin
clu
de
<std
lib
.h>
ftin
clu
de <
str
ing
.h>
ftin
clu
de <
std
io.h
>íí
inclu
de
<g
rap
h.h
>((
inclu
de
<
ma
th.h
>#
inclu
de
<
tim
e.h
>((
inclu
de
"no
mb
res
.h"
Defi
nic
ion
es
**
*/*
ítd
efi
ne
TE
ST
*/
flif
def
TE
ST
(¡d
efi
ne
ex
tern
ffe
nd
if
íídefine PATHFONTS "c:\\f iacfa\\f onts\\* . fon"
y*********************** Subrutinas del fichero ***********************/
void modo_grafico(void);
void graf_base(void);
void graf_led( int led, int on_off );
void graf_hora(void);
void graf_sombra_grafica(void);
void graf_ayuda_general(void);
void graf_borra_ayuda(void);
void graf_display(void);
void graf_valores_display(void);
void graf_valor_ab3or(void)
,-void graf_valor_mv(void);
void salir__al_dos (void) ;
void graf_ejes_tiempo(int escala);
void graf_eje_mv_absor (void)
,-void graf_eje_vertical
(short xl, short yl, short y2, float min, float max, int div, short col);
void graf_eje_horizontal
(short xl, short yl, short x2, int min, int max, int div, short col);
void graf_tanques(void);
void graf_tanque(int tanque);
void graf_presentacion(void);
int botón ( int on_off, char *nombre, short xl, short yl,
short x2, short y2, short font);
int graf_texto
(char "nombre, short xl, short yl, short x2, short y2, int font, int fondo);
void actualizar_matrices_graf icas (void)
,-void seleccionar_grafico(int orden);
void grafica_variable(int variable);
void barra_botones(void);
/*omunes del programa
extern valores__fia
valor;
extern datos_fia
dat;
matr
i2_
gra
fica
mat_
gra
[18
00
];
/'D
ato
s
cada
4 se
gu
nd
os,
2 h
ora
s en to
tal*
/
/•***.*****•*********«.*+********+*...**.****.*.***..**.****.***.*********
/* Pasa del modo texto al gr fico.
"
*/
void modo_grafico(void)
if( J_setvideomode( _MAXRESMODE ) )
exit{ 1 );
_registerfonts( PATHFONTS ); /*Fuentes gr ficas*/
A-140
APÉNDICES
APÉNDICES. PROGRAMA DE MO
NITORCACIÓ
N Y CONTROL DEL SISTEM
A AN
ALtnco
/*.»
,...+**.*
.*
**.*
..***.,*
.**..*
*.*
..**.*
*
* /
/* Funciín que llama a las funciones necesarias para dibujar la pantalla. */
void graf base(void)
ígra
f_so
mb
ra_
gra
fica
();/*
gra
f_a
yu
da
_g
rafic
as();*
/g
raf_
ay
ud
a_
ge
ne
ral();
gra
f_d
ispla
y();
gra
f_h
ora () ;
barra_botones {)
;graf_texto{"Temps
(minuts)", 130, 455, 230, 473, 1, Oí;
graf_eje mv_absor();
graf_eje~horizontal (80,434,560, (short)((dat.inicio_graf-4)*30),
(short)((dat.fin_graf-4)*30), 6, 30);
graf_jvalor_absor()
,-graf_valor_mv();
i/*
Re
loj
dig
ital,
co
n fe
ch
a y
h
ora
,
vo
id
gra
f_h
ora
(vo
id)
time_
t Itim
e;
sho
rt x
=4
45
,y
=4
60
;ch
ar
fue
nte
[20
]="t "Tm
s R
mn
'hl2
w5
0b
";ch
ar
bu
ffer[3
0];
int
seg
un
do
s,min
uto
s ;
•_se
tgte
xtv
ec
tor(
1, O
) ;_
se
tfon
t( fu
en
te ) ;
time
(&Itim
e);
sp
rintf (b
uffe
r, "%s",
ctim
ef
fcltime
) ) ,-
_setcolor(242);
_rectangle( _GFILLINTERIOR, 441, 459 ,587, 471);
_setcolor(28);
_rectangle( _GBORDER, 441, 459 ,587, 471);
_setcolor(29);
_moveto(x,y);
_outgtext(buffer);
_rectangle( _GBORDER, 350, 459 ,430, 471);
segundos^(int)(time(NULL)-dat.t_cicle);
minutososegundos/60;
segundos=segundos-minutos*60;
sprintf( buffer, "T cicle: %2i : %2i", minutos,segundos);
graf_texto( buffer, 351, 460, 429, 470, O, 1)
,-
/* Escribe la pantalla de ayuda general del programa.
void graf_ayuda_general(void)
íint i;
short x,y;
ch
ar
fue
nte
[20
]=nt'T
ms
Rm
n'hBw
Sb";
ch
ar
bu
ffer[l5
][28
]={
/**
•**
**
**
**
«*
**
**
**
«»
**
*•/
"FI
Carg
a m
ostra
FIA
",
"F2
En
c,n bom
ba F
IA
",
"F3
Apaga
bomba
FIA
",
"F4
Iny
eccií
mo
stra F
IA ",
"F5"F6"F7
Inic. v-lvula 6 vies
Apaga v_l. sup. FIA "
Enc,n v_.l.
sup. FIA
"
Enc.n v_l. inf. FIA n
Apaga bomba CFA
"AltF2 Enc,n bomba CFA
AP
ÉN
DIC
ES
A -1
41
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓN Y CONTROL DE ED
AR
"AltF3 Apaga bomba CFA ",
"AltF6 Apaga v-.lv.
sup.CFA" ,
"AltF7 Ene,n v_lv.sup.CFA",
"AltFS Enc.n v...lv.
inf-CFA" ,
"AUF9 Apaga v-.lv.
inf .CFA
" }
,-/*,"FIO Sortida del programa",
"ALT-D Sortida al DOS",
"ESC Cr,ditos programa"};
_setgtextvector( 1, O );
_setfont( fuente );
_setcolor (242) ,-/*antes
19*/
_rectangle( _GFILLINTERIOR, O, O, 595, 38);
_setcolor(29);
_rectangle( _GBORDER, O, O, 595, 3B) ;
for (i=0;i<15;i++)
{x=(short)(5+1*120-(int)(i/5)*600);
y= (short)
(2 + 12*
(int) (i/5)
) ,-
_moveto(x,y);
_outgtext(buffer(i) ) ;
/" Dibuja un rect ngulo negro para borrar el cuadro de ayuda, y as
i poder
escribir un mensaje en esa zona.
*/
void graf_borra_ayuda (void)
(_setcolor (0)
;_rectangle( _GFILLINTERIOR, O, O, 595, 38);
_setcolor (29)
;_rectangle( _GBORDER, O, O, 595, 38);
/* Dibuja el rect ngulo, las rayas interiores y los títulos del display
donde se muestran los valores .
*/
void graf display (void)
(int i ,
j ;
short x, y;
ch
ar
fue
nte [2
0] =
"t'Tm
s R
mn
'hS
wS
b";
ch
ar
varia
ble
s[6]
f!2] =
{/*
**
**
**
**
*/
" N
-N0
3-
" N
-N0
2-
" N
-NH
4+m
V11
Ab
sorb
" ,
char tanques[3] [12]=
{/•
Mesura " ,
" Temps " ,
" Punt
" } ;
_setgtextvector ( 1, 0 );
_setfont( fuente ) ;
_setcolor (171)
;_rectangle( _GFILLINTERIOR, 0, 41, 595, 97) ;
_setcolor (29)
;_rectangle( _GBORDER, 0, 41, 595, 97);
_setcolor (10)
;_rectangle( J3BORDER, 15, 56, 76, 82);
_moveto(20, 59) ;
_outgtext( "ÚLTIMS") ;
_moveto(20, 69)
,-_outgtext ( "VALORS" ) ;
setcolor (30)
;
A-1
42
AP
ÉN
DIC
ES
APÉN
DICE
S. PR
OGRA
MA
DE M
ONÍT
ORIZ
ACIÓ
N Y
CONT
ROL
DEL S
ISTEM
A AN
ALÍT
ICO
_re
cta
ng
le(
_GB
OR
DE
R,
50
0, 5
6,
57
6,
82
);_
mo
ve
to(5
3S
,56
)_
lin
eto
(S3
5,8
2)
_m
ov
eto
{5
35
, 69
)_
lin
eto
(50
0,
69
)_
mo
veto
(50
5, 5
8)
_outgtext("Absor "ï ;
_moveto(505,70)
_outgtext("mV
");
for (i=l;i<4;i++)
_se
tco
lor
(30
í;x
=(s
ho
rt)
(10
3+
i*7
0);
y= (
sh
ort
) (4
5) ;
_re
ctan
gle
( _G
BORD
ER,
x,
y,_
setc
olo
r (1
0) ,-
_tnp
veto
( (s
ho
rt)(
x+
10
),y
);_
ou
tgte
xt(
var
iab
les[
i-ll
);
for (j=l; j<4; j-t-O
í _setcolor(30);
x=(short)(103);
y= (short) (45+j*12);
_rectangle ( __GBORDER, x, y,
_setcolor(10) ;
_moveto( (short) (x-t-10) , y) ;
_outgtext (tanques íj-ll ) ;
(short) (x+70) , (short) (y-t-12) ) ;
(short) (x+70), (short) (y-t-12) ) ;
_setcolor(30)
,-_rectangle( _GBORDER, 415, 56, 476, 82);
_moveto{415,69);
_lineto(476,69);
_moveto(417,57);
_outgtext("Punt mostreig");
graf_valores_display{) ;
/*********** ************************************** t*************»**********/
/* Escribe los valores de las variables medidas del sistema en el display.*/
void graf_valores_display(void)
( int i, j;
short x , y ;
ch
ar
fue
nte
[2
0] =
"t
'Tm
s R
mn
'hS
wS
b"
;ch
ar
bu
f fe
r [1
0] ;
str
uct
tm
*te
mp
s;
_setgtextvector( 1, 0 );
_setfont( fuente );
_3etcolor (0) ;
_rectangle( _GFILLINTERIOR, 173, 57, 383, 93);
_setcolor(242) ;
for (j-l,-j<4;j*»)
(for (i»l;i<4,-i»t)
{ x. (short) (103+i*70) ;
y- (short) (45+j*12) ;
_rectan9le( _GBORDER, x, y, (short) (x+70) , (short) (y+12) );
_setcolor(30) ;
_rectangle( _GBORDER, 173, 57, 383, 93);
sprintf(buffer,"%4.2f.valor.nitrats);
_moveCo(200, 58); _outgtext(buffer);
temps = localtime(&valor.t_nitrats);
strftime( buffer, 20, "%H:%M:%S", temps);
APÉN
DICE
S A
-14
3
DESA
RROa
o E I
MPLE
MENT
AQÓN
DE
UN S
ISTEM
A SU
PERV
ISOR
PARA
LA G
ESTIÓ
N Y C
ONTR
OL D
E ED
AR
_moveto(190, 70) ; _outgtext (buf fer) ;
sprintf (buffer, "%li" , valor ,punt_nitrats) ;
_moveto(205, 82) ; _outgtext (buffer) ;
sprintf (buffer, "%4. 2 f ", valor .ni trits) ;
_moveto(270, 58) ; _outgtext (buffer)
,-
temps = localtimettvalor. t_nitrits) ;
strftime ( buffer, 20, "%H: %M: %S" , temps) ;
_moveto(260, 70) ; _outgtext (buffer) ;
sprintf (buffer, n%li" , valor. punt_nitrits) ;
_moveto(275, 82) ; _outgtext (buffer) ;
sprintf (buffer, "%4 . 2 f " .valor .amoni) ;
_moveto(340, 58) ; _outgtext (buf f er) ;
temps = localtime (&valor.t_amoni)
,-strftimei buffer, 20, "%H:%M:%S", temps);
_moveto(330, 70) ; _outgtext (buf fer) ;
sprintf (buffer, "%lin , valor .punt_amoni) ;
_moveto(345, 82) ; _outgtext (buf fer) ;
sprintf (buffer, "%li" , dat .punt_mostreig) ;
graf_texto( buffer, 416, 70, 475, 81, 0, 1) ;
/* Escribe los valores de las variables medidas del sistema en el display.*/
void graf _valor_absor (void)
í char medida [10] ;
sprintf (medida, "%2 . 3 f " , valor .absor) ;
graf_texto( medida, 536, 57, 575, 68, 0, 1) ;
/* Escribe los valores de las variables medidas del sistema en el display.*/
void graf_valor_mv(void)
char medida{10];
sprintf (medida, "%2.3fJ valor.mv) ;
graf_texto( medida, 536, 70, 575, 81, O, 1);
} /**
******
*
**
*.*.„..*.******„***.*.******/
/* Dibuja la sombra de la gr fica, la pantalla base.
*
void graf_sombra gràfica(void)
í _setcolor(23);
/"sombra*/
_rectangle( _GFILLINTERIOR, 5, 105, 595, 479);
_setcolor(171);
_rectangle( _GFILLINTERIOR, O, 100, 590, 474);
_setcolor(29);
_rectangle( J3BORDER, O, 100 , 590, 474);
_setcolor(0);
_rectangle( _GFILLINTERIOR, 80, 115 , 560, 434);
_setcolor(29);
_rectangle( _GBORDER, 80, 115 , 560, 434);
_moveto(560,275);
_lineto(80,275);
/**•.*•***.*****.********.************.****..**********...*.....**..*****.*/
/* Funciin para salir al dos. Cambio de modo gr fico a texto, ejecuta un
command y despu.s redibuja la pantalla.
*/
void salir_al_dos(void)
t _se
tvid
eo
mo
de
(
_DE
FA(J
LT
MO
DE
)
;p
rin
tf("
\nE
sc
rib
e
'ex
it'
para
v
olv
er
al
pro
gra
rna\n
");
ayst
em(n
CO
MM
AN
D.C
OM
'1)
;i£
( l_
setv
ideo
mo
de(
_MA
XR
ES«
OD
E
) )
ex
it (
1
)
,•
A-1
44
APÉN
DICE
S
APÉNDICES. PROGRAMA DE MONITORIZAOON Y CONTROL DEL SISTEMA ANALÍTICO
graf__base O ;
/* Dibuja el eje horizontal del tiempo, en tres escalas diferentes,
void graf ejes tiempo(int escala)
{char Cuente[20] ="t "Tms Rmn'hl2w50b";
_setgtextvector( 1,0);
_setfont( fuente );
_setcolor (30);
switch(escala)
{case 1:
graf_eje_horizontal( 80,
_moveto (150, 460) ,•
outgtext("Tiempo
(minutos)"
break;
case 2:
graf_eje_horizontal( 80,
_moveto(150,460);
outgtext("Tiempo
(horas)");
break;
case 3:
graf_eje__horizontal ( 80,
_moveto(150,460);
_outgtext("Tiempo
(d;as)");
break;
_rectangle( _GBORDER, 80, lis , 560, 434);
/•Escala de una hora*/
434,
560, O, 60,12, 30);
/•Escala de un dja*/
434, 560, O, 24,24, 30);
/•Escala de una semana*/
434, 560, O, 7,7, 30);
/* Dibuja el eje vertical de mv y absorbencia.
void graf eje mv absor(void)
ígraf_eje_vertical{80,120,265,-0.IF,I.OF,11,92);
graf_eje_vertical(80,28S,430,-250.OF,50.OF,6,100);
_setcolor(92);
_setgtextvector( 0, 1);
_moveto(20,220);
_outgtext ("Ab3orb._nciaa) ;
_setcolor(100);
_moveto(20,400);
_outgtext("Potencial (mV)");
void graf_eje_vertical
(short xl, short yl, short y2, float min, float max, int div, short col)
{int i=0;
short y;
float incremento=0
,-float inc_med=>o.OF;
char valor IS] ;
char fuente[20]="t'Tms Rmn'hl2w50b";
ol) ;
_setgtextvector( 1, 0 );
_setfont ( Cuente )
,-incremento=(float)((float)(y2-yl)/div);
inc_med= ( (max-min) /div);
_moveto(xl,yl);
_lineto(xl,y2)
,-
for (i=.0;i<=div;i + + )
APÉNDICES A
- 145
DESARROLLO E IMPLEMENTACIÔN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN ir CONTROL DE EDAR
y=(short)(y2-incremento*i);
_moveto(xl,y);
_lineto((short)(xl-5),y);
if (max<5 . OF) sprint f (valor, "%2,1C", inc_med*i-4-min) ;
else sprint f (valor, "%2.Of", inc_med*i+min) ;
_moveto((short)(xl-30),(short)(y-5)};
_outgtext (valor)
,-
i
void graf_eje_horizontal
(short xl, short yl, short x2, int min, int max, int div, short col)
íint i=0;
short x;
floa
t in
cre
me
nto
=0
;in
t in
c_
med
=0
;ch
ar
va
lor[5
];
ch
ar
fuen
te [2
0] =
"t 'T
ens R
mn
'hl2
w5
0b
n ;
_setcolor(col);
_setgtextvector( 1, 0
),-_setfont( fuente );
incremento=(float)((float)(x2-xl)/div);
inc_med= (int) ( (max-min) /div);
_moveto(xl,yl);
_lineto(x2,yl);
for (i=0;i<=div;i++)
x=(short)(xl+incremento*i);
_moveto(x,yl);
_lineto(x,(short)(yl+5));
sprintf(valor,"%2i",min+inc_med*i);
_moveto( (short) (x-7) , (short) (yl-f-10)),-
_outgtext(valor);
}/***.**.*.***.*****.********.***..*******.*.*.*.***..**********.**.*•**-**
/* Dibuja el nombre del tanque al que corresponde la gr fica m£ltiple.
void graf_tanque(int tanque)
char fuente [20]
="t"Tms Rmn'hl2w50bn ;
char buf fer [30] ;
_setgtextvector( 1, 0 );
_setfont( fuente );
_setcolor(0);
_rectangle{ _GFILLINTERIOR, 300, 459 ,370, 471);
_setcolor(30);
_rectangle( _GBORDER, 300, 459 ,370, 471);
_moveto(310 ,460);
sprintf(buffer,"Tanque %li",tanque);
_setcolor(SI);
_outgtext(buffer);
/*
Fu
nciin
co
n e
l co
py
righ
t, p
resen
tació
n d
el
pro
gra
ma,
vo
id
gra
f_p
rese
nta
cio
n(v
oid
)
ch
ar
fue
nte
l[20
]="
t'Tm
s R
mn
'h6
0w
50
b";
ch
ar
fue
nte
2[2
0]°
"t'T
ms
Rm
n'h
l6w
50
b";
ch
ar
fue
nte
3[2
0]=
nt "Tm
s R
mn
'hl2
w5
0b
";
_setg
tex
tvecto
r( 1
, 0
)
;
se
tco
lor(1
04
);
A-146APÉNDICES
APÉN
DICE
S. P
ROGR
AMA
DE M
oNno
RE
AdÓ
N Y
CO
NTRO
L DE
L SI
STEM
A AN
ALÍT
ICO
_rectangle( _GFILLINTERIOR, 81, 116 , 559, 433);
_moveto(250 ,150) ;
_setcolor(79)
,-_setfonc( fuentel );
_outgtext{"FIACFA">;
_moveto(180 ,200);
_setfont( fuente2 );
_outgtext ("Programa peí control d'analitzadors"),-
_moveto(220 ,225);
_outgtext("de Nitrits, Nitrats i Amoni");
_36tCOlor(77);
_moveto(100 ,362) ;
_setfont( fuente3 );
_outgtext("Copyright : Juan Bâeza - David Gabriel 1997");
_moveto(100 ,380);
_outgtext("Departament d'Enginyeria Qu¡micaH);
_moveto(100 ,398);
_outgtext("Universitat Autónoma de Barcelona");
/* 80, 115 , 560, 434'/
int botón
( inc on_off, char
nombre, short xl, short yl, short x2, short y2, short font)
short xll=(short) (xl+l) ,
x!2= (short) íxl-t-2 ,
x21=(short) (x2-l ,
x22=(short) (x2-2 ,
yll= (short) (yl+l ,
y!2= (short) (yl+2 ,
y21= (short) (y2-l ,
y22= (short) (y2-2) ;
sh
ort
x
t.y
t,la
rgo
;ch
ar
fue
nte
[3J
[20
]={
"t'
Te
rmin
al'
h!2
w5
0b
""t
'Tm
s R
mn
'hlO
wS
Ob
","t'
Tm
s R
mn
'hS
wS
b"
};
_setgtextvector( 1, O ) ;
_setfont ( fuente [fontj ) ,•
largo=_getgtextextent(nombre);
if (largo>(x2-xl-4)} return -2;
switch(on_off)
ícase 0:
colorí = 15;
COlor2 = 8 ;
break;
case 1:
colorí = 8;
color2 =
7;
break;
default:
return
-1;
_setc
olo
r(7
) ;
_rectangle( _GFILLINTERIOR, xl, yl, x2, y2);
_setcolor(0);
_rectangle( _GBORDER, xl, yl, x2, y2) ;
_setcolor(colorl);
_moveto(xll,y21);
_lineto(xll,yll)
,-_lineto(x21,yll)
,-_moveto(xl2,y22);
_lineto(xl2,yl2);
_lineto(x22,yl2);
_setcolor(color2);
_moveto(x21,yll);
_lineto(x21,y21);
APÉN
DICE
S A
-14
7
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DAR
_li
ne
to(x
ll,y
21
);_
mo
ve
to(x
22
,yl2
);_
Ün
eto
{x
22
,y2
2) ;
_li
ne
to(x
!2,y
22
);
_setcolor(0);
switch(on_off)
ícase 0:
xt= (short) ( (xl+x2-largo)/2) ;
yt=(short)((yl+y2-12)/2);
break;
case 1 :
xt= (short) ( (xl+x2-largo) /2+1)
,-yt=(short)((yl+y2-12)/2+1);
break;
default:
xt= (short) (xl-t-2) ;
yt=* (short) (yl+2) ;
break;
} _moveto ( xt, yt);
_outgtext( nombre );
int graf_texto
(char *nombre, short xl, short yl, short x2, short y2, int font, int fondo)
short largo;
char fuente[2][20]={"t'Tms Rmn'hSwSb","t'Tms Rmn'hl2w50b"};
short xt.yt;
_setgtextvector( 1, O );
_setfont( fuente[font] );
largo=_getgtextextent(nombre);
if (largo>(x2-xl-2>) return -2;
if (fondo==l)
í _setcolor(0);
_rectangle(. _GF ILL INTERÍ OR, xl, yl, x2, y2) ;
xt=(short)((xl+x2-largo)/2);
yt=(short)((yl+y2-9)/2);
_setcolor(30);
_moveto ( xt, yt);
_outgtext( nombre );
retu
rn
O ;
} /'*
**
**
**
**
*
**
**
**
**
.»*
**
**
**
**
.**
*.*
**
**
**
**
*.*
.**
**
**
*.*
.**
**
*«
«*
**
*/
/* A
ctu
ali
za l
as m
atr
ices
uti
lizad
as
para
d
ibu
jar
las
gr
ficas.
ma
t_g
raf;
d
ato
s d
e 2 h
ora
s,
cada
4 se
gu
nd
os
*/
vo
id
actu
ali
zar_
matr
ices_
gra
ficas(v
oid
)
int
i ;
for
(i=
0,-
i<1
79
9;i
+ +
)i ra
at_g
ra[i
]=m
at_g
ra[i
+1]
;i
/*H
acem
os
sit
io p
ara
el
Elt
imo v
alo
r*/
mat_
gra
[17
99
J.ab
sor=
valo
r.ab
sor;
mat_
gra
[1
79
9]
.mv
=v
alo
r.m
v,-
tnat_
gra
[l7
99
] . t
_ab
sor=
valo
r. t_
ab
so
r;m
at_
gra
[17
99
].t_
rov
svalo
r.t_
mv
;/•
Asi
gn
am
os
el
Elt
imo v
alo
r»/
void seleccionar_graficoíint orden)
f A-1
48
APÉN
DICE
S
APÉNDICES. PROGRAMA DE MONITOREACIÓN Y COIÍTROL DEL SISTEMA ANALÍTICO
«define N_SEC 4
switch(orden){
case 1: /*AMUNT*/
dat.inicio_graf--;
if (dat.
inicio__graf <0)
dat.inicio_graf=0;
dat. f in_graf •*-+;
if (dat.fin__graf>N
SEC) dat. f in graf=N SEC;
}break;
case 2: /«ABAIX-/
dat.inicio_graf++;
if ((dat.fin_graf-dat.inicio_graf)cl)
dat.inicio_graf=dat-fin_graf-l;
break;
case 3: /*DRETA*/
dat.fin_graf++;
if (dat.fin_graf>N SEC)
ídat.fin_graf=N_SEC;
break;
idat
- inicio__graf+ •»-;
if (daC.inicio_graf>(N_SEC-l)í dat.inicio_graf=(N_SEC-1);
break;
case 4:
/-ESQUERRA*/
dat.inicio_graf--;
if (d
at.in
icio
g
raf<0
){dat.inicio_graf=0;
break;
)dat.fin_graf--;
if (dat.
f in_graf«:l}
dat. fin_graf*l;
break;
ï
_setcolor (171)
,-_rectangle( _GFILLINTERIOR, 70, 442 ,570, 454);
graf_eje_horizontal (80,
434,560, (short) ( (dat.
inicio__graf-N_SEC) * (120/N_SEC) ) ,
(short) ((dat.fin_graf-N_SEC)M120/N_SEC)), 6,
30);
grafica_variable(0);
grafica_variable(l);
j/.....,...,.............................„..,......„......
.....7/* Gráfica las líneas correspondientes de mV y absorbacia
en la escala de tiempo proporcionada.
*/
void grafica_variable(int variable)
{int i;
short x,y;
float XO[2]={80.0F,80.0F},
yO[2]={265.OF,430.OFJ ;
float
alco=i4S.OF;
float sets[2] [3]s{/*m¡nimo, m ximo, rango*/
{-O.lOF^.OF.l.lF},
/*Absorbancia*/
{-2SO.OF,50.0F,300.0F}}; /*mv*/
double increm_t, increm__tt;
time_t t_final,t^inicial;
int inicío=0,
fin=1799;
_setcolor(30);
_moveto(S60,275);
_lineto(80,275);
t_inicial
=• dat.t_actual-( (4-dat.inicio_graf) «30*60) ;
t_final =
t_inicial+{(dat.fin_graf-dat.inicio graf)*30*60);
increm_tt s (double) (t_final-t_inicial) ;
' "~
switch(variable){
case Oí
/*Abgorbancia*/
for (isO;i<1800;Í++)
APÉNDICES A
-149
DESARROLLO E IMPLEMENTAQON DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
if (m
at_
gra
[i] . t__
ab
sor>
t_in
icia
l)í
inic
io=
i;b
reak
;}
for (iaO
;i«:1
80
0,-i-f + )
if (m
at g
ra Ei]-t_
ab
sor>
t fin
al)
ífin
=i;
brealc ;
}_
se
tco
lor(0
);'re
cta
ng
le! _G
FILL
·INT
ER
IOR
, 8
1,
116, 5
59
, 27
4);
_3
etc
olo
r(92
);x=
(sho
rt) (xO
[0]+
i) ;y
=(sh
ort) (y
o[0
]-alto
/sets
[0] [2
]*(m
at_
gra
[inic
io].a
bso
r-sets[0
] [0] ) ) ;
if (y<
120) y
=Z
20
;if
(y>265)
y=
26
5;
_m
ov
eto
(x,y
);fo
r (i=
inic
io*
l;i<fin
;i+*
)íin
cre
m_
t=(d
ou
ble
) d
ifftime
(t_fin
al,m
at_
gra
fi].t_a
bso
r);x=
(sho
rt) (55
9.0
F-in
crem_
t/increm
_tt*
47
8~
.OF
) ;if
(x<
81
| x
>5
S9
) co
ntin
ue;
y= (sh
ort) (y
O[0
] -alto
/sets [O
j [2] * fmat_
gra [ij .a
bso
r-sets (0] [0] ) ) ,-
if (y
<1
20
) y
=l2
0;
if (y
>2
65
) y
=2
65
;_
lineto
(x,y
);}
bre
ak
;case
1:
/*
mV
*/
fo
r (is
O;i<
18
00
;i++
)if
(mat g
ra f
i).t
mv>
t in
icia
l)í
inic
io=
i;b
reak,-
l}
fo
r (i=
0;i<
18
00
;i++
)if
(ma
t_g
ra[i].t_
mv
>t_
fina
l)
fin=
i;
bre
ak
;}
_se
tco
lor(0
);_
_rectan
gle{
_G
FILL
·INT
ER
IOR
, 81,
27
6, 5
59, 433) ,-
_se
tco
lor(1
00
> ;
x= (sh
ort) (x
O[l]+
i);y
=(sh
ort) (yO
[1J-a
lto/s
ets
[1] [2
]*(m
at
gra
tinic
io].m
v-s
ets
[1] [0
]});
if (y
<2
85
) y
=2
65
;if
(y>
43
0)
y=
43
0;
_m
ov
eto
(x,y
);fo
r (isin
icio
+1
;i<fin
;i++
){in
cre
m_
te(d
ou
ble
) d
ifftime
(t_fin
al,ra
at_
gra
[i].t_m
v);
x=
(sho
rt)(55
9-in
cre
m_
t/inc
rem
_tt*
47
8.0
F);
if (x
<8
1 |
x>
55
9)
co
ntin
ue;
y=
(sho
rt) Íy0
{l]-a
lto/s
ets
[1] Í2
]*(m
at_
gra [i].m
v-se
ta[1
] [0] ) ) ;
íf (y
<2
85
) y=>285;
if (y>
430) y
=4
30
;_
line
to(x
,y) ;
bre
ak ;
J
void inventa valores(void)
ftime_t tl;
int i;
tl=time(KULL);
for
(i=0
;i<1
80
0;i+
+ï
fma
t_g
rali].t_
mv
=(lo
ng
)(cl-4
.0*
(18
00
.0-i));
A-1
50
AP
ÉN
DIC
ES
APÉN
DICE
S. P
ROGR
AMA
DE M
ONI
TORI
ZACI
ÓN
y C
ONT
ROL
DEL
SIST
EMA
ANAL
ÍTIC
O
mat
_gra
{i]
.t_a
bsor
= (
long
) (t
l-4
.0*
(18
00
.0-i
));
mat
_g
ra[i
).m
v=
(flo
at)(
I0.0
-30
0.0
*i/
18
00
.0*
9in
((d
ou
ble
)i/4
0.0
));
mat
_g
ra[i
j.ab
sor-
(flo
at)(
0.5
F+
0.5
-sin
í(d
ou
ble
)i/5
0.O
»;
/* mat
g[1
][i]
-ph
=(f
loat
)(7
.0
-f 4.
0 *
sin
((d
ou
ble
)i/3
0.0
));
mat
g[1
][i]
.tem
p=
(flo
at)(
30
.0+
10
.0
* co
s((d
ou
ble
)i/3
0.0
});
mat
g[1
][il
.tie
rop
o=
(lo
ng
int)
(t
ime(
NU
LL) +
((l
on
g in
t)i*
60
*5
*8
J);*
/
void
ba
rra_
boto
nes(
void
){ _se
tco
lor(
17
1);
_rectangle( _GFILLINTERIOR, 600, O ,639, 479);
_setcolor(29);
_rectangle( _GBORDER, 600, O ,639. 479);
botón! O, "Barra", 603, 3, 636, 20, 1) ;
botón! O, "Ar", 610, 30, 629, 50, 2);
botoní O, "Ab", 610, 60, 629, 80, 2) ;
botoní O,
"De", 610, 90, 629, 110, 2);
botón! O, "Iz", 610, 120, 629, 140, 2);
/* CÇdigo necesario si desean hacerse pruebas.
Si quiere utilizarse debe definirse TEST al inicio del fichero
Kifdef TEST
void maint)
( modo_grafico ();
graf_display{);
graf_base();
graf_presentacion();
graf_ejes_tiempo(l);
graf_valor_absor();
graf_valor mv();
getcht);
getchí) ;
_setvideomode( _DEFAULTMODE );
«endif
APÉN
DICE
S A
-151
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DAR
PCL711.C -
FUNCIONES PARA UTILIZAR LA PLACA DE SALIDAS pcl711
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 28/8/97
Librerías a incluir
((include <stdio.h>
((include <conio.h>
ffdefine BASE 0x220
/*direccic base de la placa
SubruC inaa de 1 f i chero *******************
pcl711*/
***/
int pcl711 (int salida, int on_off ) ;
void actuacion_externa_pcl711 (void) ;
void presa_mo3tra (int la_mostra) ;
void apaga_pcl711 (void) ;
/* Funciín para pedir por pantalla en modo texto loa par metros para
ejecutar la función pcl7ll, que var;a el estado de una salida. */
void actuacion_externa_pcl711 (void)
int salida, on_of f ;
printf ("NEmero de salida: " } ;
fscanf (stdin, "%d", &salida) ;
printf ("Encendido/ Apagado: " ) ;
fscanf (stdin, "%d", &on_off) ;
pcl711 (salida, on off) ;
/* Control de la placa pcl7ll.
Función para variar el estado de una salida de la placa pcl711.
int pcl711 (int salida, int on_off)
{ unsigned char high_byte,low_byte;
static unsigned int consigna=0;
if (on_off!=0 && on_off!=l) return -1;
if (salida<0 || salida>15) return -2;
/*Si los par metros no son correctos, devuelve un ctdigo de error*/
if (on_off==l) consigna=consigna | (l«:3alida);
if (on_of f oaQ) consigna=consigna & ~ (l«salída)
low_byte=(char) (consigna & 255);
high_byte= íchar) (consigna»8) ;
_Outpw(BASE+13,low_byte};
_outpw(BASE+14,high_byteï;
void apaga_pcl7ll(void)
int i=0;
for (i=l;i<16;i++) pcl711(i,0);
A-152
APÉNDICES
APÉNDICES. PROGRAMA DE MONFTORIZACIÓN Y CONTROL DEL SISTEMA ANALÍTICO
void preaa_rao3tratint la mostra)
iapaga_pcl711O ;
/•
gotoxy(78,25);
printf<"%li",la_mostra);
•/switch(la_mostra)
(case O:
pcl7ll(8,l);
/* Circuit mostreig Reactor Anaerobi */
pcl7ll(7,1);
break;
case 1 :
break;
case 2 :
pcl711(l,l);
pcl711(3,l) ;
pCl711 (5,
1) ;
break;
case 3 :
pcl711 (6, in-
break;
case 4 :
pcl711 (4,
1) ;
break ;
case 5:
break ;
i
/* Circuit mostreig Reactor 1 */
/* electrovalvula I*/
/* electrovalvula 2*/
/* electrovalvula 10*/
/* Circuit mostreig Reactor 2 */
/* electrovalvula I*/
/* electrovalvula 3*/
/* electrovalvula 10*/
/* Circuit mostreig Reactor 3 */
/* electrovalvula ll*/
/* Circuit mostreig Sortida sistema */
/* electrovalvula 7*/
/* Mostra manual FIA */
ftifdef TEST
int maint int argc, char *argv [] )
int salida,on_of f ;
long int i;
/*if (argc==l)
printf ("\nUtiliza: pcl711 salida on_off \nn);
return -1;
salida=atoi (argvtl] ) ;
on_off =atoi (argv(2] ) ;
if (pclvil (salida, on_of£l==l) printf ("\nSalida OK\n-
else printf ("\nSalida NO OK\nn);
for (salida=o ; salida<16 ; salida-*--*-}
pcnil (salida, 1) ,
for (i=0;i<300000¡i +
for <salida=0;salida<16;salida++)
pclVll (salida, 0) ;
for (i=0;i<300000;i»t) ;
ttendif
/******
APÉNDICES A
-153
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
FITXER DE CONFIGURACIÓ FIA4.DAT
30506000
600
3865100
130
1728
393254
0.010
460
430
temps estabilització inicial sistema (seg)
temps inici calcul linea base en operació normal (seg)
temps fi calcul linea base en operació normal (seg)
numero d'injeccions entre calibrats nitrats (nou hores)
temps inici lectura detecció màxim nitrits(seg)
temps inici lectura detecció màxim nitrats+nitrits(seg)
temps retorn a posició 'load' (seg) (carrega loop)
temps retorn a posició 'inject'(seg)
increment de temps entre 50 ppm i 30 ppm nitrats (seg)
increment de temps entre 50 ppm i 15 ppm (seg)
increment de temps entre 50 ppm i 5 ppm (seg)
increment de temps entre 50 ppm i 1 ppm (seg) (antes 330)
increment de temps pic entre 3 ppm i 2 ppm nitrits {seg)
increment de temps pic entre 3 ppm i 1 ppm nitrits (seg)
increment de temps pic entre 3 ppm i 0.5 ppm nitrits (seg)
increment de temps pic entre 7 ppm i 5 ppm nitrits (seg)
increment de temps pic entre 7 ppm i 3 ppm nitrits (seg)
increment de temps pic entre 7 ppm i 1 ppm nitrits (seg)
temps inici càlcul linea base en calibracio nitrats (seg)
temps fi càlcul linea base en calibracio nitrats (seg)
error màxim acceptat entre dos pics consecutius en la calibracio (mUA)
temps pel canvi del punt de mostreig
temps per la lectura dels mv pel calcul de l'amoni
A-154
APÉNDICES
•••••••••••••••o
APÉN
DICE
S. PR
OGRA
MA D
EL PL
C
1
| *
C
ON
TRO
L P
RIN
CIP
AL
2 +
1 +
| M
50
|
i 13
+--
| +
--|
M 5
1i
4 +
--!
+--
| M
5
4
5
+--
| +
--¡
M
62i 1
6 +
-- 1
+ --
¡ M
52
17
+--¡
+ -
- +
1 M
53
18
|9
| *
SI
NO
HA
Y A
LAR
MA
S E
NC
IEN
DE
LA
S B
OM
BA
S Y
EN
TRA
DA
T
rt
.
1 /
,
1 / .
j_U
+
[
/ +
1
/ •*
| M
52
M
53
|!
11
11
J.
ü
1 +
] ! | M
5
2 Q
3
1
50
1 | M
52
Q
3
150
114
+
• -
| / +
¡
+
[T
32
]1
M
53
Q
4 15
0
11
5
H |
/H
| /H
ÍT
3
3]
1 M
53
Q
4
150
116
¡
* C
ON
TRO
L
DE
NIV
EL
^ 1
J.
1
1 A
.L
I +
--
[/+
1 M
0
1-1 n
, j
/ ,
rrri
-il
lo
+ —
l'+
L·
L -L
J "•
-1
M
0 2
1
1 1
1 I
121 1
M
0 T
1
I 12
121
j
* N
ivel
alt
o s
edim
enta
dor
| M
0
T
1
I
14
1 1 M
0
T
1 I
141 1
24
¡ *
C
EBA
DO
R
TAN
QU
E 1
| M
0
T
1
I 10
!7
fi
j.
-
Í /J.
1/4
. 1
/4
.¿
O
4.
]/+
I/"
*"
I'"
*"
¡ M
0
T
1
I
10
27
-4--
-I
+ ¡
+ [T
5]
1 M
52
Q
3
50
a
(JM
P) |
* *(S
ET
)Q
1
Q
5
Q
3
_ (S
ET
)Q
3
\ K
o l ;
Q 4
(SE
T)
Q
4
(SE
T)
Q
27
(SE
T)
M
0
f p
e;rp
\^ K
a 1
í•
Q
2
(SE
T)
Q
2
*(R
ST
)Q
0
Q 0
-M
52
(RS
T)
M
52
(RS
T)
Q
3
APÉN
DICE
S A
- 1
55
>••••••••••••••••••€
DESA
RROL
LO E
IMPL
EMEN
TACC
ON D
E UN
SISTE
MA S
UPER
VISO
R PA
RA LA
GEST
ION
Y CON
TROL
DE
EDAR
! ¡ M
52
Q
3
50
!29
|
*
CEB
AD
OR
TA
NQ
UE
2
M
0
T
1
I 11
M
0
T
1
I 11
M
53
Q
4 50
1 M
53
Q
4
50
!34
*
ALA
RM
A
DE
P
OS
IBL
E
ES
CA
PE
¡ M
0
T
1
I
13
!36
¡
* T
EM
POR
IZA
DO
R
DE
L C
ON
TRO
L D
E N
IVE
L
! M
0
I 1 Q
.
27
300
139
1
40
1 *
CO
NTA
DO
RES
-
EN
CE
ND
IDO
1 ! M
2
1 ¡M
0
T
1
I 1
2! 1
M
0
1
T
1
I 12
144
1
* C
ON
TAD
OR
ES
- A
PAG
AD
O1 |
M
31 1
M
0 T
1
I 12
1 1 M
0
T
1 I
12!
48
¡ *
ALA
RM
AS
CO
NTA
DO
RES
| C
0
1 1 C
1
1 ! M
50
1
! 1
1 M
5l
1 1
M
54
¡!
!
A -
156
AP
ÉNDI
CES
>•••••••••
Q
3
*
M
53
M
53
Q 4
Q
4
M
54
Q
27
M
0
* '
*
+ +
R I
30¡
I 1
C •*•
+
M
2
•f +
R 1
20|
1 1
C
+ +
M
3
M
50
M
51
Q 1
Q
2
Q 3
55
56
57
58
59
60
61
62
63
6465
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
APÉNDICES. PROGRAMA DEL PLC
M 5
2 |
Q
4 ¡
1 !
M
53
1 (
35
1 Q
2
7
Q
0
M
40 Q
3
M
41 Q
4
*
*
*
PUR
GA
.
Ml
Q
21
Ml
l|
Ml
1
Q
21
Q
21
6
00
0
99
99
99
99
99
99
99
99
M
1
*
**
BO
MB
AS
DO
SIFICA
DO
RA
S *
* U
N
IMP
UL
SO
T
EM
PO
RIZ
AD
O
*
M
10
06
M
10
1
| M
10
Q
6
M
10
Q
6
800
M
10
*
*
M
11
Q
7
M
11
1
|
M
11
Q 7
M
11
Q
7
800
M
11
* M
ÚL
TIP
LE
S IM
PUL
SOS
TE
MP
OR
IZA
DO
S *
+ +
M
12 •
R j
5 j
.., + ¡
jM
13
'
~
' '
C
+
+
APÉNDICES A
- 157
DESA
RROI!
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
A-15Í O E IM
PLEMEW
TACIÓN DE UN SISTEMA
SUPERVISOR PARA LA GESTIÓN Y CONTROL DE ED
AR
C
10 3
00
0
M
12
*
*
C
10
M
13
¡ Q
6
1
Q 7
C
10
M
13
1
| M
13
!! Q
6
1
Q 7
M
13 C
10
Q
6 7
M
13
* A
PAG
AD
O
EX
TE
RN
O
*
M
61
!
Q
1
!
Q
2
1 Q
3!1
Q
4
!1 Q
01¡
Q
27
1i| M
6
2|
10
M
61
*
*
* R
ES
ET
D
E A
LA
RM
AS,
RE
INIC
IO
*
M
60 j
M
2
i| M
- 3
I| M
5
0
| M
51
1
: APÉNDICES
4 SÈRVlDORiDE os1'\ / >
APÉN
DICE
S. S
ERVI
DOR
DE
DATO
S
MISERVER.C - FUNCIONES PARA LA COMUNICACIÓN CON PCS
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 20/10/98
** Librerías a incluir
«include <stdio.h>
«include <string.h>
«include oys/types.h>
«include oys/socket .h>
«include <sys/uio.h>
«include <sys/ioctl.h>
«include <netinet/in.h>
«include <arpa/inet.h>
«include <netdb.h>
«include <errno.h>
ff include <stdlib.h>
«include <signal.h>
«include <sys/ipc.h>
fiinclude <sys/shm.h>
ffinclude <time. h>
/•Memoria compartida*/
/•Memoria compartida*/
/* Tiempo */
/***«***..***»***+******* Definiciones ****•*•**»**•*•*••»*********»***/
/•ftdefine DEPURA'*/
«define Port (ushort)
32323 /* numero del puerto del socket */
«define TAMANY
512
/* tamaño del buffer de recepción de datos */
ftdefine TAMANY_PETIT 32
«define SEMKEYI ((key_t) 4223353L) /*Semáforo, definiciones en semáforo.c*/
fídefine SEMKEY2 ((key t) 4223354L) /«Semáforo, definiciones en semaforo.c*/
ítdefine SEMKEY3 ((key~t) 4223355L) /*Semáforo, definiciones en semaforo.c*/
ífdefine SHMKEY1 ((key t) 1995)
ttdefine SHMKEY2 ((key't) 1996)
ífdefine SHMKEY3 ( (keyt) 1997)
ftdefine TAMANY_SMl 1000
«define TAMANY_SM2 1000
ítdefine TAMANY_SM3 1000
ftdefine TAMANY_M
100
ftdefine PERMS 0644
«define err_sys(A) printf (A "\n")
/* Segmentos de memoria compartida */
/* Tamaño memoria compartida l */
/* Tamaño memoria compartida 2 */
/* Tamaño memoria compartida 3 */
/* Tamaño del mensaje cliente */
/* Permisos de acceso */
ftdefine MIS ADDRS
(u_long)0x00000000 /* Direcciones permitidas */
*** Subrutinas del fichero ***********************/
void mi_servidor(ínt clientSocket);
int nuevos_datos_cliente(void);
int mensaje_cliente(void);
int comprueba_consignas_gsi(void);
void medidas_al_buffer(void) ;
void mensaje_al_buffer(void);
void medidas_texto(void);
void otras_medidas_texto(void);
void medidas_analisis(void);
int
datos_cliente_varios(void)
,-void ayuda_servidor(void);
int createService(ushort port);
int disconnectClient(int clientSocket);
void
error_bind(int errno);
/.*•***.****•****.** variables comunes del programa a*********'*****»****/
struct tercera{
/*Estructura per paramètres referents als controladors*/
char nom(31 [10J;
/*Nom del controlador*/
int controlador[3];
/«Numéro del controlador */
APÉN
DICE
S A
-161
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR PA
RA L
A GE
STIÓ
N Y
CON
TROL
DE
EDAR
double
double
double
double
double
double
double
double
double
char
char
char
int
time_t
}medidas;
struct cuarta{
char
ph
[3];
tem
pe
ratu
ra[3
] ;
po
ten
cia
l[3
];o
xig
en
o[3
] ;
mA
[3];
velo
cid
ad
[3]
,-cau
dale
s[3
];se
t_p
oin
t_o
xig
en
o[3
];se
t__
po
int_
ag
itacio
n [
3] ;
en
trad
as_
plc
[16
];sa
lid
as_
plc
(24
);est
ad
os_
vari
os{
20
];ti
em
po
s[1
0J;
tiem
po
;
/•V
alo
r m
esu
rat
de
la
vari
ab
le*
//*
Valo
r m
esu
rat
de
la
vari
ab
le*
//•
Valo
r m
esu
rat
de la
v
ari
ab
le*
//*
Valo
r m
esu
rat
de
la
vari
ab
le*
//*
Valo
r m
esu
rat
de
la
vari
ab
le*
//•
Valo
r m
esu
rat
de
la
vari
ab
le*
/
/•T
iem
po d
e la
s v
ari
ab
les*
/
/*
Est
ructu
ra
para
la
s co
nsi
gn
as
*/
cam
bio
_o
xig
eno
{3
],cam
bio
_ag
itacio
n[3
J ,
cam
bio
_cau
dale
s[3
] ,
cam
bio
_ti
emp
os
[10
] ,-
do
ub
le
valo
r_o
xig
en
o[3
],v
alo
r_ag
itacio
n[3
],v
alo
r_cau
dale
s[3
];in
t ti
em
po
s(1
0];
ch
ar
cam
bio
_v
ari
ab
le[2
0]
;d
ou
ble
v
alo
r_v
ari
ab
le(2
0];
}co
nsi
gn
as;
str
uct
qu
inta
{
/* E
stru
ctu
ra
para
lo
s an
ali
zad
ore
s *
/d
ou
ble
n
itra
tos;
tim
e_
t t_
nit
rato
s;
do
ub
le n
itri
tos;
t im
e_t
t_n
i tr i t
os ;
do
ub
le
amo
nio
;ti
me_
t t_
amo
nio
;}
an
ali
sis
[5];
str
uct
vari
os{
double
v
ari
ab
le[2
0]
;ti
me_
t t_
va
ria
ble
[20
];
ch
ar
bu
ffe
r [T
AM
AN
Y]
,-ch
ar
bu
ffe
rjp
(T
AM
AN
Y_P
ET
IT]
;
int
sem
idl,
sem
id2
,se
mid
3;
int
shm
idl,
shm
id2
,S
hm
id3
;ch
ar
*d
ireccio
nl,
*d
ireccio
n2
,*
dir
eccio
n3
;
mainO
{ /•struct sockaddr_in clientSockAddr;*/
struct gockaddr clientSockAddr;
int serverSocket;
ínt clientSocket;
int addrLen;
int j;
int pid;
/* Segmentos de memoria compartida */
if ( (shmidl=shmget(SHMKEYl, TAMANY_SM1, PERMS) IPC_CR£AT) ) <0>
err_sys("Miserver: No puedo obtener la memoria compartida l\n");
if ( (direccionl=(char *)shmat(shmidl, O, 0)) == (char *)
-l>
A-162
APÉNDICES
APÉNDICES. SERVIDOR DE DATOS
err_sys("Miserver: No puedo unirme a la memoria compartida l\n");
if ( <shmid2=shmget(SHMKEY2, TAHANY_SM2, PERMS|IPC_CREAT)} <0)
err_sys("Miserver: No puedo obtener la memoria compartida 2\n");
if ( (direccion2=i
(char *} s
hmat (shmid2. O, 0}) == (char
*)-1)
err__sys ("Miserver: No puedo unirme a la memoria compartida 2\n");
if ( (shmid3=3hmget(SHMKEY3, TAMANY_SM3, PERMS|IPC_CREAT)) <0)
err_sys{"Miserver: No puedo obtener la memoria compartida 3\nn);
if ( (direccion3=(cnar *)shmat(shmid3, o, 0}) == (char
*)-!)
err_sys("Miserver: No puedo unirme a la memoria compartida 3\nn);
/* Semáforos para acceder a la memoria compartida */
semidl=sem_create(SEMKEYl, 1);
semid2=sem_create(SEMKEY2, 1);
semid3=sem_create(SËMKEY3, 1);
ítifdef DEPURA
litaei DEPURA
)rintf{"He abierto el semáforo 1,
%lu\n", semidl);
)rintf(nHe abierto el semáforo 2,
%lu\n", semid2);
>rintf("He abierto el
semáforo 3,
%lu\n", semid3)
,-¡f>nrilf
pP:ífendif
/***.***********.*****************»*************,**.**«•.**********.*
/* Inicialización de la memoria compartida */
sem_wait(semidl); /* Espera el semáforo 1 */
memsett direccionl. O, TAMANY_SMl);
/* Borra memoria compartida I*/
sem_signal(semidl); /* Deja el semáforo 1 */
sem_wait(semid2); /* Espera el semáforo 2 */
memaet( direccion2, O, TAMAHY_SM2); /* Borra memoria compartida 2*/
sem_signal(semid2); /* Deja el semáforo 2 */
sem_wait(semid3); /* Espera el semáforo 3 */
memset( direccions, O, TAMANY_SM3); /* Borra memoria compartida 3*/
sem_signalÍsemid3); /* Deja el semáforo 3 */
signal (SIGCHLD, SIG_IGN);
/* Ignorar muertes de hijoa */
j-0;
/****
****
*****
******
***
•****•*
******
/*
Se crea un socket y se inicializa el servicio TCP en el puerto
seleccionado
*/
serverSocket = createService (Port)
,-if
(serverSocket==-l) goto el_final;
addrLen = sizeof(clientSockAddr);
/**
**
**
**
* *
.**
**
**
•*.*
**
*.*
**
*..*
**
..**
**
**
,**
**
**
**
**
**
*.*
**
/*
Se e
spera
hasta
q
ue u
n c
lien
te p
ida
serv
icio
*
/
ftifdef
DEPU
RA
prin
t f ("\nS
erv
ido
r: esp
era
nd
o lle
gad
a
clie
nte
. tf%
i\n" , j ) ;ífen
dif
clientSocket*accept(serverSocket, üclientSockAddr, taddrLen);
if (clientSocket==-l) goto el_final;
ítifdef DEPURA
printf("Servidor: el cliente ha llegado. \n") ;
ífendif
pid=fork{);
#ifdef DEPURA
APÉNDICES A
-163
DESARROLLO E IM
PLEMENTAG
ON
DE UN SISTEMA SUPERVISOR
PARA LA GESTIÓN Y CONTROL DE EDAR
printf("Proceso: %i\n",pid);
iíendif
if (pid==-l) exit(l); /* Error al hacer el proceso hijo */
if (pid==0)
/* Proceso hijo */
#ifdef DEPURA
printf("\nServidor en marcha ... \n");
ftendifif(close{serverSocket)==-1)
printf("ERROR close server\nn);
mi_servidor(clientSocket);
ífifdef DEPURA
printf("\n... fin de servidor,\n");
iíendifexi
t(O);
} /*Fin proceso hijo*/
if (close(clientSocket) ==
-1)
/* Tratamiento del padre */
printf ("ERROR en close client\n"),-
}if (shmdt(direccionl) < 0)
err_sys("Miserver: No puedo soltar la memoria compartida l\n");
if (shmctl(shmidl, IPC_RMID, (struct shmid_ds *)0) <0)
err_sys("Miserver: No puedo eliminar la memoria compartida l\n");
if (ahmdt(direccion2) < 0)
err_ays("Miserver: No puedo soltar la memoria compartida 2\n");
if (shmctl(shmid2, IPC_RMID, (struct shmid_ds *)0) <0)
err_sys("Miserver: No puedo eliminar la memoria compartida 2\n");
if (shmdt(direccion3) < 0)
err_sys("Miserver: No puedo soltar la memoria compartida 3\n");
if (shmctl(ahmid3, IPC_RMID, (struct
shmid_ds «)0) <0)
err_sys("Miserver; No puedo eliminar la memoria compartida 3\nB);
sem_rm(semidl);
printf("He machacado el semáforo l\nn);
sem_rm(semid2)
,-printf ("He
machacado el semáforo 2\n"),-
sem_rm(semid3);
printf ("He
machacado el semáforo 3\n"),-
el_final:
printf ("Eso
es todo amigosVn");
/* Intercambio de información con el PC */
void mi_servidor(int clientSocket)
ichar carácter[1];
int fin
= 0;
do
/* Mientras existan peticiones ...*/
{carácter¡0]=0;
/* Recibimos petición «/
recv(clientSocket, carácter, sizeof (carácter) , O)
,-
ítifdef DEPURA
printf ("Petición: %c\n", carácter [0]);
ítendif
/* Actuamos en función de la petición*/
A-164
APÉNDICES
APÉN
DICES
. SER
VIDOR
DE
DATO
S
witchícaracterton
í case 'S'¡ /* Establecer nuevos datos */
recv (clientSocket, buffer, sizeof (buf fer) , 0) ;
if (nuevos_datos_cliente ()
== I) /* Comprobación de datos */
carácter [0] = 'O' ;
sendíclientSocket
else
/* Si no son correctos devuelve U */
í carácter [0] = 'Nr ;
sendíclientSocket, carácter , sizeof (carácter) , 0)
;}
break;
case 'M
1 :recv(clientSocket, buffer, sizeof (buf fer) , 0)
;if (mensaje_cliente () == 1) /* Comprobación de datos */
{ carácter [0] ='0' ;
sendlclientSocket, carácter , sizeof (carácter) , 01;
/* Si no son correctos devuelve N */
sendtclientSocket, carácter , sizeof(carácter), 0);
ibreak;
case 'R':
medidas al_buf fer () ;
sendíclientSocket, buffer, sizeof (buffer) , 0) ;
break;
case 'C*:
if ( comprueba_consignas gsi()== 1)
í caràcter[O]='S';
sendtclientSocket, caràcter , sizeof(caràcter), 0);
sendíclientSocket, buffer, sizeof(buffer), 0);
recvíclientSocket, caràcter, sizeof(caràcter), 0);
/* Si se ha conseguido la conexión, borra las consignas de la estructura */
if (caràcter [0]
=>='0' )
í sem_wait(semid2);
/* Espera el semáforo 2 */
memsetí direccion2. O, sizeof(consignas));
sen» signal (semid2) ;
/* Deja el semáforo 2 */
(else ( carácter[O]='N';
sendíclientSocket, carácter , aizeof(carácter), 0) ;
}break;
case 'W: /* Warning, mensaje de la planta */
mensaje_al_buffer();
sendíclientSocket, buffer, sizeof(buffer), 0);
break;
case 'P':
/* Fin de la conexión */
disconnectClient(clientSocket);
fin - 1;
break;
case 'E': /* Tratamiento especial de datos */
medidas_texto();
sendíclientSocket, buffer, sizeof(buffer), O);
break;
case '0': /* Tratamiento especial de datos */
otras_medidas_texto();
sendtclientSocket, buffer, sizeof(buffer), 0);
break;
case 'A1: /* Datos recibidos de los analizadores */
recv(clientSocket, buffer, sizeof(buffer), 0) ;
if (nuevos_datos_analizadores() == l) /* Comprobación de datos */
carácter[O]='O*;
send(clientSocket, carácter , sizeof(carácter), 0);
APÉN
DICE
S A
-16
5
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN SI
STEM
A SU
PERV
ISOR P
ARA
LA G
ESTIÓ
N Y C
ONTR
OL DE
EDA
R
/* Si ño
os devuelve N */
carácter [01 ='N' ;
send (clientSocket, carácter , sizeof (carácter) , 0)
;}
break;
case 'N': /* Valores de los analizadores para enviar*/
medidas_analisis () ;
sendtclientSocket, buffer, sizeof (buffer) , O) ;
break;
case 'V :
recv(clientSocket, buffer_p, sizeof (buf fer_p) , 0) ;
if (datos__cliente varios () == 1) /* Comprobación de datos */
f carácter [0] = *O'
;sendíclientSocket, carácter , sizeof (carácter) , O) ;
}else
/* Si no son correctos devuelve N */
f caracter[0]='N';
sen
dtc
lien
tSo
ck
et,
cará
cte
r ,
sizeo
f (c
ará
cte
r) ,
o
);)
bre
ak
;case 'H' : /* Ayuda del servidor */
case ' ? ' :
case 'h
1 :
ayuda_servidor O ;
sendtclientSocket, buffer, sizeof (buf fer) , 0) ;
break;
default:
/* Si se trata de una orden no contemplada, se desconecta */
ttifdef DEPURA
printf ("Por defecto ... \n");
«endif
disconnectClient (clientSocketí ;
fin . 1;
break; }
} while (fin.. 0) ;
X.................. ........ ............ ......... ............. ............ /
/* Toma el buffer mandado por el cliente y da valores a la estructura
de las medidas */
int nuevos_datos_cliente(void)
{ str
uct
seg
un
da
{ch
ar
nom
[3]
[101
,co
ntr
ola
do
r [3
] (1
0]
,p
h[3
] [1
0],
tem
pera
tura
(3J
[10
1 ,
po
ten
cia
l [3
] [1
0] ,
ox
igen
o{3
] [1
0]
,m
A[3
] [1
0]
,v
elo
cid
ad
[3]
[10
] ,
cau
dale
s [3
] (1
0J ,
set_
po
int_
ox
igen
o[3
] [1
0]
,se
tjp
oin
t_ag
itacio
n [
3] [
10
],en
trad
as_
plc
[16
1 ,
sali
das_
plc
[24
] ,
est
ad
os_
vari
os
[20
] ,
tiem
po
s [1
0J [
10]
;Jd
ato
s;
int i=0;
int chequeóla OL,
chequeo2=OL;
t ime_t t i empo ;
for U=0;i<(TAMAHY-12);i++) chequeo l+=buf f er [i] ;
chequeo2= atoi (&buf fer [500] ) ;
if (chequeol«chequeo2)
A-166
APÉNDICES
APÉNDICES. SERVIDOR DE DATOS
int sem créate( key t key, int initval}
{register int
id, semval,-
unión semun
(int
val;
struct semid_ds *buf;
ushort
*array;
} semctl_arg;
if (key
.. IPC_PRIVATE) return (-1);
else if (key
»- (key_t) -1) return (-11;
ag
ain
:if
( (id
> semgetlkey,
3, PERM
S |
IPC_CREAT))
< 0)retu
rn (-1);
if (sem
oplid, sop_lock[o],
2) < 0)
{if (errno == EINVAL) goto again;
err_ays("can1t lock");
}
if ( (semval - semctKid, 1, GETVAL, 0) ) < 0)
err_ays("can't GETVAL");
if (semval == 0)
{semctl_arg.val = initval;
if (semctKid, 0, SETVAL, semctl_arg) < 0)
err__sys ("can SETVAL [o]
") ;
aemctl_arg-val = BIGCOUNT;
if {semctKid, 1, SETVAL, semctl_arg) < 0)
err ays("can SETVAL [1]
"),-}
if (semopiid, &op_endcreate[0] , 2) < 0)
err_sys("can1t end create");
return(id);
/* Abre un semáforo que ya existe.
Devuelve la identidad del semáforo.
*/
int sem_open (key_t key)
(register int id;
if (key == IPC_PRIV
ATE)
return
(-1);
else if (k
ey == (key_t)
-1} retu
rn (-1
) ,-
if (
(id = sem
getikey, 3,
0)) < 0)
return ( - 1
) ;
if (sem
op (id,
&op__open [0] ,
1) < 0)
err^sys ("can
't open") ;
return (id)
;
/* Elimina un semáforo.
Debe ser llamada por el servidor. */
void sem rm(int id)
í
if (semctKid, 0 , IPC_RMID, O) < 0)
err_sys("can't IPC_RMIDn)
;
/* Cierra un semáforo. */
void sem close(int id)
APÉNDICES A
-17
9
DE
SA
RR
OliO
E iM
PLE
ME
/fTAdÓ
N D
E U
N S
ISTE
MA
SU
PE
RV
ISO
R PARA
LA G
ES
TIÓN
Y C
ON
TRO
L D
E E
DA
R
register
int
semval;
if (sem
oplid, &
op_close[0}, 3)
< 0)err_sys{"can*t
semop");
if (semval=semctl(id, 1, GETVAL, 0) <
0)
err_sys("can1t GETVAL"};
if (semval > BIGCOUNT)
err_sys("sem[l] > BIGCOUNT"),-
else if (semval « BIGCOUNT)
sem_rm(id);
else
if (sem
opfid, &
op_unlock[0), 1)
< 0)err_
sys(
rcan't
unlock");
/* Espera hasta que el semáforo es mayor que cero.
Después le resta 1 y vuelve */
void sem wait(int id)
{sem_op(id,-1);
/.*»*****,*****..****.*******»***..**+************
/* Incrementa un semáforo en 1 */
void sem_signal(int id)
sem_op(id,1);
/* Operación general sobre un semáforo.
*/
void sem_op(int id, int valué)
if ( (op_op[0].sem_op = valué) == O)
err_sys("can't have value == O");
if (sem
op(id, &
op_op[0], 1)
< 0)err_sys ( "aem
_op error"),-
A-180
APÉNDICES
APÉN
DICE
S. S
ERVID
OR DE
DAT
OS
MIGSI.C - PROGRAMA PARA ACCEDER A LA MEMORIA COMPARTIDA Y MOSTRAR LOS DATOS
IN-LINE POR PANTALLA
PROGRAMADOR: Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 26/10/98
«include <stdio.h>
«include <string.h>
«include <sys/types.h>
«include <sys/ipc.h>
Sinclude <sys/shm.h>
ííinclude <time.h>
/* Tiempo */
ftdef ine SEMKEY1 ( (key_t) 4223353L)
{(define SEMKEY2 {(key_t) 4223354L)
«define SHMKEY1 ( (key_t) 1995)
«define SHMKSY2 ((key_t) 1995)
«define TAMANY_SM1 1000
«define TAMANY_SM2 1000
«define TAMANY_M
100
/•Semáforo, definiciones en semáforo.c*/
/•Semáforo, definiciones en semáforo.c*/
/* Segmentos de memoria compartida */
/* Tamaño memoria compartida 1 */
/* Tamaño memoria compartida 2 */
/* Tamaño del mensaje cliente */
«define PERMS 0644
«define err_sys(A) printf
/• Permisos de acceso */
struct tercera{
/•Estructura per paramètres referents als controladors*/
char nom [3] [10] ;
int controlador[3];
double phl3);
double temperatura(3J;
double potencial[3];
double oxigeno[3];
double mA[3];
double velocidad[3];
double caudales[3];
double set_point_oxigeno[3] ;
double set_point_agitacion[3] ;
char
entradas_plc[16];
char
salidas_plc[24];
char
estados_varios [20]
,-int
tiempos[10];
time_t tiempo;
}medidas;
struct cuarta{
/* Estructura para las consignas */
char
cambio_oxigeno[3],
cambio_agitacion[3],
cambio_caudales(3J,
cambio_tiempos(10];
double valor_oxigeno[3],
valor_agitacion[3] ,
valor_caudales [3] ,•
int
tiempos[10] ;
char
cambio_variable[20];
double valor_variable[20];
Jconsignas;
/•Nom del controlador*/
/•Numero del controlador */
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable"/
/•Valor mesurat de la variable*/
/•Valor mesurat de la variable*/
/•Valor mesurât de la variable*/
/*Tiempo de las variables*/
int semidl,
semid2;
int shmidl,
shmid2;
char *direccionl,
*direccion2;
void main(void)
í int i;
struct tra *mihor
APÉN
DICE
S A
-181
DESA
RROL
LO E
IMPL
EMEN
TAQÓ
N DE
UN
SISTE
MA S
UPER
VISOR
PAR
A LA
GES
TIÓN
Y CO
WTR
OL D
E ED
AR
time_t hora_actual;
char mensaje_cliente{TAMANY_Mj;
/* Segmentos de memoria compartida */
if í (shmidl=shmget(SHMKEYl, TAMANY_SM1, PERMS )) <0>
err_sys("Miserver: No puedo obtener la memoria compartida l\n");
if { (direccionl=(char *)shraattshmidl, O, O)) « (char *)-!)
err_ays("Miserver: No puedo unirme a la memoria compartida l\n");
if ( <shmid2oshmget(SHMKEY2, TAMANY_SM2, PERMS }) <0)
err_sys("Migsi: No puedo obtener la memoria compartida 2\n");
if ( (direccion2=(char *)shmatÍshmid2, O, O)) -- (char *ï-l)
err_sys("Migsi: No puedo unirme a la memoria compartida 2\n");
if {(shmidl==-l)
j | (shmid2»-l) ) goto elfin;
semidl=sem_ppen(SEMKEYl);
semid2o3em_open(SEMKEY2);
if ( (semidl
=> = -i) | j (semid2 == -1) ) goto elfin;
sem_wait(semidl);
/* Esperando el semáforo 1 */
memcpy(tmedidas,direccionl,sizeof(medidas));
memcpy(mensaje_cliente, &direccionl[500], sizeof(raensaje_cliente));
sem_signal(semidl);
/* Deja el semáforo i*/
sem_wait(semid2);
/* Esperando el semáforo 2 */
memcpy(¿consignas,direccion2,sizeof(consignas));
sem_signal(semid2);
/* Deja el semáforo 2*/
printf("Hedidas: \n\n");
printf{
printf(
medidas
printf(
printf(
medidas
printf(
printf(
printf(
printf(
printf(
medidas
printf(
medidas
\t%s\t%s\t%s\n", medidas,nom(0],medidas.nom[l],medidas.nom[2]};
\t*i\t\t%i\t\t%i\n".
controlador [0] .medidas .controlador [1] .medidas. controlador [2] ) ;
pH: \t%f\t%f\t%f\n", medidas. ph[0] .medidas. phfl] .medidas .ph [2] ) ;
T:
\t%f\t%f\t%f\n",
temperatura [O] .medidas .temperatura [1] .medidas .temperatura [2] ) ;
mV: \t%f\t%f\t%f\n" , medidas. potencial [0] .medidas -potencial [1] .medidas .potencial [2] )
;medidas. oxigeno [O] .medidas. oxigeno [1]
, medidas .oxigeno [2] ) ;
medidas. mA f 0] .medidas .mA[l] , medidas. mA[ 2] ) ;
medidas. velocidad [O] .medidas .velocidad [1] , medidas. velocidad [2] ) ;
\t%f\t%f\t%f\n",
medidas. set_point_oxigeno [O]
,.set_point_oxigeno[l] , medidas .set_point_oxigeno [2] ) ;
"SP V:
\t%f\t%f\t%f\n", medidas. set_point_agitacion [0] ,
. set_point_agitacion [1] .medidas ,set_point_agitacion[2] ) ;
O2 : \t%f \t%f \t%f \n"
mA: \t%f\t%f\t%f\n"
\t%f\t%f\t*f\nn
O2 :
printf("\nEntradas PLC:
");
for (i=0;i<16;i++) printf (" %c".medidas.entradasjplc[i]);
printf(B\nSalidas PLC:
•);
for (iaO; i<24; i++) printf (" %c" .medidas . salidas_j>lc [i] ) ;
printf("\nEstados varios:
" )
,-
for (i=0,-i<20;i-»-+) printf (" %c" ,medidas.estados_varios [i] } ;
printf("\nTiempos:
");
for (i=0;i<10;i++) printf (" %i".medidas.tiempos[i)};
printf("\ncaudales:
medidas.caudales[0].medidas.caudales[1],medidas.caudales[2]);
\t%f\t%f\t%f\n"
printf("\n\nConsignas: \n"};
printf{"\nCambio 02: ");
for (i=0;i<3;i++) printf (" \t%c",consigna3.cambio_oxigeno[i]);
printf("\nCambio Vel: ");
for (i=0;i<3;i++) printf (" \t%c".consignas.cambio_agitacion[i]);
printf("\nCambio Caud:
");
for (i=0;i<3;i++) printf (" \t%c",consignas.cambio_caudales[i]};
printf(B\nCambio tiempos: ");
for (i=0;i<10;i++) printf (" \t%c",consignas.cambio_tiempos[i]);
printf(0\nCambio variables: ");
for (i=0;i<20;i++) printf (" \t%c".consignas.cambio_variable[i]);
A-182
APÉNDICES
APÉNDICES. SERVIDOR DE DATOS
prin
tf("\n
Va
lor
O2 :
"),-fo
r (i=
0;i<
3;i+
+)
prin
tf ("
\t%f"
,co
nsig
na
s,v
alo
r_o
xig
en
o[i]);
prin
tf("\n
va
lor
Vel :
");
for (i=0;i<3;i++) printf <"
\t%f",consignas.valor_agitacion[i]);
printf("\nValor Caud: ") ;
for (i=0;i<3; i++) printf í " \t%f " , consignas .valor_caudales [il )
;printf("\nValor tiempos: ") ;
for (i=0;i<10;i++) printf ("\t%in.consignas.tiempos ti]);
printf("\nOtras variables: ");
for {i=0;i<20;i++) printf ("
%f".consignas.valor_variable[iJ>;
minora=localtime( s(medidas.tiempo) );
printf("\n\nHora medidas:
%2i %2i %2i\n",
mihora->tm_hour, mihora->tm_min, mihora->tm_sec);
time( &hora_actual );
mihora=localtime( &hora_actual );
printf("Hora actual:
%2i %2i %2i\n",
minora->tm_hour, mihora->tm_min, mihora->tm_sec);
while(mensaje_cliente[ij!=10 && i<(TAMANY_M-2)) i + +;
mensaje_cliente[i+1]=0;
printf ( "Mensaje: %s\n", mensaje_cliente);
elfin:
if (shmdt(direccionl) < 0)
err_sys{nMigai: No puedo soltar la memoria compartida l\n");
if (shmdt(direccion2) < 0)
err_sys("Higsi: No puedo soltar la memoria compartida 2\n");
sem_close(semidl) ;
sem_close(seraid2) ;
APÉNDICES A
-18
3
DESARROLLO E IMPLEMENTAQON DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
MIGSIA.C - PROGRAMA PARA ACCEDER A LA MEMORIA COMPARTIDA Y MOSTRAR LOS
DATOS ANALÍTICOS POR PANTALLA
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN; 5/6/97
«include <stdio.h>
«include «string.h>
«include <sys/types.h>
«include <sys/ipc.h>
«include <sy9/shm.h>
«include <time.h>
/* Tiempo */
«define SEMKEY3 (íkey_t) 4223355L) /'Semáforo, definiciones en semáforo.c*/
«define SHMKEY3 ( Otey_t>
1997)
«define TAMANY_SM3 1000
/* Tamaño memoria compartida 3 */
«define PERMS 0644
/* Permisos de acceso */
«define err_sys(A) printf (A)
struct quinta{
/* Estructura para los analizadores */
double nitratos;
time_t t_nitratos;
double nitritos;
double amonio;
time_t t_amonio;
}analisis[5];
int
semid3;
int
shmid3;
char "direccions;
void main(void)
int i ,-
struct tm "mihora;
time_t hora_actual;
/***..*.***.****.*****.*****.********
t*,*.**»*»..*.*********..**.*./
/* Segmentos de memoria compartida */
if ( (shmid3=shmget(SHMKEY3, TAMANY_SM3, PERMS )) <0)
err_sys("Migsi: No puedo obtener la memoria compartida 3\n");
if ( (direccion3=(char *)shmat(shmid3. O, Oí)
== (char *)-l)
err_sys("Migsi: No puedo unirme a la memoria compartida 3\n");
if (shmid3==-l) goto elfin;
semid3=sem_open(SEMKEY3);
if (semid3 == -1) goto elfin;
sem_wait(semid3);
/* Esperando el semáforo 3 */
memcpy(análisis,direccion3,sizeof(análisis));
sem_signal(semid3);
/* Deja el semáforo 3*/
printf("XnUltimos valores analizados: \n\nn);
for (i=0;i<5;i++)
íprintf("Punto: %i\n",i);
printf("Nitratos : %f\n",análisis[i].nitratos);
mihora = l
ocaltime( ¿(análisis [i] ,t_nitratos) );
printf("T nitratos:
%2i %2i %2i, %2i/%2i/%2i\n",
mihora->tm_hour, mihora->tm_min, minora->tm_sec,
mihora->tm__mday, l+mihora->tm_mon, mihora->tm_year) ;
A-184
APÉNDICES
APÉN
DICE
S. S
ERVI
DOR
DE D
ATOS
printf("Nitritos: %f\n".análisis[i]-nitritos);
mihora=localtime( &(análisis[i].t_nitritos) );
printf(-T nitritos: %2i %2i %2i, %2i/%2i/%2i\n",
mihora->tm_hour, mihora->tm_min, minora->tm_sec,
minora->tm_mday, l+mihora->tm_jnon, mihora->tm_year);
printf{"Amonio:
%É\n".análisis[i)-amonio);
mihora=localtime( fctanalisis[i].t_amonio) );
printf("T amonio:
%2i %2i %2i, %2i/%2i/%2i\n",
minora- >tm_hour, minora->tm_min, rai hora - >ttn_sec,
minora->tm_mday, l4mihora->tm_mon, minora->tm_yearí;
elfin:
if (shmdt(direccions) < 0)
err_sys("Migsi: No puedo soltar la memoria compartida 3\nB);
sem_close(semid3);
exit(O);
APÉN
DICE
S A
-185
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
y C
ONTR
OL D
E ED
AR
PLANTATR2.C - PROGRAMA PARA ACCEDER A LA MEMORIA COMPARTIDA Y CREAR
AUTOMÁTICAMENTE UNA PAGINA WEB CON DATOS IN-LINE
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISION: 19/X2/97
«include <stdio.h>
ffinclude «string.h>
tfinclude <sys/types . h>
ttinclude <sys/ipc.h>
ttinclude <sys/shra.h>
Sinclude <time.h>
/* Tiempo */
ífdefine SEMKEY1 {(key_t) 4223353L)
ífdefine SEMKEY2 ((key_t) 4223354L)
ífdefine SHMKEY1 ( (key_t) 1995)
Sdefine SHMKEY2 ((key_t) 1996)
ífde
fine TAMANY_SM1 1000
ífde
fine TAMANY_SM2 1000
ífde
fine TAMANY M
100
/'Semáforo, definiciones en semaforo.c*/
/'Semáforo, definiciones en semaforo.c*/
/* Segmentos de memoria compartida */
/* Tamaño memoria compartida 1 */
/* Tamaño memoria compartida 2 */
/* Tamaño del mensaje cliente */
ífdefine PERMS 0644
ífdefine err_sys (A) printf (A)
/* Permisos de acceso */
char
char
int
time_t
}medidas;
struct cuarta{
char
int
{consignas;
tercera{
/*Estructura per
char nom[3] (10] ;
int
cont
rola
dor[
3] ;
doub
le
ph[3
J;do
uble
te
mpe
ratu
ra[3
];do
uble
po
ten
cial
[3];
doub
le o
xige
no[3
];d
ou
ble
m
A[3
];d
ou
ble
v
elo
cid
ad
[3 J
;d
ou
ble
ca
ud
ale
s[3
];d
ou
ble
se
t_p
oin
t_o
xig
en
o[3
];d
ou
ble
se
t_p
oin
t_ag
itacio
n(3
1 ;
cha
r en
tra
da
s_p
lc(1
6];
sali
das_
plc
[24
];est
ad
os_
vari
os[
20
];ti
em
po
s[1
0];
t i etnpo ;
paràmetres referents als controladora*/
/*Nom del controlador*/
/•Numéro del controlador */
/*Valor mesurat de la variable*/
/*Valor mesurat de la variable*/
/*Valor mesurat de la variable*/
/*Valor mesurat de la variable*/
/*Valor mesurat de la variable*/
/*Valor mesurat de la variable*/
/*Tiempo de las variables*/
/* Estructura para las consignas */
cambio_oxigeno[3],
cambio_agitacion[3] ,
cambio_caudale3í3],
cambio_tiempos[10];
valor_oxígeno[3],
valor_agitacion[3] ,
valor_caudales[3] ;
tiempos [10J
,-
int semidl,
aemid2;
int shmidl,
shmid2;
char *direccionl,
*direccion2;
PILE *fichero_in¡
FILE *fichero_out;
char frase[30];
char buffer[1500];
void main(void)
A-186
APÉNDICES
APÉNDICES. SERVIDOR DE DATOS
int
i;str
uct
tm
*m
iho
ra;
time_
C
no
ra_
actu
al;
ch
ar
men
saje_clien
te[TA
MA
NY
_M
j;
/* Segmentos de memoria compartida */
if ( (shmidl=shmget(SHMKEYl, TAMANY_SM1, PERMS )) <0)
err_sy9(nMiserver: No puedo obtener la memoria compartida l\n");
if ( (direccionl=(char *)shmat(shmidl. O, 0)) == (char *)-!)
err_sys("Miserver: No puedo unirme a la memoria compartida l\n");
if ( (shtnid2
= shmget (SHMKEY2, TAMANY_SM2, PERMS ) ) <0)
err_sys("Migsi: No puedo obtener la memoria compartida 2\n")
,-if ( (direccion2=(char *)shmat(shmid2. O, 0)) == (char *)-!}
err_ays("Migsi: No puedo unirme a la memoria compartida 2\nn);
if ((9hmidl==-l)
(3hmid2==-l) ) goto elfin;
semidl=sem_openíSEMKEYl);
semid2=sem_open(SEMKEY2);
if ( (semidl == -1)
do{/*-*************
(semid2 == -1) } goto elfin;
sem_wait(semidl);
/* Esperando el semáforo 1 */
memcpy (6tmedidas,direccionl, sizeof (medidas) ) ;
memcpy(mensaje_cliente, &direccionl[500], sizeof(mensaje_cliente)};
sem_signal(semidl);
/* Deja el semáforo I"/
~"
sem_wait(semid2);
/* Esperando el semáforo 2 */
memcpy(&consignas,direccion2,sizeof(consignas));
sem_signal(semid2) ;
/* Deja el semáforo 2*/
memset (frase,O,sizeof(frase));
mema e t (buffer. O, sizeof (buffer) ) ,-
fichero_out=fopen("/quantum/httpd/htdocs/depuradoras/plantatr2.html","wb");
printf("Generando html ...
\n\n");
fprintf(fichero_out,"<HTML>
<META HTTP-EQUIV=REFRESH CONTENT=20; URL=http://eq3.uab.es/depuradoras/plantatr2.html>
<HEAD>
<TITLE>Datos en tiempo real planta piloto</TITLE>
</HEAD>
<BODY bgcolor=#ffffff LINK=#OOOOff VL·INK=#800080>
<FONT FACE=Arial COLOR=#f f OOOOxP ALIGN=CENTER>PLANTA PILOTO: DATOS ACTUALIZADOS EN TIEMPO
REAL</P>
</F
ON
Tx
FO
NT
F
AC
E=
Arial
SIZ
E=
2x
P>
&n
bsp
;</P
x/F
OH
T>
<P
AL
IGN
=C
EN
TE
RxC
EN
TE
RxT
AB
LE
B
OR
DE
R
CE
LL
SP
AC
ING
=1
bg
co
lor=
#d
le9
ff B
OR
DE
RC
OL
OR
-jí 00
00
00
CE
LL
PA
DD
ING
=5
WID
TH
=683>
<T
Rx
TD
W
IDT
Hi=22%
V
AL
IGN
=M
IDD
LE
C
OL
SPAN
=2
HE
IGH
T=
41><
P>
tnb
Sp
;</T
D>
<TD
W
IDT
Ho25*
VA
LIG
N=
MID
DL
E
CO
LS
PA
N=
5 H
EIG
HT
=41>
«B
xF
ON
T
FA
CE
=-A
rÍal S
IZE
=2
C
OL
OR
=#0000£f x
P
AL
IGN
-CE
NT
ER
>R
EA
CT
OR
l<
/Bx
/FO
NT
x/T
D>
<TD
W
IDT
H=
28%
VA
LIG
N=
MID
DL
E
CO
LSPA
N=
4 H
EIG
HT
=41>
<B
xF
ON
T
FA
CE
=A
rial S
IZE
=2
CO
LO
R=ítO
OO
Of f >
<P
A
L I G
K=C
EN
TÈ
R > R
EA
CT
OR
2
</B
x/F
ON
Tx
/TD
><T
D
WID
TH
=26%
V
AL
IGN
=M
IDD
LE
C
OL
SP
AN
«2 H
EIG
HT
=41>
<B
xF
ON
T
FA
CE
=A
rÍal S
IZE
=2
CO
LO
R=ftO
OO
Of f x
P
AL I G
Ns C
EN
TÈ
R > R
EA
CT
OR
3
</B
x/F
ON
Tx
/TD
><
/TR
><
TR
xT
D
WID
TH
=22%
V
AL
IGN
=M
IDD
LE
C
OL
SP
AN
=2
HE
IGH
T=
41><
Bx
FO
NT
F
AC
E=
Arial
SIZ
E=
2 C
OL
OR
=8
00
00
ffxP
>p
H<
/Bx
/FO
NT
><
:/TD
><
TD
W
IDT
H-25%
V
AL
IGN
=M
IDD
LE
C
OL
SP
AN
=5
HE
IGH
T=
41
><
P>
","%3
n);s
prin
tf(fras
e,
H%
4.If"
,me
did
as
.ph
[OJ
);fw
rite(fra
se
,4,1
,fich
ero
_o
ut);
fprin
tf(fich
ero
_o
ut,"
</P
><
/TD
><
TD
W
IDT
H=
28%
VA
LIG
N=
MID
DL
E
CO
LSPA
Ne-4
HE
IGH
T=
41
xP
>" , " %
s" ) ;sp
rintf (fra
se
, "%4 . I
f .m
ed
idas.p
h [1
] ) ;fw
rite(fra
se
,4,1
,fich
ero
_o
ut);
fprin
tf(fich
ero
_o
ut,"
</P
><
/TD
>
APÉNDICES A
-18
7
DESARROLLO E IMPLEMENTACIÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
<TD
W
IDT
H=
26%
VA
LIG
N=
MID
DL
E
CO
LSPA
N=
2 H
EIG
HT
=4
1x
P>
" , n%3
" ) ;sp
rintf(fra
se
,"%
4.1
f",m
ed
ida
s.p
h[2
]);fw
rite(fra
se
,4,1
,fich
ero
_o
ut);
f prin
t f (f ich
ero
_o
ut, "
</P
x/T
D>
</T
R>
<T
Rx
TD
W
IDT
H=
22%
VA
LIG
N=
MID
DL
E
CO
LS
PA
N=
2 H
EIG
HT
=41>
<B
xF
ON
T
FA
CE
=A
rÍal S
I2E
=2
CO
LO
R=ífO
OO
Of f >
<P
>T
em
pera
tura
(C) <
/Bx
/FO
NT
x/T
D>
<TD
W
IDT
H=
25%
VA
LIG
N=
MID
DL
E
CO
LSPA
N=
S H
EIG
HT
=4
IxP
>" , "%
S" ) ;
sp
rintf(fra
se
,n%
4.If"
.me
did
as.te
mp
era
tura
(0]3
;
fwriC
e(fra
se
,4,1
,fich
ero
_o
ut);
fprin
tf (f ic
hero
_o
ut, "
</P
x/T
D>
<TD
W
IDT
H=
28* V
AL
IGN
-MID
DL
E
CO
LS
PA
H=
4 H
EIG
HT
=4
1x
P>
" , "%s
n ) ;sp
rintf(fra
se
,"%
4.If"
.me
did
as.te
mp
era
tura
[1
]};
fwrite
(frase
,4,1
,fich
ero
_o
ut);
fprin
tf(fich
ero
_o
ut,"
</P
><
/TD
><T
D
WID
TH
=26%
V
AL I G
N=M
I DD
L E
CO
LS
PA
N=
2 H
ElG
HT
=4
1x
P>
" , "%S
" ) ;sp
rintf(fra
se
,"%
4.If"
.me
did
as.te
mp
era
tura
[2]);
fwrite
(frase
,4,1
,fich
ero
_o
ut);
fprin
tf (f ic
hero
_o
ut, "
</P
x/T
D>
</TR>
~<TRxTD WIDTH=22% VALIGN=MIDDLE COLSPAN=2 HEIGHT=41>
<BxFONT FACE=Arial SIZE=2 COLOR=SOOOOf f xP>Oxí,-geno (ppm) </B><:/FONTx/TD>
<TD WIDTH=25% VALIGN-MIDDLE COLSPAN=5 HEIGHT=41xP>" , " %S" ) ;
sprintf(frase,"%4.1f",medidas.oxigeno[OJ);
fwrite(frase,4,1,fichero_out);
fprintf(fichero_out,"</p></TD>
<TD WIDTH=28% VALIGN=MIDDLE COLSPAN=4 HEIGHT=41xP>" , " *S" ) ;
sprintf(frase,"%4.If".medidas.oxigeno[1]);
fwrite(frase,4,1,fichero_out);
fprintf (fichero_out, "</PX/TD>
<TD WIDTH=26% VALIGN=MIDDLE COLSPAN=2 HEIGHT=41><P>","%s");
sprintf(frase,"%4.If".medidas.oxigeno [2]);
fwrite(frase,4,1,fichero_out);
fprintf (f ichero_out, "</Px/TD>
</TR>
<T
Rx
TD
W
IDT
H=
22%
VA
LIG
N=
MID
DL
E
CO
LS
PA
N=
2 H
EIG
HT
=41>
<B
xF
ON
T
FA
CE
-Arial
SIZ
E=
2 C
OL
OR
=tíOO
OO
f f xP
>R
ed
ox
(m
V) <
/Bx
/FO
NT
x/T
D>
<T
D
WID
TH
=25%
V
AL
IGN
=M
IDD
LE
C
OL
SP
AN
=5
HE
IGH
T=
41
xP
>" , " %
sn ) ;
sp
rintf{
frase
,"%
4f"
,me
did
as.p
ote
nc
ial [O
]);fw
rite (fra
se
,4,1
,fich
ero
_o
ut);
fprin
tf (f ic
hero
_o
ut, n<
/px
/TD
><
TD
W
IDT
H=
28%
VA
LIG
N=
MID
DL
E
CO
LSPA
N=
4 H
EIG
KT
=4
1x
P>
" , " %s
n ) ;sp
rintf{
frase
,"%
4f"
.me
did
as.p
ote
nc
ial
[lj)
;fw
rite(fra
se
,4,1
,fich
ero
_o
ut);
fprin
tf{fic
he
ro_
ou
t,"<
/P>
</T
D>
<TD
W
IDT
H=
26%
VA
LIG
N=
MID
DL
E
CO
LS
PA
N=
2 H
EIG
HT
=4
1x
P>
" , " %s" ) ;
sp
rintf(fra
se
,"%
4f"
,me
did
as.p
ote
nc
ial
[2
]);
fwrite
(fra
se
,4,1
,fich
ero
_o
utí;
fprin
tf (f ic
hero
_o
ut, "
</P
x/T
D>
</T
R>
<TRxTD WIDTH=42% VALIGNoTOP COLSPAN=6 HEIGHT=38>
<P ALIGN=CENTER>Hora de la adquisición de datos:</TD>
<TD WIDTH=58% VAL·IGN=MIDDLE COLSPAN=7 HEIGHT«>38xP>" , " %s" ) ;
sprintf(frase, n%sn, ctime(^medidas.tiempo));
fwrite(frase,27,1,fichero_out);
fprintf(fichero^out,"</p></TD>
</TR>
</TABLE>
</CENTERx/P>
<FONT FACEoArial SIZE=2xP> ,-</Px/FONT>
<TABLE CELLSPACING-O BORDER=0 CELLPADDING=5 WIDTH=791>
<TRxTD WIDTH=50% VALIGN=TOP>
<P>Stnbsp;</TD>
- -
<TD WIDTH=50% VALIGN=-TOP>
A-188
APÉNDICES
APÉN
DICE
S. S
ERVID
OR D
E DAT
OS
<P> </TD>
</TR>
</TABLE>
«FONT FACE=Aríal SIZE=2xP>&nbap; </P>
<P> </P>
</FONT><P>«:A HREF=http : //eq3 . uab. es/index. html>Volver al tiacute ,-ndice de Ingeniertiacute ;a
quíraica</Ax/P></BODY>
</HTML>","%a");
fclose(fichero_out);
sleepOO) ;
}while(IL);/*•*****«**«*end while*********"*******/
elfin:
if (shmdt(direccionl) < 0}
err_sys("Migsi: No puedo soltar la memoria compartida l\n°);
if (shmdt(direccion2) < O)
err_ays("Migsi: No puedo soltar la memoria compartida 2\n");
sem_close(semidl);
sem_close(semid2);
APÉNDICES
A-189
APÉN
DICE
S. CO
MUNI
CACIÓ
N GS
I - S
ERVI
DOR
DE DA
TOS
GSIJB.C - PROGRAMA PRINCIPAL PARA LA COMUNICACIÓN GSI-SERVIDOR DE DATOS
PROGRAMADOR:
Juan Antonio Baeza Labat
ULTIMA REVISIÓN: 31/10/96
ft include <stdio.h>
«include <string.h>
tí include <time.h>
/* Tiempo */
«include <sys/types .h>
((include <sya/ipc.h>
ítinclude <sys/shm.h>
«include "gsi.h"
«include <atdlib.h>
«define SEMKEY1 ((Jcey_t) 4223353L)
ttdefine SEMKEY2 ((key_t) 4223354L)
«define SEMKEY3 ((key_t) 4223355L)
tfdefine SHMKEY1 ((key_t) 1995)
«define SHMKEY2 { (key_t) 1996)
«define SHMKEY3 ((key_t) 1997)
«define TAMANY_SM1 1000
«define TAMANY_SM2 1000
«define TAMANY_SM3 1000
«define TAMAKY_M
100
«define PERMS 0644
«define err_sys(A) printf (A "\n")
«define TCPIP_PORT_NUMBER 22041
/•«define DEBUG*/
/•Semáforo, definiciones en semáforo.c*/
/•Semáforo, definiciones en semáforo.c*/
/*Semáforo, definiciones en semáforo.c*/
/* Segmentos de memoria compartida */
/* Tamaño memoria compartida 1 */
/* Tamaño memoria compartida 2 */
/* Tamaño memoria compartida 3 */
/* Tamaño del mensaje cliente */
/* Permisos de acceso */
str
uct
terc
era
{ch
ar
no
mt3
] [1
0];
int
co
ntr
ola
do
r [3
] ,-
do
ub
le
ph
(3];
double
te
mp
era
tura
[3];
do
ub
le
po
ten
cia
l[3
];d
ou
ble
o
xig
en
o[3
];d
ou
ble
m
A[3
] ;
do
ub
le v
elo
cid
ad
[3];
do
ub
le
cau
dale
s[3
];d
ou
ble
aet_
po
int_
ox
igen
o[3
];d
ou
ble
se
t_p
oin
t_v
elo
cid
ad
[31 ;
ch
ar
en
trad
aa_
plc
[16
] ;
ch
ar
aali
das_
plc
12
4}
;ch
ar
est
ad
os_
vari
os[
20
],-
int
tiem
po
s [1
0];
tim
e_
t ti
em
po
;}
med
idas
;
/•E
str
uctu
ra p
er
para
mètr
es
refe
ren
ts
als
co
ntr
ola
do
rs*
//*
Nom
d
el
co
ntr
ola
do
r*/
/•N
um
ero d
el
co
ntr
ola
do
r *
//*
Valo
r m
esu
rat
de la
v
ari
ab
le*
//•
Valo
r m
esu
rat
de la
v
ari
ab
le*
//*
Valo
r m
esu
rat
de la
v
ari
ab
le*
//•
Valo
r m
esu
rat
de la
v
ari
ab
le*
//•
Valo
r m
esu
rat
de la
v
ari
ab
le*
//'
Valo
r m
esu
rat
de la
v
ari
ab
le*
/
/•T
iem
po d
e la
s v
ari
ab
les*
/
str
uct
cu
art
af
/*
Estr
uctu
ra
para
la
s co
nsi
gn
as
*/
ch
ar
cam
bio
^o
xig
en
o[3
J,cam
bio
_ag
itacio
n[3
],cam
bio
_cau
dale
s[3
],cam
bio
_ti
em
po
s[1
0];
do
ub
le
valo
r_o
xig
en
o[3
1,
va
lor_
ag
ita
cio
nf3
],v
alo
r_cau
dale
s [3
] ;
int
tiem
po
s[1
0];
ch
ar
cam
bio
_y
ari
ab
le[2
0];
do
ub
le
valo
r_v
ari
ab
le[2
0];
}co
nsi
gn
as;
str
uct
qu
inta
f /*
E
stru
ctu
ra p
ara
lo
s an
ali
zad
ore
s *
/d
ou
ble
n
itra
tos;
tim
e_
t t_
nit
rato
s;
do
ub
le n
itrit
os;
APÉN
DICE
S A
-19
1
DESA
RROL
LO E
IMPL
EMEN
TAQ
ON
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
OE
EOAR
tim
e_
t t_
nit
rit
os;
do
ub
le
am
on
io;
tim
e_
t t_
am
on
io;
}a
na
lisis
[5];
str
uct
de_
los_
ind
ices{
icp
_in
t m
_p
h[3
];
/*
índ
ices
icp
_in
t m
_te
mp
era
tura
[31 ;
/*
índ
ices
icp
_in
t m
_p
ote
ncia
l [3
];
/*
índ
ices
icp
_in
t m
_o
xig
en
o[3
];
/*
índ
ices
icp_in
t m
_m
A[3
];
/*
índ
ices
icp
_in
t m
_v
elo
cid
ad
[3];
/*
ín
dic
es
icp
_in
t m
_n
itra
tos[5
];
/•
índ
ices
icp
_in
t m
_n
itri
tos[5
];
/*
índ
ices
icp
_in
t m
am
on
io[S
I;
/•
índ
ices
icp
_in
t m
_sp
_o
xig
eno [
3];
/*
ín
dic
es
icp
_in
t m
_sp
_v
elo
cid
ad
[3];
/*
icp
_in
t m
_c
au
da
les(
3J;
/*
ín
dic
es
icp
_in
t m
_en
trad
as_
plc
[16
];
/*ic
p_
int
m_
sali
daa_
plc
[24
];
/*ic
p_
int
m_
est
ad
os_
vari
os
[20
J;
/*
índ
ices
icp
_in
t m
_ti
em
po
s[1
0J;
/•
ín
dic
es
icp
_in
t m
_v
ari
ab
le [
20
] ,-
/*
índ
ices
icp
_in
t c
_o
xig
en
o[3
J;
/*
índ
ices
icp
_in
t c_
_v
elo
cid
ad [
3} ;
/*
ín
dic
es
icp
_in
t c_
cau
dale
s [3
];
/*
índ
ices
icp
_in
t c_
tiem
po
s[1
0];
/*
ín
dic
es
icp
_in
t c_
vari
ab
le[2
0];
/*
ín
dic
es
icp
_in
t m
_p
lc[2
];
/*
índ
ices
}indice;
medida de ph */
medida temperatura */
medida redox •/
medida oxigeno */
medida miliamperios •/
medida velocidad */
medida nitratos */
medida nitritos */
medida amonio */
medida consigna oxigeno */
índices medida consigna agitación */
medida caudales */
índices medida entradas pie */
índices medida salidas pie */
medida estados */
medida t i empos */
medida variables •/
consigna oxigeno */
consigna agitación */
consigna caudales */
consigna tiempos */
variables varias •/
E/S PLC */
/* 0,1,2 Reactores 1,2,3; 3 -> salida; 4 -> anaerobio */
}var;
double variable[20];
time_t t_variable[20];
int semidl,
semíd2,
semidS;
int shmidl,
shmid2,
shmid3;
char *direccionl,
*direccion2,
*direccion3 ;
/* Devuelve el puerto a utilizar en la comunicación G2 <--> GSI
gsi_int gsi_get_tcp_portO
return(TCPIP PORT NUMBER);
/* Inicializa el sistem externo, buffers, contadores, variables comunes..
gsi_int gsi_initialize_context(remote_process_init_string, length)
char
*remote_process_init_string;
gsi int
length;
í if ( {shmidl=shmget(SHMKEY1, TAMANY_SM1Í PERMS)) <0)
err_sys("gsi_jb: No puedo obtener la memoria compartida l\nn);
if ( (direccionl=(char *)shmat(shmidl. O, O» == (char *)-!)
err_sys("gsi_jb: No puedo unirme a la memoria compartida l\nn);
if ( (shmid2=shmget(SHMKEY2, TAMAKY_SM2, PERMS }) <0)
err_sys("gsi_jb: No puedo obtener la memoria compartida 2\n"J;
if í (direccion2=(char *)ahmat(shmid2. O, O)) == (char *)-!)
err_sys(ngsi_jb: No puedo unirme a la memoria compartida 2\n");
if ( (shmid3ashmget(SHMKEY3, TAMANY_SM3, PERMS )) <0)
err_sys("Migsi: No puedo obtener la memoria compartida 3\nn);
if ( (direccion3=(char •)ahmat(shmid3. O, 0)) == (char •)-!)
A-192
APÉNDICES
APÉNDICES. COM
UNICACIÓN
GS
I - SERVIDOR
DE DATOS
err_ays("Migai: No puedo unirme a la memoria compartida 3\n"í;
if ((ahmidl==-l) || (shmid2==-l) || (ahmid3==-l)) return(GSI_FAIL);
3emidl=sem_open(SEMKEYl);
semid2=aem_open(SE«KEY2);
aemid3=3em_open(SEMKEY3)
,-
if ( {aemidl
semid2 == -l) || (semid3
== -1) ) return(GSI_FAIL)¡
mernset (¡.indicé.
O, sizeof (índice) ) ;
memaet í&conaignaa,0,sizeof(consignas));
ffífdef DEBUG
printf ("gsi_initialize_context in context *d\n",current_context);
ffendif
return (GSI SUCCESS);
/* GSI llama a la función cuando se define o actualiza un objeto, antes de
ser utlizado por primera vez. Se regiatra el índice de la variable.
*/
gsí_int gsi_def_obj(obj_def_ptr, unused)
obj_def_type
*obj_def_ptr, *unused;
int i=0;
char parámetro!]="REACTOROn;
/*printf("Entrando en gsi_def_obj\n");*/
if ((obj_def_ptr->param_l.p_type!=3) || (obj_def_ptr->param_2.p_type!=3)
II (obj_def_ptr->param_3.p_typel*3)) return (GSI_FAIL);
/*printf("tipo paraml %i\n", obj_def_ptr->param_l.p_type);*/
/*printf{"Paraml: %s\n",gsi_str_of(obj_def_ptr->param_l));*/
#ifdef DEBUG
printf("%s\n", obj_def_ptr->param_l.p_value.symbolj?);
printf("%s\nB, obj_def_ptr->param_2-p_value.aymbol_p);
printf("%s\n", obj_def_ptr->param_3.p_value.symbol_p);
«endif
/* Reactores 1-3 */
for (ioO;i<3;i++>
íparámetro [7J =
49+i;
if(!strcmp(obj_def_ptr->param_l.p_value.symbol_p,parámetro)}
i f(!strcmp(obj_def_ptr->param_2.p_value.aymbol_p,"HEDIDA"))
if{!strcmp(obj_def_ptr->param_3.p_value.aymbol_p,"PH"))
indice.m_ph[i]=obj_def_ptr->obj_index;
goto bien,-
}if(!strcmp(obj_def_ptr->param_3.p_value.symbol_p,"T"))
índice.m_temperatura [i] =obj_def_ptr->obj__index;
goto bien;
}if(istrcmp(obj_def_ptr->param_3.p_value.symbol_p,"MV"))
indice.m_potencial[i]=obj_def_ptr->obj_index;
goto bien;
}if(lstrcmp{obj_def_ptr->param_3.p_value.symbol_p,"02"))
indice.m_oxigeno[i]=obj_def_ptr->obj_index;
goto bien;
}if(¡strcmp(obj_def_ptr->param_3.p_value.symbol_p,"MA"))
indice.m_mA[i J =
obj_def_ptr->obj_index;
APÉNDICES A
-19
3
DESARROLLO E IM
PIÉMENTACIÓ
N DE UN
SISTEMA SUPERVISOR
PARA LA GESTIÓ
N Y CONTROL DE E
DA
R
go
to b
ien
;iif {!
strcmp (ob
j_def _ptr->param_3 .p_value.symbol_p, "VELOCIDAD") )
(indice.m_velocidad[i]=obj_def_ptr->obj_index;
goto bien;
iif ( ¡strcmp (obj_def_ptr->param_3 ,p_value .svtnbol_p,
"NITRATOS" ) )
íindice.m_nitratos [i-t-1] =
obj_def_ptr->obj_index;
goto bien;
ïif ( latrcmp(obj_def_ptr->param_3.p_value.symbol_p,"NITRITOS"))
{Índice.m_nitritos[i+1]=obj_def_ptr->obj_index;
goto bien;
iif(¡strcmp(obj_def_ptr->param_3.p_yalue.aymbol_p,"AMONIO"))
{ind
ice
.m_
am
on
io[i+
l]=o
bj_
de
f_p
tr->o
bj_
ind
ex
;g
oto
b
ien,-
>if ( ! strcm
p (obj_def_ptr->param
_3.p_value.synibol_p, "SPOX
IGEN
O") }
(índice.m_ap_oxigeno[i]=obj_def_ptr->obj_index;
goto bien;
tif(!atrcmp(obj_def_ptr->
param_3.p_value.sym
bol_p,"SP
VE
LO
CID
AD
")){índice.m_sp_velocidad[i]=obj_def_ptr->obj_index;
goto bien;
iif(!strcmp(obj def_ptr->param_2.p_value.aymbol_p,"CONSIGNA"))
{if ( ¡atrcmp (obj_def_ptr- >param_3 .p_value. symbol__p, "O2") )
índice.c^oxigeno[iJ =obj_def_ptr->obj_index;
goto bien;
}if(¡strcmp(obj_def_ptr->param_3.p_value.symbol_p,"AGITACIÓN"))
Índice.c_veloeidad [i}
=obj_def_ptr->obj__index;
goto bien;
/* Salida del sedimentador*/
if(¡strcmp(obj_def_ptr->param_l.p_value.aymbol_p,"SALIDA"))
if ( 1 strcm
p (ob
j def_jptr->param
_2 .p_
valu
e.sym
bo
l_p
, "MED
IDA
" ) )tif
í ¡strcm
p (o
bj _
de
f_p
tr->p
ara
m_
3 .p
_v
alu
e. ay
mb
ol_
p, "N
ITR
AT
OS
") ){in
dic
e.m
_n
itrato
a[4
]=o
bj_
de
f_p
tr->o
bj_
ind
ex
;g
oto
b
ien
;.
iif(!strcmp(obj_def_ptr->param_3.p_value.symbol_p,"NITRITOS"))
indice.m_nitritoa[4]=obj_def_ptr->obj_index;
goto bien;
iif(!strcmp(obj_def_ptr->param_3.p_value.symbol_p,"AMONIO"))
índice.m_amonio[4]=obj_def_ptr->obj_index;
goto bien;
}
}/* Reactor anoxico */
if(¡strcmp(obj_def_ptr->param_l.p_value.symbol_p,"REACTORO"))
if(! stremp(obj def_ptr->param_2.p_value.3ymbol_p,"MEDIDA"))
• ( "
• • -
if(!strcmp(obj_def_ptr->param_3.p_value.aymbol_p,"NITRATOS"))
A-194
APÉNDICES
APÉN
DICE
S. C
OMUN
ICAC
IÓN
GS!
- SER
VIDOR
DE
DATO
S
indice.m^nitratos[0]=obj^def_ptr->obj_index;
goto bien;
)if
(¡st
rcm
p(o
bj_
de
f_p
tr->
pa
ram
_3
,p_
va
lue
.sy
mb
ol_
p,"
NIT
RIT
OS
"))
i ind
ice
.m_
nit
rito
s[0
]=o
bj_
de
f_p
tr->
ob
j_in
de
x;
go
to
bie
n;
(if(¡strcmp(obj_def_ptr->param_3.p_valúe.symbol jp,"AMONIO"))
indice.m__amonio [OJ =obj_def_ptr->obj_index;
goto bien;
/* PLC*/
me
mse
t(p
ará
me
tro
,O,s
ize
of(
pa
rám
etr
o))
;
if(!
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
l.p
_v
alu
e.s
ym
bo
l_p
,"P
LC
"))
if(¡strcmp(obj__def_ptr->param_2.p_value.symbol_p,"ENTRADA"})
parámetro loj »'E1;
for (i=0;i<10;i++)
{ pará
metr
o [
1]=
48
+i;
if(¡
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
3-p
_v
alu
e.s
ym
bo
l_p
,pa
ram
etr
o)}
ind
ice.m
_en
trad
as_
plc
[ij
=o
bj_
def_
ptr
->o
bj_
ind
ex
;g
oto
b
ien
;i
pa
rám
etr
o[1
]='1
';fo
r (i
= 1
0;i
<1
6;i
+ -O
í pa
rám
etr
o[2
]=4
8+
i-1
0;
if(1
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
3-p
_v
alu
e.s
ym
bo
l_p
,pa
rám
etr
o))
ind
ice
,m
_en
trad
as_
plc
ti]
=>
ob
j_d
ef_
ptr
->o
bj_
ind
ex
;goto
b
ien
;}
}
if(¡
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
2.p
_v
alu
e.s
ym
bo
l_p
,"S
AL
IDA
"))
pa
rám
etr
o[0
]='S
';fo
r
(i.
0;i<
10
;l+
+)
{ pará
metr
o [
1]=
48
+ i;
if(!
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
3.p
_v
alú
e.s
ym
bo
l_p
,pa
rám
etr
o))
índ
ice.m
_aali
das_
plc
[i]=
ob
j_d
ef_
ptr
->o
bj_
ind
ex
;g
oto
bie
n;
Î
pa
rám
etr
o[1
]='1
';fo
r (i
=1
0;i
<2
0;i
++
)í pa
rám
etr
o[2
J =
48
+i-
10
;if
(!st
rcm
p(o
bj_
de
f_p
tr->
pa
ram
_3
.p_
va
lue
.sy
mb
ol_
p,p
ará
me
tro
)}
ind
ice. m
_sa
lid
as_
plc
[i]
=o
bj_
def_
ptr
->o
bj_
ind
ex
,-g
oto
b
ien
,-
pa
rám
etr
o[1
]='2
';fo
r
<i=
20
;i<
24
;i+
+)
í pará
metr
o[2
J =
48
+i-
20
;if
(¡st
rcm
p(o
bj_
de
f_p
tr->
pa
rara
_3
.p_
va
lue
.sy
mb
ol_
p,p
ará
me
tro
)í
ind
ice.m
_sali
das_
plc
[i]
=o
bj_
def_
ptr
->o
bj_
ind
ex
;g
oto
bie
n;
APÉN
DICE
S A
-1
95
DESA
RROL
LO E
IMPL
EMEN
TAQO
N DE
UN
SISTE
MA S
UPER
VISOR
PAR
A LA
GES
TIÓN
Y CON
TROL
DE E
DAR
if(¡strcmp(obj_def_ptr->param_2.p_value.symbol_p,"HEDIDA"}}
íf(¡strcmp(obj_def_ptr->param 3-p_value.symbol_p,"ENTRADAS"))
{ indice.m_plc [O] =obj_def_ptr->obj_index,-
goto bien;
iif ( ! strcmp (obj_def__ptr->param_3 ,p_value. symbol_p, "SALIDAS" ) )
{ índice.m__plc [1] =obj_def_ptr->obj_index;
goto bien;
}
1
/* VARIOS PLANTA*/
memset(parámetro,O,sizeof(parámetro)) ;
if(¡
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
l,p
_v
alu
e.s
ym
bo
l_p
,"P
LA
NT
A")
){ if
(!st
rcm
p(ob
j_de
f_pt
r->
para
m_2
.p_v
alue
.sym
bol_
p,"M
ED
IDA
_CA
UD
AL
"))
{ pa
rám
etr
o[0
]='C
';fo
r (i
=0
;i<
3;i
++
)í pa
ram
etr
otl
]=4
8+
i;if
(!st
rcm
p(o
bj_
de
f_p
tr->
pa
ram
_3
.p_
va
lue
.sy
mb
ol_
p,p
ará
me
tro
))
ind
ice
.m_
ca
ud
ale
s[i]
=o
bj_
de
f_p
tr->
ob
j_in
de
x;
go
to b
ien
;
1
if(¡
atr
cm
p(o
bj_
de
f_p
tr->
pa
ram
_2
.p_
va
lue
.ay
mb
ol_
p,"
SP
_C
AU
DA
L")
)
pa
rám
etr
o[0
]»'C
1;
for
(i=
D;i
<3
;i+
+)
í pa
ram
etr
otl
] =
48
+i;
if(í
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
3.p
_v
alu
e.s
ym
bo
l_p
,pa
rám
etr
o))
ind
ice.c
_cau
dale
s[i)
=o
bj_
def_
ptr
->o
bj_
ind
ex
;g
oto
b
ien
;
ï
if(!
strc
mp
(ob
j_d
ef_
ptr
->p
ara
m_
2.p
_v
alu
e.s
ym
bo
l_p
,"E
ST
AD
OS
_V
AR
IOS
"))
pa
rám
etr
o[0
]='E
';fo
r (i
=0
;i<
10
;i+
+)
pa
rám
etr
o[1
]=4
8+
i;if
(!st
rcm
p(o
bj_
de
f_p
tr->
pa
ram
_3
.p_
va
lue
.sy
mb
ol_
p,p
ará
me
tro
))
ind
ice.m
_est
ad
os_
vari
o3
[iJ=
ob
j_d
ef_
ptr
->o
bj_
ind
ex
;g
oto
b
ien
;
} pa
ram
etr
otl
)='1
';fo
r
(Ía
lO;Í
<2
0;Í
++
)
í para
metr
o[2
]=4
8+
i-1
0;
if(!
stre
mp
(ob
j_d
ef_
ptr
->p
ara
m_
3.p
v
alu
e.s
ym
bo
l_p
,pará
metr
o)>
ind
ice
.m_
est
ad
os_
va
rio
s[i]
=o
bj_
de
f_p
tr->
ob
j_in
de
x;
goto
b
ien
;
if(!
Str
cm
p(o
bj_
de
f_p
tr->
pa
ram
_2
.p_
va
lue
.sy
mb
ol_
p,"
ME
DID
A_
TIE
MP
OS
"))
pa
rám
etr
o[O
J =
'T';
for
(i=
0;i
<1
0;i
++
)
A-1
96AP
ÉNDI
CES
APÉNDICES. COM
UNICACIÓN
GSI - SERVIDO
R DE DATO
S
pa
ram
etro
[l]=4
8+
i;if(!strc
mp
(ob
j_d
ef_
ptr->
pa
ram
_3
.p_
va
lue
.sym
bo
l_p
,pa
ram
etro
))
índice.tn_t lempos [i] =obj_def_ptr->obj_index;
goto bien;
ii
if(!strcm
p(o
bj_
de
f__
ptr->
pa
ram
_2
.p_
va
lue
.ay
mb
ol_
p, nS
P_
TIE
MP
OS
"))
pa
rám
etro
[0]=
'T';
for
(i=0
;i<1
0;i+
+)
{pa
rám
etro
[1]=
48
ti;if(!strc
mp
(ob
j_d
ef_
ptr->
pa
ram
_3
.p_
va
lue
.sym
bo
l_p
,pa
rám
etro
))
ind
ice.c
^tie
mp
os[i]=
ob
j_d
ef_
ptr->
ob
j_in
dex
;g
oto
b
ien
;}
iif(!strc
mp
(ob
j_d
ef_
ptr->
pa
ram
_2
.p_
va
lue
.sym
bo
l_p
,"VA
RIA
BL
E"))
para
metro
[0] =
'V •
for
(i«0
;i<1
0;i+
+)
ípa
rám
etro
[Ij =4
8+
i;if(!strc
mp
(ob
j_d
ef_
ptr->
pa
ram
_3
.p_
va
lue
.sym
bo
ljp,p
ara
me
tro))
índ
ice, in
varia
ble
[i]=o
bj_
def_
ptr->
ob
j_in
dex
;g
oto
b
ien
;
pa
rám
etro
[1]=
'1';
for
(i=1
0;l<
20
;i++
)
pa
rám
etro
[2]=
48
+i-1
0;
if(!strcm
p(o
bj_
de
f_p
tr->p
ara
m_
3.p
_v
alu
e.sy
mb
ol_
p,p
ará
me
tro))
índ
ice.m
_v
aria
ble
[i]=o
bj_
def_
ptr->
ob
j_in
dex
;g
oto
b
ien
;
if(!strcm
p(o
bj_
de
f_p
tr-:>p
ara
m_
2.p
_v
alu
e.sy
mb
ol_
p,"S
P_
VA
RIA
BL
E"))
pará
metro
[0] = ' V
;fo
r (Í=
0;Í
<1
0;Í
++
)
{pará
metro
[1] =
48
+i;
if ( !strcm
p(o
bj_
def_
jptr->
para
m_
3 .p
_v
alu
e.sy
mb
ol_
p, p
ará
metro
) )
ind
ice . c
_v
aria
ble
[i] =o
bj_
def_
ptr->
ob
j_in
dex
;•g
oto
b
ien
;i
parámetro [1]
='!' ;
for (i°iO;i<20;itt)
if ( istrcmp (obj_def_ptr->param_3 .p_value. symbol_p, parámetro) )
indice.c_variable [i J =
obj_def_ptr->obj_index;
go
to b
ien
;J
ftifdef DEBUG
printf {ngsi_de£_obj FAIL in context %d\n",current_context);
Sendif
return(GSI FAIL);
APÉNDICES A
-19
7
DESARROLLO E IM
PLEMENTAQ
ÓN
DE UN SISTEM
A SUPERVISOR
PARA LA GESTIÓ
N Y CO
NTROL DE EDAR
bien
:
Sifdef DEBUG
printf ("gsi_def_obj in context %d\n",current^context) ;
printf ("
%s, a %s registered with index %d\n",name_of(obj_def_ptr),
class_of(obj_def_ptr), obj_def_ptr->obj_index);
tfendif
return (GSI SUCCESS); '
}/***.***********.****.*********.
*
*..*,*. „.************/
/* GSI proporciona una lista de variables de las que se requieren valores.
La funciona toma los valores del sistema externo y los devuelve de la
forma en que GSI los entiende */
gsi_int gsi_get_data(obj_list, count)
°bj_type *obj_list;
gsi_int
count ;
{TIMB_ARGJTYPE argumentos[25];
struct tm *mihoral, *mihora2;
int i,j;
time_t mihora;
long int chequeo=0;
memset(argumentos,O,sizeof(argumentos));
sem_wait(semidl);
/* Esperando el semáforo 1 */
memcpy(&medidas,direccionl,sizeof(medidas));
for (i = 0,-i<200;i
+ + ) chequeo+=direccionl [ij
;memcpy(&var, &direccionl[700], sizeof(var));
sem_signal (semidl)
,- /* Deja el semáforo l*/
if (chequeo==0) return(GSI_FAILÍ;
chequeo=0;
sem_wait(semid3);
/* Esperando el semáforo 3 */
memcpy (análisis, direccions , sizeof (análisis) )
,-for (i = 0;i<200; i + + ) chequeo*=direccion3[i];
sem_signal(semid3);
/* Deja el semáforo 3*/
for
(i=0 ; i<
co
un
t ; i+-f )
{m
iho
ra=
med
idas.tie
mp
o;
mih
ora
l=lo
caltitn
e (
imih
ora
) ;a
rgu
me
nto
s[i].o
bj_
ind
ex
=o
bj_
list[i].o
bj_
ind
ex
;arg
um
en
tos[i].v
alu
é.p
_ty
pe=
FL
OA
T6
4_
TA
G;
arg
um
en
tos[ij.d
ate
.ye
ar=
(icp
_in
t)(19
00
L+
mih
ora
l->tm
_y
ea
r);arg
um
en
tos [ij .d
ate
.mo
nth
= (ic
p^
int) (lL
+tn
iho
ral->tm
_m
on
) ;arg
um
en
tos ti].d
ate
.da
y=
(icp
_in
t) (mih
ora
l->tm
_m
da
y);
arg
um
en
tos[ij,d
ate
.ho
ur=
(icp
_in
t)(mih
ora
l->tm
_h
ou
r);arg
um
en
tos[i].d
ate
.min
ute
=(ic
p_
int)(m
ino
rai->
tm_
min
);a
rgu
me
nto
s[i).d
ate
.se
co
nd
=(ic
p_
int)(m
ino
rai->
tm_
se
c);
for
(j=0
;j<3
;j++
){if
(ob
j_lia
t[i].ob
j_in
de
x=
oin
dic
e.m
_p
h[j])
arg
um
en
tos[iJ
.va
lué
.p_
va
lue
.floa
t_p
=m
ed
ida
s.p
h[j);
go
to b
ien
;}
if (o
bj_
list (i] .o
bj_
ind
ex
=s=
ind
ice.m
_te
mp
era
tura [ j
j )iarg
um
en
tos[i].v
alu
é.p
_v
alu
e.flo
at_
p=
me
did
as.te
mp
era
tura
[j];g
oto
b
ien
;}
if (o
bj_
list[i].o
bj_
ind
ex
==
ind
ice
.m_
po
ten
cia
l[j])
arg
um
en
tos[i] .v
alu
é.p
_v
alu
e.flo
at_
p=
med
idas.p
ote
ncia
l tj 1 ;
go
to b
ien,-
(if
(ob
i_lis
tli).ob
j_in
de
x=
=in
dic
e.m
o
xig
en
oljl)
{arg
um
en
tos[i].v
alu
é.p
_v
alu
e.flo
at_
p=
me
did
as.o
xig
en
o[j];
A-1
98
APÉNDICES
APÉN
DICE
S. C
OM
UNIC
ACIÓ
N G
SI -
SER
VIDO
R D
E D
ATO
S
go
to b
ien
;
if
(ob
j_li
at{
i] .
ob
j__
ind
ex=
=in
dic
e.m
_m
A[j
])
arg
um
en
tos[
i].v
alu
e.p
_v
alu
e.f
loa
t_p
=m
ed
ida
s.m
A[j
];g
oto
b
ien
;
if
(ob
j_li
at[
i].o
bj_
ind
ex
==
ind
ice
.m_
ve
loc
ida
d[j
])
arg
um
en
tos
[i]
. valu
e .p
_v
alu
e. f
lo
at_
p=
smed
idas
.v
elo
cid
ad
l j]
;g
oto
b
ien
;
if
(ob
j_li
at
[i]
.ob
j in
dex
==
ind
ice.m
sp
o
xig
en
olj
])c arg
um
en
tos
[i]
.valu
e.p
_v
alu
e. f
lo
at_
p=
med
idas.
set_
_p
oin
t_o
xig
en
o [
jî ;
go
to b
ien
;
if
(ob
j_li
st[
i].
ob
j_in
de
x=
s=in
dic
e.m
_sp
_v
elo
cid
ad
[j])
arg
um
en
tos
[i]
.valu
e.p
_v
alu
e.f
loat_
p=
med
idas.
set_
j?o
int_
velo
cid
ad
tj]
;g
oto
b
ien
;î
' -
if
(ob
j_li
st[
i].o
bj_
ind
ex
==
ind
ice
.m_
ca
ud
ale
s[j
]}
arg
um
en
tos
[i}
.va
lue
.p_
va
lue
.flo
at_
p=
me
did
as.c
au
da
les[j
];g
oto
b
ien
;
for
tj
if
=0
;j<
16
;j+
+)
(ob
j_lÎ
3t(
i].o
bj_
ind
ex
==
ind
ice
,m_
en
tra
da
s_p
lc[j
])
arg
um
ento
s[i]
.val
ue.
p_
typ
e=IN
TE
GE
R_
TA
G;
if
(me
did
as.
en
tra
da
s_p
lc[j
]==
49
)a
rgu
me
nto
s[i
].v
alu
e.p
_v
alu
e.i
nte
ge
r_p
=l;
els
e
arg
um
en
tos[
i].v
alu
e.p
_v
alu
e.i
nte
ge
r_p
=0
;g
oto
b
ien
;i
for (j=0;j<24;j
íf(o
bj_
list[
ij.o
bj_
ind
ex
==
ind
ice
.m_
sa
lid
as_
plc
[j])
arg
um
ento
s[i]
.val
ue.
p_
typ
e=IN
TE
GE
R_
TA
G;
if
(me
did
as.
sali
da
s_p
lc{
jj =
=4
9)
arg
um
en
tos[i
].v
alu
e.p
_v
alu
e.i
nte
ger_
p=
l;els
e ar
gum
ento
s [i
] .v
alu
e .p
_v
alu
e. in
teg
er_
_p
=0
;g
oto
b
ien
;
j_list(i].obj_index==indice.m_plc[0])
int k;
int valor=0;
argumentos[i].valué.p_type=INTEGER_TAG;
for (k=0;k<16;k++)
{ if {medidas.entradas_plc(kl==49)
valor=valor ¡ (IL « k);
argumentos ti).valué.p_value.integer_p=valor;
goto bien;
ij_list[i].obj_index==indice.m_plc[li)
int k;
int valor=0;
argumentos [i) .valué.p_type=INTEGER_TAG;
for (k=0;k<24;k++)
f if (medidas.salidas_plc[kj==49Í
valor=valor | (IL « k);
}argumentos[i).value.p_value.integer_p=valor;
APÉN
DICE
S A
-199
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN
DE
UN S
ISTC
MA
SUPE
RVIS
OR P
ARA
LA G
ESTI
ÓN
Y C
ONTR
OL D
E ED
AR
go
to b
ien
;
for
(j.0
;j<
20
,-jt
<.|
{ if
(ob
j_li
st[
i] .
ob
j_in
dex
= =
ind
ice.m
_est
ad
os
vari
os
[jl)
i arg
um
en
tos
[i]
.valu
é ,
p_ty
pe=
IKT
EG
ER
__T
AG
;arg
um
en
tos
[i]
.valu
é .p
_v
alu
e. in
teg
er_
p=
med
idas
.est
ad
os_
vari
os
[ j]
-48
;g
oto
b
ien
;
for
(j=
0; j
<1
0; j
-t-O
( if
(ob
j_li
st[
i].o
bj_
ind
ex
==
ind
ice
.m
tie
mp
os
(jjï
{ arg
um
en
tos
[i]
.val
ué.
p_
typ
e=IN
TE
GE
R_
_T
AG
;arg
um
en
tos[
i] .
valu
é.p
_v
alu
e.i
nte
ger_
p=
med
idas.
tiem
po
s[j1
;g
oto
b
ien
;}
for
(j=
0;j
<2
0;j
++
>{ if
(o
bj_
list[
i].o
bj_
ind
ex
==
ind
ice
.m_
va
ria
ble
[j]}
{ if
(var.
t_v
ari
ab
le [
j] =
.=.0
) /*
N
o e
xis
te
med
ida
*/
( arg
um
en
tos[
i].e
rro
r_cd
=1
0;
arg
um
en
tos(
i].v
alu
é.p
_ty
pe=
NU
LL
_T
AG
;g
oto
b
ien
;>
arg
um
en
tos[i
j.v
alu
é.p
_v
alu
e.f
loa
t_p
=v
ar.
va
ria
ble
(j];
mih
ora
2=
localt
ime(
&(v
ar.
t_v
ari
ab
le[j
])
) ;
arg
um
en
tos[
iJ.v
alu
é.p
_ty
pe
=F
LO
AT
64
_T
AG
;a
rgu
me
nto
s[i]
.da
te.y
ea
r=(i
cp
_in
t)(l
90
0L
+m
iho
ra2
->tm
_y
ea
r)a
rgu
me
nto
s[ij
.da
te.m
on
th=
(ic
p_
int)
(lL
+m
iho
ra2
->tm
_m
on
);a
rgu
me
nto
s[i]
.da
te.d
ay
=(i
cp
_in
t)(m
iho
ra2
->tm
_m
da
y);
arg
um
en
tos[
i],d
ate
.ho
ur=
(ic
p_
int)
(mih
ora
2->
tm_
ho
ur)
;a
rgu
me
nto
s[i]
.da
te.m
inu
te=
(ic
p_
int)
(mih
ora
2->
tm_
min
);a
rgu
me
nto
s[i]
.da
te.s
ec
on
d=
(ic
p_
int)
(mih
ora
2->
tm_
sec
);g
oto
b
ien
;
for (j=0; j<5; j++)
f if (obj_list[i].obj_index==indice.m_nitratos [j])
i if (análisis[j].t_nitratos=°0) /* No existe medida */
{ arg
um
en
tos[
i].e
rro
r_cd
=1
0;
arg
um
en
tos[
i].v
alu
é.p
_ty
pe=
NU
LL
_T
AG
;g
oto
b
ien
;}
arg
um
en
tos[i
].v
alu
e.p
_v
alu
e.f
loa
t_p
=a
na
lisis
(j].
nit
rato
s;
mih
ora
2=
localt
ime(
&(a
na
lisis
[j].
t_n
itra
tos)
};
arg
um
en
tos[
i].v
alu
é.p
_ty
pe=
FL
OA
T6
4JT
AG
;a
rgu
me
nto
s[il
.da
te.y
ea
r=(i
cp
_in
t)(1
90
0L
+m
iho
ra2
->tm
_y
ea
r);
arg
um
en
tos
[il
.date
.mo
nth
=>
(icp
_in
t) (
lL'+
mih
ora
2->
ttn
_m
on
) ;
arg
um
en
tos[
i].d
ate
.da
y=
(ic
p_
int)
(mih
ora
2->
tm
md
ay
);a
rgu
me
nto
s[i]
.da
te.h
ou
r=(i
cp
_in
t)(m
iho
ra2
->tm
_h
ou
r);
arg
um
en
tos[
i].d
ate
.min
ute
=(i
cp
_in
t)(m
iho
ra2
->tm
_m
in);
arg
um
en
tos[
i].d
ate
.se
co
nd
=(i
cp
_in
t)(m
iho
ra2
->tm
_se
c);
go
to b
ien
;i
if
(ob
j_li
st[
i].o
bj_
ind
ex
==
ind
ice
.m
nit
rit
os(j]
ïi if (análisis[j].t nitritos==0) /• No existe medida •/
{ argumentos[i].error_cd=10;
argumentos(ij.valué.p_type=KULL_TAG;
goto bien;
A-2
00
APÉN
DICE
S
APÉND
ICES. C
OM
UN
ICAC
IÓN
GS
I - SERVID
OR
DE
DATOS
arg
um
en
tos[i).v
alu
é.p
_v
alu
e.flo
at_
p=
an
alis
ig[jj.n
itritos;
mih
ora
2=
localtim
e(
&(a
na
lisis
[j]
.t_n
itrito
s)
);
arg
um
en
tos[i].v
alu
é.p
_ty
pe=
FL
OA
T6
4_
TA
G;
arg
um
en
tos[i].d
ate
.ye
ar=
(icp
_in
t)(19
00
L+
mih
ora
2->
tm_
ye
ar);
arg
um
en
tos[i].d
ate
.mo
nth
=(ic
p_
int)(lL
+m
iho
ra2
->tm
_m
on
);arg
um
ento
s [i] .date
.day
s(ic
p_
int) (m
iho
ra2
->tm
_m
day
) ;arg
um
en
tos [ij .d
ac
e.h
ou
r=(ic
p_
int) (m
iho
ra2->
tm_
_h
ou
r) ;a
rgu
me
nto
s[ij.d
ate
.min
ute
=(ic
p^
int)(m
iho
ra2
->tm
_m
in);
arg
um
en
tos[i].d
ate
.aeco
nd
=(ic
p_
int)(m
iho
ra2
->tro
_sec);
goto
b
ien
;}
if (o
bj_
list[i].o
bj_
ind
ex
==
ind
ice.m
_am
on
ioíjj)
if (a
ná
lisis
[j].t_a
mo
nio
==
0)
/*
No
ex
iste
m
ed
ida
*/
íarg
um
en
tosti].e
rror_
cd
=1
0;
arg
um
en
tos [ij .v
alué.p
_ty
pe=
NU
LL
JTA
G;
go
to b
ien
,-}
arg
um
en
tos [i] . v
alu
e.p
__
valu
e.f lo
at_
_p
=an
alisis tj] .a
mo
nio
;m
iho
ra2
=lo
ca
ltíme
( tla
na
lisis
[j].t_a
mo
nio
) );
arg
um
en
tos[i].v
alu
é.p
_ty
pe=
FL
OA
T6
4_
TA
G;
arg
um
en
tos [i] .d
ate
.year=
(icp
_in
t) (19
00
L+
mih
ora2
->tm
__
year) ;
arg
um
en
tos [i] -d
ate
.mo
nth
= (ic
p_
int) (lL
-t-mih
ora2
->tm
__
mo
n) ;
arg
um
en
tosti],d
ate
.da
y=
(icp
_in
t)(mih
ora
2->
tm
md
ay
);arg
um
en
tosIi].d
ate
.ho
ur=
(icp
_in
t)(mih
ora
2->
tm_
ho
ur);
arg
um
en
tos [i]
.da
te.m
inu
te=
(icp
_in
t) (mih
ora
2->
tm_
min
) ,-a
rgu
me
nto
s[i].d
ate
.se
co
nd
a(ic
p_
int)(m
iho
ra2
->tm
_se
c);
goto
bie
n;
tfifdef D
EB
UG
prin
tf ("g
si__
get_
data
FA
IL
in co
nte
xt
%d
\n", c
urre
nt_
co
nte
xt)
;
tfen
dif
retu
rn(G
SI_
FA
IL);
bie
n:
ftifdef DEBUG
ííendif
Sifd
ef
DE
BU
Gfo
r (i=
0; i<
cou
nt; i+•-*•)
prin
tf("O
bj:
%i
Ho
ra:
%2
i %
2i
%2i
Valo
r: *
f\n"
,arg
um
en
tosti].o
bj_
ind
ex
, a
rgu
me
nto
s[il.d
ate
.ho
ur,
arg
um
en
tosti]-d
ate
-min
ute
, arg
um
en
tos[i].d
ate
.seco
nd
,a
rgu
me
nto
sti].v
alu
e.p
^v
alu
e.flo
atjp
);
prin
tf ("
gsi
get_
data
in
conte
xt
%d
\n",c
urre
nt_
co
nte
xt);
ffend
if
gsi ret_tvals(argumentos,count);
return (GSI_SUCCESS);
/***********.*****»**•******•***********»,A****»**»**************»**********/
/* GSI proporciona una lista de consignas. La función debe comunicarse con
gsi_int gsi_set_data(obj_list( count)
~obj_type *obj_list;
gsi_int
count;
íint i,j;
sem_wait(semid2);
/* Esperando el semáforo 2 */
memcpy(&consignas/direccion2,sizeof(consignas));
sem_signal(semid2);
/* Deja el semáforo 2*/
for
(i = 0
; i<co
un
t; Í+-O
i ___
.......... - --
- - - -
- --
-APÉNDICES A
- 201
DESARROLLO
E IM
PLEMEN
TACIÓ
N D
E U
N SISTEM
A SU
PERVBO
R PARA LA
GESTIÓ
N i C
ow
reot D
E E
DA
R
if (o
bj_
list[
i].o
bj
ind
ex
==
ind
ice
.c
ox
ige
no
(jl){co
nsig
nas.c
am
bio
_o
xig
en
o íj]
='1
'; * -
-
if (o
bj_
list[i].va
lué
.p_
typ
e=
=F
LO
AT
64
_T
AG
)co
nsig
nas.v
alo
r_o
xig
en
o íj] =
ob
j_lis
t(i].vaíu
e.p
_v
alu
e.flo
at_
p;
if {
ob
j_list[i].v
alu
e.p
_ty
pe=
=IN
TE
GE
R_
TA
GÏ
co
nsig
nas.v
alo
r_o
xig
en
o[j]=
(do
ub
le) o
bj_
list [i] . v
alu
é.p
_v
alu
e . in
teg
er_
_p
;g
oto
b
ien
;}
if (o
bj
listfi]-o
bj_
ind
ex
==
ind
ice.c
_v
elo
cid
ad
[j))
{co
nsig
na
s.c
am
bio
_a
gita
cio
n[j]=
'1';
if ío
bj_
list [ij .v
alu
é.p
_ty
pe«F
i-OA
T64_T
AG
)co
nsig
nas. v
alo
r_ag
i t ació
n [j] =
ob
j lis
tfi]
.va
lué
.p
valu
e.flo
at_
p;
if (o
bj_
list [i7
.valu
e.p_ty
pe=
="ÍN
TE
GE
R_T
AG
)co
nsig
nas.v
alo
r_ag
itacio
n[j]=
(do
ub
le)o
bj_
lÍ3t [i] . v
alu
é.p
_v
alú
e. in
teg
er_
_p
;goto
bie
n;
}if
(ob
j_lis
t[i].ob
j_in
de
x=
=in
dic
e.c
_c
au
da
les[j])
{co
nsig
na
s.c
am
bio
_c
au
da
les[j]=
'1';
if (o
bj_
list[i].valu
é.p
_ty
pe=
=F
LO
AT
64
_T
AG
)co
nsig
nas.v
alo
r_cau
dale
s [j] =o
bj_
list[i].v
alu
e.p
_v
alu
e.flo
at_
p;
if (o
bj_
list[
i] .valu
é.p_
typ
e==
INT
EG
ER
__
TA
G)
co
nsig
nas.v
alo
r_cau
dale
s[j J =
(do
ub
le)o
bj_
list[i].v
alu
é.p
_v
alu
e.in
teg
er_
p;
go
to b
ien
;)
jfo
r (j«
0:j<
lo,-j+
i.)(if
(ob
j lis
t[i].ob
j_in
de
x=
=in
dic
e.c
tie
mp
os[j])
( ~
co
nsig
na
s.c
am
bio
_tie
mp
os[j]=
'i';
if (o
bj_
list[i].va
lué.p
_ty
pe=
=F
LO
AT
64
_T
AG
)co
nsig
nas.tie
mp
os[j] = (
int)
ob
j_lis
t [i] .v
alu
é.p
_v
alu
e.flo
at_
p;
if Ío
bj_
li3t[ij.v
alu
é.p
_ty
pe
==
INT
EG
ER
_T
AG
)co
nsig
nas.tie
mp
os[jj =
ob
j_lis
t[ij.valu
é.p
_v
alu
e.in
teg
er_
p;
go
to b
ien
;}
for
ij.0;j<
20
;j**
){if
(o
bj_
list[
ij.ob
j in
dex
«=
ind
ice.c
_v
aria
ble
[j])
{ -
'co
nsig
nas .c
am
bio
_v
aria
ble
[j] = ' l ' ;
if (o
bj_
list[i].va
lué
.p_
typ
e=
=F
LO
AT
64
_T
AG
)co
nsig
nas.v
alo
r_v
aria
ble
[j]=o
bj_
list[i].v
alu
e.p
_v
alu
e.flo
at_
p;
if [o
bj_
list[i].valu
é.p
_ty
pe=
=IN
TE
GE
RJT
AG
)co
nsig
nas, v
alo
r__
varia
ble
[j] =(d
ou
ble
)ob
j_lis
tIi].va
lué
.p_
va
lue
.inte
ge
r_p
;goto
b
ien
;
sem_wait(semid2);
/* Esperando el semáforo 2 */
memcpy (direccion2, Sconsignas, sizeof (c_onsignas) ) ; . . .
sem_signal (semíd2) ;"'
/'Deja el semáforo 2*/
A-202
APÉNDICES
AP
ÉN
DIC
ES
. C
OM
UN
ICA
CIÓ
N G
SI
- S
ER
VID
OR
DE
DA
TOS
ttifd
ef
DEB
UG
pri
ntf
("
gsi_
set_
data
in
co
nte
xt
%d
\n",c
urr
en
t_c
on
tex
t);
flen
dif
retu
rn
(GS
I S
UC
CE
SS
);
/**••***•***•** ............... ************ ..... *..*, ........................ /
/* Función que ejecuta GSI para que el sistema externo deje de obtener datos
para enviárselos a G2 */
gsi_int gsi_pause_context ()
ítifdef DEBUG
printf ("gsi_pause_context in context %d\n" , current_context ) ;
ftendifreturn (GSI_SUCCESS) ;
/* Función que ejecuta GSI para que el sistema externo vuelva a obtener datos
para enviárselos a G2 */
gsi_int g3i_resume_context ()
í Bifdef DEBUG
printf ("gsi_resume_context in context %d\n" , current_context) ;
Sendif return (GSI_SUCCBSS) ;
} /***'»*** .............. ***** ......... *****.***..*..* .............. **********/
/* Función que GSI utiliza para que el sistema externo deje de adquirir datos
y para realizar las acciones necesarias para finalizar este programa */
gsi_int gsi_shutdown_context ()
{ if (shmdt (direccionl) < 0)
err_sys { "gsi_jb: No puedo soltar la memoria compartida l\n");
if (shmdt (direccion2) < 0)
err_sys("gsi_jb: NO puedo soltar la memoria compartida 2\n");
if (shmdt (direccions) <
0)
err_sya ("Migsi ; No puedo soltar la memoria compartida 3\n") ;
sem_close (semidl) ;
sem_close (setnid2) ;
sem_close (semid3) ;
ítifdef DEBUG
printf ("gsi_shutdown_context in context %d\n" , current_context) ;
ttendifreturn (GSI_SUCCESS) ;
/* Función llamada anteriormente "gsi_accept_data ( ) " .
Es utilizada por GSI para mandar a G2 datos no solicitados. */
gsi_
int
gsi_
g2
_p
oll
{)
{ ch
ar
men
saje
_cl
ien
te[T
AM
AN
Y_
M] ;
int
i =
O ;
sem_wait (semidl)
,-
/* Espera el semáforo 1 */
memcpy ( mensaje_cliente, &direccionl (500] , sizeof (mensaje_cliente) ) ;
sem_signal (semidl) ;
/* Deja el semáforo 1 */
if (mensaje_cliente [O] í=0)
{ while (mensaje_cliente [ij 1=10 4& i< (TAMANY_M-2> ) Í++-;
mensaje_cliente fi+1) =0;
gsi_ret_msg(mensaje_cliente, sizeof (mensaje_cliente) ) ;
sem_wait (semidl) ;
/* Espera el semáforo 1 */
memset (tdireccionl [500] , O, sizeof (mensaje_cliente> ) ;
sem_signal (semidl) ;
/* Deja el semáforo 1 */
APÉN
DICE
S A
- 2
03
DESA
RRO
LLO
E IM
PLEM
ENTA
CIÓ
N D
E UN
SIS
TEM
A S
UPER
VISO
R P
ARA
LA G
ESTI
ÓN
Y C
ONT
ROL
DE E
DA
R
ififdef DEBUG
printf ("\ngsi_g2_poll in context %d\n" ,current_context) ;
Sendif
..
..
..
return (GSI SUCCESS) ;
/* GSI utiliza esta función para que el sistema externo deje de tomar datos
de una variable, cuando cambia sus características o deja de existir */
gsi_int gsi_stop_data(obj_lÍ3t, count)
obJ_type *obj_list; ~
gsi int
count;
{ ífifdef DEBUG
printf ( "gsi_stop_data in context %d\n" ,current_context) ;
Jfendifreturn (GSI_SUCCESS) ;
/* Función llamada anteriormente "gsi_rd_txt () " .
Cuando G2 manda un mensaje a GSI, esta función debe encargarse de
redirigirlo al sistema externo */
gsi_int gsi_send_message (message, length, obj_index)
char
'message ;
gsi int
length;
gsi_int
obj_index;
{ Sifdef DEBUG
printf ("gsi_send_message in context %d\n" ,current_context) ;
printf ("G2 says: %s\n" .message) ;
itendifreturn (GSI_SUCCESS) ;
} /********** ......... *...**.*.*.**.***.********..************ ....... **.,.**.*/
/* GSI llama 50 veces por segundo a esta función para realizar tareas si
*DO_EXT_PROC es TRUE */
gsi_int allow_ext_proc ()
8ifdef DEBUG
printf ( "allow_ext_proc in context %d\n" , current_contextï ;
ífendifreturn (GSI_SUCCESS) ;
/* Función que registra las funciones RPC que G2 puede pedir a GSI •/
gsi_int InitUsrRpcs()
return(GSI SUCCESS);
Î /* rpc definido para lanzar una alarma en la SUN */
gsi_int alarma(arguments, count, call_index)
rpc_arg_type "arguments ;
gsi int count, call_index;
{ Sifdef DEBUG
printf ("rpc alarma in context %d\n",current context);
tfendif
system(Bamp /quantum/juan/mp3/Van* &");
return(GSI SUCCESS);
A-204
APÉNDICES
APÉNDICES. COM
UNICACIÓN
GSI - SERVIDO
R D
E DATO
S
gsi_main.c
-- Sample main function to link with GSI toolkit.
This is a functional main which is used to link with skeleton.c and other
GSI example programs. Feel free to use this main as is, or modified to
suit your needs.
Although this software has been extensively tested, Gensym cannot
guarantee error-free performance in all applications.
Accordingly,
use of the software is at the customer's sole risk.
29jul93
!
*/
Sinelude "gsi.h"
/* Note, icp.h is included by gsi.h. */
extern gsi_int alarma() ;
main(argc, argv)
int
argc;
char *argv [] ;
(gsi_int status;
/** Specify GSI run-time options, if any...
** Unless specified otherwise, GSI uses D floats under VAX/VMS, and
*
IEEE floats under Alpha/OpenVMS, in both VMS systems, G floats may
* be specified as a run-time option.
In the code below the selection
* of floating point format is automated for VMS platforms via the use
* of the symbol CCSgfloat. CC$gfloat is set on VAXen when this file
* has been compiled with the /G_FLOAT option, and is set by default on
* Alphas (we have chosen IEEE as the default in all GSI example code).
* Although off by default, GSI_ONE_CYCLB is explicitly reset to
* demonstrate how options are turned off.
*/
8
ifdef vms
ft
if CCSgfloat
gsi set_option(GSI USE_GFLOATS)
,-8
endif
8
endif
gsi_reset_option(GSI_ONE_CYCLE) ;
/* gsi_reset option (ICP_USE RPCS)
,-/* gsi_set_option(ICP_RPC_ARRARGSÏ;
Por ahora no hay RPCs */
Nuevo modo G2-GSI RPC */
Set the version control variables to the values defined in gsi.h
Though optional, this is recommended to ensure version consistency
between the GSI object libraries, and the GSI and ICP include
files used to compile your application code.
gai_include_file_major_version
gsi_include_file_minor_ver3ion
icp_include_file_major_ver9ion
icp_include2file_minor_yergion
GSI_INCLUDE_MAJ_VER_NUM;
GSI_INCLUDE_MIN_VER_NUM;
ICP_INCLUDE_MAJ_VER_NUM;
ICP_INCLUDE_MIN_VER_NUM;
/* Registro de las RPC declaradas en gsi_jb */
if ( gsi_rpc_declare_local ( alarma, "ALARMA") !=
GSI_SUCCESS)
exit(l);
* Initialize GSI and enter the event handler loop.
*/status
gsi_start(argc, argv);
Since the GSI_ONE__CYCLE option is not set, gsi__start() never returns.
If GSI_ONE_CYCLE were set, gsi_start() would return after setup
and one iteration of the GSI event loop. When using the GSI_ONE_CYCLE
option, subsequent calls to gsi_run_loop() are required after the initial
call to gsi start() in order to allow GSI to react to messages from
G2 and to make calls to the user code funcitons. An example implementation
APÉNDICES A
- 205
DESARROLLO E IM
PLEMENTAQ
ON
DE UN SISTEM
A SUPERVISO
R PARA LA G
ESTIÓN
Y CONTRO
L DE EDAR
* is provided below (commented out). The function scan_and_react() is a
* hypothetical function that interacts with some other process and GSI.
*//* do {status « gsi_run_loop();
status = scan_and_react(status);
} while (status «- GSI_SUCCESS);
*/return 0 ;
} /* end main */
A-206
APÉNDICES
••••••••••••••••••••••••••••<
/*
Mis
cell
an
eo
us
mac
ros
«d
efi
ne
max
(A
, B
) ((
A)
>
{B)
? (A
) :
(B)
)
«if
nd
ef
min
«d
efi
ne
min
(A,.
B
) í
(A)
>
(B)
? (B
) :
(A))
.
.it
en
dif
/*
Mo
st
of
the
foll
ow
ing
typ
ed
efs
an
d d
efi
nes
sup
po
rtth
e
old
n
amin
g co
nv
en
tio
ns
for
the
data
str
uctu
res
defi
ned
ab
ov
e.
Som
e p
rov
ide ali
ases
for
mu
lti-
pu
rpo
se s
tru
ctu
res
typ
ed
ef
ob
j d
ef
typ
e
*o
bj_
def_
ptr
_ty
pe;
typ
ed
ef
ob
j v
alu
e
typ
e
arr
ay
_v
alu
e_
typ
e;
typ
ed
ef
icp
valu
e u
nio
n
ICP_
VA
LU
E;
typ
ed
ef
ob
j_ty
pe
TE
MP_
AR
G_T
YPE
;ty
ped
ef
ob
j_v
alu
e_
typ
e
TE
MP_
PAR
AM
;ty
ped
ef
ob
j_v
alu
e_
typ
e att
r_v
alu
e_
typ
e;
typ
ed
ef
ob
j v
alu
e t
yp
e
rpc_
ar9
_ty
pe;
typ
ed
ef
icp
valu
e u
nio
n
TE
MP_
VA
LU
E;
typ
ed
ef
tim
ed
_o
bj_
typ
e T
IME
_AR
GJT
YPE
;ty
ped
ef
att
r_ty
pe
V
EC
TO
RJT
YPE
;ty
ped
ef
t im
ed
_att
rety
pe
T
_VE
CT
OR
_TY
PE;
typ
ed
ef
icp
ti
mest
am
p_
typ
e T
IME
STA
MP;
typ
ed
ef
vo
id
*u
ser_
def_
typ
e;
typ
ed
ef
vo
id
*u
ser_
ptr
ty
pe;
typ
ed
ef
icp
in
t o
bj
ind
ex ty
pe,
tag
_ty
pe ,
sta
tus_
typ
e,
inte
rval_
typ
e ;
APÉN
DICE
S A
-21
1
'11 • • •:*;• • • • • • • • • •••••••••••••••
ex
tern
v
oid
g
si_
s t_
att
r{)
;ex
tern
v
oid
g
si
s t
ob
j in
de
xí)
;ex
tern
v
oid
g
si
s t
sta
tus
() ;
ex
tern
vo^
9
si_
s t_
att
r na
m u
.
ex
tern
v
oid
g
si
s t
att
r ti
me
O;
ex
tern
v
oid
g
si
s t
typ
e (
) ;
ex
tern
v
oid
g
si
s t_
int
( ) ;
ex
tern
v
oid
_
gsi
_s
t_lo
g()
;ex
tern
v
oid
g
si
s t
flt
()
;ex
tern
v
oid
g
si_
s t_
sym
() ;
ex
tern
void
g
si_
s t_
str
();
ex
tern
b
oo
lean
gsi
_co
nte
xt_
receiv
ed
_d
ata
t) ;
/*
Th
e f
oll
ow
ing
defi
nes
all
ow
y
ou t
o
use
th
e
- */
«d
efi
ne
flu
sh_
po
int
icp
_f
lush
jpo
int
«d
efi
ne
DO
_EX
T_P
RO
C
do
_ex
t_p
roc
*
«d
efi
ne
Set
lcp
Mo
de
(x)
(icp
_o
pti
on
s =
icp
_o
pti
on
s |
x)
«d
efi
ne
Rese
tlcp
Mo
de(x
) (i
cp
_o
pti
on
s = ic
p_
op
tio
ns
&
(-x
) )
«d
efi
ne
Test
lcp
Mo
de(x
) {ic
p o
pti
on
s &
x)
«d
efi
ne
ENA
BLE
E
XT
PR
OC
O
*do
ex
t_p
roc
*
TR
UE
«d
efi
ne
CO
RR
J3B
JJT
YP
E
Co
r_
ob
j_ty
pe
«d
efi
ne
str
_p
tr_
of
(x)
gs
_st
r_o
f (x
)«
defi
ne
sym
_p
tr_
of
(x)
gs
_sy
m_
o£
(x)
«d
efi
ne
gsi
_u
ser_
def_
of
(x,y
) ,
gs
_u
ser_
ptr
_o
f (x
,y)
«d
efi
ne
gsi
se
t u
ser
de
f{x
,y,z
) gs
_set_
user_
ptr
(x
,y,
2)
/*
Th
e f
oll
ow
ing
d
efi
ne
s all
ow
sh
ort
er
(wit
ho
ut
'gsi_
' p
refi
x)
nam
esfo
r access
fu
ncti
on
s to
b
e u
sed
. P
refi
xes
were
ad
ded
to
p
rote
ct
ag
ain
st
nam
e co
llis
ion
s
whe
n li
nk
ing
w
ith th
ird
p
art
y
pro
du
cts
.
«d
efi
ne
typ
e
of(
x)
gsi
ty
pe
o
f (x
)«
defi
ne
nam
e o
f (x
) g
si_
nam
e_o
f (x
A-
212
APÉN
DICE
S
•
APÉN
DICE
S. C
OM
UNIC
ACIÓ
N G
SI -
SER
VIDO
R D
E D
ATO
S
File name:
Owner:
Purpose :
This file depends on:
Dependent files :
Legal Notice:
History:
gsi .h
Peter Pandel
This include file serves to define the various
structure types and contants required by GSI user
applications.
icp. h
All GSI modules and their end-user applications.
Copyright (C) 1993, Gensym Corp.,
125 CambridgePark Drive, Cambridge MA 02140
All rights reserved.
18feb93
PAF Created
Olfeb95 PAF Simplified version numbering system.
23mar95
PAF Added alias for icp tiraestamp_type
«include "icp.h"
/* These declarations are used for optional version control.
«define GSI_INCLUDE_MAJ_VER_NUM
«define GSI INCLUDE MIN VER NUM
3L2L
extern gsi_int gsi_include_file_major_version;
extern gsi_int gsi_include_f ile_minor_version,-
/* Maximum size for a local function name being exported to G2.
«define MAX LOCAL FUNC_NAME
128L
DESA
RROL
LO E
IMPL
EMEN
TAQ
ÓN
DE
UN S
ISTE
MA
SUPE
RVIS
OR P
ARA
IA G
ESTI
ON
Y C
ONT
ROL
DE E
DAR
«define
«define
«define
«define
«define
«define
«define
«define
«define
«define
«define
«define
LoadUsrRpc{x,y, z)
g2_start_rpc(x, y, z)
g2__call_rpc (x,y, z)
getgsiport()
gsi_init_ds(x,y)
gsi_pause_ds()
gsi_resume_ds() .
gsi_shutdown()
gsi_accept_data()
gs i_rd_txt(x,y,z)
GSI_FAIL
GSI PORT NUM
gsi_rpc_declare_local(x,y)
gsi_rpc_start(x,y,gsi_current_context)
gsi_rpc_call(x,y,gsi_current_context)
gsi_get_tcp_port()
gsi_initialize_context(x,y)
gsi_pause_context()
gsi_resume^context()
gsi_3hutdown_context()
gsi_g2_poll()
gsi_send_message(x,y,z)
GSI_FAILURE
OL
typedef icp_int gspan int;
/* These declarations are used for optional version control.
*/«define ICP_INCLUDE MAJ VER HUM
3L
«define ICP_INCLUDE_MIN_VER_NUM
2L
extern icp_int icp_include__f ile__major_version;
extern icp_int icp_include_f ile_minor_version;
«define NULL TAG
OL
«define INTEGER TAG
OxOlL
«define SYMBOL_TAG
Ox03L
«define STRING TAG
OxD4L
«define LOGICAL_TAG
OxOSL
«define FLOAT64_TAG
Ox06L
«define ITEMJTAG
OxOSL
«define MAX_TYPE_TAG
OxOSL
«define NO ERR
OL
«define MAX_ATTR_NAME_SIZE
256L
«define ICP TRUE
1000L
«define ICP_FALSE
-1000L
«define MIN_G2_INTEGER
-536870912L
«define VOID_INDEX
-IL
«define ICP_PORT_NUM
22041L
«define UNDEFINED CONTEXT
OxFFFFFFFFL
«ifdef HSDOS
«
define MAX CONTEXTS
10L
«else
«
define MAX CONTEXTS
50L
«endif
APÉNDICES A - 209
obj_value_type param_5;
obj_value_type param_6 ;
icp_int
. interval;
} obj_def_type;
typedef struct {
obj_def_type *obj_ptr;
union {
icp__int user_long;
void
*user_ptr;
} user_def ;
icp_int tag;
} corr_obj_type;
typedef struct {
icp_int
obj_index;
icp_int
error_cd;
icp_int
interval;
obj_value_type value;
ï obj_type;
typedef struct {
icp int year;
icp int month;
icp int:
hour;
icp_int minute;
icp int second;
} icp timestamp_type;
typedef struct at {
char
attribute [MAX_ATTR_NAME_SIZE] ;
obj_value^type value;
} attr_type;
typedef struct {
char
attribute [MAX_ATTR_NAME_SIZE] ;
obj_value_type
value;
A - 210 APÉNDICES
«d
efin
e le
ng
th_
of(x
>«
de
fine
set
typ
e(x
,y)
«d
efin
e
int
of(x
)«
defin
e lo
g
of (x
)«
de
fine
f lt_o
f (x)
«d
efin
e sym
_of (x)
«d
efin
e str_
of (x
)«
de
fine
se
t_in
t(x,y
)«
de
fine
set
log
(x,y
)«
de
fine
se
t_flt{
x,y
)«
de
fine
set_
sytn
(x, y
)«
de
fine
se
t_str(x
,y)
«d
efin
e o
bj_
ind
ex
_o
f (x)
«d
efin
e se
t_o
bj_
_in
de
x(x
,y)
«d
efin
e st
tus
of (x
)«
defin
e
se _
st tu
s(x
,y)
«d
efin
e in
erv
l_
of (x
)«
defin
e se
_
in
erv
al(x
,y>
«d
efin
e d
e at
1 o
f (x)
«d
efin
e d
ef
at
2 o
f (x)
«d
efin
e d
ef
at
3
of(x
)«
defin
e d
ef at
4
of (x
)«
defin
e d
ef
at
5 o
f (x)
«d
efin
e d
ef
attr
6
of (x
)«
defin
e o
bj_
of(x
)«
defin
e v
alu
e_
of(x
)
-
- -
«d
efin
e attr_
of (x
)«
defin
e set_
attr (x
,y)
«d
efin
e a
ttr n
ame
of (x
)«
defin
e se
t_attr_
nam
e (x
,y)
«d
efin
e tim
e o
f (x)
«d
efin
e attr_
time_
of (x
)
«d
efin
e
set
is_tim
ed
(x,y
)
APÉNDICES. COMUNICACIÓN GSI - SERVIDOR DE DATOS
gsi
cla
ss_o
f(x)
gsi_
len
gth
_o
f (x)
gsi_
set_
typ
e (x
, y)
gsi_
int_
of (x
)gsi
log
o
f(x)
gsi_
flt_o
f (x
)g
si_sy
m_
of (x
)g
si_
st
_o
f (x)
gsi
se
int
x,y
)g
si__
se _
log
(x,y
)g
si_se
_
flt (x
,y)
gsi_
se
_sy
m(x
,y}
gsi
se _
str(x
,y)
gsi_
ob
j_in
dex
_o
f (x)
gsi_
set_
ob
j_in
dex
{x, y)
gsi_
statu
s_o
f (x)
gsi
set_
sta
u
s(x
,y)
gsi_
inte
rva
_
of (x
)g
si_
set_
int
rva
ltx.y
)
gsi
def
att
2
of (x
)
gsi
def
att
4 o
f (x)
gsi_
def_
att
S_
of{
xî
gsi
def
att
6 o
f (x)
gsi_
ob
j_o
f( )
gai
valu
e
of (x
)
gsi_
attr_
of (x
)g
si_
set_
attr (x
, y)
gsi_
attr_
nam
e_
of (x
)g
si_
set_
attr
name (x
, y)
gsi
time
of (x
)
gsi_
attr_
time_
of (x
)
gsi_
set_
is
timed
(x^l -
^^
^.-
^-
^^
-^ .^
^.
DESARROLLO E IMPLEMENTAQÓN DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
SEM
ÁFO
RO
. C
- FU
NC
ION
ES
PAR
A
LA
UT
ILIZ
AC
IÓN
D
E SEM
ÁFO
RO
S
UL
TIM
A
RE
VIS
ION
: S/6
/97
«in
clu
de
<std
io.h
>«
inclu
de
<sy
s/typ
es.h
>«
inclu
de
<sy
s/ipc
.h>
«in
clu
de
<sy
s/sem
.h>
«in
clu
de
<errn
o.h
>
/•«d
efin
e
SEMK
EY
((key
t) 4
22
33
53
L) *
/«
de
fine
PERM
S 0
64
4«
de
fine
err_
sys (A
) p
rintf
(A "
\n")
«d
efin
e B
IGC
OU
NT
lO
OO
O
int
sem
_cre
ate
( k
ey
_t
key
, in
t in
itval) ;
vo
id
sem
rm(in
t id
) ;v
oid
sem
clo
se (in
t id
);v
oid
se
m_
wa
it(int
id);
-.
-.
..
._
-void
se
m s
ign
al (in
t id
) ;void
se
m o
piin
t id
, in
t v
alu
e);
int
errn
o;
AP
ÉN
DIC
ES
. C
OM
UN
ICA
CIÓ
N G
SI
- S
ER
VID
OR
DE
DA
TO
S
int
sem
_cre
ate
( k
ey
_t
key
, in
t in
itv
al)
{
-
reg
iste
r in
t id
, se
mv
al;
•
un
ion
se
raun
í int
val;
struct seraid_d3
*buf ;
ushort
*array;
} semctl_arg;
if (key « IPC_PRIVATE) return (-1);
else if (key == (key_t) -1) return (-1);
ag
ain
:if
(
(id
= s
em
ge
ttk
ey
, 3
,.P
ER
MS
| IP
C_C
RE
AT
))
< 0
)re
turn
(-
1);
if
(sem
op
iid
, &
op
loc
kfO
],
2)
<
0)
{ if (errno
== EINVAL) goto again;
err_sys("can't lock"};
Î
if
( (s
emv
al
= a
em
ctl
fid
, 1,
G
ET
VA
L,
0))
<
0
)e
rr_
sy
s(n
ca
n't
G
ET
VA
L")
;if
(s
em
val
==
0)
í sem
ctl
_arg
.val
= i
nit
va
l;if
(s
em
ctK
id,
0,
SET
VA
L,
sem
ctl
_arg
) <
0)
err
_sy
s("c
an
S
ET
VA
LfO
]");
sem
ctl
_arg
.val
= B
IGC
OU
NT
;if
(s
em
ctK
id,
1,
SET
VA
L,
sem
ctl
_arg
) <
0)
err
_sy
s{"c
an
S
ET
VA
L[1
]");
)if (semopfid, &op_endcreate[0], 2) < 0)
err_sys("can1t end create");
/* Abre un semáforo que ya existe.
Devuelve la identidad del semáforo.
int aem_open (key_t key)
í register int
id;
if (key == IPC^PRIVATE) return (-1);
else if (key ==
(key_t) -1) return (
if ( (id = semgetfkey, 3, 0)) < 0)
return (-1);
if (semopiid, &op_open[0], 1) < 0)
err_sys("can1t open");
return (id);
/* Elimina un semáforo.
Debe ser llamada por el servidor.
void sem_rm(int id)
if (semctKid, O ,IPC_RMID, 0) < 0)
err_sys(dcan't IPC_RHID"};
/* Cierra un semáforo. */
void sem close(int id)
AP
ÉN
DIC
ES
A-2
15
DESA
RRO
LLO
E IM
PLEM
ENTA
CIÓ
N D
E UN
SIS
TEM
A SU
PERV
ISOR
PAR
A LA
GES
TIÓ
N Y
CO
NTRO
L DE
ED
AR
register int semval;
if (semop(id, &op_close[0], 3) < 0)
err_sys("can1t semop");
if (semval=semctl(id, 1, GETVAL, 0) < 0)
err_sys("can't GETVAL");
if (semval > BIGCOUNT)
err_sys("sem[l] > BIGCOUNT");
else if (semval == BIGCOUNT)
sem_rm(id);
else
if (semop(id, &op_unlock[0], 1) < 0}
err_sys("can't unlock");
/***.„..**•.****.*****************•****.*****.******.*/
/" Espera hasta que el semáforo es mayor que cero.
Después le resta l y vuelve */
void sem_wait(int id)
sem_op(id,-1);
} /***..********.*********.*****.******..*.************./
/* Incrementa un semáforo en l */
void sem_signal(int id)
sem_op(id,1);
} y**.**.*.*******..*****»***....*.**,****,,....*.******/
/* Operación general sobre un semáforo.
*/
void sem__op(int id, int valué)
if ( (op_op[0]-sem_op = valué) =
err_sys("can1t have value
if
{se
mo
pfi
d,
&o
p_
op
lO],
1
) <
0)
err_
sys
{"se
m_o
p e
rro
r"),
-
0) = O
") ;
A-216
APÉNDICES
f. *SISTEMl-.-Ëv f
APÉN
DICE
S. S
ISTEM
A EX
PERT
O
JERARQUÍA DE OBJETOS EN EL SISTEMA EXPERTO DESARROLLADO
write to the file "/quantum/juan/bmp/hierarchy"
the class hierarchy
** Results follow this line:
ITEM KB-WORKSPACE -- 242 instances
SYSTEM-TABLE
DEBUGGING-PARAMETERS --9 instances
PRINTER-SETUP --9 instances
FONTS -- 9 instances
DRAWING-PARAMETERS -- 9 instances
TIMING-PARAMETERS --9 instances
LOGBOOK-PARAMETERS -- 9 instances
MESSAGE-BOARD-PARAMETERS -- 9 instances
LOG-FILE-PARAMETERS --9 instances
MENU-PARAMETERS -- 9 instances
LANGUAGE-PARAMETERS -- 9 instances
COLOR-PARAMETERS --9 instances
EDITOR-PARAMETERS --9 instances
MODULE-INFORMATION --9 instances
SAVING-PARAMETERS --9 instances
INFERENCE-ENGINE-PARAMETERS -- 9 instances
DATA-SERVER-PARAMETERS --9 instances
SIMULATION-PARAMETERS -- 9 instances
KB-RESTRICTIONS
| KB-CONFIGURATION -- 9 instances
MISCELLANEOUS-PARAMETERS -- 9 instances
ONNECTION
NETWORK-WIRE
j TCP-IP
DIGITAL
SERIAL
I RS232
j RS485
ELECTRICAL
PROBE-SIGNAL
ON-OFF -- 8 instances
| 220V --10 instances
j 24V
-- 26 instances
4-20MA -- 6 instances
TRIPHASE
NEUMATIC
3-15PSI
CONSTANT-PRESSURE
AERATION
HYDRAULIC
TAP-WATER
PROCESS-STREAM
| CONNECTION-STREAM
j INFLUENT
| INTERNAL-RECYCLE
| EXTERNAL-RECYCLE
j FINAL-EFFLUENT
CONCENTRATE
| N-CONCENTRATE
j C-CONCENTRATE
MANRESA-CONNECTION
LINIA-AIGUA-LINE
[ ENT-PLANTA-LINE
| ENT-BASSA-LINE
APÉN
DICE
S A
- 2
17
DESA
RROL
LO E
IMPL
EMEN
TACI
ÓN D
E UN
SIST
EMA
SUPE
RVISO
R PA
RA LA
GES
TIÓN
Y CO
NTRO
L DE
EDAR
SORT-BAS SA-LINE
FANGS-LINE
. .
._SORT-PLANTA-L·INE
SORRA-LINE
IN -- 17 instances
OBJ CTEFAULT-JUNCTION --2 instances
JUNCTION-BLOCK-FOR-ENT-PLANTA-LINE
JUNCT ION-BLOCK-FOR-ENT-BASSA-LINE
JUNCTION-BLOCK-FOR-SORT-BASSA-LINE
JUNCTION-BLOCK-FOR-FANGS-LINE
JUNCTION-BLOCK-FOR-SORT-PLANTA-LINE
JUNCTION-BLOCK-FOR-SORRA-LINE
JUNCTION-BLOCK-FOR-RS485 -- 4 instances
JUNCTION-BLOCK-FOR-SERIAL
JUNCTION-BLOCK-FOR-220V
JUNCTION-BLOCK-FOR-TCP-IP
JUNCTION-BLOCK-FOR-TAP-WATER
JUNCTION-BLOCK-FOR-CONCENTRATE
JUNCTION-BLOCK-FOR-PROCESS-STREAM -- 3 instances
JUNCTION-BLOCK-FOR-PNEUMATIC
JUNCTION-BLOCK-FOR-3-15PSI
JUNCTION-BLOCK-FOR-CONSTANT-PRESSURE -- 6 instanc
JUNCTION-BLOCK-FOR-AERATION
JUNCTION-BLOCK-FOR-INFLUENT
JUNCTION-BLOCK-FOR-INTERNAL-RECYCLE
JUNCTION-BLOCK-FOR-EXTERNAL-RECYCLE
JUNCTION-BLOCK-FOR-CONNECTION-STREAM
JUNCTION-BLOCK-FOR-FINAL-EFFLUENT
JUNCTIOS-BLOCK-FOR-DIGITAL
JUNCTION-BLOCK-FOR-ELECTRICAL
JUNCTION-BLOCK-FOR-RS232
JUNCTION-BLOCK-FOR-ON-OFF -- 1 instance
JUNCTION-BLOCK-FOR-24V -- 1 instance
JUNCTION-BLOCK-FOR-4-20MA
JUNCTION-BLOCK-FOR-TRIPHASE
JUNCTION-BLOCK-FOR-PROBE-SIGNAL
JUNCTION-BLOCK-FOR-LIN -- 2 instances
CONNECTION-POST -- 9 instances
2-EXTENSION
G2-WINDOW -- 1 instance
2-LIST
ITEM-LIST
| UIL-NO-DUPLICATE-ITEM-LIST
VALUE-LIST
SYMBOL-LIST
TEXT-LIST
TRUTH-VALUE-LIST
QUANTITY-LIST
| FLOAT-LIST
j INTEGER-LIST
2-ARRAY
TEM-ARRAY -- 5 instances
VALUE-ARRAY
SYMBOL-ARRAY --2 instances
TEXT-ARRAY --13 instances
TRUTH-VALUE- ARRAY
QUANTITY-ARRAY
| FLOAT-ARRAY --32 instances
I INTEGER-ARRAY -- 110 instances
VARABLE-OR-PARAMETER
VARIABLE
G2-VARIABLE
| LOGICAL-VARIABLE --20 instances
| QUANTITATIVE-VARIABLE -- 163 instances
|
FLOAT-VARIABLE -- 239 instances
j | G2-G2 -- 11 instances
j INTEGER-VARIABLE -- 86 instances
|
GSI-VARIABLE
j | GSI-SBTPOINT -- 22 instances
) |
GSI-MEASURE -- 58 instances
' |
SYMBOLIC-VARIABLE --25 instances
j TEXT-VARIABLE --4 instances
SENSOR
GFI-DATA-SERVICE
j | GSI-VARIABLE
A-218
APÉNDICES
APÉNDICES. SISTEMA EXPERTO
jj
ll
ll
GSI-SETPOINT -
- 2
2 instances
) |
j
j I |
GSI-MEASURE -- 58 instances
G2-TO-G2-DATA-SERVICE
| G2-G2 --11 instances
G2-METER-DATA-SERVICE
PARAMETER
LOGICAL-PARAMETER -- 17 instances
QUANTITATIVE-PARAMETER --10 instances
| INTEGER-PARAMETER -- 6 instances
j FLOAT-PARAMETER --9 instances
j SYMBOLIC-PARAMETER -- 16 instances
|
TEXT-PARAMETER
GFI-OUTPUT-INTERFACE --4 instances
GFI-INPUT-INTERFACE
GSI-INTERFACE
1 GSI-BRIDGE -- 1 instance
02-TO-G2-DATA-INTERFACE -- 1 instance
UIL-OBJECT
UIL-GROBJ
UIL-BUTTON
I UIL-ICON-BUTTON
j | UIL-SELECTION-BUTTON
j j
UIL-WORKSPACE-BUTTON
j j
" UIL-NAVIGATION-BUTTON
UIL-GOTO-WORKSPACE-BUTTON -- 141 instances
UIL-GOTO-SUPERIOR-BUTTON -- 14 instances
UIL-GOTO-NEXT-BUTTON
UIL-GOTO-PREVIOUS-BUTTON
j ¡
UIL-HIDE-BUTTON -- 132 instances
I j
j UIL-HELP-BUTTON
j j
UIL-WORKSPACE-OPERATION-BUTTON
; |
| UIL-PRINT-WORKSPACE-BUTTON
j UIL-DIALOG
UIL-S ELECTION-BOX
UIL-CHECK-BOX
UIL-RADIO-BOX
| UIL-CONFIGURATION-CLASS
|
UIL-NAVIGATION-BUTTON-CONFIGURATION-CLASS --2 instance
j UIL-TEXT-CONFIGURATION-CLASS
GUIDE-ROOT
| GUIDE-BUTTON-TEMPLATE
GUIDE-NAVIGATION-BUTTON-TEMPLATE
| GUIDE-GOTO-WORKSPACE-BUTTON-TEMPLATE
j GUIDE-GOTO-SUPERIOR-BUTTON-TEMPLATE
| GUIDE-GOTO-NEXT-BUTTON-TEMPLATE
| GUIDE-GOTO-PREVIOUS-BUTTON-TEMPLATE
j GUIDE-HIDE-BUTTON-TEMPLATE
j GUIDE-HELP-BUTTON-TEMPLATE
j GUIDE-PRINT-WORKSPACE-BUTTON-TEMPLATË
| GUIDE-GARBAGE-PAIL
STAR-ICON -- 1 instance
ITEM-PROFILE-INFORMATION
ACTIVITY-PROFILE-INFORMATION
SYSTEM-PROFILE-INFORMATION
OBJ-SUBWS-DEACTIV -- 4 instances
INFORMADORS --73 instances
PLANT -- 1 instance
PROCESS_UNIT
| WASTE -- 1 instance
| REACTOR
j | AEROBIC-REACTOR --2 instances
j j
ANOXIC-REACTOR --
1 instance
j ANAEROBIC-REACTOR -- 1 instance
j VESSEL
j | VESSEL-N -- 1 instance
j j
VESSEL-C --
1 instance
| SETTLER -- 1 instance
j TAP
-- 1 instance
j JUNCTION-BOX --
1 instance
j AIR-SUPPLY --3 instances
| PURGE -- 1 instance
I JUNCTION-OUTLET -- 1 instance
INSTRUMENTATION
| PLC -- 1 instance
OLD-PLC
TRANSDUCER
...
j | I-PJTRANSDUCER --4 instances
APÉNDICES A
- 219
DESARROLLO E IMPLEMENTAQON DE UN SISTEMA SUPERVISOR PARA LA GESTIÓN Y CONTROL DE EDAR
| I-V_TRANSDUCER -- 3 instances
VALVEELECTROVALVE-3-WAYS -- 1 instance
ELECTROVALVE-OM_OFF --2 instances
CONTROL-VALVE
| CONTROL-VALVE-LIQUID -- 1 instance
| CONTROL-VALVE-AIR -- 3 instances
MEASURING-DEVICE
DETECTOR
| LEVEL-DETECTOR -- 4 instances
| LEAK-DETECTOR -- 2 instances
PROBE
| ORP-PROBE --3 instances
| PH-PROBE --3 instances
j T-PROBE --
3 instances
| DO-PROBE -- 3 instances
CONTROLLER
PHROCON-1B -- 3 instances
FREQUENCY-CONVERTER -- 3 instances
TIRRER -- 3 instances
PUMPVARIABLE-DOSING-PUMP -- 2 instances
PERISTALTIC-PUMP --2 instances
FIXED-DOSING-PUMP -- 2 instances
ELECTRIC-FLOJET
AIR_FLOJET -- 2 instances
ANALYSER
NO3-ANALYSER --
1 instance
N02-ANALYSER -- 1 instance
NH4-ANALYSER -- 1 instance
PO4-ANALYSER
LUDGE --
1 instance
OMPUTER-INTERFACE
RS232-RS485_CONVERTER -- 2 instances
OMPUTER
PROCESS-COMPUTER -- 1 instance
ANALYZER-COMPUTER -- 1 instance
G2-COMPUTER -- 1 instance
MICROORGANISM
MICROFAUNA
OTHER-MICRO FAUNA
ACINERA-UNCINATA -- 1 instance
TRACHELOPHYLLUM -- 1 instance
DREPANOMONAS -- 1 instance
OTHER-OTHER-MICROFAUNA -- 1 instance
ROTOZOA
CILIATES
SWIMMING-CILIATES
OTHER-SWIMMING-CILIATES -- 1 instance
CINETOCHILUM-MARGARITACEUM -- 1 instance
COLPIDIUM -- 1 instance
CYCLIDIUM -- 1 instance
GLAUCOMA -- 1 instance
PARAMECIUM-CAUDATOM --
1 instance
TETRAHYMENA -- 1 instance
URONEMA -- 1 instance
SATHRQPHILUS -- 1 instance
ATTACHED-CILIATES
SPIROSTOMUM -- 1 instance
VORTICELLA-CONVALLARIA --
1 instance
VORTICELLA-AQUADULCIS --
1 instance
VORTICELLA-MICROSTOMA -- 1 instance
CARCHESIUM -- 1 instance
ZOOTHAMNIUM --
1 instance
OPERCULARIA -- 1 instance
EPISTYLIS -- 1 instance
VAGINICOLA -- 1 instance
STENTOR --
i instance
OTHER-ATTACHED-CILIATES -- 1 instance
CRAWLING-CILIATES
OTHER-CRAWLING-CILIATES -- 1 instance
ASPIDÏSCA-CICADA -- 1 instance
ASPIDISCA-LYNCEUS --
1 instance
EUPLOTES-AFFINIS -- 1 instance
EUPLOTES-PATELLA --
1 instance
STYLONYCHIA -- 1 instance
TROCHILIA -- 1 instance
A-220
APÉNDICES
Top Related