Publicado el 20.07.2025 a las 21:09
Un Byte fantasma en una caldera de biomasa
Si quieres ir al turrón clic aquí.
Para los que nos dedicamos a la automatización y el control, hay dos tipos de problemas:
Este artículo va de los segundos, un fantasma que casi me vuelve loco durante la puesta en marcha de un proyecto en una caldera de biomasa.
El proyecto molaba, desarrollar un sistema experto para el abatimiento no catalítico de NOx en una gigantesca caldera de biomasa.
En resumen, mi software tenía que ser el cerebro que, jugando con variables como la temperatura, el oxígeno, el ammonia slip, la carga de la caldera..., decidiera la cantidad exacta de urea a inyectar para reducir las emisiones contaminantes.
Un puzzle de ingeniería química y programación.
Mi sistema experto era una maravilla (qué voy a decir yo).
Corría en un servidor de rack en la sala del DCS, pulcro y eficiente.
Su única ventana al mundo exterior era un cable de red y el protocolo Modbus TCP, a través del cual se comunicaría con el rey de la planta, el DCS de Siemens.
Trabajé codo con codo con el programador que había contratado la planta para programar el DCS para que la comunicación entre el DCS y el Sistema Experto fuera correcta.
Terminamos y comenzamos las pruebas.
Si has hecho puestas en marcha, sabes de qué va las pruebas de señales.
Señal por señal, te la pongo a 1, OK, vuelve a 0 y a por la siguiente.
Las variables numéricas las tratábamos como reales (4 Bytes o 2 Words, como quieras decirle).
Probamos todas las señales, todo correcto.
Cerré el lazo de mi sistema y se puso a funcionar.
Todo iba de maravilla, el bit de vida iba fino, la calidad de las señales era correcta.
Comenzó a funcionar el sistema pero los resultados arrojados no eran los esperados, comenzó a tener un comportamiento errático.
Yo simulaba en mi portátil el escenario operacional y arrojaba valores coherentes, pero en la planta no.
Meme típico...
En mi equipo funciona.
Comenzó la típica danza de la culpa.
Mi sistema funciona bien. Aquí tienes los logs de la simulación. El problema debe estar en el DCS decía yo.
El DCS funciona perfecto con los cientos de otros equipos. El único que da problemas es tu 'sistema experto'. Revisa tu comunicación. me decía el compi que programó el DCS.
Lo decía con tal seguridad que me sacaba de quicio.
Revisiones de mi código hasta que las letras bailaban en la pantalla.
En mi equipo todo iba bien, no podía arreglar un problema si antes no lo encontraba.
¿Un problema en la red? Los pings eran estables.
La frustración era inmensa.
Todas las miradas están dirigidas a mí, al nota del DCS nada.
Todo el mundo daba por hecho que era culpa mía.
Mi flamante sistema experto se estaba comportando como un niño caprichoso, y yo no sabía por qué.
Agotado y sin más ideas, decidí volver al origen, al nivel más bajo y fundamental de la comunicación.
Le pedí al programador que me dejara de enviar los valores verdaderos de las señales para poder escribir yo valores y enviar a mi Sistema señales simuladas.
Y... SORPRESA
Al escribir en uno de los valores, vi de pura casualidad que cambiaron dos señales.
WTF
Repetí la operación para asegurarme de que no fuera un espejismo.
Confirmado, había un solapamiento en la memoria.
Ese era mi fantasma.
Visualicé los registro en binario y ya quedó todo claro.
El problema era que el programador del DCS se despistó declarando una señal real.
Los reales son 2 Words, pues bien, el espacio reservado en memoria estaba bien, eran 2 Words, ahí es imposible equivocarte porque si no el programa daría un error.
El problema fue que en lugar de dejar 2 Words, a la siguiente variable le asignó el Word contiguo.
Te lo desarrollo.
Imagina que el caudal está en el Word 6, y que la carga la declaras justo a continuación, pues debería asignarle el Word 8 porque el Word 6 y 7 es para el caudal porque hemos dicho que un real son 2 Words.
Pues el problema es que él declaró la carga en el Word 7 y claro, cuando escrías en el caudal o en la carga se modificaban los dos valores.
En producción eso no lo puedes ver porque todas las variables cambian a la vez y muy rápido.
Y puedes que te preguntes por qué no nos dimos cuenta en la prueba de señales.
Se alinearon los astros para no verlo, te cuento.
Te he contando que para probar las señales, me las escría a 0 y después a 1.
Tenía varias pestañas donde organizaba las señales.
El solapamiento se dio con la última señal de una pestaña y la primera de la siguiente pestaña, de manera que cuando escribió un 1 en la señal que estaba la última de la pestaña modifica el Byte 3 de ese doble word, pero también modificaba el Byte 1 del doble word de la primera variable de la siguiente pestaña pero no se veía.
Al pasar a la siguiente pestaña ya no veíamos la anterior señal y así se nos pasó por algo.
Una vez correjido eso todo comenzó a funcionar de maravilla.
Como siempre, las problemas se solucionan a base de pico y pala.
Esta historia fue hace 7 años, pero aún hoy por hoy, cuando hay un problema y hay varios actores siempre me toca demostrar que el problema no está en mi lado, es lo que tiene ser la contrata.
Y como dicen que una imagen vale más que mil palabras, te dejo unas imágenes de un ejemplo que he hecho en TIA Portal para explicarte lo que te he contado.
Hasta luego 🖖