Diagnóstico estación profibus en S7-300 con Tia Portal
¿Como saber que ET profibus ha caído?
Caso real.
Hemos actualizado con éxito un proyecto de STEP7 a Tia Portal en un S7-300, y estamos muy contentos con el trabajo realizado, ya que aparentemente todo se ejecuta bien.
Pero nos damos cuenta de que hay una función que estaba presente antes y ahora deja de funcionar, el diagnóstico de estaciones IM de la red Profibus del plc en el scada. El motivo es que en STEP7 se usa un SFC especifico que Tia Portal no utiliza.
¿Como arreglarlo?
Paso 1: Añade el bloque OB de hardware OB86 desde el menu "Añadir bloque" en el árbol de proyecto.

Una vez añadido, crea las declaraciones por defecto que soporta este OB. En la doble palabra OB86_RACK se genera el código del diagnóstico cuando falla un elemento de hardware del plc. Para nuestra comodidad, vamos a eliminar la línea DWORD y añadir 4 lineas de BYTE, ya que la información que buscamos se guarda en el BYTE4 de esa doble palabra.

Paso 2: Añade un nuevo DB "DB_Diagnostico" para guardar los datos de fallo de diagnóstico, el mas importante es la creación de un Array de 127 BOOL, en donde se iran haciendo los bits de las estaciones que entren en fallo.

Paso 3: Añade un segmento en AWL con este texto:
// --- SEGMENTO PARA FALLO (16#39) ---
L #OB86_EV_CLASS
L 16#39
==I
JCN NEXT // Si no es fallo, salta a la siguiente comprobación
// Cargar el número de la estación (esclavo Profibus)
L #OB86_RACK_Byte4 // Dirección del esclavo (0-126)
ITD // Convertir a Double Integer
// Para que el índice funcione en un Array de Bools, no hay que multiplicar.
// Pero debemos sumar el OFFSET de inicio en el DB del array (8.0)
L P#8.0 // Cargar el puntero a la dirección de inicio (8.0)
+D // Sumar el número de estación al puntero base
LAR1 // Ahora AR1 apunta a: Byte 8 + Estación
OPN "DB_Diagnostico" // Abre el DB
S DBX [ AR1 , P#0.0 ] // SET al bit correspondiente al número de esclavo
BEU // Finaliza la ejecución de este bloque
// Si la estación es la 5,el puntero resultante es P#8.5.
// Si la estación es la 10 automáticamente lo traduce a P#9.2(Byte 9,bit 2 ).
NEXT: L #OB86_EV_CLASS
L 16#38
==I
JCN END // Si no es recuperación, salta al final
L #OB86_RACK_Byte4 // Dirección del esclavo (0-126)
ITD // Convertir a Double Integer
// Para que el índice funcione en un Array de Bools, no hay que multiplicar.
// Pero debemos sumar el OFFSET de inicio del array (8.0)
L P#8.0 // Cargar el puntero a la dirección de inicio (8.0)
+D // Sumar el número de estación al puntero base
LAR1
OPN "DB_Diagnostico"
R DBX [ AR1 , P#0.0 ] // RESET al bit del esclavo que volvió
END: NOP 0
Este código en AWL lo que hace es: setea a 1 la posición en el array de las estaciones que fallen en base a su numero de esclavo, y devuelve a 0 esos bits una vez que la estación recupera la comunicación.
¿No es fantástico?