0 BEGIN PGM 81801_ES MM 1 ;Programa NC para calcular la fecha y la hora, 2 ;a partir de la hora del sistema actual. 3 ;La hora del sistema actual la ha guardado el 4 ;control numérico en el programa al que se 5 ;llama, en el parámetro Q0. 6 ;El valor es tiempo en segundos que han 7 ;transcurrido desde el 1/1/1970 a las 0:00 h. 8 ;Puesto que se toma como referencia la hora 9 ;UTC, existe la posibilidad de definir la 10 ;diferencia de tiempo entre la hora UTC y la 11 ;hora local. Para ello, registrar en el 12 ;parámetro Q50 la diferencia en horas. 13 ;Los valores calculados los guarda el control 14 ;numérico del siguiente modo: 15 ;Q1= año 16 ;Q2= mes 17 ;Q3= día 18 ;Q4= hora 19 ;Q5= minuto 20 ;Q6= segundo 21 ;Entonces, estos valores ya se pueden utilizar. 22 ; 23 ;Registro de la diferencia entre la hora UTC y 24 ;la hora local en horas Q50 = 2 ;DIFERENCIA DE TIEMPO EN HORAS 25 ; 26 ;A partir de aquí ya no se cambia nada 27 ;Cálculo de los segundos totales Q10 = Q0 ;Copiar la hora del sistema Q51 = Q50 * 3600 ;Conversión de la diferencia de tiempo en segundos Q10 = Q10 + Q51 ;Hora del sistema + diferencia de tiempo 28 ;Cálculo año Q1 = 1969 ;Inicio año 29 LBL 10 Q1 = Q1 + 1 ;Seguir contando un año Q12 = Q1 / 4 - INT ( Q1 / 4 ) 30 FN 10: IF +Q12 NE +0 GOTO LBL 18 ;si no es divisible por 4, no es año bisiesto Q12 = Q1 / 400 - INT ( Q1 / 400 ) 31 FN 9: IF +Q12 EQU +0 GOTO LBL 15 ;si es divisible por 400, es año bisiesto Q12 = Q1 / 100 - INT ( Q1 / 100 ) 32 FN 9: IF +Q12 EQU +0 GOTO LBL 19 ;si es divisible por 100, no es año bisiesto 33 LBL 15 Q19 = 366 * 24 * 3600 ;Segundos del año Q20 = 1 ;Marca: año bisiesto Q10 = Q10 - Q19 ;Hora del sistema - Año 34 FN 11: IF +Q10 GT +0 GOTO LBL 10 ;si la hora del sistema es positiva, el año todavía no se ha encontrado 35 FN 9: IF +0 EQU +0 GOTO LBL 19 ;Año encontrado 36 ; 37 LBL 18 Q19 = 365 * 24 * 3600 ;Segundos del año Q20 = 0 ;Marca: no año bisiesto Q10 = Q10 - Q19 ;Hora del sistema - Año 38 FN 11: IF +Q10 GT +0 GOTO LBL 10 ;si la hora del sistema es positiva, el año todavía no se ha encontrado 39 LBL 19 ;Año encontrado Q10 = Q10 + Q19 ;Segundos restantes al comienzo del año 40 ; 41 ;Cálculo mes 42 ;Enero Q2 = 1 ;Número de mes Q12 = 31 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 43 FN 11: IF +Q10 GT +0 GOTO LBL 22 ;Si quedan segundos restantes, saltar a febrero Q10 = Q10 + Q12 * 86400 ;Segundos restantes inicio del mes 44 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 45 ;Febrero 46 LBL 22 Q2 = Q2 + 1 ;Contar un mes más Q12 = 28 + Q20 ;Número de días del mes + marca año bisiesto Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 47 FN 11: IF +Q10 GT +0 GOTO LBL 23 ;Si quedan segundos restantes, saltar a marzo Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 48 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 49 ;Marzo 50 LBL 23 Q2 = Q2 + 1 ;Contar un mes más Q12 = 31 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 51 FN 11: IF +Q10 GT +0 GOTO LBL 24 ;Si quedan segundos restantes, saltar a abril Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 52 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 53 ;Abril 54 LBL 24 Q2 = Q2 + 1 ;Contar un mes más Q12 = 30 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 55 FN 11: IF +Q10 GT +0 GOTO LBL 25 ;Si quedan segundos restantes, saltar a mayo Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 56 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 57 ;Mayo 58 LBL 25 Q2 = Q2 + 1 ;Contar un mes más Q12 = 31 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 59 FN 11: IF +Q10 GT +0 GOTO LBL 26 ;Si quedan segundos restantes, saltar a junio Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 60 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 61 ;Junio 62 LBL 26 Q2 = Q2 + 1 ;Contar un mes más Q12 = 30 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 63 FN 11: IF +Q10 GT +0 GOTO LBL 27 ;Si quedan segundos restantes, saltar a julio Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 64 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 65 ;Julio 66 LBL 27 Q2 = Q2 + 1 ;Contar un mes más Q12 = 31 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 67 FN 11: IF +Q10 GT +0 GOTO LBL 28 ;Si quedan segundos restantes, saltar a agosto Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 68 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 69 ;Agosto 70 LBL 28 Q2 = Q2 + 1 ;Contar un mes más Q12 = 31 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 71 FN 11: IF +Q10 GT +0 GOTO LBL 29 ;Si quedan segundos restantes, saltar a septiembre Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 72 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 73 ;Septiembre 74 LBL 29 Q2 = Q2 + 1 ;Contar un mes más Q12 = 30 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 75 FN 11: IF +Q10 GT +0 GOTO LBL 30 ;Si quedan segundos restantes, saltar a octubre Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 76 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 77 ;Octubre 78 LBL 30 Q2 = Q2 + 1 ;Contar un mes más Q12 = 31 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 79 FN 11: IF +Q10 GT +0 GOTO LBL 31 ;Si quedan segundos restantes, saltar a noviembre Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 80 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 81 ;Noviembre 82 LBL 31 Q2 = Q2 + 1 ;Contar un mes más Q12 = 30 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 83 FN 11: IF +Q10 GT +0 GOTO LBL 32 ;Si quedan segundos restantes, saltar a diciembre Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 84 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 85 ;Diciembre 86 LBL 32 Q2 = Q2 + 1 ;Contar un mes más Q12 = 31 ;Número de días del mes Q10 = Q10 - Q12 * 86400 ;Segundos restantes - Segundos del mes 87 FN 11: IF +Q10 GT +0 GOTO LBL 38 ;Si quedan segundos restantes, saltar a mensaje de error Q10 = Q10 + Q12 * 86400 ;Segundos restantes al inicio del mes 88 FN 9: IF +0 EQU +0 GOTO LBL 39 ;Salto al cálculo de día 89 ;Emisión de mensaje de error 90 LBL 38 91 FN 14: ERROR= 1088 ;Datos contradictorios 92 ;Cálculo de día 93 LBL 39 Q3 = INT ( Q10 / 86400 ) + 1 ;Determinar el día Q10 = Q10 - ( ( Q3 - 1 ) * 86400 ) ;Cálculo de segundos restantes 94 ;Cálculo horas Q4 = INT ( Q10 / 3600 ) ;Determinar horas Q10 = Q10 - ( Q4 * 3600 ) ;Cálculo de segundos restantes 95 ;Cálculo minutos Q5 = INT ( Q10 / 60 ) ;Determinar minutos Q10 = Q10 - ( Q5 * 60 ) ;Determinar segundos restantes 96 ;Cálculo segundos Q6 = INT Q10 ;Determinar segundos 97 ;Final del programa 98 END PGM 81801_ES MM