Guardar en EEPROM Fecha y Hora

  • 9 Respuestas
  • 6890 Vistas

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Guardar en EEPROM Fecha y Hora
« : mayo 05, 2016, 11:54:12 am »
Hola Boris,

Tendrás algún código de ejemplo para guardar en memoria EEPROM los datos de la fecha y la hora del RTC...?

Saludos

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #1 : mayo 05, 2016, 20:36:27 pm »
Hola Mariano,

Es muy fácil, a modo general debes leer hora/fecha actual del RTC con función: RtcGetAll()
Lo copias a un array a los datos.

Luego al array lo guardas en EEPROM con la funcion EepromWriteCells()

Finalmente podes leer nuevamente el array de EEPROM conEepromReadCells().

Las funciones están descritas en documento: http://slicetex.com/hw/stx80xx/docs/STX80XX-MP-PLC-AX_CX_DX.pdf

Te adjunto un ejemplo que acabo de hacer, donde se guarda la hora/fecha del PLC al arrancar en la memoria EEPROM y
luego si accedes desde el servidor Web, se muestra la fecha/hora en la pagina inicial Web.

Es importante que tengas la fecha/hora del PLC configurada correctamente así no ves datos erróneos.



Te explico a modo general el código:

Para hacerlo modular, en el archivo RtcEeprom.p puse dos funciones para guardar fecha/hora en memoria EEPROM y
otra función para leer fecha/hora de la memoria EEPROM, se llaman RtcSaveToEeprom() y RtcLoadFromEeprom().

Código: (Pawn) [Seleccionar]
RtcSaveToEeprom()
{
   // Crear variables para almacenar información del reloj.
   new RtcData[7]
   
   // Obtener información del reloj.
   // RtcData[0]=Day, RtcData[1]=Month, RtcData[2]=Year, RtcData[3]=Hour, RtcData[4]=Min, RtcData[5]=Sec, RtcData[6]=DOW
   RtcGetAll(RtcData[0], RtcData[1], RtcData[2], RtcData[3], RtcData[4], RtcData[5], RtcData[6])
   
   // Escribir RtcData[] en a partir de la dirección 0 de la EEPROM hasta la direccion 23.
   // La catidad de bytes a escribir es: 6 celdas * 4 bytes = 24 bytes
   return EepromWriteCells(0, 6, RtcData)
}

RtcLoadFromEeprom(&Day ,&Month, &Year, &Hour, &Min, &Sec)
{
   new Stat = 0
   new RtcData[6]
   
   // Leer 6 celdas a partir de la dirección 0 de la EEPROM.
   if((Stat=EepromReadCells(0, 6, RtcData)) < 0)
   {
      // Error de lectura.
      return Stat
   }   
   
   // Retornar fecha/hora en variables pasadas como argumentos de la funcion.
   Day=RtcData[0]
   Month=RtcData[1]
   Year=RtcData[2]
   Hour=RtcData[3]
   Min=RtcData[4]
   Sec=RtcData[5]
   
   // Retornar estado de la funcion.
   return Stat
}

Si te fijas en el código anterior, las funciones son simples: cargar fecha/hora y guardan en EEPROM.
Luego cargan de EEPROM fecha y hora, y la devuelven en variables para el usuario.

Luego en el servidor Web, desde el archivo OnPrintEvent.p imprimimos las cadenas de fecha/hora en la pagina Web dinamica:

Código: (Pawn) [Seleccionar]

   // Crear variables para almacenar información del reloj.
   new Day, Month, Year, Hour, Min, Sec

[snip]

      //
      // Procesar cadenas relacionadas a index.shtml
      //
      case 30:
      {
         // Leer fecha/hora de EEPROM.
         RtcLoadFromEeprom(Day, Month, Year, Hour, Min, Sec)
         
         // Imprimir fecha en pagina Web.
WebServerPrintStr("%02d/%02d/%04d", Day, Month, Year)
      }
      case 31:
      {
         // Leer fecha/hora de EEPROM.
         RtcLoadFromEeprom(Day, Month, Year, Hour, Min, Sec)
         
         // Imprimir hora en pagina Web.
         WebServerPrintStr("%02d:%02d:%02d", Hour, Min, Sec)
      }

[snip]



Cualquier duda me avisas, saludos.






« Última Modificación: mayo 05, 2016, 20:42:22 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #2 : mayo 12, 2016, 12:43:13 pm »
Que tal Boris,

Con respecto a este tema, decidí elaborar como primera prueba un muestreo de la variable vía web server.

El primer problema que tengo es al intentar "poner en hora" el RTC del PLC.
Ingreso mediante el menú PLC a la pestaña Fecha/Hora; la fecha la muestra bien (12-05-16) pero en los campos
hora / minutos / segundos muestra todos los valores en cero.... presionando el botón "actual" , levanta correctamente
la hora de la PC... luego le doy "enviar" y al parecer la actualiza (Según dice un cartel emergente) hasta ahí bárbaro.

Luego, al conectarme de nuevo con el PLC y darle click nuevamente sobre la pestaña Fecha/Hora, todos los valores se
encuentran en cero nuevamente... y por las pruebas en el programa que estoy haciendo aparentemente nunca se produce la actualización de la hora (Hora/minutos/segundos).
*****************************************************************
El segundo problema es el que sigue:

Para no leer todos los datos de la fecha (puesto que en primera medida sólo me interesa HHMMSS)
Uso el siguiente código
//////////////////////////////////////////////////////////////////////////////
   RtcGetTime(RtcData[0], RtcData[1], RtcData[2])
   //Hora_completa=RtcData[0]+':'+RtcData[1]+':'+RtcData[2];
   
   Hora_completa=RtcData[1];   // muestro sólo los minutos
   
   Hora[puntero_horas]=Hora_completa;
//////////////////////////////////////////////////////////////////////////////
En este código, sólo quedé mostrando los minutos (RtcData[1])... ya que no me funciona como creía la instrucción

   Hora_completa=RtcData[0]+':'+RtcData[1]+':'+RtcData[2]; // Intento concatenar subcadenas como en C++

Mi intención es armar una cadena o string con los valores de modo que quede HH:MM:SS...
para que este dato me quede en una sola variable.
Todas las variables están declaradas en forma global en PLC Main usando la reservada "new"... no sé
si deba declararla de otra forma...
Aguardo tus comentarios para aclarar estas dudas...


Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #3 : mayo 12, 2016, 13:10:58 pm »
Buenas tardes,

En la pestaña Fecha/Hora es solo para escribir la fecha/hora de la PC en el PLC. No muestra la hora del PLC, por eso te muestra cero.

En la pestaña Información, en Current Time,  te muestra la hora actual del PLC cuando apretás el botón "Conectar!".

Por otro lado, la forma de concatenar qué haces no es válida en Pawn.

Hay otra función SrtFormat()  qué te puede servir para poner la hora en un string de esa forma.

Luego te paso un ejemplo de uso.

Saludos.



Enviado desde un dispositivo móvil usando Taptalk.

« Última Modificación: mayo 12, 2016, 19:42:18 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #4 : mayo 12, 2016, 19:50:33 pm »
Buenas tardes Mariano,

Para concatenar valores en una cadena, podes utilizar la función StrFormat() como explica el siguiente link:

http://www.slicetex.com/foro/smf/index.php?topic=50.msg132#msg132


Adjunto te paso un ejemplo para cargar, en el cual te crea un servidor Web y en la pagina principal se muestra hora/fecha actual
del PLC, utilizando Strings con el formato: HH:MM:SS y DD/MM/YYYY.

El código al que debes prestar atención esta en la funcion @OnWebServerPrint() y es el siguiente:

Código: [Seleccionar]
      //
      // Procesar cadenas relacionadas a index.shtml
      //
      case 30:
      {
         // Leer fecha/hora de RTC.         
         RtcGetAll(Day, Month, Year, Hour, Min, Sec, DOW)
         
         //Almacenar fecha en string.
         StrFormat(DateStr, 12, false, "%02d/%02d/%04d", Day, Month, Year)
         
         // Imprimir fecha en pagina Web.
WebServerPrintStr("%s", DateStr)
      }
      case 31:
      {
         // Leer fecha/hora de RTC.         
         RtcGetAll(Day, Month, Year, Hour, Min, Sec, DOW)
         
         //Almacenar hora en string.
         StrFormat(TimeStr, 12, false, "%02d:%02d:%02d", Hour, Min, Sec)
         
         // Imprimir hora en pagina Web.
WebServerPrintStr("%s", TimeStr)
      }


Donde:

         //Almacenar hora en string.
         StrFormat(TimeStr, 12, false, "%02d:%02d:%02d", Hour, Min, Sec)


Te imprime sobre la cadena TimeStr la hora HH:MM:SS, según los códigos de formatos y variables que les pases.
El valor 12 es el numero máximo de caracteres que se escribirán en TimeStr incluyendo el terminador '\0', de tal forma
que sepas que la longitud final del array no será sobrepasada en la construcción de la cadena.

Saludos
« Última Modificación: mayo 12, 2016, 19:56:03 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #5 : mayo 16, 2016, 16:11:46 pm »
Gracias Boris... y como puedo hacer para almacenar estas cadenas en un array....? ... Es decir: ¿Como declaro y cargo un array de cadenas?

Enviado desde mi SM-J110M mediante Tapatalk


Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #6 : mayo 16, 2016, 20:50:16 pm »
Buenas tardes.

Es bastante simple, por ejemplo si queres declarar un array con X cadenas de Y elementos, podes hacer:

new StringArray[X][Y]

Por ejemplo, 3 cadenas con capacidad para 20 elementos seria:

new StringArray[3][20]

Luego para acceder a la primera cadena haces: StringArray[0].

Por ejemplo, podemos usar StrFormat() para agregar las cadenas "Hola", "Mundo!" y "Soy un PLC" en el array de la siguiente forma:

Código: (Pawn) [Seleccionar]
   // Cargar StringArray con 3 cadenas.
   StrFormat(StringArray[0], 20, false, "%s", "Hola")
   StrFormat(StringArray[1], 20, false, "%s", "Mundo!")
   StrFormat(StringArray[2], 20, false, "%s", "Soy un PLC.")

Notar que usamos el 3 argumento con valor "20", ya que es el limite de elementos de cada cadena del array.

Si queres acceder al segundo caracter de la tercera cadena, haces: StringArray[2][1]

En otras palabras, se trata como un array de dos dimensiones.

Adjunto te paso un ejemplo para StxLadder que si lo cargas, te muestra estas 3 cadenas del ejemplo en la pagina principal del servidor.

Por otro lado, si vas a definir 3 cadenas constantes, podes hacer:

Código: (Pawn) [Seleccionar]
StringArray[3][] = { "Hola", "Mundo!", "Soy un PLC." }
Finalmente, hoy liberamos la version StxLadder 1.7.5 y la versión 200 del firmware para STX8091, que permite crear paginas dinamicas que se actualizan de "a fragmentos" automaticamente
sin necesidad de refrescar toda la pagina (luego vamos a publicar ejemplos). Te recomiendo actualizar firmware y software.

Saludos

« Última Modificación: mayo 16, 2016, 20:54:15 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #7 : mayo 17, 2016, 15:54:02 pm »
Gracias Boris... anduvo bárbaro...

Tenía errores de sintaxis en mi programa....
Existe algún documento de donde pueda consultar la sintaxis de todas las funciones Pawn disponibles?

Saludos

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #8 : mayo 17, 2016, 21:11:25 pm »
Perfecto.

En general estan en:

http://slicetex.com/hw/stx80xx/docs/STX80XX-MP-PLC-AX_CX_DX.pdf

http://slicetex.com/ladder/docs/files/STXLADDER-PI.pdf

Y en sus respectivas notas de aplicación.

En el caso de StrFormat() aun no esta documentada oficialmente, pero poder ves la descripción de la misma (y sus funciones compañeras) en:

http://www.slicetex.com/foro/smf/index.php?topic=50.msg132#msg132

Si es para entender en profundidad el lenguaje Pawn (no funciones del PLC), deberías leer este manual.

Quedamos a disposición.



Nota:

Podes probar este ejemplo para el servidor Web que hoy subimos

http://slicetex.com/docs/an/an030/files/WebServerPawn4.zip

Actualiza el reloj en pantalla sin necesidad de recargar la pagina web completa (asi como tambien las entradas digitales).

Requiere ultimo software y firmware instalados.

Mas informacion en:

http://www.slicetex.com/foro/smf/index.php?topic=203.msg997#msg997



« Última Modificación: septiembre 03, 2019, 18:50:47 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Re:Guardar en EEPROM Fecha y Hora
« Respuesta #9 : mayo 17, 2016, 22:26:59 pm »
Eso esta buenisimo Boris.... en mi proyecro va a ser muy util... apenas pueda probarlo te compartire los resultados

Enviado desde mi SM-J110M mediante Tapatalk