Discusiones sobre Productos NI

cancelar
Mostrando los resultados de 
Buscar en lugar de 
Quiere decir: 

Adquirir datos mediante puerto serial, calcular tiempo

Mi problema es el siguiente:

 

quiero adquirir datos enviados mediante un dsPic por la puerta serial,de hecho lo hago y por un tiempo no hay problemas, pero cada cierto rato labview me envia un error(archivo adjunto).

 

Tengo sospechas que puede ser por el tiempo en que envio mis datos, pero lo he intentado con varias y diferentes formas,tengo entendido que dentro del loop while hay que si o si poner un "tiempo de ejecucion", como van a ver en el programa ese tiempo es de 1 seg, y al dspic lo he configurado para que me envie la trama cada 1/2 segundo....No se exactamente si eso esta bien puesto que he dejado los tiempos iguales y el error viene con mas frecuencia.

 

Se me ocurre tambien que que la trama que envio quizas se descordine con el labview y quizas cuando deba leer un numero quizas lea un espacio en blanco o un punto

 

la trama la envio de la siguiente forma dentro del dspic:

 

printf("%f %f %f %f %f %f",enviar1,enviar2,enviar3,enviar4,enviar5,enviar6);

 

Existe alguna forma de coordinar el labview con el dspic para que no se equivoque??, quizas haya que poner un identificador dentro del bloque de escaneo para que haga correctamente la leectura??(si es asi por favor alguien me puede decir como se hace)

 

O quizas no sea nada de lo que dije anteriormente y sea otro error 

 

No se me ocurre que hacer por favor ayuda

 

Saludos al foro!!:)

 

Descargar todos
0 kudos
Mensaje 1 de 9
5.266 Vistas

Hola, en mi opinión puedes tener problemas igualmente en el pic y en el LV y deberías modificar ambos para que el sistema pueda funcionar para largo tiempo sin problemas. Ten en cuenta que usualmente no se usan dos eventos temporizados en sistemas distintos, ya que los relojes nunca van a ser iguales y terminas perdiendo el sync. En estos casos se usa un reloj solamente y el otro sistema debe sincronizarse col primero de otra manera.

 

En el pic podrías marcar una dimensión fija de caracteres enviados y añadir un carácter de terminación. O sea: dale una precisión definida a tus datos, así que no pueda pasar que algo genere una cadena incorrecta que el LV no va aconvertir bien. Podrías por ejemplo modificar tu código de la siguiente manera:

 

printf("%6.3f %6.3f %6.3f %6.3f %6.3f %6.3f\r",enviar1,enviar2,enviar3,enviar4,enviar5,enviar6);

 

De esta manera siempre tendrás una cadena de la misma longitud. No sé si el compilador del PIC puede manejar semejante cadena ya que no lo utilizamos: espero que sí. El "\r" el el retorno de carro (ASCII 13).

 

En el LV puedes imponer en la configuración del VISA que se use el retorno de carro para terminar leyendo. Le das un timeout largo (1.5 seg) de manera que siempre te quedas en el VISA Read hasta que recibas el terminador. Debes chequear el código del salida del Read para discriminar el timeout (Pic no envía: apagado u roto). Yo no puedo ver tu código ya que tengo instalado el LV 8.5, pero se peueden encontrar ejemplos de comunicación con el "termination character": deberías encontrar en tu PC el ejemplo "Advanced serial write and read" donde puedes ver cómo definir el termination character.

 

De esta manera puedes obtener un sistema más estable y que debería poder ir funcionando para largo tiempo sin problemas.



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 2 de 9
5.248 Vistas

primero que nada gracias por responder he logrado darle cierta estabilidad al sistema, esto lo hice gracias a tu sugerencia y aparte le agregue un bloque llamado match true/ false string funtion, he logrado que funcione bien por mas menos 1 hora, mi idea es que no fallle!!!jajajaja o que sea estable por largos periodos de tiempo

 

lamentablemente igual falla, añadi el "\n" como termination char, y funciona bien pero como digo se detiene cada cierto tiempo....

 

como dices debe ser por la coordinacion entre el dspic y labview, la otra idea que se me ocurre es no ocupar el bloque scan from string, pero no se como adquirir y separar la cadena de otra forma.

 

Lamentablemente no puedo subir el vl en 8.5 porque tengo unas funciones que solo aparecen en el 2009(set dynamic data atribute), o quizas si se pueda pero no lo se hacer

 

alguna otra sugerencia??

 

muchas gracias por el tiempo que te das al responder:)

0 kudos
Mensaje 3 de 9
5.239 Vistas

Bueno, ¿has probado ver el mensaje que pasas al Scan from string cuando hay el error? Si pones un probe en aquel cable puedes averiguar que en cada lectura el mensaje sea correcto.

¿Puedes sacar una imagen del código y ponerlo aquí? Lo que puede interesar es la predisposición del puerto serial y el proceso de lectura.



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 4 de 9
5.236 Vistas

no no lo he probado asi....

 

pero lo probe cuando salta el error le doy a stop y me y tengo un indicador de string que al quedar en stop me permite ver el error...

 

con esto me di cuenta que en algun momento la cadena no llega completamente o sea llegan por ejemplo 3 valores... nose porque ocurre esto

 

en estos momentos hago otra prueba enviando los datos por el dspic  mas lentamente (1 seg)... no se si funcionara pero si salta el error te subo lo que me salio con el probe.

 

Vale y gracias:)

0 kudos
Mensaje 5 de 9
5.233 Vistas

y como era de esperarse salto el error

 

le saque las cosas al vl para dejarlo en 8.5.

 

ahora un par de precisiones desde ahora mi cadena la envio desde el dspic de la sigte forma

 

printf("identificador_enviar%1.2f %1.2f %1.2f %1.2f %1.2f %1.2f\n",enviar1,enviar2,enviar3,enviar4,enviar5,enviar6);

 

para que?.. esto para poder ir distriminando y hacer la lectura solo cuando sea correcta y lo veras en el vl que subi 

 

gracias nuevamente!!

Descargar todos
0 kudos
Mensaje 6 de 9
5.231 Vistas

Bueno, hay algunos puntos que corregir para que el còdigo funcione como quieres.

 

Antes que todo es necesario imponer el correcto termination character en el VISA Configure Serial Port ya que por defecto se asume el 0x0A o sea el '\n'. El '\r' corresponde al caràcter 13.

 

Secundariamente si mides cuàntos caracteres hay en el puerto inmediatamente después de enviar el pedido es muy fàcil que el nùmero sea incorrecto, ya que debes dejar que el PIC maneje el comando y envìe la respuesta. Pero esto ya no es necesario si lees hasta el terminador, por lo que he modificado al vi.

 

En el còdigo ademàs he modificado la interpretaciòn del mensaje para simplificarla. Creo que va a funcionar aunque no he podido testearlo.



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 7 de 9
5.196 Vistas

Hola Pasmosodico,

he estado pensando un poco en tu vi y hay algunos detalles que no me quedan claros, en particular aquel botón "Calibrar" que has puesto en la pantalla.

 

Normalmente hay dos maneras de interactuar con dispositivos externos:

  1. Polling periódico. Esta es una manera muy común: se envía un pedido al dispositivo y este contesta dentro de cierto tempo.
  2. El dispositivo envía regularmente mediciones sin pedido. En algun caso dentro de esta tarea puedo enviar pedidos especiales al dispositivo para que haga algo diferente

El caso 1 arriba es el más simple: casi no hay necesidad de coordinar el proceso de lectura con el de pedido puesto que si todo va bien el dispositivo siempre me va a contestar dentro de cierto tiempo. Si este es tu caso, todo el proceso de lectura debería estar dentro del case que evalúa el botón "Calibrar". Si el PCI no contesta debes considerar que esté roto u desconectado u apagado y decidir qué hacer (seguramente poner una advertencia en la pantalla para poen el usuario al tanto).

 

El caso 2 es un poco mas complicado, porque se debe considerar el momento en el que enviar el pedido al PCI para que esto esté listo para escuchar y contestar. Además, no veo en el código si esperas en este momento una contestación diferente.

 

Espero que estas consideraciones puedan ayudarte en completar a lo mejor tu programa.



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 8 de 9
5.187 Vistas

primero que nada gracias por responder nuevamente, disculpa la demora de mi respuesta pero tuve problemas con el internet

 

probare el vl que subiste para ver como me va

 

sobre tu duda el boton "calibrar", bueno primero que nada el proyecto que realizo trata de emular a un datalogger donde las corrientes llegan(4-20)al dsPIC, y este ultimo las envia  mediante puerto serial a labview, el boton "calibrar" es para que el "usuario", envie los datos al dsPIC, estos datos corresponderan a los valores maximo y minimos de cada sensor que en mi caso seran 6 la trama esta concadenada en labview cosa que el dsPIC  las reciba almacene y procese de manera correcta.... bueno esa parte esta resuelta pero ahora estaba medio atascado con el problema que te comentaba probare tu solucion a ver si me resulta y luego contare

 

Muchas gracias

 

🙂

0 kudos
Mensaje 9 de 9
5.170 Vistas