el 05-26-2016 03:28 PM
Hola,
Probablemente este sea un problema muy común y aparentemente ya hay soluciones en el foro.
Sin embargo no logra dar con el correcto y ya llevo días buscando sin solución.
Explico mi problema:
Estoy adquiriendo data de un powermeter mediante comunición MODBUS, tuve algunos problemas con la librería, pero ya le agarré la maña.
El asunto está en que grafico en un chart, puesto que en teoría tengo un tiempo de muestreo constante de un segundo.
El problema de sincronizar el tiempo inicial lo he logrado usando un nodo de propiedad offset al cual le asigno el valor de la hora actual.
El multiplier lo dejo en 1 puesto que coincide con el de mi tiempo de muestreo.
Y efectivamente me funciona al iniciar la aplicación por primera vez. La gráfica se visualiza en tiempo real.
El asunto está en que al dejar monitorizando de un día para otro se producen desfaces grandes, esto a pesar de estar haciendo uso de un timed loop con 1000 ms. Entiendo que se me pueda desincronizar la data (lo cual es aceptable en pequeñas proporciones). Pero de un día para otro el desfasaje se hace de más de 24 horas. Con lo cual la gráfica se torna insostenible. Ni parando y rejecutando el programa logro solucionarlo.
Tengo que borrar la data del chart y hasta cerrar la aplicación para volver a sincronizar correctamente.
Es cierto que por problemas de comunicacióny en algunos caso pierdo data, pero hice que el código identifique esos errores rellene con el último dato anterior.
el 05-31-2016 03:20 PM
Hola jimkurk,
Espero estés muy bien. Revisando lo que me comentas en el foro, seguramente lo que está ocurriendo es que aunque tienes el ciclo temporizado a 1 segundo cada iteración, lo estás ejecutando en un sistema operativo que no logra correr en tiempo real (no nos asegura que exactamente cada iteración durará un segundo), por lo que si en algún momento se abre alguna otra aplicación que demande procesamiento, puede que alente la ejecución de su ciclo.
Para evitar que ocurra esto se pueden tomar dos alternativas. Utilizar algún dispositivo que nos asegure que corre las aplicaciones en tiempo real, como los equipos de nuestra plataforma RIO:
NI CompactRIO
http://www.ni.com/compactrio/esa/
Otra alternativa, es utilizar el tipo de dato de waveform. El waveform, además de incluir un arreglo con todas las muestras de la señal, uno puede darle información como el instante de tiempo en el que inicia la adquisición, y el tiempo de muestreo. Y con esto, al desplegarla en una waveform graph, LabVIEW asume que estas muestras se tomaron de forma periódica, y aunque el desfasamiento en la adquisición pudo estar presente, LabVIEW solo toma de referencia el tiempo en que se inició la adquisición y agrega el tiempo de muestreo entre cada una de las muestras. en el siguiente documento se explican los componentes del tipo de dato waveform:
Using the Waveform Data Type in LabVIEW
http://digital.ni.com/public.nsf/allkb/B965F316364DE17B862572DF00363B10
Espero te sea de utilidad esta información y quedo al pendiente de cualquier otra duda.
Saludos.
Guillermo O.
National Instruments México