Arrays para registro de fecha/hora y muestra analogica

  • 4 Respuestas
  • 3041 Vistas

Mariano Mazza

  • Aprendiz
  • **
  • Mensajes: 20
Arrays para registro de fecha/hora y muestra analogica
« : agosto 15, 2016, 21:15:28 pm »
Estoy creando una tabla que registra valores que toma de una entrada analógica

Necesito registrar fecha y hora mas 30 valores que se obtienen en lecturas cada 1 minuto (osea en 30 min ya tengo todos los valores)
Una vez cargados en un array tengo que pasar al siguiente grupo de mediciones
Solo se me ocurre hacerlo con un array bidimensional   array[] []  pero he probado cuanta sintaxis se me ocurrió y da error

Doy ejemplo:
largo del array 37 y cant renglones 10


new fecha=16
new hora=12
new valor_dia [37][10]

valor_dia_1 [37][0] = {fecha,hora,'texto1',texto2',valo1,valor2,.......}


en el caso de texto1 es la suma de un texto y una variable que tampoco pude concatenar

intente:    new texto1 = ('Mariano=' , x)    tambien me da error

Se me complica con la sintaxis....

Desde ya muchas gracias








« Última Modificación: agosto 16, 2016, 13:39:04 pm por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Arrays para registro de fecha/hora y muestra analogica
« Respuesta #1 : agosto 16, 2016, 13:29:24 pm »
Buenos dias,

Para crear un array bidimensional haces:

Código: (Pawn) [Seleccionar]

new Array[x][y]


Donde "x" es la fila e "y" es la columna. Pero "y" puede contener varios elementos y ser un "array" en si mismo.

Por ejemplo, si necesitas registrar "30" eventos con "2" valores enteros cada uno, haces:

Código: (Pawn) [Seleccionar]

new Array[30][2]


Para acceder al registro "15", y sumar los valores "1" y "2", podes hacer:

Código: (Pawn) [Seleccionar]

new Array[30][2]
new Suma

Suma = Array[14][0] + Array[14][1]


Notar que los elementos de cada array empiezan con el indice "0", por lo que acceder al elemento "1" de la fila "15", se indexa como: Array[14][0]



Finalmente, una forma simple de registrar hora/fecha es usar un "TimeStamp".
Un TimeStamp es un numero entero que contiene el numero de segundos que pasaron desde el 01/01/1970 a las 00:00 hs.

La función RtcGetTimestamp() te devuelve el TimeStamp del segundo actual.

Entonces, teniendo ese numero entero, es facil almacenarlo de forma compacta en un array de enteros.

Luego la función TimeConvertTimestamp() te permite convertir ese TimeStamp en valores legibles por un humano.

Ejemplo:

Supongamos que tenemos el timestamp de un evento que ocurrió en determinado momento (que pudo
haber ocurrido en cualquier fecha). Con la función TimeConvertTimestamp() podemos obtener la fecha y
hora en que el evento ocurrió.

Código: (Pawn) [Seleccionar]

   // Variables que almacenará el TimeStamp y fecha/hora.
   new TimeStamp, Day, Month, Year, Hour, Min, Sec

   // Obtener timestamp actual
   TimeStamp = RtcGetTimestamp()

   // Esperar 1 segundo (solo a modo de ejemplo)
   DelayS(1)

   // Obtener fecha y hora a partir de variable TimeStamp.
   TimeConvertTimestamp(TimeStamp, Day, Month, Year, Hour, Min, Sec)
   
   // Imprimir fecha y hora del reloj en display LCD de VirtualHMI.
   nLcdPrintf(0, 0, LCD_CLRLINE, "%02d/%02d/%d", Day, Month, Year)
   nLcdPrintf(0, 1, LCD_CLRLINE, "%02d:%02d:%02d", Hour, Min, Sec)


Ve rmanual STX80XX-MP-PLC-AX_CX_DX.pdf para descripción de funciones completas, ver pag. 161.



Para tu ejemplo de Array podes aplicarlo de la siguiente manera:

En cada minuto, almacenas el valor de la muestra analógica y el TimeStamp.

Supongamos el siguiente código (ilustrativo):

Código: (Pawn) [Seleccionar]

new Samples[30][2]

// Almacenar en fila 0 del array muestra analogica y timestamp.

Samples[0][0] = VinRead(1)
Samples[0][1] = RtcGetTimestamp()

// ... 1 minuto despues ...

// Almacenar en fila 1 del array muestra analogica y timestamp.

Samples[1][0] = VinRead(1)
Samples[1][1] = RtcGetTimestamp()


Luego si queres obtener la hora/fecha de la muestra almacenada haces:

Código: (Pawn) [Seleccionar]

 
  // Variables que almacenará el TimeStamp y fecha/hora.
   new TimeStamp, Day, Month, Year, Hour, Min, Sec

   // Obtener timestamp de muestra "5"
   TimeStamp = Samples[4][1]

   // Obtener fecha y hora a partir de variable TimeStamp.
   // En las variables Day, Month, Year, Hour, Min, Sec queda el valor convertido.
   TimeConvertTimestamp(TimeStamp, Day, Month, Year, Hour, Min, Sec)

Los mismo que para convertir a voltaje la muestra "5"  obtenida con VinRead(1), podes hacer:

Código: (Pawn) [Seleccionar]

   // Crear variable para almacenar voltaje.
   new Float: Voltaje1 = 0

   // Convertir la muestra binaria adquirida a voltaje, almacenar
   // en variable "Voltaje1". Especificar como resolución 12 bits.
   Voltaje1 = Float: VinToVoltage(1,  Samples[4][0], 12)



Deberias hacer alguna funcion Pawn que emprolije el código y lo haga mas accesible.

Saludos














« Última Modificación: agosto 16, 2016, 13:39:14 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano Mazza

  • Aprendiz
  • **
  • Mensajes: 20
Re:Arrays para registro de fecha/hora y muestra analogica
« Respuesta #2 : agosto 16, 2016, 16:52:58 pm »

Excelente la explicación, me es de gran ayuda!!

Mariano Mazza

  • Aprendiz
  • **
  • Mensajes: 20
Re:Arrays para registro de fecha/hora y muestra analogica
« Respuesta #3 : agosto 16, 2016, 16:56:36 pm »


Hay manera de concatenar texto con una variable?

por ejemplo:

new x = 16
new texto
texto = "Hoy es ".x."de mayo"   

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Arrays para registro de fecha/hora y muestra analogica
« Respuesta #4 : agosto 16, 2016, 18:47:52 pm »
Debes usar la función StrFormat().

Para tu ejemplo:

Código: (Pawn) [Seleccionar]

new x = 16
new texto[25]

// Dejar en array texto[] la cadena "Hoy es 16 de mayo". La cantidad máxima de caracteres que se utilizaran sera de 25-1 en este caso.

StrFormat(texto, 25, false, "Hoy es %d de mayo", x)


El uso de StrFormat() es similar a las funciones nLcdPrintf(), solo que en vez de imprimir en un display, imprime el resultado en un array.

Para unir dos cadenas de texto harías:

Código: [Seleccionar]

new Mensaje[30]
new Nombre[] = "Franz"
new Apellido[] = "Kafka"

// Unir dos cadenas, resultando: "Nombre: Franz Kafka".
StrFormat(Mensaje, 30, false, "Nombre: %s %s", Nombre, Apellido)


En el siguiente link tenes información de sintaxis sobre la función StrFormat():
http://www.slicetex.com/foro/smf/index.php?topic=50.msg132#msg132




Saludos
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com