Cómo crear un valor de tiempo en formato S5Time en Step 7

Esta pequeña entrada sobre el formato S5Time puede que no la necesites nunca. O sí. Al menos la primera parte de la entrada.

La situación es la siguiente. Tienes que pasar un valor temporal a un temporizador de S7 y sabes los segundos, pero no sabes cómo transferírselo al temporizador. Es decir, quieres hacer algo así:

temporizadorEstá claro ¿no?

La idea tiene que ser poder cargar el tiempo en la marca MW100 (o cualquier otra a tu antojo) y que funcione a las mil maravillas.

Bien, pues eso tiene una fácil solución y otra más elaborada, pero que conviene conocer.

Transformar milisegundos en S5Time

Los teutones de Siemens tontos no son, y tienen un bloque preparado para que puedas pasar de un tiempo X en milisegundos (en formato time, por ejemplo: T#1h5m6s200ms para indicar 1 hora con 5 minutos y 6 segundos con 200 milisegundos).

tim_s5tiPara realizar esta operación, tan sólo debes cargar la función que viene con Step 7 en: Librerías> Stdlibs>IEC>FC  40 TIM_S5TI

Es decir, transformamos un tiempo IEC en formato de tiempo de Siemens.

Muy útil y simple de hacer.

Pero como estamos en Programación Siemens, y nos va la marcha, vamos a demostrar que además sabemos Latín por lo que vamos a hacerlo de manera que los neófitos pongan los ojos como platos al ver las vueltas que se pueden dar para hacer esto mismo.

Es decir, lo vamos a hacer diferente… ¡porque podemos! (y para eso somos de Bilbao. Véase “Todos nacemos vascos“)

Cómo crear un valor de tiempo en formato S5Time en Step 7

Bien, para realizar esta bilbainada, vamos a necesitar conocer cómo es el formato S5Time por dentro. Ojo a la siguiente imagen:

S5TIME-formatComo ves, hay que trabajárselo un poco.

Para empezar, tenemos que pasar nuestro tiempo a un número entre 0 y 999. Si te suena esto al formato S5time del Step 5, estoy seguro que ya peinas unas cuantas canas, pero sí, como sabes, los temporizadores de S7 son reminiscencias del Step 5 con todas las consecuencias.

Bueno, seguido de esto, tenemos 2 bits para decidir la base de tiempos de tal forma que los elijas así:

Base de tiempo Código binario
10 ms 00
100 ms 01
1 s 10
10 s 11

¡No me digas que no mola!

Con lo cual, tendremos que nuestro tiempo que teníamos por ahí perdido de 1h5m6s200ms  resulta que no es traducible a un tiempo S5Time…

¿WTF?

Pues sí, no tiene resolución suficiente, es decir, no podemos contar horas y con precisión de milisegundos ya que para poder alcanzar las horas, tendremos que tomar la base 10s de tal forma que obviando los milisegundos, es tiempo sería 3906 segundos, que tampoco podemos alcanzar.

Por tanto, como digo, solo podremos alcanzar los 390 x 10 segundos, es decir, 1h5m aproximadamente. perdiendo esos 6 segundos restantes con sus 200 preciosos milisegundos.

Pero es que además, no puedes contar por ejemplo 3horas porque 999x 10 segundos = 9990 segundos = 2,775h = 2h46m30s

¿Va mejorando la cosa eh?

Bien, más allá de las limitaciones, vayamos al meollo de la cuestión una vez repuestos del shock.

Imaginemos que queremos construir un tiempo de 3,5 segundos podremos hacer:

  • 35 x 100ms
  • 350x 10ms

Cualquiera de las dos opciones son correctas si bien usando la base 10ms tendrás mejor precisión.

Vale, ¿y ahora?

Bueno, pues ahora, para crear un valor de tiempo en formato S5T en Step 7 tendrás que hacer lo siguiente.

L 350 //Cargamos los 3,5 segundos en base 10ms

ITB //Pasamos el valor a BCD

L W16#0FFF //Cargamos una máscara para eliminar los 4 bits de la izquierda

UW //Hacemos un AND de palabra para ejecutar la máscara.

LW16#0000 //(en este caso tenemos que cargar un 0000 en el cuarteto de la base)

OW // Hacemos un OR para que adquiera el tiempo y la base

T MW100 //Lo cargamos al temporizador.

¿Qué cargaríamos si no fuera la base un 0?

Bien, teniendo en cuenta que las opciones para los 4 bits de la base serían:

  • 0000
  • 0001
  • 0010
  • 0011

En hexadecimal tendríamos para estos valores:

  • 0000 ->  0
  • 0001 ->1
  • 0010 ->2
  • 0011-> 3

Con lo que también podríamos haber cargado:

L 35 //Cargamos los 3,5 segundos en base 100ms

ITB //Pasamos el valor a BCD

L W16#0FFF //Cargamos una máscara para eliminar los 4 bits de la izquierda

UW //Hacemos un AND de palabra para ejecutar la máscara.

LW16#1000 //(en este caso tenemos que cargar un 0001 en el cuarteto de la base y dejar el resto del valor del número en hexadecimal en cero)

OW // Hacemos un OR para que adquiera el tiempo y la base

T MW100 //Lo cargamos al temporizador.

Luego usarías el valor de MW100 en el temporizador normalmente.

¿Has usado esta forma alguna vez?

Si tienes cierta edad y te ha tocado lidiar con PLC y pantallas antiguas seguro que has hecho si no esto, algo parecido para saber cómo crear un valor de tiempo en formato S5T en Step 7

Ya sabes que como siempre, esta entrada será incluida en “Cómo programar Step 7 y no morir en el intento” junto con otras que incluiré ya publicadas y alguna que queda por publicar aún.

Si te parece útil, o simplemente te ha gustado, te invito a que lo compartas a través de tus redes sociales.

 

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

Entrevista a Juan Carlos Martín (REEA)

En esta ocasión traigo al blog algo muy especial. Más bien a alguien especial. La …