PDA

Ver la versión completa : Manejar Fechas S7-300



pedrito
24/06/2010, 08:21
Buenas de nuevo.
Os voy a dar bien la vara hasta que me suelte con los Siemens...:o

Cómo puedo manejar la fecha y hora del S7-300 ?

Básicamente es para hacer comparaciones con dicho valor y hacer determinadas cosas entre franjas horarias al día y luego aparte según qué mes del año.

Gracias de antemano.

Txispo
24/06/2010, 22:08
Hola,
lo primero, el formato DATE_TIME: Si miras en la ayuda, verás que el formato DATE_TIME son 8 bytes, con este contenido en BCD:
Byte 0 -> Año, desde 1990 hasta 2089
Byte 1 -> Mes
Byte 2 -> Día
Byte 3 -> Hora
Byte 4 -> Minuto
Byte 5 -> Segundo
Byte 6 -> Centena y Decena de milisegundo
Byte 7 ("Nibble" alto) -> Unidad de milisegundo
Byte 7 ("Nibble" bajo) -> Día de la semana. 1=domingo.
----------------------------------------------------------------------------------------------
Para no tener que hacerlo "a huevo", puedes espresarlo así: DT#2010-06-24:20:55:00.000

Tienes luego una serie de funciones que te son de utilidad:
SFC1 "READ_CLK" -> Leer fecha/hora del PLC
SFC0 "SET_CLK" -> Poner en hora el PLC

Y luego, en la librería IEC Function Blocks tienes un montón de recursos, por ejemplo:

FC1 "AD_DT_TM" Suma un intervalo en formato TIME a un dato DATE_TIME .

La función FC34 "SB_DT_DT" te devuelve el tiempo transcurrido entre dos datos tipo DATE_TIME

Tienes comparaciones de datos DATE_TIME (FC9, 12 y 18)....

Por cierto, el formato TIME: es un dato formato IEC entero 32bit con signo que contiene un intervalo de tiempo en milisegundos, esto es, que vale entre -2147483648ms y +2147483647ms, esto es, entre -T#24D_20H_31M_23S_648MS y T#24D_20H_31M_23S_647MS

Ánimo, que no es tan complicado....
Además, que sepas que hay OBs especiales que se disparan por hora o por fecha....

David
24/06/2010, 22:12
Supongo que se podrá extraer la hora y minutos para hacer comparaciones con valores INT.

pedrito
25/06/2010, 09:50
Buenas de nuevo.
Estoy haciendo pruebas y no consigo ver el valor de la fecha (El operando no es correcto).:confused:

Aparte de esto, he encontrado como crear los bloques de datos sobre la marcha pero no me funciona para este caso. Utilizo este ejemplo:

U E 125.7

Call "Creat_DB"
Low_Limit := W#16#0
Up_Limit := W#16#0
Count := W#16#2
Ret_Val := MW0
DB_Number := MW10

CALL "READ_CLK"
RET_VAL:=MW1
CDT :=DB1.FechaHora2

http://img685.imageshack.us/img685/8407/enviom.th.jpg (http://img685.imageshack.us/i/enviom.jpg/) Uploaded with ImageShack.us (http://imageshack.us)

Txispo
30/06/2010, 22:24
Hola,
haz una prueba:
Crea un FC, y en la zona de declaración de variables, creas una TEMP llamada AHORA con formato DATE_AND_TIME. Supongamos que te ocupa 8 bytes, desde LB0 hasta LB7.

Y haces lo siguiente:
CALL "READ_CLK"
RET_VAL:=MW1
CDT :=#AHORA
// MW1 es una palabra para guardar el código de error que tengas.
A partir de este momento, tienes en la pila de datos locales esta información:
LB0 -> Año, desde 1990 hasta 2089
LB1 -> Mes
LB2 -> Día
LB3 -> Hora
LB4 -> Minuto
LB5 -> Segundo
LB6 -> Centena y Decena de milisegundo
LB7 ("Nibble" alto) -> Unidad de milisegundo
LB7 ("Nibble" bajo) -> Día de la semana. 1=domingo.

Por tanto, si quieres guardar por ejemplo el minuto en la MW200, harías
L LB4
T MW200 // el hueco libre lo rellena con ceros.

Fíjate que está en BCD, esto es, cada 4 bits codifican un dígito decimal del 0 al 9, por lo que el número en hexadecimal coincide con su valor decimal.

Para convertir BCD a entero, tienes la instrucción BTI

Txispo
30/06/2010, 23:46
Una vuelta más.... Además de esa FC con #ahora como dato temporal, puedes crear un DB, p. ej, DB10 con esta estructura:

+0.0 anno byte b#16#0
+1.0 mes byte b#16#0
+2.0 dia byte b#16#0
+3.0 hora byte b#16#0
+4.0 min byte b#16#0
+5.0 seg byte b#16#0
+6.0 ms1 byte b#16#0
+7.0 ms2 byte b#16#0


Si ahora en el FC de antes agregas esto:

Call SFC20
SRCBLK:= p#L0.0 byte 8
RET_VAL:=MW1
DSTBLK := P#DB10.DBX0.0 BYTE 8

tendrás en el DB10 los datos de fecha/hora

KNUM
04/08/2010, 17:38
Hola a todos.
Ésta es mi primera aportación al foro y aprovecho para hacer las presentaciones.
Me llamo Jose y estoy empezando con esto del S7 por necesidades laborales. Tengo que programar el control de iluminación de un taller con una ET200S. En principio los requisitos son simples, pero me he atascado cuando me han pedido que apague todo el alumbrado durante el fin de semana. He leido vuestro hilo pero no consigo extraer la información del byte 7 nibble bajo para poder hacer la comparación.
¿Me podeis echar una manilla?
Muchas gracias por adelantado.