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í:
Está 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.
Contenido
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).
Para 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:
Como 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.
Enseño a programar PLC de Siemens a través de mis cursos.
Más información sobre mi aquí
Puedes seguirme en cualquiera de las siguientes redes sociales.
2 Comentarios
A ver tengo un pequeño problema.
Suelo programar en KOP, y en clase estamso dando ahora mismo AWL.
Mi problema es que quiero usar el S5Time y aprender a como manejarme con ese tipo de dato.
Bueno el programa consiste en lo siguiente. la frecuencia que escribas en tu bloque de datos, te varie el tiempo que actua un pequeño parpadeo.
Como T = 1 / F, he realizado la división y tal, y cuando quiero pasar el dato a s5time, el valor que esta simulandose, alcanza a los dias, y no soy capaz de avanzar en este problema…
En un S5time solo puedes meter 2h52minutos, si no recuerdo mal. No puedes usarlos. Tendrás que usar temporizadores IEC o fabricar tu propio contaje de tiempo.