Programador horario de tareas en S7

Vamos a ver un ejemplo práctico sobre un programador de tareas de dos cámaras frigoríficas, que tiene básicamente los siguientes requerimientos:

  • La programación de las cámaras tienen que ser independientes
  • La programación tiene que ser independiente por días.
  • La programación tiene que ser independiente en cuanto a las horas y su duración.
  • La salida se dará mediante una booleana que se llevará a la máquina como marcha/paro.

 A lo que yo le añadiría

  • Visualización de la hora del autómata
  • Posibilidad de poner en hora el reloj.

 Las solicitaciones son claras: quiere poder programar al detalle cada una de las cámaras por separado. Pues pongámonos manos a la obra.

Programador horario de tareas en S7

Para realizar un programa de este tipo no nos podemos olvidar de los dos puntos que he añadido: ver por un lado la hora que está corriendo en el autómata y por otro lado poder ponerlo en hora.

Esto nos va a permitir indagar en cómo se obtiene la hora del PLC y cómo se le hace un Setup. No te preocupes, esto los teutones lo tienen resuelto con unas bonitas funciones que vienen con el paquete de Step 7.

  • SFC 0 “SET_CLK” para establecer la hora en el PLC
  • SFC 1 “READ_CLK” para leer la hora del PLC

Por otro lado está la programación en sí mismo de las cámaras frigoríficas.

 ¿Cómo es la mejor manera de programarlas?

En un principio había pensado en hacerlo con hora de entrada y salida, es decir, simplemente le dices la hora a la que quieres que arranque cada día, y a qué hora que pare.

Podría valer salvo que quieras que arranque y pare varias veces al día, cosa probable. Bueno, es cuestión de poner más campos… o sea, una pequeña chapuza.

Lo suyo a mi juicio es hacer algo un poco más sofisticado pero simple, a la par que elegante: unos botones marcando las horas donde quieres que esté activa y listo. Luego grabamos el horario para cada máquina y ya está ¿mola eh?

Por tanto tendremos que añadir la posibilidad de recuperar el horario de cada máquina para editarlo.

En resumen, el resultado gráfico sería este:

Programador horario de tareas en S7

Para que no cojas tendinitis en el dedo índice, he añadido unos botones para borrar el contenido del día y para seleccionarlo completamente.

Como ves, se podrá editar cargado y guardando el contenido del horario diseñado.

Finalmente está representada la salida de activación de la máquina A  y la máquina B.

Bien , pero ¿cómo funciona?

Sencillo, vamos a almacenar las horas de arranque/paro en un DB por máquina como booleanas.

Luego recuperaremos el día y la hora del reloj del PLC y buscaremos el estado del bit de dicho día a esa hora. Si está a true pues activaremos la salida de la máquina A y/o B dependiendo de cada programación.

Usaremos un DB de intercambio y edición de tal forma que trabajaremos sobre él y guardaremos en el DB de A o de B en función de lo que elijamos.

Para ello usaremos la función SFC20 que sirve para copiar bloques de datos. Esto nos permitirá leer y escribir en el DB de intercambio desde el HMI. Así, para grabar pasaremos el contenido del DB de intercambio al DB de cada una de las cámaras y al revés. Cuando queramos recuperar qué tiene programado, leeremos el DB y su contenido lo copiaremos en el DB de intercambio, viéndolo por tanto en el HMI.

Adicionalmente podrás cambiar la hora y la fecha del reloj del PLC para asegurarte que se enciende y apaga cuando debe.

Bueno, para mejor explicación y como siempre, os dejo con el vídeo explicativo, que es como mejor me voy a explicar y más fácilmente lo vas a entender. Es un poco largo pero creo que merece la pena.

Para finalizar decir que ejemplos como este puedes encontrarlos en Cómo programar Step 7 sin morir en el intento, el cual se irá actualizando con el paso del tiempo para todos aquellos que lo compren y que viene con los proyectos asociados en formato zip para su estudio y mejor comprensión.

Acerca de Iñigo Gútiez

Ingeniero industrial por la Escuela de Ingenieros Superiores de Bilbao. Trabajo como ingeniero de proyectos y automatización en Guardian Industries

Te puede interesar

Direccionamiento indirecto

Direccionamiento indirecto en Step 7 (I) – Memoria y punteros a área

Para empezar con el tema del direccionamiento indirecto, vamos a explicar una serie de conceptos …

13 Comentarios

  1. Hola Iñigo, quisiera saber, que version de wincc flexible tiene, pues no puedo abrir el wincc, me da un error de version, y tengo interes en verla.

    Un saludo

  2. Hola,

    Es la versión 2008 SP3

  3. Hola! Iñigo mi verção WinCC es SP2 y el voluntad tentatar hacen mediante el uso de su programa S7, que esta muy bien preparado, espero conceguir.
    Excusa mi ESPAÑOL no es bueno! Gracias por los exelente lección!! Saludos.

  4. Gracias por comentar y hacer el esfuerzo de hacerlo en español!!

  5. Hola Iñigo! FC3 creado para Borrar todos y activar todos, ¿cómo puedo hacer con el WinCC ?
    Gracias, Un saludo.

    FUNCTION FC 3 : VOID

    TITLE =
    VERSION : 0.1

    VAR_TEMP
    Valor : BYTE ;
    Error : INT ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =

    L B#16#FF;
    T #Valor;
    A M 4.1; // Botão IHM
    JC M001;
    A M 4.3; // Botão IHM
    JC M002;

    L B#16#0;
    T #Valor;
    A M 4.2; // Botão IHM
    JC M001;
    A M 4.4; // Botão IHM
    JC M002;
    BE ;

    M001: CALL SFC 21 (
    BVAL := #Valor,
    RET_VAL := #Error,
    BLK := DB1.Dia[1]);
    BE ;

    M002: CALL SFC 21 (
    BVAL := #Valor,
    RET_VAL := #Error,
    BLK := DB1.Dia[2]);
    BE ;

    NETWORK
    TITLE =

    END_FUNCTION

  6. Hola Iñigo ,tengo algunas consultas sobre este ejemplo y me he registrado en el foro ,pero todavía no he recibido la activación .
    Te comento una de mis consultas , he visto el el DB2 y el DB3 son diferentes , me puedes explicar a que se debe eso.
    Y la otra consulta es que tú comentas que el DB2 Siemens ordena los datos de esa forma,
    ¿Como es que lo genera ?
    Estas son algunas de la muchas dudas que tengo.
    Desde ya muchas gracias y un saludo

    • Hola Jose Luis,

      Creo recordar que en el video se veian un poco diferentes pero en el proyecto estaba bien. En cualquier caso es igual el texto que pongas en los DB. son literales, nombres de las variables, pero no es funcional.
      Si son iguales en cuanto a tipo y número de bytes.

      En cuanto a el orden de los bytes no hay que hacer nada. Simplemente hay que tenerlo en cuenta. Cuando cargas un 1 en el MW0, el bit que se activa no es el M0.0 sino el M1.0 que es el primer bit del byte alto. En una doble palabra, en el MD0, el bit sería el .0 del byte bajo de la palabra baja. Es decir, de MD0,
      La palabra alta es la MW2
      La palabra baja es la MW0

      De la palabra baja, la MW2, el byte bajo es el MB3 y el byte alto es el MB2. Con lo cual, si cargas un 1 en el MD0, el bit que se activa es el M3.0

      En definitiva, el orden que se usa para activar los bits son, del 1 a 32:
      M3.0(1) M3.1 (2)… M3.7(8) M2.0(9) M2.1(10)… M2.7 M1.0 M1.1 … M1.7 M0.0 M0.1 … M0.7(32)

      Espero haberte ayudado y no liado más.

  7. Hola Iñigo
    Comprendo lo que explicas en la posición de los bytes.
    No se si sera lo correcto lo que estoy haciendo pero como no tengo instalado el wincc ,fuerzo los bit desde la tabla de variables y en el caso de la maquina A funciona correctamente ,pero la máquina B no .
    Por eso te comentaba que el DB2 es diferente al DB3 si bien el tipo (bool) y el número de bytes(28) son iguales.
    Por ejemplo al día 2 a las 15:00 horas le corresponde en la máquina A el bit 6.7 y a la máquina B el mismo día y la misma hora le corresponde el bit 5.7.
    No quiero liarte con esto y me interesa mucho ya que creo que se puede aplicar para muchos proyectos.
    Desde ya muchas gracias y un saludo

    • Hola Jose,

      Vale. He visto el fallo. Como bien indicas, el problema residia en el DB3, que no es igual que el DB2. Había un error en las leyendas de las booleanas.

      Ya está corregido y subido de nuevo al servidor. Si lo bajas ahora lo verás mejor.

      En cualquier caso no te funciona porque como bien indicas al forzar la hora por el nombre de la variable y como no estaban bien, pues no iba bien.

      Espero que ahora sí te funcione como esperabas.

      Un saludo

  8. Hola Iñigo ,nuevamente yo
    Espero no molestarte ,pero he visto que el DB de intercambio es diferente a los otros dos.
    Lo he corregido copiando de uno de ellos y funciona correctamente.
    No se si es complicarte mucho el que me expliques un poco mas el FC10 ,ya que me lió bastante con la nemotecnia.
    El programa realmente funciona muy bien y como te comentaba creo que se puede aplicar a muchos proyectos (estantería inteligente por ejemplo) .
    Muchas gracias .

  9. hola amigo, quisiera saber si este “programador horario de tareas” aplica para el “GMWIN” del plc glofa gm7