Controlar la fecha y hora es un tema casi recurrente en la programación en general: bases de datos, hojas de cálculo, páginas web… y cómo no, PLC de Siemens.
Contenido
Fecha y hora en Step 7
En esta entrada, he querido poner fecha y hora en Step 7 y no en TIA portal, porque quiero que veas, cómo ha mejorado este tema con la nueva versión de Siemens. Quiero enseñarte ambas formas de acceder a la lectura del reloj del PLC.
Y es que ha cambiado tanto la forma en la que se accede al reloj, que merece la pena echarle un vistazo en cómo deberías hacerlo. La verdad
Acceso al reloj del PLC en Step 7
En step 7 tradicional, para acceder al reloj, y poder manejar su información tenemos que realizar dos pasos:
- Leer el reloj del PLC y volcarlo a una variable tipo DATE_AND_TIME
- Desgranar esta iformación para acceder al año, mes, día, hora etc…
Es decir, vamos a usar en primer lugar el SFC1 «Read Clock» para recuperar la fecha y hora en una variable local DATE_AND_TIME llamada en este caso #FechaYHora:
Por tanto, la variable #FechaYHora contendrá toda la información respecto a la fecha de calendario y hora actual que tiene el reloj del PLC de Siemens.
Ahora bien ¿cómo podemos acceder a esa información para obtener cada dato (mes, día, minutos…) por separado?
La información está dentro de la propia variable con la siguiente estructura de datos:
Los bytes 0 a 7 harán referencia a cada dato parcial de la fecha y hora, así, y teniendo en cuenta que hemos volcado la información en una variable local, deberemos leer cada byte por separado para obtener el año, mes, día etc.
Tenemos en cuenta la forma en la que hemos declarado las variables:
Además, ojo, porque la información viene representada en formato BCD, por lo que si queremos obtener esta información en decimal, deberemos realizar una conversión a este nuevo formato:
Así iremos haciendo con todos los valores en función del dato que queramos obtener.
Solo hay un dato que es un poco más complejo de obtener, que es el día de la semana.
Como puedes ver, en el último byte tenemos 4bits dedicados a parte de los milisegundos, y 4 bits (los más bajos), para leer el día de la semana.
Para solucionar este punto, lo que haremos será una máscara para obtener esta información:
La idea es quedarnos con el contenido de los 4 bits más bajos (menos significativos) del contenido del último byte, y transformarlo en un entero que nos dará de 1 a 7, el día de la semana siendo 1, el domingo.
Como ves, es bastante laboriosa la forma de obtener los diferentes valores del reloj en Step 7 si lo comparamos con TIA Portal, como vamos a ver a continuación.
Acceso al reloj del PLC en TIA Portal
Una de los avances en TIA Portal es el tratamiento del reloj del sistema. Al margen de poder acceder a la hora de sistema o a la hora local (por si tuviera que usar ambas), la gestión de la información es mucho más sencilla.
Así, ahora tenemos un tipo de datos el DTL, el cual tiene incluida toda la información ya desgranada:
Como ves, puedes una vez leído el reloj del PLC, acceder de forma parcial a cualquiera de los datos de una forma inmediata.
A modo de simple ejemplo vemos como, una vez leída la hora, podemos acceder a la hora y cargarlo a una segunda variable de forma extremadamente sencilla.
Ni que decir tiene, que puedes usar cualquiera de los datos integrados como te interese en cada caso.
¿Qué te ha parecido la fecha y hora en Step 7?
Has podido comprobar la facilidad con la que se accede ahora a los datos en TIA Portal cuando hace referencia a la hora.
¿Sabías que era así?
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.
24 Comentarios
Aupa Iñigo, ¿sabes cómo puedo cambiar la fecha del reloj interno de s7?
Sí claro, en Step 7 tradicional, en el editor de código, en Sistema Destino-> Ajustar Hora
En TIA Portal, en online y diagnóstico, funciones, ajustar la hora.
Saludos!
Hola Iñigo,
Como generarías un pulso con frecuencia semanal, quincenal, mensual…etc? Para arrancar una secuencia
Hola Iñigo,
Me gustaría sacar en formato Char la decena y la unidad por separado, por ejemplo del dato de la Hora.
Partiendo de un Byte donde tengo la Hora, (DB_.DBB__), obtengo en una var. temporal tipo Int mediante 2 funciones «Bite_to_byte» :
DB_.DBx__.0 —–> #Hora_decena DB_.DBx__.4 —–> #Hora_unidad
DB_.DBx__.1 DB_.DBx__.5
DB_.DBx__.2 DB_.DBx__.6
DB_.DBx__.3 DB_.DBx__.7
El problema es que tanto #Hora_decena como #Hora_unidad al convertirlo con un Move a otra var. temporal tipo Char, me da el resultado bien de la decena y la unidad pero con un 0 delante cada dato, es decir, obtengo un char con 2 dígitos. (Ej. 13h –> 01 + 03).
¿ como podría sacar tan solo 1 dígito ?
Saludos y gracias!
Entiendo lo que quieres hacer, pero un move, es una transferencia, no una conversión. Como entenderás, en un char, por su propia definición, no puede ser un 12, por ejemplo, porque serían dos caracteres, y no uno.
No estás convirtiendo nada. Para convertir a char, tienes que sumar 48 unidades, ya que tienes que jugar en el codigo ASCII. Es decir, un «1» en ASCII es el código 49. Por tanto, si al 1 en entero, les sumas 48 unidades, obtienes, ahora sí, en formato CHAR, un 1 según el código ASCII.
Saludos
Hola Iñigo.
Estoy haciendo un FB en SCL, para un S7-300 y necesito captar la fecha y hora. ¿Me pudieras ayudar?.
Gracias,
Wilfredo
Tendrás que hacer la llamada a la función de lectura del reloj igual que se hace en cualquiera de los lenguajes. No me has dicho en que plataforma estas programando, ni PLC..
Hola lñigo estoy programando a través de las sfc01 y sfc0 para sincronizar la hora del poco no el HDMI y así no se pierda cuando se le quita la energía el detalles es que como estoy trabajando en Ladder cuando ingreso la variable en el bloque de rd_clk o sfc01me sale sintaxis error , sabes qué tipo de variable tendría que poner en la salida ya que pongo db15:dbx100 por ejemplo y me sale sintaxis errónea
Tienes que poner una variable date_and_time, o un puntero ya que el reloj devuelve 8 bytes.
Hola, ¿como estais?. Me llamo Javier y vivo en Madrid.
Tengo una duda con el tema del reloj con el S7-1200 y es el siguiente:
Por ejemplo son ahora las 16:00h en horario de invierno en la zona horaria UTC +1 (Paris;Roma, Madrid,etc), bien…
El PLC lo configuro con la misma zona horaria y con el horario de verano activo. Me voy a «Online y diagnostico» y configuro
la hora a las 16:00h (sin adoptar PG/PC, lo hago manualmente) y creo dos registros para ver la hora local y la de sistema y aqui
creo que viene el problema o duda……cuando veo la hora local me marca las 17:00h y la de sistema las 16:00h.
¿Esto es correcto? y si no lo es…¿que estoy haciendo mal? Porque en todos los videos que veo, al configurar la hora del PLC sale
esa misma hora como local y la de sistema 1h menos, a mi es al reves.
Muchas gracias a todos, si pudieseis echarme una mano os lo agradeceria.
Saludos.
Hola Javier. Yo lo veo bien. La hora del sistema se supone que es UTC+0, y luego la local, la que corresponda, por ejemplo UTC+1, por tanto lo lógico es que la local tenga una hora más.
La idea de esta doble hora es que tengas PLC en diferentes husos horarios con la misma hora, por poner un ejemplo de uso. Todos tienen la misma hora de sistema, pero la hora local, cambia en función de dónde esté el PLC.
Saludos
Hola Íñigo;
Tienes este ejemplo de acceso al reloj para el S7-300 con Tia Portal en vez del Step 7? No sé si cambiará mucho.
Y cómo lo vemos en un HMI?
Muchas gracias.
Saludos!
En TIA portal está chupado ya que te lo da en DTL, que es una estructura con todo bien separadito. Luego para mostrarlo en el HMI es inmediato ya que es un tipo de dato que permite mostrarse directamente en TIA Portal.
Si solo quieres la hora, pues tendrás que usar las funciones de fecha y hora para quedarte solo con la fecha, o solo con la hora.
Pero con eso es con el 1200, pero con el 300 también?
Muchas gracias.
No, en TIA Portal con el S7-300/400 lo programas igual que si fuera en S7 tradicional. Solo cambia la apariencia del interfaz, pero las prestaciones y funcionalidades, son las mismas.
Ok, muchas gracias, a ver si me funciona.
Buenas noches. Sigo mucho tus vídeos y son geniales. Enhorabuena!!!!
Una pregunta… Los 8 byte están en código BCD, ok!!! Entonces, como con un solo byte en código BCD es capaz de obtener un entero de 4 dígitos??? Hablo del año, ya que por dígito decimal necesita 4 bit en BCD.
perdon… queria decir para un degito decimal en BCD necesita 4 bit
Hola buen dia estoy buscando si existe algun FC para la conversion de dias a dias julianos sabras si ya existe algo asi?
No me suena, la verdad. No lo he usado nunca.
Saludos Iñigo, muy buenos tus videos.
Queria preguntar, si hay manera de crear una variable Date_and_time y almacenar el contenido de la Fecha y hora tal cual se lee en el SFC1, que dicha variable sea parte de una structura de arreglo y luego poder mover el contenido de la variable a traves de las posiciones del arreglo.
Echa un vistazo a esta entrada: https://programacionsiemens.com/como-crear-una-variable-dtl-en-la-serie-300-en-tia-portal/
Hola Iñigo que tal mira tengo una CPU S7-1500 a la cual le cambio la hora y zona horaria, tanto por hardware desde tia portal y desde el display que trae el plc ahí ningun problema, sin embargo transcurrido un tiempo se cambia la hora a otro horario y no al de mi pais
He probado varias veces y aun asi vuelve a cambiarse la hora
uff, lo siento, pero no sabría decirte cual es el problema.