Selección de bomba por menor tiempo de operación en S7-400H con Step 7 V5.5

Para poner en marcha la bomba con menor tiempo de servicio en una configuración de 8 bombas (6 de servicio y 2 de reserva) utilizando un controlador SIMATIC S7-400H en Step 7 V5.5 (Statement List / STL), se debe implementar un bucle de comparación en un bloque de función (FB o FC) que recorra un Bloque de Datos (DB) donde se registran las horas de operación de cada unidad. El algoritmo determina la bomba disponible con el valor acumulado más bajo y activa un bit de habilitación para su arranque.

Tabla de contenido

Contexto de la aplicación y lógica de prioridad

En aplicaciones de bombeo con esquemas de redundancia (por ejemplo, 6 bombas en servicio y 2 en reserva), el desgaste mecánico debe distribuirse de manera uniforme. Cuando el sistema solicita el arranque de una nueva unidad por demanda de proceso:

  1. Evaluación de disponibilidad: Se descartan las bombas que ya están en marcha, las que se encuentran en falla o las que están marcadas fuera de servicio.
  2. Búsqueda del valor mínimo: Se compara el tiempo acumulado de las bombas disponibles. La bomba con el menor tiempo acumulado recibe la prioridad de arranque más alta.
  3. Parada por mayor tiempo: De manera simétrica, cuando la demanda del proceso disminuye, el algoritmo selecciona la bomba en marcha que acumula el mayor número de horas de operación para detenerla primero.

En controladores de alta disponibilidad S7-400H programados con Step 7 V5.5 (STL), esta lógica se ejecuta mediante bucles indexados utilizando punteros o direccionamiento indirecto.

Requisitos previos

  • Software de ingeniería: SIMATIC Step 7 V5.5 (o superior).
  • Controlador: CPU S7-400H (por ejemplo, CPU 412-3H).
  • Estructura del programa: Un Bloque de Datos (DB) destinado al almacenamiento de los contadores de horas de cada bomba y a los estados de disponibilidad (en marcha, falla, modo manual/automático).
  • Lenguaje de programación: Lista de instrucciones (Statement List - STL).

Estructura del bloque de datos para tiempos de operación

Para facilitar la iteración mediante punteros en STL, defina un Bloque de Datos (DB10) con una estructura uniforme para las 8 bombas.

Plaintext

DATA_BLOCK DB 10
TITLE = Registro de tiempos y estados de bombas
STRUCT
   Bomba : ARRAY [1..8] OF STRUCT
      Horas     : DINT;   // Horas acumuladas de funcionamiento
      Minutos   : INT;    // Minutos acumulados
      Segundos  : INT;    // Segundos acumulados
      EnMarcha  : BOOL;   // Indica si la bomba está actualmente encendida
      Falla     : BOOL;   // Indica si la bomba está en condición de falla
      Disponible: BOOL;   // Habilitación para arranque (Auto y sin falla)
      Arranque  : BOOL;   // Salida de orden de arranque generada por la lógica
   END_STRUCT;
END_STRUCT;
BEGIN
END_DATA_BLOCK

Algoritmo de búsqueda de menor tiempo en STL (Statement List)

El siguiente procedimiento muestra la implementación de un Bloque de Función (FC 50) que evalúa las 8 bombas en DB10, identifica la bomba disponible que no está en marcha y que posee el menor valor en el campo Horas, y retorna su número de índice (1 a 8).

Procedimiento

  1. Cree un nuevo objeto Function (FC) en Step 7 V5.5 y seleccione STL como lenguaje de programación.
  2. declare las variables locales de la función (TEMP e OUTPUT):

    • BombaSeleccionada (Output, tipo INT): Índice de la bomba elegida.
    • MenorTiempo (Temp, tipo DINT): Almacena temporalmente el valor mínimo encontrado.
    • LoopIndex (Temp, tipo INT): Contador para el bucle de iteración.
    • Offset (Temp, tipo DWORD): Registro de desplazamiento de puntero en el DB.
      3. Introduzca el código STL para realizar la búsqueda iterativa:

Structured Text

FUNCTION FC 50 : VOID
TITLE = Búsqueda de bomba disponible con menor tiempo de operación

VAR_OUTPUT
  BombaSeleccionada : INT ;
END_VAR
VAR_TEMP
  MenorTiempo : DINT ;
  LoopIndex : INT ;
  Offset : DWORD ;
END_VAR

BEGIN
NETWORK
TITLE = Inicialización de variables de búsqueda

      L     L#2147483647;       // Inicializar con el valor máximo posible de DINT
      T     #MenorTiempo;

      L     0;
      T     #BombaSeleccionada;

      OPN   DB    10;           // Abrir el DB de datos de bombas
      L     P#0.0;              // Apuntar al inicio de la estructura (Bomba 1)
      T     #Offset;

      L     1;                  // Iniciar contador del bucle
      T     #LoopIndex;

NEXT: L     #LoopIndex;
      L     8;                  // Límite de 8 bombas
      GTI   ;
      JC    END;

// --- Verificar si la bomba está disponible y no está en marcha ---
      L     #Offset;
      LAR1  ;

      A     DBX [AR1, P#8.2];   // Evaluar bit 'Disponible'
      AN    DBX [AR1, P#8.0];   // Evaluar bit 'EnMarcha' (debe ser FALSE)
      JCN   INCR;               // Si no está disponible o ya marcha, saltar a la siguiente

// --- Comparar horas acumuladas ---
      L     DBD [AR1, P#0.0];   // Cargar variable 'Horas'
      L     #MenorTiempo;
      GED   ;                   // Si Horas >= MenorTiempo actual, saltar
      JC    INCR;

// --- Actualizar el mínimo encontrado ---
      L     DBD [AR1, P#0.0];
      T     #MenorTiempo;

      L     #LoopIndex;
      T     #BombaSeleccionada; // Guardar número de la mejor bomba candidato

// --- Incrementar puntero para la siguiente bomba ---
INCR: L     #Offset;
      L     P#10.0;             // Tamaño en bytes de la estructura de cada bomba
      +D    ;
      T     #Offset;

      L     #LoopIndex;
      L     1;
      +I    ;
      T     #LoopIndex;
      JU    NEXT;

END:  BE    ;
END_FUNCTION

Resultado esperado: La variable BombaSeleccionada entrega el índice (1 a 8) de la bomba que cumple con estar disponible, no estar operando y tener las menores horas acumuladas. Si no hay bombas disponibles, el valor retornado es 0.

Integración con banderas de habilitación e interbloqueos

Una vez identificado el índice de la bomba con menor tiempo acumulado, la orden de arranque no debe aplicarse de forma continua sin considerar las banderas de estado del sistema:

  1. Etapa de demanda: Cuando la variable de control del proceso (por ejemplo, nivel o presión) solicita el arranque de una unidad adicional, active un pulso de ejecución.
  2. Evaluación de interbloqueo: Confirme que la bomba seleccionada no posee banderas activas de falla o selección en modo manual.
  3. Set de la orden de arranque: Utilice el índice devuelto para conmutar la salida de mando de la bomba correspondiente en el DB o en las salidas físicas de la periferia.
  4. Histéresis de conmutación: Evite alternar bombas con frecuencias muy elevadas. Se recomienda establecer un tiempo mínimo de marcha antes de permitir que la lógica reevalúe y detenga o arranque otra unidad.

Verificación

El procedimiento de selección por menor tiempo de operación funciona correctamente cuando:

  • Al forzar un valor de Horas inferior en la Bomba 3 en comparación con las demás (estando todas en estado no operativas y disponibles), la llamada a la función asigna el valor 3 a la variable BombaSeleccionada.
  • Si la Bomba 3 pasa al estado EnMarcha = TRUE, la función descarta automáticamente la Bomba 3 y selecciona la siguiente bomba disponible con menor tiempo acumulado.
  • Si una bomba conmuta a estado Falla = TRUE o Disponible = FALSE, el bucle la ignora dentro del proceso de evaluación sin detener la ejecución del ciclo de la CPU S7-400H.
  • Si no hay ninguna unidad en condición disponible, la salida BombaSeleccionada permanece en 0 sin provocar fallos de acceso a la memoria (Stop por error de área en direccionamiento indirecto).

Limitaciones y precauciones operativas

  • Límite de tiempo de ejecución del ciclo: El uso de bucles (JU NEXT) dentro de un PLC debe acotarse estrictamente (en este caso, 8 iteraciones). Bucles indeterminados provocan el desbordamiento del temporizador de perro guardián (Watchdog) de la CPU.
  • Sincronización en sistemas redundantes S7-400H: Los bloques de datos que contienen los registros de horas y estados deben estar configurados en la memoria no volátil y sincronizados entre ambas CPUs del sistema H para evitar discrepancias de selección durante una conmutación de controlador (Failover).
  • Alineación de datos en el DB: Al usar punteros fijos en STL (como P#10.0 para el tamaño de la estructura), cualquier modificación en los tipos de datos internos de la estructura del DB desalineará el cálculo de las direcciones en la instrucción LAR1.

Preguntas frecuentes para ingenieros

¿Por qué se utiliza el tipo de datos DINT para almacenar las horas de operación?

El tipo de datos DINT (Entero doble de 32 bits con signo) permite almacenar valores hasta 2.147.483.647. Si se utilizara un entero estándar de 16 bits (INT), el límite máximo sería de 32.767 horas (aproximadamente 3,7 años de operación continua), corriendo el riesgo de desbordamiento en plantas industriales de ciclo prolongado.

¿Cómo se debe gestionar el conteo de minutos y segundos antes de incrementar las horas?

Se recomienda utilizar un pulso de reloj de 1 segundo (por ejemplo, proveniente de la marca de ciclo configurada en la CPU) para incrementar la variable Segundos. Cuando esta alcance 60, se reinicia a 0 e incrementa Minutos. Al alcanzar 60 minutos, se reinicia e incrementa la variable Horas (DINT).

¿Qué sucede si dos o más bombas tienen exactamente el mismo número de horas operadas?

Dado que el bucle en STL evalúa la condición "Menor estricto" (GED), el algoritmo mantendrá la primera bomba encontrada que cumpla la condición durante el barrido (menor índice de arreglo). La segunda bomba con las mismas horas no sustituirá a la primera hasta que la primera cambie de estado a no disponible o incremente sus horas.

Artículos relacionados

Etiquetas relacionadas

Code: C137

6 respuestas