Al crear un programa de pruebas con TestStand, la funcionalidad de prueba principal se implementa en distintos módulos de código. TestStand proporciona adaptadores que llaman a módulos de código desarrollados mediante varios entornos y lenguajes de programación, como LabVIEW, LabWindows™/CVI™, C#, VB .NET, C/C++ y ActiveX.
Este documento analiza las prácticas recomendadas que se deben tener en cuenta al desarrollar los módulos de código del sistema de pruebas y llamarlos desde su secuencia de pruebas. Al utilizar este documento, se asume que usted tiene un conocimiento práctico básico de TestStand, incluido un entendimiento de cómo crear una secuencia de prueba básica. Si no está familiarizado con estos conceptos, consulte los siguientes recursos de inicio antes de utilizar este documento:
Para obtener información más específica sobre cómo implementar módulos de código, consulte los temas de ayuda Tipos de pasos integrados y Adaptadores de módulos de TestStand.
Antes de comenzar a desarrollar un sistema de pruebas, considere la posibilidad de definir un enfoque general para los siguientes aspectos del sistema de prueba:
Al diseñar un sistema de pruebas, es importante definir un nivel consistente de granularidad para los módulos de código. La granularidad es el alcance de la funcionalidad de cada módulo de código en un sistema de pruebas. Una secuencia de pruebas con baja granularidad llama a pocos módulos de código, cada uno de los cuales realiza más funciones, mientras que una secuencia con alta granularidad llama a muchos módulos de código, cada uno con un alcance menor.
Baja granularidad | Alta granularidad |
|
|
Debe buscar un equilibrio entre estos extremos, ya que cada uno tiene sus propias ventajas.
Implementar una prueba simple mediante diferentes niveles de granularidad
Para mantener una granularidad constante en todo el sistema de pruebas, cree un conjunto de estándares para el desarrollo de módulos de código, como por ejemplo:
Al especificar la ruta de un módulo de código en un paso de prueba, puede elegir una ruta absoluta o relativa. Se recomienda evitar rutas absolutas por los siguientes motivos:
Cuando especifica una ruta relativa, TestStand utiliza una lista de directorios de búsqueda para resolver la ruta. Estos directorios de búsqueda suelen contener el directorio de archivos de secuencia actual, los directorios específicos de TestStand y los directorios del sistema.
Es importante definir una estructura de archivos para sus secuencias de prueba y módulos de código antes de comenzar el desarrollo. Use las siguientes normas para definir una estrategia para almacenar archivos de secuencia y módulos de código.
Defina una estructura de directorio donde los módulos de código están en un subdirectorio del archivo de secuencia
Al implementar el código de prueba con la Utilidad de implementación TestStand, puede elegir destinos específicos para los archivos de secuencia y los módulos de código dependientes. Si existe una ruta relativa entre los directorios de destino para el archivo de secuencia y el módulo de código, la Utilidad de implementación TestStand actualiza la ruta en el archivo de secuencia para que apunte a la ubicación actualizada. En la mayoría de los casos, es mejor hacer coincidir la estructura de directorios de su implementación con la del sistema de desarrollo, para asegurarse de que la implementación sea lo más similar posible al código en su máquina de desarrollo.
Al definir el alcance de los módulos de código para su sistema de pruebas, es importante definir una estrategia para la cual se implementará la funcionalidad en los módulos de código en lugar de en el archivo de secuencia. Las siguientes secciones pueden ayudarle a determinar el lugar más apropiado para implementar una funcionalidad común:
Lo ideal sería que el módulo de código tuviera funcionalidades directamente relacionadas con la obtención de mediciones de prueba y que la secuencia de prueba procesara el resultado de la prueba sin procesar. Este enfoque tiene los siguientes beneficios:
Para obtener mediciones más simples, el módulo de código puede devolver el valor de medición sin procesar a la secuencia para su procesamiento. Por ejemplo, si un paso de prueba mide el voltaje en un pin específico de la unidad bajo prueba (UUT), el módulo de código debe devolver el valor medido en lugar de realizar la verificación directamente en el módulo de código. Puede procesar este valor para determinar el resultado de la prueba en el archivo de secuencia utilizando un paso de prueba de límite numérico.
La evaluación de los límites en el paso de prueba simplifica los módulos de código y mejora el registro de resultados
Sin embargo, debido a la complejidad de algunas pruebas, no siempre es posible procesar los resultados de la prueba sin procesar en el archivo de secuencia. Para hacer mediciones más complejas, quizá sea necesario un procesamiento adicional de los datos de resultados. Los datos complejos se pueden procesar en una sola cadena o resultado numérico, que luego se puede evaluar en TestStand a través de una comparación numérica o cadena. Por ejemplo, los resultados de una prueba de barrido de frecuencia son complejos y no se pueden evaluar directamente, pero los datos se pueden procesar en un solo número que representa el valor mínimo. En este caso, el módulo de código debe evaluar el resultado procesado y devolver los datos de frecuencia en un parámetro independiente para su registro, como se muestra en el siguiente ejemplo de prueba del dispositivo móvil:
Para datos más complejos, procese los datos en el módulo de código para generar un resultado numérico o de cadena, y use un parámetro para pasar los datos sin procesar para registrarlos
Si los datos sin procesar son de gran tamaño, pasar los datos a TestStand puede tener un impacto significativo en el rendimiento. En este caso, plantéese registrar los datos directamente en un archivo TDMS y vincularlos al archivo desde el informe de prueba. Esto le permite hacer referencia a los datos del informe sin la necesidad de pasarlos a TestStand. Consulte la sección Incluir hipervínculos en un informe: archivo TDMS para obtener más información sobre este enfoque.
Si el paso no puede determinar el resultado de la prueba utilizando los tipos de evaluación disponibles en los Pasos de prueba, considere la posibilidad de crear un nuevo tipo de paso con funcionalidad adicional para manejar el tipo de prueba requerido. Para obtener más información sobre cómo crear tipos de pasos personalizados, consulte el artículo Prácticas recomendadas para el desarrollo de tipos de pasos personalizados en esta serie.
Para muchas pruebas, el entorno UUT o de prueba debe estar en un estado determinado antes de que se pueda realizar la prueba. Por ejemplo, es posible que se requiera un voltaje de excitación para tomar una medida de temperatura, o que una cámara térmica deba ajustarse a una temperatura determinada. Para estos tipos de módulos, utilice parámetros para pasar los valores de entrada, como el voltaje de excitación o la temperatura deseada. Esto proporciona muchos de los mismos beneficios que la devolución de los datos sin procesar en los módulos de código de prueba frente a los límites de procesamiento directamente en el código, como se ha explicado en la sección anterior.
TestStand proporciona una funcionalidad integrada para la generación de informes y el registro de bases de datos con los resultados de los pasos de prueba. Por esta razón, evite implementar cualquier tipo de registro de datos directamente dentro de los módulos de código. En su lugar, asegúrese de que los datos que desea registrar se pasen como un parámetro y utilice TestStand para registrar los datos. Algunos datos, como los resultados de las pruebas, los límites y la información de errores se registran automáticamente. Para registrar otros datos, puede usar la función de resultados adicionales para especificar parámetros adicionales que se incluirán en el informe.
Para obtener más información sobre cómo añadir resultados al informe de prueba, consulte el ejemplo Adición de datos personalizados a un informe que se incluye con TestStand.
Si tiene requisitos específicos para el registro, considere la posibilidad de modificar o crear un complemento de procesamiento de resultados. Esto le permitirá utilizar la recopilación de resultados del TestStand incorporado para reunir los resultados, mientras que podrá determinar cómo se procesan y presentan los resultados. Para obtener más información, consulte la sección Creación de complementos del documento Prácticas recomendadas para el desarrollo y la personalización del modelo de proceso de TestStand.
Puede resultar difícil determinar el mejor enfoque para implementar un ciclo, ya que cada enfoque tiene sus propias ventajas y desventajas. Las pautas siguientes le ayudarán a determinar qué estrategia es la mejor para su aplicación:
Reproducción interna de ciclos en el módulo de código
Reproducción externa en el archivo de secuencia
Muchos sistemas de pruebas utilizan la conmutación para permitir que una sola pieza de hardware pruebe varios sitios. Los conmutadores le permiten controlar mediante programación qué pines de una Unidad bajo prueba (UUT) están conectados a un hardware específico a través de rutas predefinidas.
Puede implementar la conmutación en los módulos de código TestStand de las siguientes maneras:
Cuando utilice el hardware de NI Switch, puede usar NI Switch Executive para definir rutas rápidamente. Si tiene acceso a NI Switch Executive, el uso de la configuración de pasos integrada para la conmutación suele ser el mejor enfoque y tiene los siguientes beneficios:
Utilice NI Switch Executive para especificar rutas directamente desde la configuración de pasos de TestStand, incluyendo soporte para la expresión de TestStand para determinar dinámicamente la ruta usando el índice de ciclo actual u otras propiedades
Para evitar el mantenimiento de módulos de código para tareas más simples, puede usar el lenguaje de expresión en TestStand para realizar cálculos básicos y manipular la matriz unidimensional. Deben implementarse requisitos de programación más avanzados en los módulos de código, ya que los lenguajes de programación proporcionan una funcionalidad más robusta que se adapta mejor a estas tareas. Por ejemplo, concatenar matrices multidimensionales es mucho más fácil de lograr con la función Build Array nativa de LabVIEW que a través del lenguaje de expresión.
En algunos casos, puede usar las clases nativas proporcionadas con .NET Framework para evitar crear expresiones demasiado complejas. Por ejemplo, puede usar la clase System.IO.Path para realizar rápidamente la manipulación de rutas sin crear un módulo de código.
Puede usar un paso .NET para utilizar métodos de .NET Framework sin la necesidad de un módulo de código
Al implementar módulos de código, hay una serie de decisiones de diseño que afectarán a muchos de los módulos de código que cree. Esta sección proporciona pautas para los siguientes conceptos:
Hay dos enfoques que puede usar para acceder a los datos de TestStand dentro de un módulo de código:
En la mayoría de los casos, es mejor utilizar parámetros para pasar datos en lugar de usar la API de TestStand para acceder a ellos directamente por las siguientes razones:
Cuando sea posible, utilice parámetros para pasar los datos requeridos a los módulos de código
Sin embargo, usar la API para acceder directamente a las propiedades puede ser útil en los casos en que el módulo de código está accediendo a una variedad de datos de forma dinámica, en función del estado del paso. El uso de parámetros de pasos en este caso puede llevar a una larga lista de parámetros donde solo algunos se usan realmente en diversas condiciones.
Si utiliza la API de TestStand en un módulo de código, pase una referencia al objeto SequenceContext (ThisContext) como parámetro. El objeto SequenceContext da acceso a todos los demás objetos de TestStand, incluido el motor TestStand y el Runstate actual. La referencia de contexto de la secuencia también es necesaria si se utiliza el monitor de terminación o los VIs de diálogo modal.
Use SequenceContext para acceder a la API de TestStand en módulos de código, que se pueden utilizar para acceder a datos mediante programación
Si vuelve a utilizar módulos de código fuera de TestStand, tenga en cuenta que cualquier operación que use la API de TestStand solo estará disponible si se llama al módulo desde una secuencia de TestStand. Los datos que obtenga el módulo de TestStand a través de la API no estarán disponibles. Puede definir un mecanismo alternativo para obtener datos de prueba en los casos en que se llame al módulo de código fuera de TestStand comprobando primero si la referencia de contexto de secuencia es nula. En LabVIEW, puede usar la función Not A Number/Path/Refnum?, que devuelve un valor booleano, como se muestra en la Figura 3.
Utilice
Utilice Not a Number/Path/Refnum? para verificar la validez de la referencia del objeto SequenceContext para los módulos de código utilizados fuera de TestStand
En muchos casos, los módulos de código pueden producir grandes cantidades de datos complejos a partir de mediciones o análisis. Evite almacenar este tipo de datos en las variables de TestStand, ya que TestStand crea una copia de los datos cuando los almacena. Estas copias pueden reducir el rendimiento del tiempo de ejecución o causar errores de falta de memoria. Use los enfoques siguientes para administrar grandes conjuntos de datos sin crear copias innecesarias:
Cuando un usuario presiona el botón Terminar, TestStand detiene la secuencia de ejecución y ejecuta los pasos de limpieza. Sin embargo, si la ejecución ha llamado a un módulo de código, el módulo debe completar la ejecución y devolver el control a TestStand antes de que la secuencia pueda terminar. Si el tiempo de ejecución de un módulo de código es superior a unos pocos segundos o cuando el módulo espera a que se produzca una condición, como la entrada de usuario, al usuario puede parecerle que se ha ignorado el comando de finalización.
Para solucionar este problema, puede usar el monitor de terminación para permitir que los módulos de código verifiquen y respondan al estado de terminación de la ejecución de la llamada. Por ejemplo, el ejemplo de envío Prueba de la tarjeta madre del equipo utiliza el monitor de terminación en el cuadro de diálogo de simulación, como se muestra a continuación. Si la secuencia de prueba finaliza, el VI de estado comprobar terminación devuelve falso y el ciclo se detiene.
Consulte los
Consulte los ejemplos del monitor de terminación para obtener más información sobre el uso del monitor de terminación.
Un error en un sistema de pruebas es un comportamiento en tiempo de ejecución inesperado que impide que las pruebas se lleven a cabo. Cuando un módulo de código genera un error, devuelva esa información a la secuencia de prueba para determinar qué acción se debe ejecutar a continuación, como terminar la ejecución, repetir la última prueba o advertir al operador de la prueba.
Para proporcionar a TestStand cualquier información de error de los módulos de código, use el contenedor Result.Error del paso, como se muestra a continuación. TestStand verifica automáticamente esta propiedad después de cada paso para determinar si se ha producido un error. No necesita pasar la información de error de TestStand al módulo de código. Si el módulo de código devuelve un error a TestStand, la ejecución puede desviarse a otra parte de la secuencia de prueba, como el grupo de pasos de limpieza.
Puede usar la configuración Error en tiempo de ejecución [On Run-Time Error], ubicada en la pestaña Ejecución [Execution] de las Opciones de estación [Station Options] para determinar cómo responde TestStand a los errores de los pasos. Por lo general, debe usar la opción Mostrar cuadro de diálogo [Show Dialog Box] mientras desarrolla sus secuencias para ayudar en la depuración, ya que esta opción le permite interrumpir la ejecución y verificar el estado actual de la secuencia. Para los sistemas implementados, puede usar las opciones Ejecutar limpieza [Run Cleanup] o Ignorar [Ignore], en lugar de requerir la entrada de operadores de prueba. La información del error se registra automáticamente en los resultados de la prueba, que se pueden utilizar para encontrar la causa del error.
Pase la información del error al contenedor Step.Result.Error para notificar a TestStand si se produce un error de paso
De forma predeterminada, TestStand carga todos los módulos de código en un archivo de secuencia en la memoria cuando ejecuta una secuencia en el archivo y los mantiene cargados hasta que cierra el archivo de secuencia. Con estos ajustes, puede producirse un retraso inicial cuando comienza una secuencia mientras se cargan los módulos. Sin embargo, las ejecuciones posteriores del archivo de secuencia son más rápidas ya que los módulos permanecen en la memoria.
Puede configurar el momento de carga y descarga de un módulo de código en la pestaña Opciones de ejecución [Run Options] del panel de configuración de pasos. Por lo general, las opciones de carga predeterminadas proporcionan el mejor rendimiento, pero existen casos donde puede ser mejor cargar el módulo de código solo cuando se usa con la opción de carga Load dynamically. En el caso de los módulos de código que no se llaman en la ejecución típica, como los diagnósticos que solo se ejecutan después de que falla una prueba en particular, deben cargarse de forma dinámica, ya que en la mayoría de los casos no es necesario cargar estos módulos en absoluto.
Al cargar dinámicamente módulos de código, tenga en cuenta que TestStand no informa sobre problemas con los módulos de código hasta que carga el módulo de código, lo que podría producirse al final de una ejecución prolongada. Sin embargo, puede usar el analizador de secuencia para verificar que no haya errores en una secuencia antes de ejecutarla. El analizador verificará los módulos de código cargados estática y dinámicamente.
En los módulos de código que requieren mucha memoria, puede modificar la opción de descarga predeterminada para reducir el uso total de memoria. Por ejemplo, puede establecer el módulo en Descargar después de ejecutar el paso o Descargar después de ejecutar la secuencia. Sin embargo, este cambio aumentará los tiempos de ejecución, ya que TestStand necesitará volver a cargar el módulo para cada llamada posterior. Cuando sea posible, una alternativa mejor es usar la versión de 64 bits de TestStand y un sistema con más memoria física para obtener el rendimiento de prueba más rápido a pesar de los altos requisitos de uso de memoria.
Si sus módulos de código mantienen datos compartidos, como variables estáticas o variables globales funcionales de LabVIEW, modificar las opciones de descarga puede causar cambios en el comportamiento, ya que los datos globales se pierden cuando se descargan los módulos. Al cambiar las opciones de descarga, asegúrese de que los datos requeridos se pasen a la secuencia de TestStand o se almacenen en una ubicación más permanente para evitar la pérdida de datos.
Consulte las Prácticas recomendadas para mejorar el rendimiento del sistema NI TestStand para obtener más información sobre otras formas de optimizar el rendimiento de un sistema de pruebas.
Un uso común de los módulos de código es interactuar con el hardware de prueba para configurar estímulos y tomar mediciones de prueba. Los métodos de comunicación con el hardware incluyen:
• Usar un controlador de hardware, como NI-DAQmx, para comunicarse directamente con el hardware.
• Usar un controlador de instrumentos, que internamente envía comandos a un instrumento a través del controlador de hardware VISA o IVI.
El método de comunicación que se utiliza depende del tipo de hardware instalado. Para cualquier tipo de comunicación, abrirá una referencia o sesión para el controlador antes de realizar llamadas específicas del controlador y cerrará la manija después de que se complete la interacción.
En la mayoría de los casos, se comunicará con el mismo hardware en varios pasos de prueba. Para evitar el impacto en el rendimiento de abrir y cerrar la sesión de instrumentos en cada módulo de código, es importante estudiar cómo gestionará las referencias de hardware dentro de sus secuencias de prueba. Existen dos enfoques comunes para administrar referencias de hardware:
Si está utilizando un controlador de instrumentos, o se está comunicando directamente con instrumentos utilizando los controladores VISA o IVI, use el administrador de sesiones a menos que tenga una necesidad específica de control directo sobre las vidas útiles de las sesiones de hardware. Si está utilizando un controlador de hardware como DAQmx, no puede usar el administrador de sesiones y debe administrar las referencias manualmente.
Cuando inicialice el instrumento, pase la referencia de sesión como un parámetro de salida a la secuencia de llamada, luego almacene la referencia en una variable. A continuación, puede pasar la variable como entrada para cada paso que requiere acceso al instrumento.
Muchos controladores, incluidos NI-DAQmx, VISA y la mayoría de los controladores de instrumentos, utilizan el tipo de datos de referencia de E/S para almacenar referencias de sesión. Utilice el tipo de datos LabviewIOControl en TestStand para almacenar estas referencias.
Utilice una variable con el tipo LabVIEWIOControl para pasar referencias de hardware, como una referencia de tarea DAQ, entre módulos de código
Cuando pase explícitamente las manijas de instrumentos entre TestStand y los módulos de código, almacene la referencia de hardware en una variable local. Si el hardware se usa en varias secuencias, pase la manija como un parámetro de secuencia a cada una de las secuencias que lo requiera. Evite usar variables globales para almacenar referencias de hardware, ya que puede ser difícil garantizar que el instrumento se haya inicializado antes de usar la referencia.
Use el grupo de pasos de configuración para iniciar el hardware y el grupo de pasos de limpieza para cerrar las referencias de hardware por estos motivos:
Use los grupos de configuración y limpieza para iniciar y cerrar referencias de hardware
Para las manijas de instrumentos VISA e IVI, puede usar el administrador de sesiones para gestionar automáticamente las referencias de hardware. El administrador de sesiones ofrece muchas ventajas; por ejemplo:
El administrador de sesiones inicia automáticamente la manija después de crear la sesión y cierra la manija automáticamente cuando se libera la última referencia a la sesión. Los módulos de código y las secuencias pasan un nombre lógico, como “DMM1”, para obtener un objeto de sesión del administrador de sesiones, que contiene la manija del instrumento correspondiente.
Cuando utilice el administrador de sesiones, almacene el objeto de sesión en una variable de referencia de objeto de TestStand. Dado que la vida útil de la sesión está vinculada a la vida útil de la variable de referencia del objeto, la manija del instrumento se inicializará y se cerrará una vez por ejecución, sin importar cuántos módulos de código de secuencia y subsecuencias accedan a la misma sesión.
En el ejemplo siguiente, el paso Obtener sesión DMM [Get DMM Session] obtiene una referencia al objeto de sesión del instrumento para el DMM para el nombre lógico. El paso almacena la referencia de sesión en una variable local para que la sesión permanezca inicializada durante la ejecución de la secuencia.
Utilice el administrador de sesiones para poder hacer referencia a instrumentos mediante un nombre lógico. El VI de administrador de sesiones obtiene la referencia de E/S de DMM usando el nombre lógico
Consulte la Ayuda del administrador de sesiones de NI [NI Session Manager Help], ubicada en <Program Files>\National Instruments\Shared\Session Manager, para obtener más información sobre cómo utilizar el administrador de sesiones.
La secuencia de ejemplo anterior obtiene la sesión de un módulo de código de LabVIEW que llama al administrador de sesiones en lugar de llamar al administrador de sesiones directamente porque este ejemplo ha configurado el adaptador de LabVIEW para ejecutar los VI en un proceso separado. Consulte la Ayuda del administrador de sesiones de NI [NI Session Manager Help], ubicada en <Program Files>\National Instruments\Shared\Session Manager, para obtener más información sobre cómo utilizar el administrador de sesiones.
Para comunicarse con cualquier tipo de hardware, utilice bibliotecas de controladores, que proporcionan un conjunto de funcionalidades diseñadas para permitirle realizar un conjunto de tareas mediante lenguaje de programación. Al utilizar bibliotecas de controladores, a menudo llama a varios VI o funciones para realizar una sola operación lógica, como tomar una medida o configurar un disparo. Crear un módulo de código para implementar esta funcionalidad, en lugar de llamar a las funciones de la biblioteca directamente desde un paso de TestStand, tiene algunas ventajas; por ejemplo: