Download METODOLOGÍA APLICADA A LA CREACIÓN DE UN SISTEMA
Transcript
0(72'2/2*Ë$$3/,&$'$$/$ &5($&,Ï1'(816,67(0$'( 7(670(',$17(/,%5(5Ë$67&/ # /0123 AUTORIZACIÓN PARA LA DIGITALIZACIÓN, DEPÓSITO Y DIVULGACIÓN EN ACCESO ABIERTO ( RESTRINGIDO) DE DOCUMENTACIÓN 1º. Declaración de la autoría y acreditación de la misma. El autor D. Pablo Calvo Báscones, como estudiante de la UNIVERSIDAD PONTIFICIA COMILLAS (COMILLAS), DECLARA que es el titular de los derechos de propiedad intelectual, objeto de la presente cesión, en relación con la obra Proyecto Fin de Grado: Metodología aplicada a la creación de un sistema de test mediante librerías TCL 1, que ésta es una obra original, y que ostenta la condición de autor en el sentido que otorga la Ley de Propiedad Intelectual como titular único o cotitular de la obra. En caso de ser cotitular, el autor (firmante) declara asimismo que cuenta con el consentimiento de los restantes titulares para hacer la presente cesión. En caso de previa cesión a terceros de derechos de explotación de la obra, el autor declara que tiene la oportuna autorización de dichos titulares de derechos a los fines de esta cesión o bien que retiene la facultad de ceder estos derechos en la forma prevista en la presente cesión y así lo acredita. 2º. Objeto y fines de la cesión. Con el fin de dar la máxima difusión a la obra citada a través del Repositorio institucional de la Universidad y hacer posible su utilización de forma libre y gratuita ( con las limitaciones que más adelante se detallan) por todos los usuarios del repositorio y del portal e-ciencia, el autor CEDE a la Universidad Pontificia Comillas de forma gratuita y no exclusiva, por el máximo plazo legal y con ámbito universal, los derechos de digitalización, de archivo, de reproducción, de distribución, de comunicación pública, incluido el derecho de puesta a disposición electrónica, tal y como se describen en la Ley de Propiedad Intelectual. El derecho de transformación se cede a los únicos efectos de lo dispuesto en la letra (a) del apartado siguiente. 3º. Condiciones de la cesión. Sin perjuicio de la titularidad de la obra, que sigue correspondiendo a su autor, la cesión de derechos contemplada en esta licencia, el repositorio institucional podrá: 1 Especificar si es una tesis doctoral, proyecto fin de carrera, proyecto fin de Máster o cualquier otro trabajo que deba ser objeto de evaluación académica 1 (a) Transformarla para adaptarla a cualquier tecnología susceptible de incorporarla a internet; realizar adaptaciones para hacer posible la utilización de la obra en formatos electrónicos, así como incorporar metadatos para realizar el registro de la obra e incorporar “marcas de agua” o cualquier otro sistema de seguridad o de protección. (b) Reproducirla en un soporte digital para su incorporación a una base de datos electrónica, incluyendo el derecho de reproducir y almacenar la obra en servidores, a los efectos de garantizar su seguridad, conservación y preservar el formato. . (c) Comunicarla y ponerla a disposición del público a través de un archivo abierto institucional, accesible de modo libre y gratuito a través de internet. 2 (d) Distribuir copias electrónicas de la obra a los usuarios en un soporte digital. 3 4º. Derechos del autor. El autor, en tanto que titular de una obra que cede con carácter no exclusivo a la Universidad por medio de su registro en el Repositorio Institucional tiene derecho a: a) A que la Universidad identifique claramente su nombre como el autor o propietario de los derechos del documento. b) Comunicar y dar publicidad a la obra en la versión que ceda y en otras posteriores a través de cualquier medio. c) Solicitar la retirada de la obra del repositorio por causa justificada. A tal fin deberá ponerse en contacto con el vicerrector/a de investigación ([email protected]). d) Autorizar expresamente a COMILLAS para, en su caso, realizar los trámites necesarios para la obtención del ISBN. 2 En el supuesto de que el autor opte por el acceso restringido, este apartado quedaría redactado en los siguientes términos: (c) Comunicarla y ponerla a disposición del público a través de un archivo institucional, accesible de modo restringido, en los términos previstos en el Reglamento del Repositorio Institucional 3 En el supuesto de que el autor opte por el acceso restringido, este apartado quedaría eliminado. 2 d) Recibir notificación fehaciente de cualquier reclamación que puedan formular terceras personas en relación con la obra y, en particular, de reclamaciones relativas a los derechos de propiedad intelectual sobre ella. 5º. Deberes del autor. El autor se compromete a: a) Garantizar que el compromiso que adquiere mediante el presente escrito no infringe ningún derecho de terceros, ya sean de propiedad industrial, intelectual o cualquier otro. b) Garantizar que el contenido de las obras no atenta contra los derechos al honor, a la intimidad y a la imagen de terceros. c) Asumir toda reclamación o responsabilidad, incluyendo las indemnizaciones por daños, que pudieran ejercitarse contra la Universidad por terceros que vieran infringidos sus derechos e intereses a causa de la cesión. d) Asumir la responsabilidad en el caso de que las instituciones fueran condenadas por infracción de derechos derivada de las obras objeto de la cesión. 6º. Fines y funcionamiento del Repositorio Institucional. La obra se pondrá a disposición de los usuarios para que hagan de ella un uso justo y respetuoso con los derechos del autor, según lo permitido por la legislación aplicable, y con fines de estudio, investigación, o cualquier otro fin lícito. Con dicha finalidad, la Universidad asume los siguientes deberes y se reserva las siguientes facultades: a) Deberes del repositorio Institucional: - La Universidad informará a los usuarios del archivo sobre los usos permitidos, y no garantiza ni asume responsabilidad alguna por otras formas en que los usuarios hagan un uso posterior de las obras no conforme con la legislación vigente. El uso posterior, más allá de la copia privada, requerirá que se cite la fuente y se reconozca la autoría, que no se obtenga beneficio comercial, y que no se realicen obras derivadas. - La Universidad no revisará el contenido de las obras, que en todo caso permanecerá bajo la responsabilidad exclusiva del autor y no estará obligada a ejercitar acciones legales en nombre del autor en el supuesto de infracciones a derechos de propiedad intelectual derivados del depósito y archivo de las obras. El autor renuncia a cualquier reclamación frente a la Universidad por las formas no ajustadas a la legislación vigente en que los usuarios hagan uso de las obras. - La Universidad adoptará las medidas necesarias para la preservación de la obra en un futuro. 3 b) Derechos que se reserva el Repositorio institucional respecto de las obras en él registradas: - retirar la obra, previa notificación al autor, en supuestos suficientemente justificados, o en caso de reclamaciones de terceros. Madrid, a 28. de Mayo de 2014 ACEPTA Fdo…………………………………………………………… 4 WĂďůŽĂůǀŽĄƐĐŽŶĞƐ ϴ !"#$! >()*+&)%&,)*+& :ŽƐĞ^ĄŶĐŚĞnjůŵĂŐƌŽ 1&2& *# . '$3 # 0(72'2/2*Ë$$3/,&$'$$/$ &5($&,Ï1'(816,67(0$'( 7(670(',$17(/,%5(5Ë$67&/ # /0123 METODOLOGÍA APLICADA A LA CREACIÓN DE UN SISTEMA DE TEST MEDIANTE LIBRERÍAS TCL Autor: Pablo Calvo Báscones Directores: José Sánchez Almagro Entidad colaboradora: EADS-Astrium Crisa RESUMEN DEL PROYECTO 1. INTRODUCCIÓN La creciente complejidad de los proyectos de ingeniería ha fomentado la aparición de nuevas metodologías de trabajo. Los objetivos que se persiguen al implementar una metodología de trabajo robusta y eficiente son los siguientes: x x x x Una mayor compatibilidad entre los distintos elementos que componen un proyecto. Poder evitar problemas ya solventados ocurridos en casos anteriores. Aumentar la eficiencia, tanto en el proceso de diseño como en la ejecución. Evitar “puntos ciegos” del proyecto que puedan representar una amenaza para la ejecución del mismo. Para implantar una metodología de trabajo de forma efectiva, se establecerán tres fases principales: 1) Fase de identificación: El objetivo de esta fase, será la identificación del tipo de proyecto que será llevado a cabo. 2) Fase de formación: En esta fase se facilitará a cada miembro del grupo técnico los recursos necesarios para una correcta ejecución del proyecto. 3) Fase de consolidación: Se establece la metodología que mejor se adapte a las necesidades del proyecto. OBJETIVO: “Conseguir una elevada calidad en la ejecución del proyecto, disminuyendo costes y aumentado la eficiencia de todo el proceso de ejecución”. - METODOLOGÍAS PRESENTES EN ESTE PROYECTO En el diseño de cada una de las librerías del sistema, se podrán emplear conjuntamente tres tipos de metodologías de software distintas: 1) Metodologías estructuradas: Implementadas en aquellas librerías donde se requiere la ejecución de procesos de forma secuencial. Ej: Librería de secuencias de test. 1 2) Metodologías orientadas a objetos: Permitirá dividir cada librería de comandado en clases, objetos y métodos independientes. Ej: Librería de comandado de instrumentos. 3) Metodologías orientadas a sistemas en tiempo real: Permite el uso de interrupciones, hilos, etc., con el fin de poder controlar varios procesos de forma simultánea. Ej: Gestión de errores y situaciones de emergencia del sistema. En el diseño de las secuencias, podrán seguirse multitud de metodologías de verificación y pruebas de test: Pruebas de caja negra, pruebas de compatibilidad, pruebas de funcionalidad, pruebas de estrés, etc. 2. METODOLOGÍA APLICADA A UN CASO REAL OBJETIVO: Diseño de un sistema de test automático. FINALIDAD: Verificar el cumplimiento de las especificaciones técnicas de un convertidor CC/CC. ESPECIFICACIONES DEL SISTEMA: - - Modo de ejecución: Automático Modos de trabajo: Secuencia / Depuración o Secuencia: Comandado de instrumentos de forma automática. o Depuración: Comandado de instrumentos de forma manual. Lenguaje de programación: TCL Librerías: o driver_gpib: Librería encargada de gestionar las comunicaciones entre el sistema de control y el resto de instrumentos (Registro de comandos enviados, verificación de conexiones, etc.). o error_handle: Librería encargada de gestionar las situaciones de emergencia del sistema, salidas de secuencia controladas, “reporting de errores”, etc. o driver_gpib_agil34970a: Librería encargada del comandado del escáner Agilent 34970A. o driver_gpib_hp6653a: Librería encargada del comandado de la fuente de alimentación HP 6653A. o driver_gpib_hp34401a: Librería encargada del comandado del multímetro HP 344010A. o driver_gpib_kikuplz150u: Librería encargada del comandado de la carga dinámica Kikusui PLZ 150u. 2 o driver_rs232_tekttps2024: Librería encargada del comandado del osciloscopio Tektronix PS2024. o Clases abstractas: Librerías que contienen las clases abstractas de los instrumentos de comandado. ESPECIFICACIONES DE LA PRUEBA DE TEST DEL CONVERTIDOR: - Modo de prueba: Secuencia de test. Tipo de prueba: Funcional. Instrumentos que participan en la prueba: o Multímetro HP 344010A. o Fuente de alimentación HP 6653A. o Carga dinámica Kikusui PLZ 150u. o Osciloscopio Tektronix PS2024. - Fases de la prueba: o Encendido del convertidor: Aumento de tensión a la entrada del convertidor hasta alcanzar la tensión nominal de trabajo. En esta etapa de la prueba, se registrará la tensión de encendido del convertidor. V Apagado Encendido Vin Vout Von Vumbral t t’on Figura 1. Arranque de un convertidor o Pruebas de eficiencia a tensión constante y carga variable: Se realizará un estudio sobre el comportamiento del convertidor para distintos valores de carga. o Apagado del convertidor: Disminución de la tensión de entrada del convertidor hasta a un valor por debajo de la tensión de apagado, indicada en el data-sheet del componente. En esta etapa de la prueba, se registrará la tensión de apagado del convertidor. V Encendido Apagado Vin 24V 15V Vout Vumbral Voff t’off t Figura 2. Apagado de un convertidor 3 RESULTADOS DE LA PRUEBA: - Resultados de la verificación: ƐƉĞĐ͘dĠĐŶŝĐĂƐ DĞĚŝĐŝſŶ ƵŵƉůĞĐŽŶůĂƐ ĞƐƉĞĐŝĨŝĐĂĐŝŽŶĞƐ sŽŶs sŽĨĨs sŽƵƚs Omed ϭϮ ϭϮ͕ϭϳ ϭϭ ϭϭ͕ϭϱ ϭϱ ϭϱ͕Ϭϯϱ ϴϰй ϴϱ͕Ϯϱй ݱ ݱ ݱ ݱ Figura.Resultadosdelaprueba. - Capturas automáticas del osciloscopio del encendido y apagado del convertidor: Captura del instante en que se enciende el convertidor. - Captura del instante en que se apaga el convertidor. Análisis del comportamiento del convertidor para distintos valores de carga: 4 !" ! METHODOLOGY APPLIED IN THE DESIGN OF A TEST SYSTEM BASED ON TCL LIBRARIES Author: Pablo Calvo Báscones Director: José Sánchez Almagro Collaborating institution: EADS-Astrium Crisa ABSTRACT 1. INTRODUCTION The rise of the complexity in engineering projects has enhanced the appearance of new working methodologies. The main objectives pursued by implementing a sturdy efficient methodology are the following ones: x More compatibility between the elements that make up the whole project. x Avoid any already-solved problem that occurred in previous projects. x Increase the efficiency, both in the design project and in the execution of it. x Avoid any project “blind spots” that could become a risk for the execution of it-self. In order to introduce a working methodology in an effective way, it will be established three main phases: 1) Identification phase: The aim of this phase will be the identification of the type of project that will be executed. 2) Training phase: In this phase, any member of the technical group will be provided with all the training resources needed to get a right execution of the project 3) Consolidation phase: In this last phase, the methodology that better fits the requirements of the project will be established. OBJECTIVE: “Get a high quality in the execution of the project by reducing costs and increasing the efficiency of the whole execution process” - METHOLOGIES APPLIED IN THIS PROJECT Three different types of software methodologies could be use jointly in the design of each library of the system: 1) Structured methodologies: These types of methodologies are introduced in those libraries where a sequential execution of the process is required. Ex: Test sequence libraries. 5 2) Object oriented methodologies: They make possible to divide each library into independent classes, objects and methods. - Ex: Instruments command libraries. 3) Real time system oriented methodologies: They make possible to use interruptions, threads, etc. During the sequence, in order to control several process simultaneously. - Ex: Libraries in charge of managing all error and emergency situations occurred during the sequence. During the design of a test sequence, several types of verification methodologies can be introduced: Black box testing, compatibility testing, functional testing, stress/endurance testing, etc. 2. METHODOLOGY APPLIED IN TO A REAL CASE: OBJETIVE: Design an automated test system. PURPOSE: Verify the technical specifications of a DC/DC converter. SYSTEM SPECIFICATIONS: - - Execution mode: Automatic Working mode: Sequence / Debugging o Sequence: Instrument command in an automatic way. o Debugging: Instrument command in a manual way. Programming language: TCL Libraries: o driver_gpib: Library that manages the communications between the control system and the rest of the instruments (Command sent register, connection verification, etc.) o error_handle: Library that manages all emergency situations of the system, the sequence controlled exit, error reporting, etc. o driver_gpib_agil34970a: Library used to command the scanner: Agilent 34970A . o driver_gpib_hp6653a: Library used to command the power supply: HP 6653A. o driver_gpib_hp34401a: Library used to command the multimeter: HP 344010A. o driver_gpib_kikuplz150u: Library used to command the electronic load: Kikusui PLZ 150u. 6 o driver_rs232_tekttps2024: Library used to command the oscilloscope: Tektronix PS2024. o Abstract classes: Libraries that contain the abstract classes of the commanded instruments. ESPECIFICACIONES DE LA PRUEBA DE TEST DEL CONVERTIDOR: - Test mode: Sequence. Type of testing: Functional. Instruments that take part in the sequence: o Multimeter: HP 344010A. o Power supply HP 6653A. o Electronic load Kikusui PLZ 150u. o Oscilloscope Tektronix PS2024. - Stage of the test sequence: o Electronic ignition of the converter : The input voltage of the converter will increase until reaching the nominal operating voltage. In this step of the sequence, the converter ignition voltage level will be registered. V Apagado Encendido Vin Vout Von Vumbral t t’on Figure1.Converter Start-up o Efficiency tests at a constant voltage value and different load values: In this stage of the sequence, will be possible to analyze the behavior of the converter for different load values. o Converter shut down: The input voltage of the converter will decrease until reaching shut down voltage level of the converter. In this step of the sequence, the converter shut down voltage level will be registered. V Encendido Apagado Vin 24V 15V Vout Vumbral Voff t’off Figure.$POWFSUFSTIVUEPXO 7 t TEST RESULTS: - Verification results: ƐƉĞĐ͘dĠĐŶŝĐĂƐ DĞĚŝĐŝſŶ ƵŵƉůĞĐŽŶůĂƐ ĞƐƉĞĐŝĨŝĐĂĐŝŽŶĞƐ sŽŶs sŽĨĨs sŽƵƚs Omed ϭϮ ϭϮ͕ϭϳ ϭϭ ϭϭ͕ϭϱ ϭϱ ϭϱ͕Ϭϯϱ ϴϰй ϴϱ͕Ϯϱй ݱ ݱ ݱ ݱ Figure 3. Verification r esults - Automated oscilloscope screen capture at the electronic ignition and shut down of the converter. 0TDJMMPTDPQF TDSFFO DBQUVSF BU TUBSUVQ WPMUBHF - 0TDJMMPTDPQFTDSFFODBQUVSFBUTIVUEPXOWPMUBHF Analysis of the converter performance for different load values 8 !" ! DOCUMENTO I MEMORIA Índice general DOCUMENTO I. MEMORIA 1 I. 6 Estudio de la metodología 1. Metodología orientada al desarrollo de sistemas de test 1. Introducción a la metodología. Motivación . . . . . . . . . . . . . . . . . . . . 2. Características generales y fases de desarrollo de una metodología orientada al diseño de sistemas de test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Características específicas de metodologías aplicadas en el diseño de software 3. de sistemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Metodologías de Verificación y Pruebas de Test . . . . . . . . . . . . . . . . . 11 13 2. Metodología aplicada a un caso real 1. Objetivo: . . . . . . . . . . . . . . . . . . . . 2. Métricas establecidas . . . . . . . . . . . . . 3. Planificación del proyecto . . . . . . . . . . . 4. Especificaciones de software . . . . . . . . . 5. Herramientas que componen el sistema de test 6. Especificaciones de la secuencia de test . . . 7. Arquitectura del software . . . . . . . . . . . 15 15 15 15 16 19 20 23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 9 II. Sistemas de test 26 1. Pasado, presente y futuro de los sistemas de test 1. Introducción a los sistemas de test. Motivación . 2. Sistema de test manual . . . . . . . . . . . . . 3. Sistema de Test Semi-Automático . . . . . . . 4. Sistema de test automático . . . . . . . . . . . 27 27 27 28 30 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Buses de comunicación utilizados en el comandado remoto de instrumentos 33 1. Buses de comunicación para sistemas de test con baja o media carga de procesado 33 2. Buses de comunicación para sistemas de test de alto nivel de procesado . . . . 36 III. Librerías del sistema 1. Librerías. Estructuras básicas 1. Estructura de una clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Estructura del constructor. Instrumentos comandados por GPIB . . . . . . . . 3. Estructura del constructor y destructor. Instrumentos comandados por RS232 4. Estructura de una función de comandado . . . . . . . . . . . . . . . . . . . . 5. Estructura de un diccionario de errores . . . . . . . . . . . . . . . . . . . . . 6. Estructura del Setup de secuencia . . . . . . . . . . . . . . . . . . . . . . . . 7. Lista de instrumentos de secuencia . . . . . . . . . . . . . . . . . . . . . . . Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 38 . . . . . . . 39 39 41 42 43 45 46 47 2 8. Instanciación de clases (Setup) . . . . . . . . . . . . . . . . . . . . . . . . . . 48 IV. Secuencia de test Y Resultados obtenidos 49 1. Prueba de verificación. Diseño del setup 1. Instanciación de librerías y espacios de nombres . . . . . . . . . . . . . . . . . 2. Instanciación de objetos (Instrumentos y funciones) . . . . . . . . . . . . . . . 3. Arranque del Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 50 51 52 2. Prueba de verificación. Diseño de la secuencia 1. Cabecera . . . . . . . . . . . . . . . . . . . . . 2. Parámetros de configuración de la prueba . . . 3. Apagado controlado. Interrupción de secuencia 4. Procedimientos básicos . . . . . . . . . . . . . 5. Secuencia lógica de la prueba . . . . . . . . . . . . . . . 52 52 53 54 54 55 . . . . . 61 61 62 63 64 65 3. Resultados obtenidos 1. Tabla de mediciones registradas . . 2. Resultados mostrados por pantalla 3. Capturas del osciloscopio . . . . . 4. Análisis y estudio de los resultados 5. Resultados de la verificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V. Conclusiones Y Futuros desarrollos 1. 2. 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Comandado de instrumentos por un sistema de control avanzado (Tarjeta FPGA) 70 Diseño de un interfaz gráfico para el sistema de test . . . . . . . . . . . . . . . 70 Ampliar el número de dispositivos controlados por el sistema de test . . . . . . 71 Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 3 Índice de figuras 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Cronograma establecido para el desarrollo del sistema de test Arquitectura de ficheros: “System \ documents” . . . . . . . Arquitectura de ficheros: “System \ setup” . . . . . . . . . . Arquitectura de ficheros: “System \ test” . . . . . . . . . . . Arquitectura de ficheros: “System \ tools” . . . . . . . . . . Arquitectura de ficheros: “System \ work” . . . . . . . . . . HP 6653A [Fuente de alimentación . . . . . . . . . . . . . Kikusui PLZ150U [Carga dinámica] . . . . . . . . . . . . . Tektronix TPS2024 [Osciloscópio . . . . . . . . . . . . . . HP 34401A [Multímetro . . . . . . . . . . . . . . . . . . . Agilent 34970A [Escáner] . . . . . . . . . . . . . . . . . . Convertidor CC/CC . . . . . . . . . . . . . . . . . . . . . . Arranque de un convertidor . . . . . . . . . . . . . . . . . . Desconexión de un convertidor . . . . . . . . . . . . . . . . Ejemplo de clase abstracta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 16 17 17 18 18 19 19 19 20 20 21 22 23 24 16. 17. 18. 19. 20. 21. Entorno de trabajo de un sistema de test manual[6] . . . . . Entorno de trabajo de un sistema de test semi-automático [6] c ) Ejemplo de control remoto por interfaz gráfica (LabVIEW Comparación entre los distintos tipos de Bus [7] . . . . . . . Entorno de trabajo de un sistema de test automático [6] . . . Diagrama de flujo de un sistema de test automático [6] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 29 29 30 30 31 22. 23. 24. 25. 26. 27. 28. Captura del instante en que se enciende el convertidor. . . . . . . Captura del instante en que se apaga el convertidor. . . . . . . . . Análisis y estudio de los resultados. . . . . . . . . . . . . . . . . Resultados de la prueba. . . . . . . . . . . . . . . . . . . . . . . Ejemplo de módulo de conmutación por matriz de puntos de cruce Ejemplo de FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo de Interfaz gráfica del sistema de test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 63 64 65 69 70 70 Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 4 Índice de tablas 1. Especificaciones técnicas del convertidor . . . . . . . . . . . . . . . . . . . . . . . 2. Plantilla de resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 23 3. Comparativa de las principales características de distintos buses . . . . . . . . . . . 36 4. Tabla de mediciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 5 PARTE I ESTUDIO DE LA METODOLOGÍA Capítulo 1 Metodología orientada al desarrollo de sistemas de test 1. L Introducción a la metodología. Motivación a estructura de todo proyecto, queda desde sus inicios, intrínsecamente determinada por el modo en el que éste es planificado, diseñado, construido , etc. Por metodología se entiende: “Conjunto de métodos que se siguen en una investigación científica o en una exposición doctrinal.” [Rae] Dichos métodos quedan determinados por el tipo de proyecto y por el nivel de normalización (respecto a ciertos estándares u otros proyectos) con el que se llevan a cabo. Un proyecto normalizado o estandarizado es aquel que cumple con las exigencias del cliente siguiendo un modelo previamente definido y que cumple con unos pre-requisitos aprobados por un colectivo a nivel interno de una empresa o incluso a nivel nacional o internacional. Los objetivos que se persiguen al implementar una metodología orientada al desarrollo de proyectos de manera estándar son los siguientes: Una mayor compatibilidad entre los distintos elementos que componen un proyecto. Al establecer una metodología normalizada e igual para todos, los componentes pertenecientes a fuentes de trabajo distintas podrán ser compatibles entre sí. Poder evitar problemas ya solventados ocurridos en casos anteriores. Establecer una metodología de trabajo, teniendo en cuenta los errores ya cometidos, permite reducir el tiempo de pruebas y verificaciones. Aumentar la eficiencia, tanto en el proceso de diseño como en la ejecución. Conocer de antemano cuál es la estructura básica de la que se debe partir o qué elementos pertenecientes a otros proyectos pueden ser reutilizados, permite agilizar tiempos de diseño y ejecución. Esto solo es posible gracias a la implementación de una metodología compatible entre proyectos y los elementos del mismo. Evitar “puntos ciegos”. Al mantener una forma de trabajo regida por una metodología robusta, se reduce la probabilidad de ignorar u omitir elementos cruciales en la ejecución del proyecto. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 7 A la hora de aplicar una metodología de trabajo efectiva, pueden llegar a darse diversas situaciones: La formación y preparación de cada uno de los operarios no es siempre homogénea, por lo que puede ocurrir que los periodos de adaptación sean mayores o menores dependiendo de sus capacidades y conocimientos. La tecnología disponible suele variar dependiendo de cada proyecto. Es altamente recomendable que la metodología a seguir sea flexible a los cambios y pueda adaptarse a cualquier escenario de trabajo. Todos los operarios puede que no estén de acuerdo con la implementación de una nueva metodología de trabajo. Transmitir las ventajas y razonar el porqué de dicha implementación a todos los trabajadores, representa una etapa clave dentro del proceso de adaptación. Con el avance de los medios tecnológicos, la magnitud de los proyectos de ingeniería va en aumento. La única forma viable de poder llevar a cabo tales proyectos, es mediante el reparto de tareas entre los distintos miembros de un equipo técnico. Es frecuente que cada uno de estos miembros presente hábitos distintos de trabajo: elaborar código, enfocar diferentes soluciones ante un mismo problema, etc., son formas de trabajo que aportan al proyecto matices característicos de cada integrante. El llevar a cabo las distintas partes del proyecto, repartiendo la carga de trabajo entre todos los miembros, presenta numerosas ventajas respecto a la eficiencia y rendimiento de un proyecto individual. Una de las mayores dificultades puede aparecer durante la puesta en común de cada componente del proyecto. Si durante el diseño no se ha aplicado una normalización común para todas, es muy probable que lleguen a producirse serios problemas de compatibilidad entre los distintos componentes. La resolución de dichas incompatibilidades puede inducir a serios retrasos en la fecha de entrega o incluso a un mal funcionamiento del sistema en cuestión. Con el fin de evitar cualquier situación de incompatibilidad, se emplearán metodologías de trabajo que resuelvan a priori cualquier ambigüedad o posible incongruencia entre los distintos elementos de enlace de cada una de las partes del proyecto. El diseño de cada metodología de trabajo no siempre es el mismo debido a que cada sección dentro de una empresa o incluso cada proyecto puede llegar a requerir un modo de trabajo diferente. Recordemos que la metodología debe ser la pieza angular que permita que elementos independientes sean totalmente compatibles entre sí. Una vez iniciado el proyecto y establecida una metodología concreta, ésta será la que vaya configurando la planificación, diseño, construcción, etc. Y no al revés. Por el contrario, dichas etapas dentro del proyecto serán las que perfeccionen la metodología existente, haciéndola más eficiente y flexible a cada situación. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 8 2. Características generales y fases de desarrollo de una metodología orientada al diseño de sistemas de test P ara poder comenzar a diseñar la metodología que posteriormente será implementada en el diseño de sistemas de test, se deberán determinar aquellos aspectos que estén relacionados con [1]: Métricas empleadas en el estudio del sistema de test que se quiere diseñar. Herramientas utilizadas por y para el diseño del sistema de test. Actividades o pruebas que se llevarán a cabo en cada secuencia de test. Rol que desempeñará cada ingeniero en la ejecución del proyecto. Para determinar dichos aspectos de manera eficiente, se requiere una temprana gestión de medios y recursos. Por recursos podemos entender: “Aquellos servicios, sistemas de hardware, software, bases de datos, experiencias previas en proyectos anteriores, etc., que puedan ser de utilidad en el diseño y la ejecución de dicho proyecto”. Una correcta gestión favorece, en todos sus aspectos, la ejecución del proyecto. Poder anticiparse y planificar los recursos y medios requeridos permite, una mejor estimación del coste total del proyecto y del tiempo medio de ejecución del mismo. De entre todos los posibles roles previstos para el diseño de un sistema de test se puede destacar, basándose en los niveles de criticidad presentes en su función: Responsable de testing: Encargado de la depuración y verificación del software destinado al comandado del sistema de test. Una verificación incorrecta o poco exhaustiva puede ocasionar el mal funcionamiento del sistema. Responsable de gestión y planificación de pruebas: Encargado del diseño de la arquitectura de cada una de las pruebas programadas para el sistema de test, ya en un estado funcional. Una incorrecta programación del sistema de test puede ocasionar resultados inverosímiles, dando por bueno un producto defectuoso, o derivar en pérdidas económicas al verse obligados a desechar componentes en buenas condiciones. 2.1. Fases propias del diseño y planificación de una metodología La fases propias del diseño y planificación de una metodología serán [1]: 2.1.1. Fase inicial o de identificación Los objetivos que se pretenden alcanzar en esta primera etapa serán los siguientes: Identificar las herramientas y participantes que formarán parte del equipo de trabajo. Identificar riesgos potenciales. Identificar experiencias previas con proyectos anteriores. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 9 2.1.2. Fase de formación: Las tareas principales de esta etapa serán: Capacitar a cada uno de los miembros del equipo técnico que llevarán a cabo la ejecución del proyecto. Establecer un modelo de trabajo cooperativo entre todos los implicados en los distintos proyectos piloto o proyectos en pruebas, con el fin de poder identificar las prácticas que se llevarán a cabo, definir y establecer la ejecución de cada parte del proyecto, detectar posibles problemas y asegurar una correcta utilización de las herramientas de test. Establecer periódicamente reuniones, donde cada miembro del grupo pueda exponer nuevas ideas, sugerencias y conocimientos adquiridos. El verdadero sentido de esta etapa quedará definido en los siguientes objetivos: Asignar las distintas tareas y funciones de cada participante dentro del proyecto. Identificar cada una de las partes del proyecto. Consolidar las herramientas de hardware y software que se deberán utilizar en el diseño del sistema de test. Capacitar al personal mediante una formación continua para que pueda llevar a cabo la ejecución de la tarea asignada. Definir las métricas que serán empleadas por todos y cada uno de los miembros del grupo, a fin de consolidar un modelo de proyecto estándar para todos. 2.1.3. Fase de consolidación: Una vez finalizada la fase de planificación del proyecto, es necesario consolidar una única metodología. Para ello se deberá: Valorar y aplicar las posibles mejoras planteadas en las distintas reuniones y juntas. Confirmar las métricas que serán empleadas. Establecer un modelo de control sobre los tiempos de ejecución y entrega del proyecto. Los objetivos que se persiguen en esta fase serán los siguientes: Conseguir una mayor autonomía en cada uno de los participantes del grupo, autogestionando la parte del proyecto que les ha sido asignada. Resolver posibles problemas de compatibilidad entre las distintas partes del proyecto. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 10 2.1.4. Fase final o de implantación: Una vez llegado a un acuerdo y consolidada ya la metodología, se procede a su implantación en todos aquellos proyectos cuya arquitectura se asemeje a aquella para la cual fue inicialmente diseñada. 2.2. Objetivo Global El principal objetivo que se persigue al implantar una nueva metodología es el siguiente: “Conseguir una elevada calidad en la ejecución del proyecto, disminuyendo costes y aumentado la eficiencia”. 3. A Características específicas de metodologías aplicadas en el diseño de software de sistemas ctualmente existen numerosas metodologías aplicadas en el desarrollo de arquitecturas de software. En este proyecto se emplearán conjuntamente tres tipos de metodologías distintas. Entre todas las metodologías existentes cabe destacar, de forma esquemática, las tres más representativas y utilizadas en este proyecto [2]: Metodologías estructuradas: • Orientada a procesos. • Orientada a datos. ◦ Estructura jerárquica. ◦ Estructura no jerárquica. • Estructura mixta. Metodología orientada a objetos [OO]. Metodología implementada en sistemas en tiempo real. Como se explicará en los siguientes apartados, cada una de estas metodologías será aplicada en aquellas partes de la arquitectura del software donde mejor satisfagan las especificaciones técnicas, tanto en la gestión de procesos como en la eficiencia con la que se lleva a cabo el procesado de datos. Las razones por las que se llegó a la decisión de utilizar dichas metodologías, quedan notoriamente justificadas al presentar las principales características de cada uno: 3.1. Metodologías Estructuradas Están basadas en una estructura “Top - Down”. Define las especificaciones del sistema de test mediante una descomposición funcional del mismo. Dicha descomposición, permite una visualización estructurada del conjunto de especificaciones mediante la utilización de gráficos particionados, descendentes y jerárquicos de los distintos procesos del sistema. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 11 Este tipo de metodologías serán empleadas en el diseño de secuencias y campañas (conjunto de secuencias) que se llevarán a cabo una vez se encuentre el sistema de test en modo funcional. Está compuesta por: Diagrama de flujo de datos. Cada diagrama representa los distintos procesos que se llevan a cabo y del mismo modo, se representa también el flujo de información existente entre las distintas funciones. Diccionario de datos: Contienen las distintas referencias sobre el flujo de información reflejado en el diagrama. Especificaciones de procesos: Análisis en profundidad de cada función y proceso que componen el proyecto. 3.2. Metodologías Orientadas a Objetos [OO] En esta metodología, tanto los procesos como las variables serán tratados como un único componente u objeto. Cada sistema puede estar compuesto por varios objetos capaces de interactuar entre sí. Los fundamentos de una metodología OO son: Abstracción: Descripción “superficial” de los elementos, funciones o métodos de un objeto (Clase abstracta de un objeto). Encapsulación: Se agrupan los elementos pertenecientes a los objetos, de forma que el usuario solo tenga acceso a aquellos elementos que puedan ser configurables, mientras que el resto permanecerán ocultos para el usuario. (Métodos contenidos dentro de funciones de propósito general). Modularidad: Propiedad que permite a cada objeto el poder estar dividido en distintos métodos, procesos, funciones, etc. Jerarquía o herencia: Estructura lógica presente en los distintos niveles de abstracción. Tipificación: Cada objeto estará propiamente definido para evitar cualquier posible suplantación entre objetos distintos. Persistencia: Propiedad presente en aquellos objetos que permanecen activos después de que el espacio de nombres donde fue instanciado haya cambiado o incluso desaparecido (Declaración de variables en niveles superiores). 3.3. Metodologías Orientadas a Sistemas en Tiempo Real Presente en sistemas cuya prioridad es el control global de todos los procesos. Esta metodología estará comúnmente implantada en sistemas donde sea necesario: Gestionar la concurrencia de objetos de diversa naturaleza. Priorizar la ejecución de unos procesos sobre otros. Establecer flujos de información entre tareas de forma síncrona o asíncrona. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 12 Manejar interrupciones durante la ejecución de procesos simultáneos. Establecer un marco de referencia temporal para cada uno de los procesos que han de ejecutarse. 4. Metodologías de Verificación y Pruebas de Test Para poder establecer una correcta arquitectura de software, es necesario conocer cuál será el tipo de prueba que será llevada a cabo en el sistema de test. Conocer las distintas metodologías aplicadas a procesos de verificación, permite poder valorar cuál de ellas se adapta mejor a las especificaciones técnicas que han de verificarse en cada prueba. Entre todas las posibles pruebas de verificación/validación, se pueden destacar algunas de las más comúnmente utilizadas [3]: • Pruebas automatizadas: Cada una de dichas pruebas, como su nombre indica, se gestiona de forma automática sin la necesidad de una participación directa por parte del operario. • Pruebas de aceptación: Comprueban si un producto cumple con las especificaciones técnicas del cliente. Es frecuente que dichas pruebas sean supervisadas por el cliente a la hora de aceptar o no la valoración de los resultados. • Pruebas de “Caja Negra”: Son comúnmente aplicadas en dispositivos donde el funcionamiento interno es desconocido. La valoración de los resultados se basa en analizar las salidas generadas al estimular el dispositivo con unas entradas conocidas previamente definidas. • Pruebas de “Caja Blanca”: El fundamento de estas pruebas se basa en el análisis del funcionamiento, procesos y estructuras internas que configuran el cuerpo de la aplicación o dispositivo. • Pruebas de compatibilidad: Miden el nivel de operatividad conjunta entre dos o más dispositivos, hardware-software, etc. Este tipo de pruebas pueden ser llevadas a cabo de forma automática o manual. • Pruebas de normalización: Su objetivo será el de determinar si se cumple o no con los actuales requisitos y estándares presentes en un sector determinado. • Pruebas de exploración:También conocidas como pruebas “on the fly”. Son pruebas realizadas sobre la marcha, que se centran en una función específica de la aplicación, un componente concreto del dispositivo, etc. Las pruebas de exploración son llevadas a cabo por aquellos operarios altamente cualificados que conocen el posible riesgo de existencia de errores en puntos concretos del sistema. Puede ocurrir que la finalidad de la prueba no sea comprobar el número de errores, sino verificar que la fiabilidad del sistema asegura una tasa de errores por debajo de los niveles críticos. • Pruebas de funcionalidad: Se revisa que el dispositivo cumple con todas las especificaciones y que todas sus funciones operan correctamente. Las pruebas llevadas a cabo comprueban el correcto funcionamiento componente a componente, verificando su comportamiento tanto en circunstancias normales como anómalas. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 13 • Pruebas regresivas: Orientadas a la depuración de errores o al mantenimiento de dispositivos. Su estructura es similar a las pruebas funcionales. Su objetivo se centra en comprobar que, una vez se realizan los cambios de depuración, tanto el elemento depurado como el resto de elementos funcionan correctamente. • Pruebas de estrés o aguante: Se basan principalmente en someter al dispositivo a condiciones extremas de trabajo y analizar qué niveles de estrés es capaz de soportar, determinando si dichos niveles están por encima o por debajo del umbral establecido en las especificaciones técnicas. Estas pruebas son muy frecuentes en sistemas de vuelo. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 14 Capítulo 2 Metodología aplicada a un caso real 1. Objetivo: Diseñar un sistema de test totalmente automatizado, que permita verificar desde tarjetas de potencia hasta componentes electrónicos. Para llevar a cabo el proyecto, se implantarán las metodologías previamente descritas, aplicadas tanto en la ejecución del mismo como en el diseño de cada función y de cada secuencia que componen en su conjunto el sistema de test. 2. Métricas establecidas Para poder empezar con la ejecución del proyecto, es necesario establecer las métricas necesarias para determinar el plazo de entrega del proyecto, las funciones del sistema de test, la arquitectura de ficheros, etc. 3. Planificación del proyecto Para poder cumplir los plazos de entrega, es necesario establecer un riguroso control sobre el tiempo destinado a cada una de las etapas que conforman el proyecto: S1 Formación Arquitectura de ficheros Programación de instrumentos Gestión de secuencias Diseño de secuencias Documentación TCL GPIB RS232 Definir arquitectura Multímetro Fuente de alimentación Carga dinámica Scanner Osciloscopio Registro de eventos Reporting de errores Gestión de errores Secuencia modelo Manual de usuario M1 (Enero) S2 S3 S4 S5 M2 (Febrero) S6 S7 S8 S9 M3 (Marzo) M4 (Abril) M5 (Mayo) S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S20 ` Figura 1. Cronograma establecido para el desarrollo del sistema de test Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 15 4. Especificaciones de software 4.1. Un único lenguaje de programación Con el objetivo de unificar el lenguaje de programación empleado, tanto en el comandado de instrumentos como en el diseño de las secuencias de test, se decantó por utilizar un lenguaje que tuviera, entre otras muchas propiedades, un soporte de librerías compatible con la comunicación entre el ordenador y cada uno de los instrumentos del sistema de test (Comunicación GPIB, RS232, USB, ect.), que presentara una gran escalabilidad en cuanto a dispositivos y secuencias programadas, fuera un lenguaje robusto y fácil de usar, etc. 4.2. Reusabilidad de estructuras Cada librería destinada al comandado de un instrumento debe presentar una estructura estándar para todas y cada una ellas. De esta forma, se posibilita el poder reutilizar gran parte del código, en el caso de que se sea necesario comandar un instrumento con la misma función pero de distinta marca o modelo al ya programado. 4.3. Estructura de ficheros y datos El objetivo principal que se persigue al establecer una estructura fija en la jerarquía de ficheros es la creación de un software destinado al comandado del sistema de test, que sea completamente autónomo y permita su potabilidad entre distintos sistemas. Estableciendo una arquitectura fija, se está facilitando la implementación de nuevas librerías de comandado al sistema de test. Simplemente combinando las carpetas que ya contiene el sistema de test actual con los ficheros que contienen los nuevos módulos, se consigue de forma fácil y sencilla un nuevo sistema ya ampliado, totalmente operativo, sin necesidad de realizar ningún cambio en las direcciones de trabajo. La estructura de ficheros empleada será la siguiente: 4.3.0.1. documents documents System \ documents setup setup hardware hardware Multimeter_user_manual.pdf ... Power-supply_user_manual.pdf Figura 2. Arquitectura de ficheros: “System \ documents” La carpeta “documents” contendrá toda la documentación relevante acerca de los instrumentos que componen el sistema de test: datasheet, user-manual, etc. En el caso de que el usuario quiera conocer cual es la función y la correcta utilización de cada dispositivo, deberá buscar en dicha carpeta. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 16 4.3.0.2. setup setup System \ setup software software source source tcl tcl driver_... driver_... “driver”_...* .tcl class_... class_... pkgIndex.tcl setup_... setup_... “driver”_...dict_error.json others others Figura 3. Arquitectura de ficheros: “System \ setup” La carpeta “setup” contiene todas las librerías que componen el sistema de test. Cada una de las librerías se nombrará de la siguiente forma dependiendo de su función: driver_*: Contiene los driver de comandado del instrumento (*). class_*: Contiene la clase abstracta correspondiente al instrumento (*) setup_*: Contiene el “setup” o inicialización de la prueba de test (*) Otras librerías: Contienen las librerías de distinta naturaleza a las anteriores. Estas carpetas no contendrán ningún tipo de prefijo adicional. 4.3.0.3. test test System \test device_verification_converter device_verification_converter script script seq_select.tcl seq_launcher.bat seq_launcher.bat show_help.bat show_help.bat stimuli stimuli test_secquence test_secquence script script seq.tcl Figura 4. Arquitectura de ficheros: “System \ test” Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 17 El directorio “test” contiene dos grupos de ficheros dentro de la carpeta correspondiente a la prueba de verificación “device_verifiation_converter”: \ script: Contiene los ficheros correspondientes a la selección del modo de ejecución de la prueba. “Modo secuencia” o “Modo depuración” • Modo secuencia: Comandado automático del instrumento a partir de una secuencia previamente establecida. • Modo depuración: Comandado manual del instrumento mediante comandos. \ stimuli: Contiene la secuencia de test correspondiente a la prueba. 4.3.0.4. tools tools System \ tools userwork.bat userwork.bat Figura 5. Arquitectura de ficheros: “System \ tools” El fichero “userwork.bat” carga la configuración en el sistema de todos los directorios de trabajo: Directorio de aplicaciones (Tcl, Doxigen...), librerías por defecto, workpath, etc. 4.3.0.5. work test System \ work device_verification_converter osciloscope_outputs converter_charge.bmp converter_discharge.bmp measures measurements.txt measurements.txt Figura 6. Arquitectura de ficheros: “System \ work” La carpeta “work”, a diferencia del resto de ficheros creados por el usuario de forma manual, estará generada automáticamente tras la ejecución de cada secuencia de test. En ella estarán contenidos todos los informes, capturas del osciloscopio, medidas realizadas, etc. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 18 5. Herramientas que componen el sistema de test Los instrumentos que componen actualmente el sistema de test son los siguientes: 5.1. HP 6653A [Fuente de alimentación] Clase de instrumento Fuente de alimentación Modelo HP 6653A Comunicación Características Principales GPIB x Tensión de salida: 0 a 15 V x Corriente de salida: 0 a 15 A ---------------------------------- x Precisión V: 0.06% ± 15mV x Precisión A:0.015% ± 13mA Figura 7. HP 6653A [Fuente de alimentación 5.2. Kikusui PLZ150U [Carga dinámica] Clase de instrumento Carga dinámica CC Modelo Kikusui PLZ150U Comunicación GPIB x Tensión: 1.5 a 150 V x Corriente: 30 A x Potencia: 150 W Características Principales ---------------------------------- x Módulos: 5 ---------------------------------- x Modos de carga: Tensión / Corriente / Conductancia. Figura 8. Kikusui PLZ150U [Carga dinámica] 5.3. Tektronix TPS2024 [Osciloscópio] Clase de instrumento Osciloscopio Modelo Tektronix TPS 2024 Comunicación Características Principales RS232 x Canales: 4 x V. de muestreo: 2 GS/s ---------------------------------- x Vmax : 300 VRMS x Ancho de banda: 20 MHz Figura 9. Tektronix TPS2024 [Osciloscópio Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 19 5.4. HP 34401A [Multímetro] Clase de instrumento Multímetro Modelo HP 34401A Comunicación GPIB Características Principales x Dígitos de resolución: 6½ x DC/AC tensión, DC/AC corriente, resistencia de 2 y 4 hilos, diodo, continuidad, frecuencia y periodo. ---------------------------------- x V max. : 1000 V x I max. : 3A ---------------------------------- x Precisión 0.0035% DC x Precisión 0.06% AC x Precisión A:0.015% ± 13mA Figura 10. HP 34401A [Multímetro 5.5. Agilent 34970A [Escáner] Clase de instrumento Escáner Modelo Agilent 34970A Comunicación GPIB x Dígitos de resolución: 6½ x Escáner de 250 ch/s Características Principales ---------------------------------- x DC/AC tensión y corriente, resistencia, frecuencia y periodo. Figura 11. Agilent 34970A [Escáner] *Las imágenes mostradas pueden tener derechos de copyright de sus respectivas marcas. *HP, Agilent, Kikusui y Tektronix son marcas registradas. *Las imágenes pueden no corresponder con el instrumento utilizado en el sistema de test. *Si desea información mas detallada sobre los instrumentos utilizados, se adjunta enlace en la bibliografía de herramientas e instrumentos utilizados. 6. Especificaciones de la secuencia de test Para comprobar el correcto funcionamiento del sistema de test, se llevará a cabo la verificación de un componente electrónico basándose en las especificaciones técnicas indicadas en el datasheet del fabricante. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 20 6.1. Dispositivo sometido a la prueba de test El dispositivo bajo test será un convertidor CC/CC que presenta las siguientes especificaciones técnicas indicadas en su datasheet correspondiente: Figura 12. Convertidor CC/CC Tensión de entrada nominal Rango de tensión de entrada Tensión de salida Corriente de salida máxima Eficiencia media 24 VDC 18-36 VDC 15 VDC 200 mA 84 % Corriente de entrada sin carga / con carga Tensión mínima de encendido Tensión límite de apagado Precisión de voltaje de salida 5 mA / 150 mA 12 VDC 11 VDC ±1 % Tabla 1. Especificaciones técnicas del convertidor 6.2. Diseño de la prueba En el diseño de cualquier prueba de test se debe considerar cualquier situación de riesgo: primero para el operario y segundo para el dispositivo o sistema de test. Para evitar dichas situaciones se deberán emplear sistemas de protección, detección de fallos en la comunicación con los instrumentos, etc. Para poder establecer cada una de las etapas que componen la verificación del dispositivo, es recomendable conocer de forma aproximada el comportamiento del dispositivo en cada una de las fases de la prueba. 6.2.1. Estudio del arranque del convertidor Se sabe a ciencia cierta que todo convertidor necesita ser alimentado a una tensión mínima de encendido para poder empezar a trabajar como tal. La primera parte de la secuencia de verificación se centrará en el análisis de esta primera etapa del convertidor. Se irá incrementando la tensión de entrada como una rampa ascendente Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 21 hasta que se detecte el encendido del mismo. Para detectar que realmente el convertidor se ha encendido, se establecerá una tensión umbral por encima de la cual se considerará que ya está en funcionamiento. Se aproximará el tiempo de encendido por el momento en el que la tensión de salida supere la tensión umbral (t′on ). Se estima que la gráfica correspondiente al momento de encendido del convertidor tenga aproximadamente la siguiente forma: V Apagado Encendido Vin Vout Von Vumbral t’on t Figura 13. Arranque de un convertidor 6.2.2. Pruebas de rendimiento a tensión nominal constante y carga variable Una vez que el convertidor se encuentre trabajando en régimen permanente, con una tensión de salida de 15 V y esté alimentado a tensión nominal (24 V), se realizarán las distintas pruebas de rendimiento correspondientes a distintos valores de carga. Para el cálculo del rendimiento se empleará la siguiente fórmula: η= 6.2.3. (Vout · Iout ) Pout = Pout + Pin (Vout · Iout ) + (Vin · Iout ) Estudio del apagado del convertidor Una vez completada la secuencia correspondiente a las pruebas de rendimiento, se iniciará la tercera y última etapa de la verificación. Partiendo de la tensión de alimentación nominal, se irá reduciendo el voltaje a la entrada del convertidor hasta asegurarnos de que se ha producido la desconexión del mismo. Momento en el que registraremos la tensión a la que se ha apagado el convertidor. Se estima que la gráfica correspondiente al momento de apagado del convertidor tenga aproximadamente la siguiente forma: Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 22 V Encendido Apagado Vin 24V 15V Vout Vumbral Voff t t’off Figura 14. Desconexión de un convertidor 6.3. Procesado de medidas. Resultados Se diseñará una plantilla de mediciones que permita agrupar los resultados obtenidos de forma estructurada y bien organizada: Configuración de fase Fase Tensión Carga 1 Rampa ascendente Constante Constante Rampa descendente Constante Incrementada Reducida Constante 2 4 Vin Iin Mediciones Vout Iout Pin Pout h Tensión de histéresis de carga: Tensión de histéresis de descarga: Resultado de la prueba: Tabla 2. Plantilla de resultados Una vez completada la tabla con las mediciones, se comparan los resultados obtenidos con los esperados. Si los resultados se encuentran dentro de los umbrales admisibles, puede afirmarse que el convertidor se mantiene dentro de sus condiciones nominales de funcionamiento. 7. Arquitectura del software 7.1. Librerías de comandado de instrumentos Para gestionar de manera eficiente todos los instrumentos y las funciones de cada uno de ellos, es necesario implementar una metodología “OO” (Orientada a objetos) que permita descomponer cada tipo de instrumento en clases abstractas de las que hereden las clases asignadas a cada modelo. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 23 Multímetro <Abstract> +Leer Tensión(entrada AC/DC) +Leer Corriente(entrada AC/DC) +Leer Impedancia(entrada 2x/4x) Multímetro HP +Leer Tensión(entrada AC/DC) +Leer Corriente(entrada AC/DC) +Leer Impedancia(entrada 2x/4x) Multímetro Agilent +Leer Tensión(entrada AC/DC) +Leer Corriente(entrada AC/DC) +Leer Impedancia(entrada 2x/4x) Multímetro KEITHLEY +Leer Tensión(entrada AC/DC) +Leer Corriente(entrada AC/DC) +Leer Impedancia(entrada 2x/4x) * HP, KEITHLEY y Agilent son marcas registradas. Figura 15. Ejemplo de clase abstracta Utilizar clases abstractas permite unificar todas las funciones pertenecientes a un mismo tipo de instrumento. De esta forma, el usuario solamente necesitará conocer cuales son los comandos de la clase abstracta, pues serán los mismos para el resto de instrumentos. 7.2. Registro de comandos y “reporting” de errores Con el objetivo de poder gestionar el flujo de información que procesa el sistema, se requiere de funciones capaces de registrar cada uno de los comandos que se envían por cada puerto, incluyendo la hora en que fue enviado. De manera similar, se precisan librerías dedicadas al “reporting” de errores que permitan al usuario determinar qué errores se han producido y cuales de ellos son críticos a la ahora de gestionar la respuesta del sistema ante dicho error. Tanto el registro de comandos como el “reporting” de errores serán diseñados siguiendo una metodología “OO”. Las funciones que componen ambas estructuras serán llamadas directamente desde las funciones de comandado de cada instrumento. 7.3. “Error Handle” o Gestor de errores Gestionar la actuación del sistema en situaciones en las que se ha producido algún error durante la secuencia forma parte de las funciones pertenecientes a lo que comúnmente se conoce como “Error Handle” o “Gestor de errores”. Ambas funciones serán instanciadas siguiendo una metodología “OO” como “objetos” independientes, controlados a bajo nivel en cada función de cada instrumento. La clase “Error Handle” se encarga de, dependiendo de la severidad del error notificado por la función “Reporting de Errores”, ejecutar el protocolo de seguridad programado. Por defecto, el protocolo de actuación ante errores que presenten una severidad crítica se basa en una parada controlada de todos los dispositivos. Dicha actuación podrá ser reprogramada por el operario en función de la prueba de test que se esté llevando a cabo. Los principales objetivos del gestor de errores, como ya se indicó previamente, serán: proteger la salud de los operarios como prioridad número uno y posteriormente, proteger el equipo de test y el dispositivo sometido a pruebas de cualquier situación que pueda producir daños irreversibles en los mismos. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 24 7.4. Secuencias de test Para poder diseñar una secuencia de test, se requiere configurar al menos dos elementos: La SECUENCIA, que contiene el comandado de instrumentos y el procesamiento de los datos procedentes de las medidas, y el SETUP, que contiene la inicialización de los instrumentos. Tanto la secuencia como el setup serán programados siguiendo una metodología estructurada, es decir, su estructura presentará una ejecución secuencial del tipo “Top - Down”. En pruebas de test avanzadas, puede darse la necesidad de tener que ejecutar varios procesos al mismo tiempo. Para ello se emplearán métodos de ejecución en paralelo, tales como el uso de hilos, interrupciones, etc. que requieran de una metodología orientada a sistemas en tiempo real. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 25 PARTE II SISTEMAS DE TEST Capítulo 1 Pasado, presente y futuro de los sistemas de test 1. Introducción a los sistemas de test. Motivación L os procesos de verificación y sistemas de test no siempre han presentado unos niveles de automatización tan elevados como los actualmente presentes en fábricas de producción en serie o empresas dedicadas al diseño de componentes o dispositivos electrónicos. Dichos procesos de verificación pueden basarse en la comprobación de unas especificaciones técnicas específicas o simplemente en la calidad de un producto. En electrónica, una secuencia de test se basa esencialmente en la medición de las respuestas que genera el dispositivo bajo test, al aplicarle unas entradas o estímulos determinados. Una vez realizadas las mediciones, se procesa dicha información, extrayendo las conclusiones que determinen si el dispositivo ha pasado o no la prueba. La automatización de las secuencias va adquiriendo una mayor relevancia en aquellos entornos de trabajo donde se busca conseguir un alto nivel de reproducibilidad con cada prueba y un tiempo de ejecución lo más breve posible. Existen entornos de trabajo donde unos altos niveles de automatización pueden llegar a ser innecesarios, debido a una elevada inversión inicial que haga encarecer el coste de cada prueba sin reflejar un ahorro sustancial a largo plazo. Conocer qué partes de la prueba de test necesitan ser cubiertas mediante procesos automáticos y la compatibilidad del equipo del que se dispone con dicha automatización puede ser un buen comienzo para decidir qué nivel de automatización se adapta mejor a nuestras necesidades. 2. Sistema de test manual E ste tipo de sistemas de test será el primero en ser implementado a nivel industrial. La escasa complejidad propia de los primeros sistemas electrónicos permitía a este tipo de sistemas obtener resultados óptimos de manera eficiente. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 27 En la actualidad, estos entornos de test se emplean en aquellos proyectos caracterizados por [6]: • Requerir una “velocidad” de secuencia relativamente baja. El tiempo de muestreo de cada medición no es un factor crítico. • Tener una configuración modulable o abierta, es decir, que pueda estar sometido a modificaciones con relativa frecuencia (Baja reproducibilidad). • Las mediciones que se llevarán a cabo en dicho proyecto son, en su mayoría, verificaciones inmediatas (Ej: tensión, corriente, etc., en puntos concretos en momentos puntuales). Figura 16. Entorno de trabajo de un sistema de test manual[6] Para la debida y correcta utilización de los dispositivos en cada una de las pruebas, se requiere de operarios con una elevada destreza en el manejo de dichos instrumentos. La recogida y análisis de los resultados obtenidos en cada prueba puede llegar a ser una tarea larga y, en algunos casos, complicada. Este tipo de entornos de test es comúnmente utilizado en pequeñas y medianas empresas cuyos trabajos están orientados a la reparación de sistemas o a la verificación de prototipos a pequeña y mediana escala. El coste total medio es, sin duda, el más económico de todos los posibles sistemas de test. Las secuencias de test ejecutadas de forma manual presentan una gran ineficiencia en proyectos en los que configurar todos los equipos de medición para cada prueba representa un elevado porcentaje del tiempo de éstas. 3. Sistema de Test Semi-Automático D esde hace más de una década, las empresas pertenecientes al sector eléctrico y de la electrónica se han visto en la necesidad de implementar nuevos entornos de test que les permitan poder realizar pruebas más exhaustivas de forma más rápida y eficiente. Esta adaptación llevaría a los laboratorios de verificación de sistemas a desarrollar e implantar una nueva forma de trabajo, basada en un entorno de test cuya característica principal será el Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 28 comandado de los instrumentos desde el sistema de control y, en ciertas fases de la prueba, también de forma manual. Los proyectos donde es frecuente encontrar sistemas de test semi-automáticos son: • Aquellos que, al automatizar las pruebas de test, generan un beneficio por encima de los costes derivados de dicha automatización. • La magnitud del proyecto no requiere de una plena automatización. • Los resultados obtenidos deben ser reproducibles. • Requieren de un sistema de test con cierta flexibilidad. Figura 17. Entorno de trabajo de un sistema de test semi-automático [6] Al igual que los sistemas de test manuales, éstos también requieren de un operario experimentado, pues la realización de pruebas de manera semi-automática debe ser monitorizada por un experto y seguir unas normas de seguridad. El coste total de un sistema de test aumenta cuanto mayor sea el nivel de automatización del mismo. Este aumento en el coste se ve compensado con una notable reducción en el tiempo de ejecución de cada prueba. La automatización de estos procesos suele llevarse a cabo mediante programas basados en una interfaz gráfica muy intuitiva, que permite configurar el instrumento remotamente. A su vez, es bastante frecuente que dicha automatización quede limitada a una ventana de comandos, desde donde se pueda controlar el instrumento mediante el envío de líneas de código una a una, sin posibilidad de poder establecer una secuencia lógica que permita la interacción entre instrumentos. c Figura 18. Ejemplo de control remoto por interfaz gráfica (LabVIEW ) Analizando el coste de los equipos utilizados, el precio medio es casi tres veces mayor que el de un sistema de test manual. Este notable incremento es debido, mayoritariamente, a que las herramientas empleadas poseen mejores especificaciones técnicas y un potente interfaz de comunicaciones entre el dispositivo y el ordenador. Dicha interfaz de comunicaciones puede ser Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 29 implementada utilizando distintos tipos de Bus: PCI, PCI Express, PXI, PXI Express, GPIB, USB, Ethernet/LXI, etc. Max. Ancho de Banda (MB/s) Aumento (Mejora) Ancho de banda Latencia vs Ancho de Banda Bueno Mejor El mejor Latencia aproximada (µs) Disminución (Mejora) Latencia Figura 19. Comparación entre los distintos tipos de Bus [7] 4. Sistema de test automático Figura 20. Entorno de trabajo de un sistema de test automático [6] E ste tipo de sistemas de test representa el último estadio de nuestro proyecto. La ejecución de cada una de las pruebas de test se desarrolla de forma plenamente autónoma. Las razones por las que se suele emplear este tipo de entornos de trabajo serán las siguientes: • Realización de pruebas reproducibles y repetibles. • Necesidad de reducir el tiempo de prueba. • Las especificaciones técnicas, que han de ser verificadas en cada secuencia, son conocidas previamente y permanecen estables a lo largo de todo el proyecto. • Reducir el coste económico que conllevaría la realización de las pruebas empleando otro tipo de sistemas. • Las pruebas podrán ser llevadas a cabo por personal no especializado. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 30 El proceso propio de un sistema de test automático presentará un flujo de información similar al mostrado en la siguiente figura: DUT Fuente de alimentación Instrumento de medida (Device Under Test) Dispositivo de estímulos Matríz SWITCH Estímulo punto 1 Medída punto 1 Estímulo punto 2 Medída punto 2 Estímulo punto 3 Medída punto 3 Matríz SWITCH Instrumento de medida BUS Comandos de control Ordenador Datos de mediciones Figura 21. Diagrama de flujo de un sistema de test automático [6] El precio medio de un entorno de test completamente automático varía enormemente en función de la complejidad del dispositivo que se quiera testear, desde varios miles hasta centenas de miles de euros. Los elementos con mayor peso dentro del coste total medio son: El dispositivo de control del sistema de test ()encargado de enviar los comandos y procesar la información de las mediciones) y la automatización y/o programación del mismo. La automatización de cada una de las pruebas se puede llevar a cabo mediante un software cerrado, donde el operario solo pueda modificar los parámetro de entrada y de salida, o mediante un lenguaje interpretado “de scripting” que pueda ser ejecutado tanto como código cerrado, como un código totalmente escalable con capacidad de ser modificado con la posibilidad de satisfacer las necesidades particulares de cada usuario. Para automatizar las secuencias, en este proyecto se empleará el lenguaje TCL como herramienta de comunicación entre los instrumentos que componen el sistema de test y el sistema de control. Algunas de las razones del uso de TCL en la automatización de pruebas de verificación serán las siguientes: • Al ser un lenguaje interpretado, no necesita ser compilado, agilizando los proceso tanto de depuración como de ejecución. • Es de código abierto, por lo que no supone un coste adicional por licencias de uso. • Posee gran cantidad de librerías que hacen que sea totalmente compatible con los principales protocolos de comunicación (GPIB, RS232, Ethernet, USB, ect.). • Es totalmente compatible con las metodologías [OO] y de tiempo real. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 31 • Es compatible con la mayoría de micro-controladores del mercado, haciendo posible su utilización en pruebas de verificación que requieran mayor capacidad de procesamiento que la que puede tener normalmente un ordenador. • Posee su propia herramienta gráfica: “TK”, que permite crear una interfaz gráfica compatible con el comandado del propio sistema de test. Por el contrario, las desventajas que tiene este lenguaje son: • El sistema de depuración de errores de TCL es poco intuitivo, haciendo que algunos errores de código sean complicados de depurar. • No está tan extendido como otros lenguajes interpretados como Phyton o Perl, haciendo que el número de librerías, aunque abundantes, sigan siendo muy limitadas en comparación con otros lenguajes. El estudio, diseño y construcción física del propio sistema de test es, en muchos casos, un proyecto independiente; el cuál se va estructurando a medida que se van cerrando las especificaciones del dispositivo que será testeado en dicho sistema. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 32 Capítulo 2 Buses de comunicación utilizados en el comandado remoto de instrumentos La comunicación entre los instrumentos y la unidad de control u ordenador representa uno de los elementos con mayor criticidad de todo el sistema de test. La velocidad de transmisión de datos puede suponer un factor clave en el diseño de cada prueba, pues el tiempo de transmisión requerido para procesar grandes cantidades de información puede llegar a alargar en exceso el tiempo de ejecución prueba establecido. Como se ha mostrado en el capítulo anterior, existe una gran variedad de buses de comunicación adaptados a cada necesidad. Para la verificación de un componente electrónico, como es el caso de un convertidor DC/DC, se emplearán buses de comunicación con una tasa de transferencia de datos que varía desde los 160 kB/s (RS232) hasta los 8 MB/s (GPIB). 1. Buses de comunicación para sistemas de test con baja o media carga de procesado 1.1. RS232 (Puerto serie) Ancho de Banda Máx: 160 kB/s Distribución del Ancho de Banda: Compartido Calificación del A.B. : Baja Calificación Latencia: Baja Otras características: Fue uno de los primeros buses de comunicación empleado en el control de instrumentación de forma remota. Su implementación en el control de equipos de medición es cada vez más reducida. Permite distintas velocidades de transmisión mediante la configuración del Baud-rate. Posibilidad de establecer conexiones “null-modem” entre dispositivos. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 33 La aparición del cable USB como sustitutivo al RS232 ha generado que el comandado de instrumentos mediante RS232 pase a un tercer plano. Actualmente, la tecnología USB ofrece grandes prestaciones tanto técnicas (ancho de banda mejorado) como de funcionabilidad (Tecnología “Plug and Play”), que hacen que en comparación con el RS232 sea, en muchos casos, la opción más acertada. Los casos en los que se sigue empleando el puerto serie en el comandado de instrumentos pueden ser los siguientes: El instrumento o el equipo de control solo admiten dicho bus de comunicación. La velocidad de transmisión de información no es un elemento crítico en las pruebas de test que llevan a cabo en el sistema. No se precisa de altas prestaciones, por lo que se valoran otras opciones más económicas (como es el caso del RS232). Se requiere de una comunicación robusta entre dispositivos, que soporte longitudes de hasta 15 metros de separación entre el instrumento y el sistema de control. En este proyecto, se empleará una comunicación RS232 por el puerto serie debido a que, en el caso del osciloscopio, solo es posible el comandado del instrumento a través de dicho puerto. Al utilizar una conexión RS232, quedará limitada en gran medida la gestión de los posibles errores relacionados con el estado de la conexión del osciloscopio. Para poder establecer una comunicación entre el sistema de control y el instrumento, es necesario que exista unanimidad en la configuración de la comunicación. En el caso de que alguna de las partes (Emisor / Receptor) esté configurada de manera distinta respecto a la otra, la comunicación entre ambos no podrá ser establecida. La configuración por defecto que se utilizará será la siguiente: Velocidad de transmisión: 19200 baudios. Control de flujo de datos: no. Paridad: Impar. Dicha configuración podrá cambiarse en cualquier momento, pero siempre deberá de llevarse a cabo de forma simultánea tanto en el equipo de control como en el instrumento. 1.2. GPIB (GPIB-USB) Actualmente, es el bus de comunicación por excelencia, siendo uno de los más utilizados en el comandado de instrumentos. Presenta una gran escalabilidad, permitiendo una conexión en paralelo de hasta 15 instrumentos de forma simultánea. Cada instrumento poseerá una dirección única para cada red, de forma que puedan ser comandados varios dispositivos sin que se lleguen a producir conflictos de dirección. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 34 Algunas de las principales características de este bus de comunicación son: Ancho de Banda Máx: 8 MB/s Distribución del Ancho de Banda: Compartido Calificación del AB: Bueno Calificación Latencia: Mejor Otras características: Gran robustez. Implementación extendida en la industria. Conexión mááá́as utilizada en instrumentos electrónicos. Ideal para: Automatización de equipos ya existentes. Sistemas híbridos. Sistemas que utilizan una instrumentación especializada. A pesar de ser numerosas las ventajas que ofrece este bus de comunicación frente al RS232, en ciertos casos, el RS232 sigue llevando la ventaja (como por ejemplo la longitud máxima de conexión, la cual no puede ser superior a los 4 metros en el caso del GPIB frente a una longitud máxima de hasta 15 metros que soporta el RS232). 1.3. Buses de comunicación frecuentemente utilizados Es frecuente poder encontrar otros instrumentos comandados a partir de las siguientes conexiones: 1.3.1. Ethernet Ancho de Banda Máx: 12.5 MB/s (Fast Ethernet) Distribución del Ancho de Banda: Compartido a lo largo de la red Calificación del AB: Mejor Calificación Latencia: Bueno Otras características: Capacidad de enviar información de manera remota. Presente en PC’s Ideal para: Sistemas distribuidos (distanciados uno del otro). Monitoreo remoto. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 35 1.3.2. USB Ancho de Banda Máx: 60 MB/s (Hi-Speed USB) Distribución del Ancho de Banda: Compartido en los puertos Calificación del AB: Bueno Calificación Latencia: Mejor Otras características: Presente en todos los PC’s. Conectividad más sencilla mediante auto--detección. Ideal para: Aplicaciones portátiles y de escritRrio. Sistemas pequeños y de bajo costo. 1.4. Comparación de características A la hora de escoger qué tipo de bus es el que mejor se adapta a los requisitos del proyecto, es frecuente recurrir a las características mostradas en la siguiente tabla: Número máximo de dispositivos por puerto Ancho de banda Longitud de conexión máxima Número de dispositivos con conexión compatible RS232 GPIB (GPIB-USB) USB (HUB USB) Ethernet (switches) 1 15 127 Sin límite 20 kB/s 8MB/s 60 MB/s 12.5 MB/s 15 m 4m 5m 100 m Escaso Muy alto Muy alto Alto Tabla 3. Comparativa de las principales características de distintos buses 2. Buses de comunicación para sistemas de test de alto nivel de procesado En aquellos sistemas donde la velocidad de procesamiento requerida exceda de las especificaciones propias de un sistema de test estándar, se podrán emplear los siguiente buses de comunicación diseñados especialmente para sistemas de test de alto desempeño. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 36 2.1. PCI y PCI Express Ancho de Banda Máx: 250 MB/s (PCI EXPRESS) 132 MB/s (PCI) Distribución del Ancho de Banda: Compartido Calificación del A.B. : el mejor Calificación Latencia: el mejor Otras características: Posee las mejores prestaciones tanto en ancho de banda como en latencia. Los ordenadores actuales cuentan la mayoría con slots PCI. Especialmente diseñado para: Sistemas de trabajo de alto desempeño (S.T.A.D.) Procesar gran cantidad de datos 2.2. PXI y PXI Express Ancho de Banda Máx: 250 MB/s (PXI EXPRESS) 132 MB/s (PXI) Distribución del Ancho de Banda: Compartido Calificación del A.B. : el mejor Calificación Latencia: el mejor Otras características: Presenta una arquitectura física basada en CompactPCI Presenta funciones adicionales respecto a CompactPCI basadas en el control de tiempos y modos de sincronización. Especialmente diseñado para: Sistemas de trabajo de alto desempeño (S.T.A.D.) Sistemas compuestos de instrumentos heterogéneos. Control preciso de tiempos y modos de sincronización. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 37 PARTE III LIBRERÍAS DEL SISTEMA Capítulo 1 Librerías. Estructuras básicas Cada una de las librerías de comandado representan, en su conjunto, la columna vertebral de este proyecto. El objetivo que se persigue con cada librería no es simplemente comandar un instrumento, sino comandarlo de forma controlada, segura... donde cada comando enviado al instrumento quede registrado y cada error, reportado por el instrumento, o evento ocurrido durante la secuencia de test sea gestionado de forma totalmente controlada. Para lograr tales resultados, es necesario la combinación de distintas librerías que se encarguen de cada función por separado (comandado del instrumento, registro de errores y eventos ocurridos, gestión y ejecución de protocolos específicos en caso de registrar un error o una situación crítica para el sistema, etc.). 1. Estructura de una clase Cada una de las librerías de comandado presentará una estructura similar entre ellas. El objetivo es establecer un modelo de librería que sea lo más escalable posible; pudiendo aplicarlo de esta forma, a cualquier instrumento que comparta un mismo protocolo de comunicación. Dentro de la estructura de una clase, se destacarán cuatro elementos fundamentales: Variables: Pueden ser públicas (si se puede acceder a ellas desde fuera de la clase) o privadas (solamente la clase tiene acceso a ellas). Constructor: Recoge todas aquellas operaciones o acciones que han de ejecutarse en el momento en el que la clase es instanciada. Puede tener o no parámetros de entrada, necesarios para poder instanciar el objeto de dicha clase. Destructor: Cuando un objeto deja de estar instanciado, se ejecuta la lógica programada en el destructor de la clase. No todas las clases requieren el uso de un destructor. Funciones: Pueden estar orientadas al comandado del instrumento o simplemente a la ejecución de operaciones. Pueden tener, al igual que el constructor, unos parámetros de entrada requeridos por la función. Las funciones pueden ser públicas, en el caso de que puedan ser utilizadas por el usuario, o privadas, en el caso de que solo puedan ser utilizadas por la propia clase. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 39 Cada una de las librerías presentará la siguiente estructura: #Se nombra la libreria del instrumento: package provide nombre_libreria 1.0 #Se inicializa la clase abstracta correspondiente al instrumento: package require nombre_clase_abstracta Declaración de la librería/clase. Librerías adicionales [OO],abstract_class, etc. Estructura de la clase/librería. Variables privadas y públicas de la clase. Funciones genéricas de la clase. ConstructorZEFTUSVDUPS de la clase. Funciones de la clase. #Se inicializan librerias adicionales si es necesario: package require nombre_libreria_adicional #Se inicializa la libreria que permite instanciar objetos en TCL: package require Itcl #Se declara el namespace donde estara instanciada la libreria: namespace eval nombre_librería { #Se importa el namespace correspondiente a las librerias adicionales namespace import ::nombre_libreria_adicional::* namespace import ::itcl::* #Se declara la clase del instrumento: ::itcl::class nombre_instrumento { #Se importa la clase abstracta correspondiente al tipo de instrumento inherit ::class_instrumento::instrumento #Se declaran las private variable private variable public variable variables que seran utilizadas en la clase a b c ############################################################################################################# #Funiones genericas de la clase: ############################################################################################################# proc sumar_ab {a b} { set a_mas_b [expr $a+$b] return $a_mas_b } ############################################################################################################# #Funiones del constructorZEFTUSVDUPS pertenecienteT a un instrumento: ############################################################################################################# #Se instancia el constructor de la clase constructor {parametro_1 parametro_2} { #E+&.1-0%&'6/$*»/%&-$0/4536$503 #Se abre el canal de comunicacion del instrumento. #Se instancia el diccionario de errores (Si lo tiene). #Se configura la severidad correspondiente a un error de conexión del instrumento. #Se añade la clase del instrumento a la clase "error_handle" encargada de gestionar situaciones criticas. #Se inicializa el valor de severidad actual a 0. } EFTtructor{parametro_1parametro_2} { #E+&.1-0%&'6/$*»/ %&-%&4536$503 #Se cierra el canal de comunicacion del instrumento. } ############################################################################################################# #Ejemplo de funciones que componen una clase: ############################################################################################################# #Se declaran las funciones publicas que componen la clase: public method funcion_1 { parametro_1 parametro_2} { #Conjunto de comandos correspondientes a la funcion_1 set a $parametro_1 set b $parametro_2 #Para utilizar funciones privadas dentro de una clase, se hara de la siguiente forma: set c [$this funcion_privada $a $b] return $c } Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 40 #Se declaran las funciones privadas que podran ser solamente usadas dentro de la clase private method funcion_privada { parametro_a parametro_b } { set valor [expr $parametro_a + $parametro_b] set valor [sumar_ab $parametro_a $parametro_b] return $valor } } } #Se exporta la clase correspondiente al instrumento namespace export nombre_libreria Código 1. Ejemplo de estructura básica de una clase 2. Estructura del constructor. Instrumentos comandados por GPIB El constructor es la “función” a la que se llama automáticamente siempre que un objeto de esta clase sea instanciado. Un constructor puede requerir unos argumentos de entrada. Dichos argumentos serán necesarios para poder instanciar el objeto. De manera común para todos los instrumentos que utilizan un protocolo de comunicación GPIB | IEEE-488, el constructor correspondiente a su clase presentará la siguiente estructura: _gpib #Pointer to $$error_handle class set error_handle $d_error_handle #Pointer to driver_gpib set gpib $_gpib } Objeto error_handle { constructor { _visa_addrs Objeto driver_ gpib { { Dirección GPIB d_error_handle} { Se asignan a una variable los objetos de la clase driver_gpib y error_handle } # open device set visaAddr $_visa_addrs # get handle to default resource manager if { [catch { set rm [visa::open-default-rm] } rc] } { puts stderr "Error opening default resource manager\n $rc" } else { set rm [visa::open-default-rm] } # check if devide opened if { [catch { set vi [visa::open $rm $visaAddr] } rc] } { puts "Error opening instrument `$visaAddr`\n$rc" } else { set vi [visa::open $rm "$visaAddr"] # Set proper timeout fconfigure $vi -timeout 500 } # Get ID from instrument puts $vi "*IDN?" #Remove useless part of ID set _id [gets $vi] #Characters until second "," set num [expr [string first "," $_id #Redefine device ID set id [string range $_id 0 $num] #Device name set device_name $id Se configura la comunicación con el instrumento por el canal GPIB previamente indicado al inicializar el objeto correspondiente al instrumento. En el caso de que no se pueda establecer una comunicación con el instrumento, se mostrará un error por pantalla. [expr [string first "," $_id]+1]]-1] Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones } Se guarda la identificación [nombre y número de serie] del instrumento para ser utilizada posteriormente en el archivo de registro con todos los comandos mandados al instrumento, incluyendo la fecha y la hora. ϙϋϘϋϗϛϏϋϘϋ 41 όϕϘϓχϚϕ #Setup error dictionary set fp [open [file join setup sw source tcl driver_gpib_hp6653a driver_gpib_hp6653a_dict_error.json] r] set dict_err [read $fp] set dict_err [json::json2dict $dict_err] } Se instancia el diccionario de errores del dispositivo χϙϏύϔϢϔϊϕϒϕ a una variable en formato de diccionario, para lo cual ϙϋ ϘϋϗϛϏϋϘϋ la conversión de όϕϘϓχϚϕ JSON a TCL. # SEVERITY CONNECTION ERROR VALUE set severity_nu 2 set connection_error_value -1 set c_err_msg [list "$connection_error_value, \"Connection error\" $severity_nu" "+0, \"No Error\" 0"] set con_def_msg "error writing \" $vi\": Unknown error" #Specific error report when disconection set c_err_msg_er "$connection_error_value, \"Connection error\" $severity_nu" #Add instrument in error_handle $this setup_error_handle #Initialize maximum severity set max 0 } } } Se asigna al error de desconexión un número de error (-1) y un nivel de severidad específico (2). Dichos valores pueden cambiar de un instrumento a otro. Se define el mensaje que se mostrará por pantalla al producirse una desconexión. Se llama al método “setup_error_handle” el cual añade la referencia de este objeto aϒϕψϐϋϚϕϋϘϘϕϘШώχϔϊϒϋͨ } Inicia el nivel de severidad a 0. } Código 2. Estructura básica de un constructor para instrumentos comandados por GPIB 3. Estructura del constructor y destructor. Instrumentos comandados por RS232 El constructor de la clase de un instrumento comandado por RS232 presentará una estructura muy simple, debido a que muchas de las funciones implementadas en GPIB (gestión de errores, detección de instrumentos, etc.) son altamente ineficientes en comunicaciones RS232. Dichas limitaciones vienen determinadas por la forma con la que se debe gestionar el canal de comunicación. Para poder comunicarse con un instrumento, se deberá abrir un canal en el puerto serie (COM1, COM2,..) que permanecerá abierto hasta que se cierre de forma manual. Esto imposibilita el poder detectar la desconexión del instrumento; ya que al preguntar el estado en el que se encuentra, no se recibirá respuesta alguna. Esta situación podría interpretarse como una pérdida de conexión o simplemente que el instrumento está en ese momento ocupado. La forma más efectiva de lidiar con situaciones en las que se desconoce el estado del instrumento suele ser, generalmente, un contador de bits combinado con un “time-out” efectivo. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 42 La configuración del “time-out” hace referencia al tiempo (ms) que el sistema esperará a recibir una respuesta por parte del instrumento. En el caso en que el sistema intente leer del buffer de memoria un número determinado de bits y el instrumento no sea capaz de devolver tal cantidad, esperará el tiempo indicado en el “time-out” antes de interrumpir el proceso de lectura de bits del buffer. De este modo se evita que el sistema se colapse esperando una cadena de bits inexistente. El constructor de un instrumento comandado por RS232 presentará los siguientes elementos: serial_port } constructor { } Directorio de los Puerto serie ficheros de configuración _config_dir set vi [open $serial_port: RDWR] fconfigure fconfigure fconfigure fconfigure fconfigure fconfigure fconfigure $vi $vi $vi $vi $vi $vi $vi } } Apertura del canal del puerto serie -blocking 1 -buffering full -encoding binary -mode 19200,o,8,1 -translation binary -eofchar {} -timeout 10000 #Configuration files location set config_dir $_config_dir } { } } Configuración del canal Se guarda en una variable la dirección de los ficheros de configuración Código 3. Estructura básica de un constructor para instrumentos comandados por RS232 En comunicaciones RS232 también será necesario la implementación de un destructor. El destructor contiene las acciones que serán ejecutadas en el momento en el que el objeto deje de estar instanciado (Fin de la prueba). Al contrario que el constructor, nunca requiere de parámetros de entrada. La función del destructor en comunicaciones RS232 será simplemente cerrar el canal de comunicaciones. Su estructura será la siguiente: # Destructor of the class destructor { ΜϋωϏϋϘϘχϋϒωχϔχϒϊϋϒϖϛϋϘϚϕϙϋϘϏϋͨ close $vi } } Código 4. Estructura básica de un destructor para instrumentos comandados por RS232 4. Estructura de una función de comandado Las funciones de comandado de cada uno de los instrumentos, a pesar de ser funciones totalmente distintas, presentan una estructura común a todas. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 43 Además de establecer un flujo de comandos entre el ordenador y el instrumento, cada una de las funciones debe cumplir con las siguientes especificaciones: - Comandar el instrumento: Poder configurar y controlar el instrumento de forma remota. Es el principal objetivo de cada una de las funciones. Es bastante frecuente que para una única función se requieran más de un solo comando, por lo que es de vital importancia el orden de cada uno de ellos. Uno de los errores más comunes tiene su origen en el orden con el que el buffer de memoria es vaciado. Un vaciado incorrecto puede producir que la medida obtenida sea incoherente o simplemente, si el buffer se encontraba vacío, no exista. - Registrar cada uno de los comandos enviados desde el sistema de control: A la hora de depurar una secuencia de test, es muy difícil poder realizar un seguimiento en detalle de la misma si no se conoce qué comandos se están enviando en todo momento. El registro debe contener: la hora en la que fue enviado, la dirección del instrumento y el comando enviado. - Detectar cualquier error producido: La aparición de errores durante la ejecución de una secuencia es un suceso que debe de evitarse a toda costa, pero no siempre es posible. Durante la ejecución de la secuencia pueden producirse diferentes tipos de errores: • Errores de comandado: Suelen aparecer cuando se introduce un comando con una sintaxis correcta, pero las unidades empleadas no son las correctas, la cifra es excesivamente alta, etc. El sistema por sí solo no es capaz de detectarlos, sino que es el instrumento quien los devuelve. • Errores de conexión: Ocurren al intentar mandar un comando a un instrumento que ha perdido la comunicación con el equipo de control. Este tipo de errores solo pueden ser detectados por el propio sistema de control. • Errores de sintaxis: Aparecen al cometer un error de sintaxis en el código (una variable mal declarada, un paréntesis mal localizado...). Son errores frecuentes de sintaxis. - Registrar la severidad asociada a un error: Uno de los elementos más importantes de cada una de las pruebas de test es la parada de emergencia controlada. La ejecución de la misma depende de la severidad del error. Dicha parada de emergencia es gestionada por el objeto de la clase error_handle. Para ello, es necesario que cada una de las funciones de comandado registre la severidad de cada error y que sea capaz de enviar al gestor de errores dicha información. Utilizar una misma estructura que satisfaga todos los requisitos previamente descritos permite: Poder abstraer cada una de las funciones. Abstrayendo las funciones se consigue una mayor escalabilidad del sistema. Para añadir más funciones de comandado solamente es necesario diseñar la parte lógica de la función, pues el resto de elementos son totalmente compatibles con cualquier función. Mayor compatibilidad entre elementos. Al utilizar la misma estructura, se asegura una plena compatibilidad entre funciones. Depurado de errores más efectivo. Al compartir un mismo esquema de trabajo, cualquier error detectado en una función puede ser solventado en el resto sin preocuparse por la estructura interna de cada función. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 44 { La estructura básica de una función de comandado de instrumentos presenta los siguientes elementos: { Parámetro de entrada Estructura común public method read_voltage_dc { v_conf_dc } { Función encapsulada N #-----------------------------------------------------------------------------------------------------------#-----------------------------------------------------------------------------------------------------------N N if { [catch { N N #-----------------------------------------------------------------------------------------------------------N #-----------------------------------------------------------------------------------------------------------array set v_param $v_conf_dc puts $vi "CONF:VOLT:DC $v_param(range), $v_param(resolution)" }Envío de comandos al instrumento. $gpibcommand_sent_wfile$device_name$visaAddr"CONF:VOLT:DC= $v_param(range), $v_param(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "READ?" set id [gets $vi] Se registran los comandos enviados y se comprueba que no haya errores. } } Se lee del buffer de memoria las posibles medidas obtenidas del instrumento $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] } Se vuelven a registran los comandos enviados y se comprueba que no haya errores. N #-----------------------------------------------------------------------------------------------------------N #-----------------------------------------------------------------------------------------------------------N } err_code]} { N N N if {$err_code == $con_def_msg} { N N $error_handle error_report_screen $visaAddr $c_err_msg N N } else { N N Detección de errores de sintaxis | otros errores. $error_handle error_report_screen $visaAddr "Unknown error" N N } N N N} N N #-----------------------------------------------------------------------------------------------------------N #-----------------------------------------------------------------------------------------------------------N N N $error_handle execute_controlled_exit [$this error_report severity] Estructura común } Detección de errores de comunicación. } envía al gestor de errores el nivel } deSe severidad máximo producido Estructura común N N if { $err_code == "" } { N N #-----------------------------------------------------------------------------------------------------------N #-----------------------------------------------------------------------------------------------------------N N N return $id N N N N #-----------------------------------------------------------------------------------------------------------N #-----------------------------------------------------------------------------------------------------------N } Si no se ha producido ningún error se devuelve el valor medido. } } Código 5. Estructura básica de una función de comandado 5. Estructura de un diccionario de errores Cada uno de los instrumentos que componen el sistema de test posee su propia sintaxis de errores. Con el objetivo de poder interpretar tanto un error numérico como un mensaje, utilizaremos un diccionario propio, creado a partir del manual de usuario del instrumento. El diccionario estará compuesto por: Código de error: Valor numérico correspondiente a un error, que será interpretado como un mensaje. Mensaje de error: Descripción asociada al valor numérico devuelto por el instrumento. Severidad: Valor numérico que hace referencia al nivel de criticidad del error. Dependiendo de dicho valor, se llevará acabo un protocolo de seguridad asignado a dicho valor. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 45 Cada diccionario estará estructurado como un array siguiendo la nomenclatura JSON (JavaScript Object Notation). La razón de su utilización recae en su compatibilidad con otros muchos lenguajes de programación, permitiendo así, el poder ser utilizado en cualquiera de ellos. Un diccionario de errores escrito en JSON presenta la siguiente estructura: { "Error_value ":{"Error_Message":"Severity_value"}, "+0": "-101": "-102": "-113": "-121": "-123": {"No error" {"Invalid character" {"Syntax error" {"Undefined header" {"Invalid character in number" {"Numeric overflow" :"0"}, :"1"}, :"1"}, :"1"}, :"1"}, :"2"}, *** "-214": "-221": "-222": "-223": "-224": "-230": "-330": "-350": } {"Trigger deadlock" {"Settings conflict" {"Data out of range" {"Too much data" {"Illegal parameter value" {"Data stale" {"Self-test failed" {"Too many errors" :"2"}, :"3"}, :"1"}, :"1"}, :"1"}, :"1"}, :"4"}, :"5"} Código 6. Estructura básica de un diccionario de errores en formato JSON 6. Estructura del Setup de secuencia Cada secuencia de test requiere de un Setup específico que inicialice todos los instrumentos, funciones, librerías, etc. que se necesiten para ejecutar dicha secuencia. Las razones por las que se emplea un Setup como método de inicialización del sistema son las siguientes: Permite configurar cada secuencia individualmente, eligiendo qué instrumentos y qué funciones forman parte de la misma. Permite establecer una comunicación entre las funciones del sistema y los instrumentos. Dicha comunicación posibilita: registrar todos los comandos enviados, gestionar una salida de secuencia controlada en caso de error, etc. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 46 Un Setup de secuencia presentará una estructura similar a la siguiente: #Se nombra la libreria del setup de secuencia: package provide setup_secuencia_ejemplo 1.0 Declaración de la librería Setup. Inicialización de funciones e instrumentos. Instanciación de funciones del sistema. Instanciación de instrumentos. #Se inicializan las librerias correspondientes a las funciones del sistema package require funcion_error_handle package require funcion_comunicacion_busGPIB #Se inicializan las librerias correspondientes a los instrumentos y sus clases abstractas package require class_fuente_alimentacion package require driver_gpib_hp6653a #Se importa el namespace de cada libreria namespace import ::funcion_comunicacion_busGPIB::* namespace import ::funcion_error_handle::* namespace import ::class_fuente_alimentacion::* namespace import ::driver_gpib_hp6653a::* #Se instancian las funciones logicas del sistema: #Error Handle: Encargado de gestionar las salidas de secuencia controladas set e_h [error_handle e_h] #Driver GPIB: encargado de gestionar y registrar la comunicacion entre el ordenador y el instrumento set d_gpib [driver_gpib d_gpib ] #Se instancia el instrumento que sera comandado en la secuencia set PS_main [driver_gpib_hp6653a PS_main "GPIB0::5::INSTR" $d_gpib $e_h] [El instrumento PS_main podrá utilizar funciones de e_h y d_gpib] Código 7. Ejemplo de estructura básica de un Setup de secuencia 7. Lista de instrumentos de secuencia En el setup de la secuencia es necesario crear una lista con todos los instrumentos que van a participar en la prueba de test. Esta lista será utilizada por el objeto perteneciente a la clase driver_gpib para poder comprobar la correcta conexión de todos los instrumentos que van a participar en la prueba. Su función se explicará más adelante. La lista de instrumentos deberá tener la siguiente estructura: Primer elemento: Contiene la dirección del instrumento. Segundo elemento: Contiene el nombre del instrumento. Tercer elemento: Contiene el protocolo de comunicación empleado. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 47 Ejemplo de lista de instrumentos: setlist_devices[list \ {WJTB@BEESTGPIB0::2::INSTROBNFHEWLETT-PACKARD,34401AQSPUPDPMgpib} \ {WJTB@BEESTGPIB0::5::INSTROBNFHEWLETT-PA CKA, RD6653AQSPUPDPMgpib} \ {WJTB@BEESTGPIB0::1::INSTROBNFKIKUSUI,PLZ-50F protocolgpib}] Código 8. Ejemplo de lista de instrumentos 8. Instanciación de clases (Setup) Para poder comandar un instrumento, primero se deberá instanciar un objeto perteneciente a la clase del instrumento. Antes de instanciarlo, es necesario importar el resto de clases y opcionalmente, también aquellos “namespaces” donde se encuentre declarada la clase. El siguiente fragmento de código muestra dos posibles formas de instanciar un objeto en TCL: packagerequire"package_que_contiene_la_clase" namespaceimport"namespace_de_la_clase" setOPNCSF@puntero@PCK[nombre_clase nombre_objeto $param_1 $param_2] package require "package_que_contiene_la_clase" setOPNCSF@puntero_obj[::namespace_de_la_clase::nombre_clase nombre_objeto $param_1 $param_2] Código 9. Ejemplo de instanciación de un objeto La principal diferencia entre ambas es la forma de referenciar la clase del objeto. Si se importa el espacio de nombres donde está contenida la clase, no será necesario indicar su dirección completa porque ya estará contenida en el “namespace” actual. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 48 PARTE IV SECUENCIA DE TEST Y RESULTADOS OBTENIDOS Motivación Para poder apreciar las grandes ventajas que ofrece un sistema de test totalmente automatizado, se llevará a cabo la verificación del convertidor previamente descrito. Capítulo 1 Prueba de verificación. Diseño del setup Para comenzar a utilizar los instrumentos es necesario instanciarlo. Se diseñará un fichero de Setup que permita instanciar los instrumentos de manera rápida y eficiente. Para poder definir las partes principales del setup, lo dividiremos en dos: 1. Instanciación de librerías y espacios de nombres package provide setup_prueba_convertidor 1.0 #================================================== #===========INSTANCIACION DE PAQUETES============== #================================================== #INSTRUMETOS package require package require package require package require #CLASES package package package driver_gpib_hp34401a; driver_gpib_hp6653a driver_gpib_kikuplz150u driver_rs232_tekttps2024 ABSTRACTAS DE CADA INSTRUMENTO require class_multimeter require class_powersupply require class_electronic_load #REPORTING Y GESTION DE ERRORES package require driver_gpib package require error_handle #OTRAS LIBRERIAS package require json package require Itcl package require common package require logger Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 50 #================================================== #===========INSTANCIACION DE NAMESPACES============ #================================================== #INSTRUMETOS namespace import namespace import namespace import namespace import ::driver_gpib_hp34401a::* ::driver_gpib_hp6653a::* ::driver_gpib_kikuplz150u::* ::driver_rs232_tekttps2024::* #CLASES ABSTRACTAS DE CADA INSTRUMENTO namespace import ::class_multimeter::* namespace import ::class_powersupply::* namespace import ::class_electronic_load::* #REPORTING Y GESTION DE ERRORES namespace import ::driver_gpib::* namespace import ::error_handle::* #OTRAS LIBRERIAS namespace import ::common::* namespace import ::logger::* Código 10. Instanciación de librerías y espacios de nombres 2. Instanciación de objetos (Instrumentos y funciones) ============================================================================================ # SETUP CRLogger (Configura la forma con que se muestran los mensajes por pantalla): set log [::logger::CRLogger] ============================================================================================ # Lista de instrumentos comandados por GPIB que van a particpar en la prueba de test: set list_devices [list \ {visa_addrs GPIB0::2::INSTR name HEWLETT-PACKARD,34401A protocol gpib} \ {visa_addrs GPIB0::5::INSTR name HEWLETT-PACKARD, 6653A protocol gpib} \ {visa_addrs GPIB0::1::INSTR name KIKUSUI,PLZ-50F protocol gpib} ] # {Directorio del fichero con todos los comandos enviados} {nombre del fichero } set driver_log_name [ list \ {work/test/board_characterization_mst1553std_ssb /seq10001_convertidor/commands_sent} \ {test1_log} ] # SETUP driver_gpib set d_gpib [driver_gpib d_gpib $driver_log_name $inlist] ============================================================================================ # SETUP error_handle set e_h [error_handle e_h $log] ============================================================================================ # SETUP FUENTE DE ALIMENTACION: set PS_main [driver_gpib_hp6653a PS_main "GPIB0::5::INSTR" $d_gpib $e_h] # SETUP CARGA DINAMICA: set DL_test [driver_gpib_kikuplz150u DL_test "GPIB0::1::INSTR" $d_gpib $e_h] # SETUP MULTIMETRO set Mult_test [driver_gpib_hp34401a Mult_test "GPIB0::2::INSTR" $d_gpib $e_h] ============================================================================================ # DIRECTORIO DONDE SE ENCUENTRAN LOS FICHEROS DE CONFIGURACION DEL OSCILOSCOPIO set os_config_dir "/setup_prueba_convertidor/" # SETUP OSCILOSCOPIO set Tek [driver_rs232_tekttps2024 tek "COM1" $os_config_dir] Código 11. Instanciación de objetos (Instrumentos y funciones) Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 51 3. Arranque del Setup Para cargar el setup de la prueba, simplemente se deberá ejecutar el siguiente comando: source[fileTFUVQ@[email protected]] Capítulo 2 Prueba de verificación. Diseño de la secuencia El fichero de secuencia representa la parte lógica de cada una de las pruebas de test. En dichas pruebas es muy importante considerar el mayor número posible de situaciones que puedan darse a lo largo de la secuencia: Un corto circuito, sobrecarga del sistema, desconexión de un instrumento, etc. Cuanto mayor sea el número de situaciones consideradas, más compleja será la lógica de comandado. La estructura de la secuencia estará dividida en cuatro partes principales: 1. Cabecera La primera parte de la secuencia será la cabecera, donde quedará reflejada la identificación de la prueba que se va a llevar a cabo. La finalidad de esta parte es meramente documental. #=============================================================================== # sequence definition #=============================================================================== setseqdef(name) [get_sequence_name] setseqdef(dut) "Convertidor_DC_DC" setseqdef(testbench)"hardware_testbench" setseqdef(objective)"Verificar especificaciones tÏcnicas del convertidor" set seqdef(related) "" set seqdef(logger) $log set seqdef(simstep) /tb_system/simstep set seq "[namespace current]::[sequence seq [array get seqdef]]" set step_id -10 #=============================================================================== # S T E P D E F I N I T I O N" #=============================================================================== set step [seq new_step [list id [incr step_id 10] objective "Tes0" \ requirements "" meth "automatic" on_exit "\$this print_result"]] #=============================================================================== Código 12. Cabecera de la secuencia Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 52 2. Parámetros de configuración de la prueba Para conseguir que cada prueba pueda ser fácilmente configurable, es necesario que los parámetros de configuración sean lo más accesibles posible. Por ello, todos los parámetros serán declarados al principio de la secuencia. #=================================================================================== # P A R A M E T R O S D E C O N F I G U R A C I O N #=================================================================================== #VALOR DE RESISTENCIA DE LA CARGA DINAMICA DURANTE &-*/$3&.&/50 Y 3&%6$$*0/ DE TENSION setdl_resistance_cte{100}; #Ohms #VALORES DE RESISTENCIA DE LA CARGA DINAMICA DURANTE EL PERIODO DE TENSION CONSTANTE set dl_resistance_secquence {2000 1000 500 100 50} #TENSION INICIAL DE LA SECUENCIA set vmin_up {8};# V #TENSION FINAL DE LA SECUENCIA set vmin_down {4};# V #NIVEL DE TENSION CONSTANTE set vmax {24};# V #INCREMENTO DE TENSION POR CADA STEP DE SECUENCIA set v_step {1};# V #TIEMPO DE ESTABILIZACION DE MEDIDAS set tm {1000}; # ms #VALOR DE CORRIENTE POR ENCIMA DEL CUAL SE CONSIDERA QUE EL CONVERTIDOR ESTA ENCENDIDO set ion {0.005}; #A #VALOR DE CORRIENTE POR DEBAJO DEL CUAL SE CONSIDERA QUE EL CONVERTIDOR ESTA "1"("%0 setioff{0.010}; #A #CORRIENTE ."9*."DE SALIDA DE LA FUENTE DE ALIMENTACION setimax{200mA} #PARAMETROS DE PROTECCION DE LA FUENTE DE ALIMENTACION #NIVEL DE TENSION DE PROTECCION set v_prot {30 V} #NIVEL DE CORRIENTE DE PROTECCION set i_prot {300 mA} #MODULO DE LA CARGA DINAMICA AL QUE ESTA CONECTADO LA SALIDA DEL CONVERTIDOR set dl_chan_resist "ch1" Código 13. Parámetros de configuración de la secuencia Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 53 3. Apagado controlado. Interrupción de secuencia En el caso de que se produzca un error con una severidad asociada superior a la permitida, se ejecutará un apagado controlado del sistema para no provocar daños tanto al dispositivo bajo test como a los propios instrumentos. La secuencia de parada se define después de los parámetros de configuración de secuencia. En el caso de la prueba del convertidor, el apagado controlado será el siguiente: set seq_controlled_exit { " #Apagamos la fuente de alimentacion $PS_main output off #Desactivamos la fuente de alimentacion de la carga dinamica $DL_test output off #Desactivamos el consumo de potencia de la carga dinamica $DL_test input off #Desactivamos las protecciones de la fuente de alimentacion $PS_main clear_prot " } #Se instancia la secuencia de apagado controlado en el gestor de errores e_h load_controlled_exit $seq_controlled_exit Código 14. Secuencia de apagado controlado e instanciación de la misma en el gestor de errores 4. Procedimientos básicos Con el objetivo de simplificar la apariencia del código, se unifican aquellas secuencias que vayan a ser instanciadas en varias ocasiones, consiguiendo de esta forma simplificar la lógica de la prueba. Para esta secuencia, se declarará, a modo de ejemplo, la función que finaliza la secuencia de test: #Ejemplo de procedimiento basico: Fin de la prueba proc end_test {} { #Apagado de la fuente $PS_main output off $PS_main clear_prot #Apagado de la carga dinamica $DL_test output off $DL_test input off } Código 15. Ejemplo de procedimiento básico. Fin de la prueba Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 54 5. Secuencia lógica de la prueba Una vez definidos todos los parámetros de la prueba, se diseña la secuencia lógica de la misma. 5.1. Configuración inicial de instrumentos #SE PRESENTAN POR PANTALLA LOS PARAMETROS DE CONFIGURACION DE LA PRUEBA: $step add_procedure " Dynamic load resistance: $dl_resistance_cte0INT $vmin_up7 Minimun voltage rising: Minimun voltage decreasing:$vmin_down7 Maximun voltage: $vmax7 Voltage step: $v_step7 Current on: $ion" $ioff" Current off: Step time (setting time): $tm NT" #SE COMPRUEBA QUE TODOS LOS INSTRUMENTOS ESTAN CONECTADOS AL SISTEMA DE CONTROL: if { [d_gpib check] == 0 } { #EN CASO DE HABER ALGUN ERROR DE COMUNICACION SE REPORTA UN ERROR $step rep_error "Error: some devices are not connected" } else { #=========================================================================================================== # C O N F I G U R A C I O N D E I N S T R U M E N T O S #=========================================================================================================== #SE CARGA LA CONFIGURACION DEL OSCILOSCOPIO PARA DETECTAR EL ENCENDIDO DEL CONVERTIDOR (ESCALON DE SUBIDA) $Tek setconfig subida #=========================================================================================================== #CARGA DINAMICA EN MODO RESISTENCIA $DL_test set_mode [list channel $dl_chan_resist mode cr] $DL_test set_conductance [list channel $dl_chan_resist conductance [expr 1.0/$dl_resistance_cte] mode auto] #ENCENDIDO DE ALIMENTACION Y CONSUMO DE LA CARGA DINAMICA $DL_test input on $DL_test output on $step add_procedure "setup DL as resistance: $dl_resistance_cte" #=========================================================================================================== #CONFIGURACION DE TENSION Y CORRIENTE DE LA FUENTE DE ALIMENTACION $PS_main set_psv [list voltage $vmin_up] $PS_main set_psc [list current $imax] #CONFIGURACION DE PROTECION PARA TENSION Y CORRIENTE $PS_main set_prot_psvc [ list v_level $v_prot c_level $i_prot] #SE ACTIVA LA ALIMENTACION $PS_main output on #=========================================================================================================== #INICIALIZACION DE LOS FLAGS DE CORRIENTE DE ENCENDIDO Y APAGADO # Current: set c_thres_on 0 set c_thres_off 0 #=========================================================================================================== #SE ESTABLECE UN CANAL HACIA EL ARCHIVO DONDE ESTARAN REGISTRADAS TODAS LAS MEDIDAS set report_measures [file join test2_measures.txt] set fp [open $report_measures w] #=========================================================================================================== #SE INICIALIZA LA VARIABLE step_counter set step_counter 0 #=========================================================================================================== #SE INICIALIZAN LAS VARIABLES DE TENSION Y CORRIENTE (VALORES PREVIOS DE CADA MEDIDA) set v_ps_output_mult [$PS_main read_outputs {voltage}] set c_ps_output [$PS_main read_outputs {current}] Código 16. Configuración inicial de los instrumentos Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 55 5.2. Incremento de la tensión con carga constante #=========================================================================================================== # I N C R E M E N T O D E L A T E N S I O N C O N C A R G A C O N S T A N T E #=========================================================================================================== #SE INICIALIZA EL NUMERO DE INCREMENTOS DE TENSION REALIZADOS set x 0 #CONDICION DE INCREMENTO DE TENSION: TENSION DE ENTRADA CONVERTIDOR < TENSION MAXIMA while {[$Mult_test read_voltage_dc [list range def resolution def]] < $vmax && \ [$PS_main read_outputs {voltage}] < $vmax { #SE GUARDAN LAS MEDICIONES PREVIAS DE TENSION Y CORRIENTE set v_prev $v_ps_output_mult set c_prev $c_ps_output #SE INCREMENTA LA TENSION DE ALIMENTACION. SI ALCANZA EL VALOR MAXIMO, LA TENSION SATURA A DICHO VALOR. if { [expr ($vmin_up+$x*$v_step)] < $vmax } { $PS_main set_psv [list voltage [expr ($vmin_up+$x*$v_step)]A];#Mal A } else { $PS_main set_psv [list voltage $vmax] } # AUMENTA EL INCREMENTO DE TENSION incr x #ESPERAR EL TIEMPO DE ESTABILIZACION DE LAS MEDIDAS after $tm #COMPROBAR QUE LA PROTECCION DE LA FUENTE DE ALIMENTACION NO HA REPORTADO NINGUN EVENTO set protection_event [$PS_main read_events] #SI SE DETECTA UN EVENTO DE PROTECCION. SE PARA LA SECUENCIA Y SE REPORTA UN ERROR. if {[expr $protection_event] > 0} { end_test $step rep_error "Error test stopped due to protection event number: $protection_event" error "Protection event : $protection_event" } # SE ASIGNAN TODAS LAS MEDICIONES DE CADA (INSTRUMENTO) A SU VARIABLE CORRESPONDIENTE # TENSION DE ENTRADA (FUENTE DE ALIMENTACION) set v_ps_output_ps [$PS_main read_outputs {voltage}] # TENSION DE ENTRADA (MULTIMETRO) set v_ps_output_mult [$Mult_test read_voltage_dc [list range $v_ps_output_ps resolution def]] # CORRIENTE DE ENTRADA (FUENTE DE ALIMENTACION) set c_ps_output [$PS_main read_outputs {current}] # TENSION DE SALIDA (CARGA DINAMICA) set v_dl_inpunt [$DL_test read_voltage "$dl_chan_resist"] # CORRIENTE DE SALIDA (CARGA DINAMICA) set c_dl_inpunt [$DL_test read_current "$dl_chan_resist"] #SE MUESTRAN LOS RESULTADOS POR PANTALLA $step add_procedure " Voltage PS output measure (PS measure): Current PS output measure (PS measure): Voltage dynamic load (Resistance mode): Current dynamic load (Resistance mode): Voltage PS output measure (multimeter measure): " $v_ps_output_ps V $c_ps_output A $v_dl_inpunt V $c_dl_inpunt A $v_ps_output_mult V Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 56 #COMPROBACION DE ESTADO DE ENCENDIDO DEL CONVERTIDOR: (CORRIENTE_DESPUES/CORRIENTE_ANTES) > 10 if {[expr abs($c_ps_output)/abs($c_prev)] > $current_peak_detection_value && $c_thres_on == 0} { #SE PONE EL FLAG DE ENCENDIDO A 1 set c_thres_on 1 #SE EXPORTA LA CAPTURA DEL OSCILOSCOPIO $Tek hard_copy subida #SE GUARDA LA TENSION Y CORRIENTE DE ENCENDIDO set v_on_measured [$Mult_test read_voltage_dc [list range def resolution def]] set c_on_measured [$PS_main read_outputs {current}] #SE MUESTRA POR PANTALLA LAS CONDICIONES DE ENCENDIDO $step add_procedure "Converter switched on at voltage: $v_on_measured current: $c_on_measured" } #SE CALCULA LA EFICIENCIA DEL CONVERTIDOR if {$v_dl_inpunt >= 0} { set efficiency [expr ($v_dl_inpunt*$c_dl_inpunt)/($v_ps_output_mult*$c_ps_output)] } else { set efficiency 0 } #SE MIDE LA CONDUCTACIA DE LA CARGA DINAMICA Y SE CALCULA LA RESISTENCIA EQUIVALENTE set dl_read_resist [expr 1/[DL_test read_conductance $dl_chan_resist]] #SE ESCRIBE EN EL FICHERO UNA LISTA CON TODAS LAS MEDICIONES REALIZADAS EN ESTE PASO. puts $fp "$step_counter $v_ps_output_ps $v_ps_output_mult $c_ps_output $v_dl_inpunt \ $c_dl_inpunt $efficiency $dl_read_resist" #SE INCREMENTA EL CONTADOR DE PASOS COMPLETADOS set step_counter [expr $step_counter+1] } #SI DESPUES DE ALCANZAR LA TENSION NOMINAL NO SE DETECTA EL ENCENDIDO DEL CONVERTIDOR, SE REPORTA UN ERROR if {$c_thres_on == 0} { $step rep_error "Converter hasn't been swithched on" } Código 17. Incremento de la tensión con carga constante Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 57 5.3. Tensión constante con carga variable #=========================================================================================================== # T E N S I O N C O N S T A N T E C O N C A R G A V A R I A B L E #=========================================================================================================== #SE CONFIGURA LA RESISTENCIA INICIAL DE LA CARGA DINAMICA (100 OHMS) $DL_test set_conductance [list channel $dl_chan_resist conductance [expr 1.0/$dl_resistance_cte] mode auto] #VARIACION DE LA CARGA DEL CONVERTIDOR {2000 1000 500 100 50} foreach dl_resistance_val $dl_resistance_secquence { #SE CONFIGURA LA RESISTENCIA DE LA CARGA DINAMICA $DL_test set_conductance [list channel $dl_chan_resist \ conductance [expr 1.0/$dl_resistance_val] \ mode auto] #ESPERAR TIEMPO DE ESTABILIZACION DE LAS MEDIDAS after $tm # SE ASIGNAN TODAS LAS MEDICIONES DE CADA (INSTRUMENTO) A SU VARIABLE CORRESPONDIENTE # TENSION DE ENTRADA (FUENTE DE ALIMENTACION) set v_ps_output_ps [$PS_main read_outputs {voltage}] # TENSION DE ENTRADA (MULTIMETRO) set v_ps_output_mult [$Mult_test read_voltage_dc [list range $v_ps_output_ps resolution def]] # CORRIENTE DE ENTRADA (FUENTE DE ALIMENTACION) set c_ps_output [$PS_main read_outputs {current}] # TENSION DE SALIDA (CARGA DINAMICA) set v_dl_inpunt [$DL_test read_voltage "$dl_chan_resist"] # CORRIENTE DE SALIDA (CARGA DINAMICA) set c_dl_inpunt [$DL_test read_current "$dl_chan_resist"] #SE MUESTRAN LOS RESULTADOS POR PANTALLA $step add_procedure " Voltage PS output measure (PS measure): Current PS output measure (PS measure): Voltage dynamic load (Resistance mode): Current dynamic load (Resistance mode): Voltage PS output measure (multimeter measure): " $v_ps_output_ps V $c_ps_output A $v_dl_inpunt V $c_dl_inpunt A $v_ps_output_mult V #SE CALCULA LA EFICIENCIA DEL CONVERTIDOR if {$v_dl_inpunt >= 0} { set efficiency [expr ($v_dl_inpunt*$c_dl_inpunt)/($v_ps_output_mult*$c_ps_output)] } else { set efficiency 0 } #SE MIDE LA CONDUCTACIA DE LA CARGA DINAMICA Y SE CALCULA LA RESISTENCIA EQUIVALENTE set dl_read_resist [expr 1/[DL_test read_conductance $dl_chan_resist]] #SE ESCRIBE EN EL FICHERO UNA LISTA CON TODAS LAS MEDICIONES REALIZADAS EN ESTE PASO. puts $fp "$step_counter $v_ps_output_ps $v_ps_output_mult $c_ps_output $v_dl_inpunt \ $c_dl_inpunt $efficiency $dl_read_resist" #SE INCREMENTA EL CONTADOR DE PASOS COMPLETADOS set step_counter [expr $step_counter+1] } #SE CONFIGURA DE NUEVO LA RESISTENCIA INICIAL DE LA CARGA DINAMICA (100 OHMS) $DL_test set_conductance [list channel $dl_chan_resist conductance [expr 1.0/$dl_resistance_cte] mode auto] Código 18. Tensión constante con carga variable Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 58 5.4. Decremento de la tensión con carga constante #=========================================================================================================== # D E C R E M E N T O D E L A T E N S I O N C O N C A R G A C O N S T A N T E #=========================================================================================================== #SE CARGA LA CONFIGURACION DEL OSCILOSCOPIO PARA DETECTAR EL APAGADO DEL CONVERTIDOR (ESCALON DE BAJADA) $Tek setconfig bajada #CONDICION DE DECREMENTO DE TENSION: TENSION DE ENTRADA CONVERTIDOR > TENSION MINIMA while {[$Mult_test read_voltage_dc [list range def resolution def]] > $vmin_down && \ [$PS_main read_outputs {voltage}] > $vmin_down } { #COMPROBAR QUE LA PROTECCION DE LA FUENTE DE ALIMENTACION NO HA REPORTADO NINGUN EVENTO set protection_event [$PS_main read_events] #SI SE DETECTA UN EVENTO DE PROTECCION. SE PARA LA SECUENCIA Y SE REPORTA UN ERROR. if {[expr $protection_event] > 0} { end_test $step rep_error "Error test stopped due to protection event number: $protection_event" break } #SE GUARDAN LAS MEDICIONES PREVIAS DE TENSION Y CORRIENTE set v_prev $v_ps_output_mult set c_prev $c_ps_output #SE DECREMENTA LA TENSION DE ALIMENTACION. set x [expr $x-1] $PS_main set_psv [list voltage [expr ($vmin_up+$x*$v_step)]] #ESPERAR EL TIEMPO DE ESTABILIZACION DE LAS MEDIDAS after $tm # SE ASIGNAN TODAS LAS MEDICIONES DE CADA (INSTRUMENTO) A SU VARIABLE CORRESPONDIENTE # TENSION DE ENTRADA (FUENTE DE ALIMENTACION) set v_ps_output_ps [$PS_main read_outputs {voltage}] # TENSION DE ENTRADA (MULTIMETRO) set v_ps_output_mult [$Mult_test read_voltage_dc [list range $v_ps_output_ps resolution def]] # CORRIENTE DE ENTRADA (FUENTE DE ALIMENTACION) set c_ps_output [$PS_main read_outputs {current}] # TENSION DE SALIDA (CARGA DINAMICA) set v_dl_inpunt [$DL_test read_voltage "$dl_chan_resist"] # CORRIENTE DE SALIDA (CARGA DINAMICA) set c_dl_inpunt [$DL_test read_current "$dl_chan_resist"] #SE MUESTRAN LOS RESULTADOS POR PANTALLA $step add_procedure " Voltage PS output measure (PS measure): Current PS output measure (PS measure): Voltage dynamic load (Resistance mode): Current dynamic load (Resistance mode): Voltage PS output measure (multimeter measure): $v_ps_output_ps V $c_ps_output A $v_dl_inpunt V $c_dl_inpunt A $v_ps_output_mult" V #COMPROBACION DE ESTADO DE ENCENDIDO DEL CONVERTIDOR: (CORRIENTE_ANTES/CORRIENTE_DESPUES) > 10 if {[expr abs($c_prev)/abs($c_ps_output)] > $current_peak_detection_value && $c_thres_on == 1} { #SE PONE EL FLAG DE APAGADO A 1 set c_thres_off 1 #SE EXPORTA LA CAPTURA DEL OSCILOSCOPIO $Tek hard_copy bajada #SE GUARDA LA TENSION Y CORRIENTE DE APAGADO set v_off_measured $v_ps_output_mult set c_off_measured $c_ps_output #SE MUESTRA POR PANTALLA LAS CONDICIONES DE APAGADO $step add_procedure "Converter switched off at voltage: $v_off_measured current: $c_off_measured" } Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 59 #SE CALCULA LA EFICIENCIA DEL CONVERTIDOR if {$v_dl_inpunt >= 0} { set efficiency [expr ($v_dl_inpunt*$c_dl_inpunt)/($v_ps_output_mult*$c_ps_output)] } else { set efficiency 0 } #SE MIDE LA CONDUCTACIA DE LA CARGA DINAMICA Y SE CALCULA LA RESISTENCIA EQUIVALENTE set dl_read_resist [expr 1/[DL_test read_conductance $dl_chan_resist]] #SE ESCRIBE EN EL FICHERO UNA LISTA CON TODAS LAS MEDICIONES REALIZADAS EN ESTE PASO. puts $fp "$step_counter $v_ps_output_ps $v_ps_output_mult $c_ps_output $v_dl_inpunt \ $c_dl_inpunt $efficiency $dl_read_resist" #SE INCREMENTA EL CONTADOR DE PASOS COMPLETADOS set step_counter [expr $step_counter+1] } Código 19. Decremento de la tensión con carga constante 5.5. Validación de la prueba #=========================================================================================================== # V A L I D A C I O N D E L A P R U E B A #=========================================================================================================== #SI NO SE HAN DETECTADO AMBOS CAMBIOS DE ESTADO DEL CONVERTIDOR, SE CONSIDERA LA PRUEBA COMO NULA #SI POR EL CONTRARIO SE HAN DETECTADO AMBOS VALORES, LA PRUEBA SE CONSIDERA VALIDA MOSTRANDO SUS VALORES if { $c_thres_on == 0 || $c_thres_off == 0 } { $step rep_error "Test FAIL" } else { $step add_procedure "Result of the test: Hysteresis Voltage on:$v_on_measured Hysteresis Current on: $c_on_measured Hysteresis Voltage off:$v_off_measured Hysteresis Current on: $c_off_measured" $step add_procedure "Test SUCCESS" } #SE CIERRA EL FICHERO DE MEDIDAS close $fp #SE EJECUTA LA SECUENCIA DE FINAL DE TEST end_test } Código 20. Validación de la prueba Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 60 Capítulo 3 Resultados obtenidos 1. Tabla de mediciones registradas Los resultados de todas las mediciones se recogerán en la siguiente tabla: &ĂƐĞ ĚĞůĂ ƐĞĐƵĞŶĐŝĂ dĞŶƐŝſŶĚĞ dĞŶƐŝſŶĚĞ ŽƌƌŝĞŶƚĞĚĞ dĞŶƐŝſŶĚĞ ŽƌƌŝĞŶƚĞĚĞ DĞĚŝĐŝſŶ ĞŶƚƌĂĚĂs ĞŶƚƌĂĚĂs ĞŶƚƌĂĚĂ ƐĂůŝĚĂs ƐĂůŝĚĂ ;&͘Ϳ ;͘͘Ϳ ;DƵůƚşŵĞƚƌŽͿ ;͘͘Ϳ ;&͘͘Ϳ WŝŶ ǁ WŽƵƚ ǁ ĂƌŐĂĂůĂ ƐĂůŝĚĂĚĞů ZĞŶĚŝŵŝĞŶƚŽ ĐŽŶǀĞƌƚŝĚŽƌ й KŚŵƐ ;͘͘Ϳ Ϭ͕ϬϬ ϭϬϬ Ϭ͕ϬϬ ϭϬϬ Ϭ͕ϬϬ ϭϬϬ Ϭ͕ϬϬ ϭϬϬ ϭ ϭ ϭ Ϯ ϯ ϰ ϴ͕ϬϬ ϵ͕ϬϬ ϭϬ͕Ϭϭ ϭϭ͕ϬϬ ϴ͕ϭϭ ϵ͕ϭϯ ϭϬ͕ϭϰ ϭϭ͕ϭϱ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϮ Ϭ͕ϬϮ Ϭ͕ϬϮ Ϭ͕ϬϮ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ ŽŶǀ͘ŶĐĞŶĚŝĚŽ ϱ ϭϮ͕Ϭϭ ϭϮ͕ϭϳ Ϭ͕ϮϮ ϭϱ͕Ϭϯ Ϭ͕ϭϱ Ϯ͕ϲϲ Ϯ͕Ϯϲ Ϭ͕ϴϱ ϭϬϬ ϲ ϳ ϴ ϵ ϭϬ ϭϭ ϭϮ ϭϯ ϭϰ ϭϱ ϭϲ ϭϯ͕ϬϬ ϭϰ͕ϬϬ ϭϱ͕ϬϬ ϭϲ͕Ϭϭ ϭϳ͕ϬϬ ϭϴ͕Ϭϭ ϭϴ͕ϵϴ ϭϵ͕ϵϴ ϮϬ͕ϵϵ Ϯϭ͕ϵϵ ϮϮ͕ϵϴ ϭϯ͕ϭϴ ϭϰ͕ϭϵ ϭϱ͕Ϯϭ ϭϲ͕ϮϮ ϭϳ͕Ϯϯ ϭϴ͕Ϯϱ ϭϵ͕Ϯϱ ϮϬ͕Ϯϲ Ϯϭ͕Ϯϴ ϮϮ͕Ϯϵ Ϯϯ͕ϯϬ Ϭ͕ϮϬ Ϭ͕ϭϵ Ϭ͕ϭϳ Ϭ͕ϭϲ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϰ Ϭ͕ϭϯ Ϭ͕ϭϮ Ϭ͕ϭϮ Ϭ͕ϭϭ ϭϱ͕Ϭϯ ϭϱ͕Ϭϯ ϭϱ͕Ϭϯ ϭϱ͕Ϭϯ ϭϱ͕Ϭϯ ϭϱ͕Ϭϯ ϭϱ͕Ϭϯ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϯ͕ϲϴ Ϯ͕ϲϳ Ϯ͕ϲϮ Ϯ͕ϲϳ Ϯ͕ϲϰ Ϯ͕ϲϱ Ϯ͕ϲϱ Ϯ͕ϲϯ Ϯ͕ϲϬ Ϯ͕ϲϯ Ϯ͕ϲϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϭ͕ϴϰ Ϭ͕ϴϱ Ϭ͕ϴϲ Ϭ͕ϴϰ Ϭ͕ϴϲ Ϭ͕ϴϱ Ϭ͕ϴϱ Ϭ͕ϴϲ Ϭ͕ϴϳ Ϭ͕ϴϲ Ϭ͕ϴϱ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϳ ϭϴ ϭϵ ϮϬ Ϯϭ ϮϮ Ϯϯ Ϯϯ͕ϵϵ Ϯϯ͕ϵϵ Ϯϯ͕ϵϵ Ϯϯ͕ϵϵ Ϯϯ͕ϵϵ Ϯϯ͕ϵϵ Ϯϯ͕ϵϵ Ϯϰ͕ϯϮ Ϯϰ͕ϯϮ Ϯϰ͕ϯϮ Ϯϰ͕ϯϮ Ϯϰ͕ϯϮ Ϯϰ͕ϯϮ Ϯϰ͕ϯϮ Ϭ͕ϭϭ Ϭ͕Ϭϭ Ϭ͕ϬϮ Ϭ͕Ϭϯ Ϭ͕ϭϭ Ϭ͕ϮϮ Ϭ͕ϭϭ ϭϱ͕Ϭϰ ϭϱ͕Ϭϱ ϭϱ͕Ϭϱ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϯ ϭϱ͕Ϭϰ Ϭ͕ϭϱ Ϭ͕Ϭϭ Ϭ͕ϬϮ Ϭ͕Ϭϯ Ϭ͕ϭϱ Ϭ͕ϯϬ Ϭ͕ϭϱ Ϯ͕ϲϴ Ϭ͕ϯϮ Ϭ͕ϰϮ Ϭ͕ϳϬ Ϯ͕ϲϴ ϱ͕Ϯϯ Ϯ͕ϲϴ Ϯ͕Ϯϲ Ϭ͕ϭϭ Ϭ͕Ϯϯ Ϭ͕ϰϱ Ϯ͕Ϯϲ ϰ͕ϱϭ Ϯ͕Ϯϲ Ϭ͕ϴϰ Ϭ͕ϯϱ Ϭ͕ϱϰ Ϭ͕ϲϰ Ϭ͕ϴϰ Ϭ͕ϴϲ Ϭ͕ϴϰ ϭϬϬ ϮϬϬϬ ϭϬϬϬ ϱϬϬ ϭϬϬ ϱϬ ϭϬϬ ϯ Ϯϰ Ϯϱ Ϯϲ Ϯϳ Ϯϴ Ϯϵ ϯϬ ϯϭ ϯϮ ϯϯ ϯϰ ϯϱ ϮϮ͕ϵϴ Ϯϭ͕ϵϵ ϮϬ͕ϵϵ ϭϵ͕ϵϴ ϭϴ͕ϵϴ ϭϴ͕Ϭϭ ϭϳ͕ϬϬ ϭϲ͕ϬϬ ϭϱ͕ϬϬ ϭϰ͕ϬϬ ϭϯ͕ϬϬ ϭϮ͕Ϭϭ Ϯϯ͕ϯϬ ϮϮ͕Ϯϵ Ϯϭ͕Ϯϴ ϮϬ͕Ϯϲ ϭϵ͕Ϯϱ ϭϴ͕Ϯϱ ϭϳ͕Ϯϯ ϭϲ͕ϮϮ ϭϱ͕Ϯϭ ϭϰ͕ϭϵ ϭϯ͕ϭϴ ϭϮ͕ϭϳ Ϭ͕ϭϭ Ϭ͕ϭϮ Ϭ͕ϭϮ Ϭ͕ϭϯ Ϭ͕ϭϰ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϲ Ϭ͕ϭϳ Ϭ͕ϭϵ Ϭ͕ϮϬ Ϭ͕ϮϮ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ ϭϱ͕Ϭϰ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϭ͕ϭϱ Ϯ͕ϲϲ Ϯ͕ϲϯ Ϯ͕ϲϬ Ϯ͕ϲϯ Ϯ͕ϲϱ Ϯ͕ϲϱ Ϯ͕ϲϰ Ϯ͕ϲϳ Ϯ͕ϲϮ Ϯ͕ϲϳ Ϯ͕ϲϯ Ϯ͕ϲϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϯ͕Ϯϲ Ϭ͕ϴϱ Ϭ͕ϴϲ Ϭ͕ϴϳ Ϭ͕ϴϲ Ϭ͕ϴϱ Ϭ͕ϴϱ Ϭ͕ϴϲ Ϭ͕ϴϰ Ϭ͕ϴϲ Ϭ͕ϴϱ Ϭ͕ϴϲ Ϭ͕ϴϱ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ŽŶǀ͘ƉĂŐĂĚŽ ϯϲ ϭϭ͕ϬϬ ϭϭ͕ϭϱ Ϭ͕ϬϬ Ϭ͕Ϭϳ Ϭ͕ϬϬ Ϭ͕ϬϮ Ϭ͕ϬϬ Ϭ͕ϬϬ ϭϬϬ ϯ ϯϳ ϯϴ ϯϵ ϰϬ ϰϭ ϰϮ ϰϯ ϭϬ͕ϬϬ ϵ͕ϬϬ ϴ͕ϬϬ ϳ͕ϬϬ ϲ͕Ϭϭ ϰ͕ϵϵ ϰ͕ϬϬ ϭϬ͕ϭϰ ϵ͕ϭϯ ϴ͕ϭϭ ϳ͕ϭϬ ϲ͕Ϭϵ ϱ͕Ϭϳ ϰ͕Ϭϲ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϮ Ϭ͕ϬϮ Ϭ͕ϬϮ Ϭ͕ϬϮ Ϭ͕Ϭϭ Ϭ͕Ϭϭ Ϭ͕Ϭϭ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ Ϭ͕ϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭϬϬ ϭ ϭ ϭ ϭ ϭ Ϯ Ϯ Ϯ Ϯ ϯ ϯ ϯ ϯ ϯ ϯ ϯ ϯ )DVHGHODVHFXHQFLD *ODSFNFOUPEFUFOTJØO 5FOTJØODPOTUBOUF 3FEVDDJØOEFUFOTJØO ,QVWUXPHQWRTXHUHDOL]yODPHGLGD &' &DUJDGLQiPLFD )$ )XHQWHDOLPHQWDFLyQ 0XOWtPHWUR Tabla 4. Tabla de mediciones Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 61 2. Resultados mostrados por pantalla En el siguiente informe se muestra todo el proceso llevado a cabo por el sistema de test, presentado a su vez las mediciones realizadas: ========================================================================================== S E Q U E N C E D E F I N I T I O N ========================================================================================== SEQUENCE NAME: test_00002_prueba2 DUT: Convertidor_DC_DC TESTBENCH: hardware_testbench OBJECTIVE: Verificar especificaciones técnicas del convertidor ========================================================================================== ========================================================================================== S T E P D E F I N I T I O N ========================================================================================== STEP ID: 0 OBJECTIVE: Tes0 REQUIREMENTS: none METHOD: automatic ========================================================================================== ** Note: step 0: ** Note: step 0: Test settings: Dynamic load resistance: Minimun voltage rising: Minimun voltage decreasing: Maximun voltage: Voltage step: Current on: Current off: Step time (setting time): ** Note: step 0: ** Note: step 0: ** Note: step 0: ** Note: step 0: Check that all devices connected setup DL as resistance: 100 ###################################################################### # Increasing voltage test: ###################################################################### Voltage PS output measure (PS measure): 7.99760E+0 V Current PS output measure (PS measure): -2.19186E-3 A Voltage dynamic load (Resistance mode): 0.002 V Current dynamic load (Resistance mode): 0.00008 A Voltage PS output measure (multimeter measure): +8.10963880E+00 V *** ** Note: step 0: Voltage Current Voltage Current Voltage ** Note: step 0: ** Note: step 0: 100 Ohms 8 V 4 V 24 V 1 V 0.005 A 0.010 A 1000 ms PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): 1.20069E+1 V 2.19053E-1 A 15.031 V 0.15007 A +1.21652720E+01 V -------------------------------------------------------------------------Converter switched on at voltage: +1.21653260E+01 V current: 2.19053E-1 A -------------------------------------------------------------------------Voltage Current Voltage Current Voltage PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): 1.30020E+1 V 2.03527E-1 A 15.032 V 0.15007 A +1.31762440E+01 V 2.39869E+1 V 1.10371E-1 A 15.035 V 0.15009 A +2.43188170E+01 V *** ** Note: step 0: Voltage Current Voltage Current Voltage ** ** ** ** ** Note: Note: Note: Note: Note: step step step step step 0: 0: 0: 0: 0: PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): ###################################################################### # Constant voltage: ###################################################################### Voltage Current Voltage Current Voltage PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): 2.39869E+1 V 1.33341E-2 A 15.046 V 0.00755 A +2.43218140E+01 V 2.39869E+1 V 2.15171E-1 A 15.028 V 0.29994 A +2.43155640E+01 V *** ** Note: step 0: Voltage Current Voltage Current Voltage ** ** ** ** ** ** Note: Note: Note: Note: Note: Note: step step step step step step 0: 0: 0: 0: 0: 0: PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): ###################################################################### # Decreasing voltage test: ###################################################################### Voltage Current Voltage Current Voltage PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): 2.39869E+1 V 1.10371E-1 A 15.036 V 0.15010 A +2.43188700E+01 V 1.10022E+1 V -2.19186E-3 A 0.066 V 0.00009 A +1.11525880E+01 V *** ** Note: step 0: Voltage Current Voltage Current Voltage ** Note: step 0: ** Note: step 0: PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): -------------------------------------------------------------------------Converter switched off at voltage: +1.11525880E+01 V current:-2.19186E-3 A -------------------------------------------------------------------------Voltage Current Voltage Current Voltage PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): 9.99746E+0 V -2.19186E-3 A 0.003 V 0.00008 A +1.01415820E+01 V 3.99789E+0 V -2.19186E-3 A 0.002 V 0.00008 A +4.05764040E+00 V *** ** Note: step 0: Voltage Current Voltage Current Voltage PS output measure (PS measure): PS output measure (PS measure): dynamic load (Resistance mode): dynamic load (Resistance mode): PS output measure (multimeter measure): ** Note: step 0: ###################################################################### # Result of the test: ###################################################################### ** Note: step 0: ** Note: step 0: -------------------------------------------------------------------------Hysteresis Voltage on:+1.21653260E+01 V Hysteresis Current on: 2.19053E-1 A Hysteresis Voltage off:+1.11525880E+01 V Hysteresis Current on: -2.19186E-3 A -------------------------------------------------------------------------Test: SUCCESS Código 21. Validación de la prueba. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 62 3. Capturas del osciloscopio Con el fin de poder observar de forma más visual las distintas transiciones del convertidor entre sus distintos estados, se programa la secuencia para que capture las dos siguientes formas de onda desde el osciloscopio: Figura 22. Captura del instante en que se enciende el convertidor. Figura 23. Captura del instante en que se apaga el convertidor. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 63 4. Análisis y estudio de los resultados !" ! !"" !"" Figura 24. Análisis y estudio de los resultados. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 64 5. Resultados de la verificación ƐƉĞĐ͘dĠĐŶŝĐĂƐ DĞĚŝĐŝſŶ ƵŵƉůĞĐŽŶůĂƐ ĞƐƉĞĐŝĨŝĐĂĐŝŽŶĞƐ sŽŶs sŽĨĨs sŽƵƚs Omed ϭϮ ϭϮ͕ϭϳ ϭϭ ϭϭ͕ϭϱ ϭϱ ϭϱ͕Ϭϯϱ ϴϰй ϴϱ͕Ϯϱй ݱ ݱ ݱ ݱ Figura 25. Resultados de la prueba. Se puede observar cómo, además de verificar las especificaciones técnicas facilitadas por el fabricante, se han podido realizar otros muchos estudios sobre el comportamiento del convertidor simulando distintas condiciones de trabajo a distintos niveles de carga. Tales estudios pueden ser de utilidad a la hora de implementar el convertidor en una tarjeta de potencia u otro dispositivo electrónico. La ejecución de secuencias de test totalmente automatizadas permite verificar de forma rápida y eficiente cualquier dispositivo electrónico; cuya verificación, en el caso de ser llevada a cabo mediante un sistema de test manual o semiautomático, podría llevar varias horas de trabajo o incluso días. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 65 PARTE V CONCLUSIONES Y FUTUROS DESARROLLOS Metodologías que hacen posibles los proyectos El resultado final de todo proyecto, queda intrínsecamente configurado por el tipo de metodología implantada en dicho proyecto. Muchos serán los que piensen en un primer momento, que una metodología aplicada al diseño de un sistema de test debe estar estar centrada solo y exclusivamente al mero diseño del sistema. Pero la realidad va más allá. La metodología aplicada en este proyecto no solamente se ha centrado en el diseño de un sistema de test, sino que también ha permitido el poder llevarlo a cabo cumpliendo con las altas expectativas sobre la escalabilidad y flexibilidad del sistema. Todo ello gracias al haber aplicado en cada una de las partes del proyecto una misma metodología previamente establecida y aceptada por todos los componentes del grupo. Una metodología bien cimentada permite establecer un seguimiento en detalle de todos los aspectos del proyecto que son clave en la ejecución del mismo: La planificación de tiempos, la arquitectura del software, la gestión de versiones de un programa en desarrollo... son algunos de los aspectos relacionados directamente con el proceso de elaboración de un proyecto, y que deben estar recogidos en su metodología. Una de las riquezas mejor guardadas dentro de la filosofía de trabajo de una empresa es su metodología. Gracias a ella muchos proyectos proyectos salen adelante, pero poca gente es capaz de ver que desde sus inicios hasta la entrega final del producto, todo el proyecto es pura metodología. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 67 Menos visual, más eficiente Uno de los elementos a los que se ha tenido que renunciar al pasar de un sistema de test semiautomático a uno totalmente automatizado, es el aspecto visual del entorno de trabajo. (De momento) Las secuencias de test llevadas a cabo desde un sistema de test manual, permitían de forma muy gráfica, el poder controlar los instrumentos de forma remota, visualizando con colores y formas el estado de la secuencia. En este proyecto, por el contrario, se ha dado prioridad a la eficiencia, por lo que el aspecto visual se ha limitado a breves lineas de texto donde aparecen reflejadas todas las mediciones realizadas. Una interfaz gráfica no es, ni mucho menos, incompatible con los sistemas de test automatizados. Pero la elaboración de toda una interfaz gráfica que sea realmente eficiente y contenga más funciones que las de simplemente mostrar por pantalla el estado de la secuencia , hace que esta tarea se convierta en un nuevo proyecto de expansión al sistema de test actual. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 68 El verdadero potencial de la automatización Como se ha podido apreciar en los resultados de la secuencia anteriormente mostrados, no solamente se ha podido comprobar que el componente cumple con las especificaciones del fabricante, sino que se han podido llevar a cabo otros muchos estudios adicionales sobre el comportamiento del mismo. Esto solo es posible gracias a la gran cantidad de muestras recogida por el sistema. Esto solo es posible gracias a la implantación de una lógica programable en la estructura de cada una de las secuencias. Los sistemas de test semiautomáticos, en la mayoría de los casos, solamente pueden mandar al instrumento lineas de comandos de forma secuencial, imposibilitando la utilización de bucles. Esto hace que el tiempo de ejecución de cada secuencia sea notoriamente superior al requerido por un sistema de test automatizado. En proyectos donde el número de mediciones sea tan elevado que sobrepase la capacidad estándar de los instrumentos de medida, se utilizarán matrices de puntos de cruce como módulos de conmutación. De esta forma se conseguirá ampliar el número de mediciones posibles hasta satisfacer las necesidades del cliente. Figura 26. Ejemplo de módulo de conmutación por matriz de puntos de cruce Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 69 Futuros desarrollos Una de las grandes ventajas de este sistema de test, como ya se ha indicado en numerosas ocasiones, es su gran escalabilidad. Esto permite que futuros proyectos puedan seguir desarrollando nuevas funcionalidades que puedan ser añadidas al sistema actual. Entre ellas cabría destacar: 1. Comandado de instrumentos por un sistema de control avanzado (Tarjeta FPGA) El gran potencial de procesado presente en dichas tarjetas, hace que sean el compañero de viaje perfecto para el comandado de instrumentos en sistemas de alto desempeño. Figura 27. Ejemplo de FPGA 2. Diseño de un interfaz gráfico para el sistema de test Hacer que el sistema de test sea más intuitivo y fácil de usar, desarrollando una interfaz gráfica que permita tanto mostrar el estado de la secuencia, como la configuración de la misma. Figura 28. Ejemplo de Interfaz gráfica del sistema de test Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 70 3. Ampliar el número de dispositivos controlados por el sistema de test En el caso de que fuese necesario la utilización de nuevos dispositivos en la secuencia de test, podrían implementarse nuevas librerías de comandado específicas para cada instrumento. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 71 Bibliografía DE P RUEBAS (T ESTING ) [1] M ETODOLOGÍA http://www.globons.com/metodologia-testing.php Último acceso: Mayo 2014. Globons IT Solutions [2] M ETODOLOGÍAS PARA EL DESARROLLO DE SOFTWARE (W IKI DE LA ASIGNATURA ) Universidad de oriente - Maturín, Mónagas, Venezuela http://wiki.monagas.udo.edu.ve/index.php/Metodologías_para_el_desarrollo_de_software Último acceso: Mayo 2014. [3] A P T EST - S OFTWARE T ESTING G LOSSARY http://www.aptest.com/glossary.html Último acceso: Mayo 2014. [4] I AN K UON , A ARON E GIER y J ONATHAN ROSE, Design, Layout and Verification of an FPGA using Automated Tools , University of Toronto, Toronto, Ontario, Canada 2004. [5] S TALLINGS , W., Comunicaciones y redes de computadores, Ed. Prentice-Hall. 2007. [6] D EP. E LECTRÓNICA, Universidad Regional de Buenos Aires [7] M.C. C ARLOS M ARTÍNEZ, National Instruments Instrumentos para Pruebas Automatizadas , 2007 r - Comparación de Buses de Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 72 DOCUMENTO II MANUAL DE USUARIO Índice de librerías Gestor de comunicaciones: driver_gpib 3 Instanciación: ..................................................................................................................... 3 Funciones de la clase: ......................................................................................................... 3 1. 2. 3. Escaneo de dispositivos conectados. ...................................................................................................... 3 Comprobar conexión con todos los instrumentos pertenecientes a la prueba de test. ............................ 4 Registro de todos los comandos enviados por el bus GPIB. .................................................................. 4 Gestor de errores: error_handle 5 Instanciación: ..................................................................................................................... 5 Funciones de la clase: ......................................................................................................... 5 1. 2. 3. 4. Reportar los errores producidos por pantalla. ........................................................................................ 5 Añadir referencia del instrumento para poder comandarlo. ................................................................... 6 Cargar secuencia de parada controlada. ................................................................................................. 6 Gestor de situaciones de emergencia. Parada controlada. ...................................................................... 6 Fuente de alimentación: driver_gpib_hp6653a 8 Instanciación: ..................................................................................................................... 8 Funciones de la clase: ......................................................................................................... 8 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Encender | Apagar la pantalla del instrumento....................................................................................... 8 Activar | Desactivar la alimentación. ..................................................................................................... 8 Configurar tensión y corriente. .............................................................................................................. 9 Configurar tensión. ................................................................................................................................ 9 Configurar corriente. ............................................................................................................................ 10 Configurar protecciones de tensión y corriente.................................................................................... 10 Configurar protecciones de tensión...................................................................................................... 11 Configurar protecciones de corriente. .................................................................................................. 11 Eliminar configuración de protecciones............................................................................................... 11 Leer flags (eventos) de protección. ...................................................................................................... 12 Leer valores de salida [Tensión | Corriente | Potencia]. ....................................................................... 12 Multímetro: driver_gpib_hp34401a 13 Instanciación: ................................................................................................................... 13 Funciones de la clase: ....................................................................................................... 13 1. 2. 3. 4. 5. 6. 7. 8. 9. Encender | Apagar la pantalla del instrumento..................................................................................... 13 Medir resistencia de dos cables. ........................................................................................................... 14 Medir resistencia de cuatro cables. ...................................................................................................... 14 Medir tensión DC................................................................................................................................. 15 Medir tensión AC................................................................................................................................. 15 Medir corriente DC. ............................................................................................................................. 16 Medir corriente AC. ............................................................................................................................. 16 Medir frecuencia. ................................................................................................................................. 17 Repetir última medición. ...................................................................................................................... 17 -Manual de usuario- Scanner: driver_gpib_agil34970a 18 Instanciación: ................................................................................................................... 18 Funciones de la clase: ....................................................................................................... 18 1. 2. 3. 4. 5. 6. 7. Encender | Apagar la pantalla del instrumento..................................................................................... 18 Medir tensión DC................................................................................................................................. 19 Medir tensión AC................................................................................................................................. 19 Medir corriente DC. ............................................................................................................................. 20 Medir corriente AC. ............................................................................................................................. 20 Medir resistencia de dos cables. ........................................................................................................... 21 Medir resistencia de cuatro cables. ...................................................................................................... 21 Carga dinámica: driver_gpib_kikuplz150u 22 Instanciación: ................................................................................................................... 22 Funciones de la clase: ....................................................................................................... 22 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Elección de modo de trabajo. ............................................................................................................... 22 Activar | Desactivar el consumo de potencia. ...................................................................................... 23 Activar | Desactivar la fuente de alimentación..................................................................................... 23 Configurar protección [Corriente | Tensión | Potencia]. ...................................................................... 24 Deshabilitar protección y reiniciar flags de protección. ....................................................................... 24 Configurar conductancia. ..................................................................................................................... 25 Configurar corriente de entrada. .......................................................................................................... 25 Configurar tensión de salida. ............................................................................................................... 26 Configurar parámetro “soft start”. ....................................................................................................... 26 Configurar variación de corriente. ....................................................................................................... 27 Configurar un pulso | tren de pulsos de corriente................................................................................. 28 Medir corriente de entrada | salida. ...................................................................................................... 28 Medir tensión de entrada | salida. ......................................................................................................... 29 Medir potencia de entrada | salida. ....................................................................................................... 29 Medir conductancia.............................................................................................................................. 29 Osciloscopio: driver_rs232_tekttps2024 30 Instanciación: ................................................................................................................... 30 Funciones de la clase: ....................................................................................................... 30 1. 2. 3. 4. Guardar configuración actual. .............................................................................................................. 30 Configurar osciloscopio con una configuración guardada. .................................................................. 31 Guardar pantalla del osciloscopio. ....................................................................................................... 31 Guardar forma de onda de un canal [Manual | Auto]. .......................................................................... 31 Funciones privadas de instrumentos 1. 2. 33 Instanciación del instrumento en el objeto gestor de errores (error_handle). ...................................... 33 Lectura de errores y máxima severidad asociada a los mismos. .......................................................... 33 Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 2 -Manual de usuario- Capítulo 1 Gestor de comunicaciones: driver_gpib Librería destinada a la gestión de comunicaciones de todos los instrumentos, conectados por GPIB, que compongan el sistema de test. Instanciación: Parámetros del constructor: log_name: Lista con el directorio hasta el archivo de registro de comandos y el nombre del archivo. list_devices: Lista con los instrumentos que van a participar dentro del sistema de test Ejemplo de instanciación: set d_gpib [driver_gpib d_gpib $driver_log_name $inlist] Funciones de la clase: 1. Escaneo de dispositivos conectados. Función: get_devices_connected Parámetros de entrada: verbose? (True | False) Parámetros de salida / acciones: verbose: True (devuelve la información en variables distintas): "GPIB0::2::INSTR gpib HEWLETT-PACKARD,34401A" "GPIB0::5::INSTR gpib HEWLETT-PACKARD,6653A" verbose: False (devuelve la información como una variable en formato de lista) {GPIB0::2::INSTR gpib HEWLETT-PACKARD,34401A}{GPIB0::5::INSTR gpib HEWLETT-PACKARD,6653A} Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 3 -Manual de usuario- 2. Comprobar conexión con todos los instrumentos pertenecientes a la prueba de test. Función: check_devices_connected Parámetros de entrada: Ninguno Parámetros de salida / acciones: 1: Todos los dispositivos están conectados 0: Alguno de los dispositivos no están conectados 3. Registro de todos los comandos enviados por el bus GPIB. Función: command_sent_wfile Parámetros de entrada: dev_name: Nombre del instrumento dev_addrs: Dirección GPIB del instrumento command: Comando enviado al instrumento Parámetros de salida / acciones: Archivo con la siguiente información: 04/30/2014 17:14:56 GPIB0::5::INSTR "MEAS:VOLT?" 04/30/2014 17:14:56 GPIB0::5::INSTR "MEAS:CURR?" 04/30/2014 17:16:05 GPIB0::1::INSTR "INST:COUP CH1," Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 4 -Manual de usuario- Capítulo 2 Gestor de errores: error_handle Librería destinada a la gestión de errores producidos durante el comandado del instrumento. Las funciones principales de esta librería se basarán en un apagado controlado en situaciones de emergencia y en mostrar los errores por pantalla. Instanciación: Parámetros del constructor: Ninguno Ejemplo de instanciación: set e_h [error_handle e_h] Funciones de la clase: 1. Reportar los errores producidos por pantalla. Función: error_report_screen Parámetros de entrada: dev_addrs: Dirección GPIB del instrumento. error_data: Lista con el código de error y su descripción. Parámetros de salida / acciones: Muestra por pantalla la siguiente información: GPIB0::8::INSTR GPIB0::8::INSTR "-101" "Invalid character" "-102" "Syntax error" Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 5 -Manual de usuario- 2. Añadir referencia del instrumento para poder comandarlo. Función: add_instrument Parámetros de entrada: instrument_id: Nombre del objeto asociado al instrumento. Ej: escaner_test instr_ref: Referencia al objeto Ej: ::escaner_test:: Parámetros de salida / acciones: Añade a una lista los parámetros recibidos junto a los del resto de instrumentos. Dicha lista será instanciada en el momento en el que se vaya a ejecutar el apagado controlado. 3. Cargar secuencia de parada controlada. Función: load_controlled_exit Parámetros de entrada: controlled_exit: Lista que contiene cada uno de los pasos de la secuencia que será ejecutada en situación de emergencia. Parámetros de salida / acciones: Almacena en una variable la lista de comandos. 4. Gestor de situaciones de emergencia. Parada controlada. Función: execute_controlled_exit Parámetros de entrada: severity: Nivel de severidad reportado por el instrumento Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 6 -Manual de usuario- Parámetros de salida / acciones: Dependiendo del nivel de severidad del error producido, se decidirá ejecutar la secuencia de apagado controlado previamente establecida o simplemente reportarlo como error leve. En circuitos simples es común que lo primero que sea desconectado sea la fuente de alimentación seguido de las cargas dinámicas. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 7 -Manual de usuario- Capítulo 3 Fuente de alimentación: driver_gpib_hp6653a Librería destinada al comandado de la fuente de alimentación HP 6653A. Instanciación: Parámetros del constructor: visa_addrs: Dirección GPIB asignada al instrumento d_gpib: Referencia al objeto de la clase driver_gpib d_error_handle: Referencia al objeto de la clase error_handle Ejemplo de instanciación: set PS_main [driver_gpib_hp6653a PS_main "GPIB0::5::INSTR" $d_gpib $e_h] Funciones de la clase: 1. Encender | Apagar la pantalla del instrumento. Función: display Parámetros de entrada: on_off: (on | off) Selecciona el estado de la pantalla Parámetros de salida / acciones: Enciende o apaga la pantalla del instrumento 2. Activar | Desactivar la alimentación. Función: output Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 8 -Manual de usuario- Parámetros de entrada: output_conf: (on | off) Habilita o deshabilita la alimentación. Parámetros de salida / acciones: Enciende o apaga la alimentación de la fuente. 3. Configurar tensión y corriente. Función: set_ps_vc Parámetros de entrada: output_vc: Lista con la configuración de tensión y corriente: Ejemplo: [list voltage {50 mV} current {3 mA}] x x Voltage: nivel de tension {<value> V| mV...MIN|MAX} Current: nivel de corriente {<value> A| mA...MIN|MAX} Parámetros de salida / acciones: Configura la tensión y corriente de salida sin cambiar el estado de la alimentación 4. Configurar tensión. Función: set_psv Parámetros de entrada: output_v: Lista con la configuración de tensión: Ejemplo: [list voltage {50 mV}] x Voltage: nivel de tensión {<value> V| mV...MIN|MAX} Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 9 -Manual de usuario- Parámetros de salida / acciones: Configura la tensión de salida sin cambiar el estado de la alimentación 5. Configurar corriente. Función: set_ps_c Parámetros de entrada: output_c: Lista con la configuración de corriente: Ejemplo: [list current {3 mA}] x Current: nivel de corriente {<value> A| mA...MIN|MAX} Parámetros de salida / acciones: Configura la corriente de salida sin cambiar el estado de la alimentación 6. Configurar protecciones de tensión y corriente Función: set_prot_psvc Parámetros de entrada: protect_vc: Lista con la configuración de protección de tensión y corriente: Ejemplo: [list v_level {1 V} c_level {60 mA}] x x v_level: nivel de tensión (protección) {<value> V | mV...MIN|MAX} c_level: nivel de corriente (protección) {<value> A | mA...MIN|MAX} Parámetros de salida / acciones: Configura la protección de tensión y de corriente acorde a los valores indicados después de v_level (tensión) y c_level (corriente). Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 10 -Manual de usuario- 7. Configurar protecciones de tensión. Función: set_prot_psv Parámetros de entrada: protect_v: Lista con la configuración de protección de tensión: Ejemplo: [list overv_level {3 V}] x overv_level: nivel de tensión (protección) {<value> V | mV...MIN|MAX} Parámetros de salida / acciones: Configura la protección de tensión acorde al valor indicado después de overv_level. Esta función no cambia la configuración de la tensión de salida. 8. Configurar protecciones de corriente. Función: set_prot_psc Parámetros de entrada: protect_c: Lista con la configuración de protección de corriente: Ejemplo: [list c_level {3 A}] x c_level: nivel de corriente (protección) {<value> A | mA...MIN|MAX} Parámetros de salida / acciones: Configura la protección de corriente acorde al valor indicado después de c_level. Esta función no cambia la configuración de la corriente de salida. 9. Eliminar configuración de protecciones. Función: clear_prot Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 11 -Manual de usuario- Parámetros de entrada: Ninguno Parámetros de salida / acciones: Elimina la protección configurada y cualquier flag de protección activo. Un flag de protección se activa cuando se sobrepasa cualquiera de los valores de protección previamente configurados. 10. Leer flags (eventos) de protección. Función: read_events Parámetros de entrada: Ninguno Parámetros de salida / acciones: Devuelve, en formato numérico, cualquier evento de protección ocurrido: OV (Over Voltage): 1 OC (Over Current): 2 OT (Over Temperature): 16 RI (Remote inhibit is active): 512 UNR (Power supply output is unregulated): 1024 11. Leer valores de salida [Tensión | Corriente | Potencia]. Función: read_outputs Parámetros de entrada: type: parámetro con el nombre de la medida {voltage | current | power} Parámetros de salida / acciones: Devuelve la medida indicada en sus unidades correspondientes: x Voltaje (V) x Corriente (A) x Potencia (W) Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 12 -Manual de usuario- Capítulo 4 Multímetro: driver_gpib_hp34401a Librería destinada al comandado del multímetro HP 34401A. Instanciación: Parámetros del constructor: visa_addrs: Dirección GPIB asignada al instrumento d_gpib: Referencia al objeto de la clase driver_gpib d_error_handle: Referencia al objeto de la clase error_handle Ejemplo de instanciación: set Mult_test [driver_gpib_hp34401a Mult_test "GPIB0::2::INSTR" $d_gpib $e_h] Funciones de la clase: 1. Encender | Apagar la pantalla del instrumento. Función: display Parámetros de entrada: on_off: (on | off) Selecciona el estado de la pantalla Parámetros de salida / acciones: Enciende o apaga la pantalla del instrumento Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 13 -Manual de usuario- 2. Medir resistencia de dos cables. Función: read_resx2 Parámetros de entrada: r_confx2: Lista con la configuración del multímetro para medir resistencias de dos cables. Ejemplo: [list range {5 ohm} resolution {1 ohm}] x x range: rango de medición { <value> MOHM | KOHM | OHM ... | MIN | MAX | DEF } resolution: resolución de la medida { <value> MOHM | KOHM | OHM ... | MIN | MAX | DEF } Parámetros de salida / acciones: Devuelve el valor de la resistencia medida para un rango y una resolución determinados. Unidades de la medida: Ohms 3. Medir resistencia de cuatro cables. Función: read_resx4 Parámetros de entrada: r_confx4: Lista con la configuración del multímetro para medir resistencias de cuatro cables. Ejemplo: [list range {5 ohm} resolution {1 ohm}] x x range: rango de medición { <value> MOHM | KOHM | OHM ... | MIN | MAX | DEF } resolution: resolución de la medida { <value> MOHM | KOHM | OHM ... | MIN | MAX | DEF } Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 14 -Manual de usuario- Parámetros de salida / acciones: Devuelve el valor de la resistencia medida para un rango y una resolución determinados. Unidades de la medida: Ohms 4. Medir tensión DC. Función: read_voltage_dc Parámetros de entrada: v_conf_dc: Lista con la configuración del multímetro para medir una tensión DC. Ejemplo: [list range {5 mV} resolution {1 mV}] x x range: rango de medición { <value> kV | V | mV... | MIN | MAX | DEF } resolution: resolución de la medida {<value> kV | V | mV... | MIN | MAX | DEF } Parámetros de salida / acciones: Devuelve el valor de la tensión DC medida para un rango y una resolución determinados. Unidades de la medida: V 5. Medir tensión AC. Función: read_voltage_ac Parámetros de entrada: v_conf_ac: Lista con la configuración del multímetro para medir una tensión AC. Ejemplo: [list range {5 mV} resolution {1 mV}] x x range: rango de medición { <value> kV | V | mV... | MIN | MAX | DEF } resolution: resolución de la medida {<value> kV | V | mV... | MIN | MAX | DEF } Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 15 -Manual de usuario- Parámetros de salida / acciones: Devuelve el valor de la tensión AC medida para un rango y una resolución determinados. Unidades de la medida: V 6. Medir corriente DC. Función: read_current_dc Parámetros de entrada: c_conf_dc: Lista con la configuración del multímetro para medir una corriente DC. Ejemplo: [list range {20 A} resolution {1 mA}] x x range: rango de medición { <value> A | mA ... | MIN | MAX | DEF} resolution: resolución de la medida { <value> A | mA ... | MIN | MAX | DEF} Parámetros de salida / acciones: Devuelve el valor de la corriente DC medida para un rango y una resolución determinados. Unidades de la medida: A 7. Medir corriente AC. Función: read_current_ac Parámetros de entrada: c_conf_ac: Lista con la configuración del multímetro para medir una corriente AC. Ejemplo: [list range {20 A} resolution {1 mA}] x x range: rango de medición { <value> A | mA ... | MIN | MAX | DEF} resolution: resolución de la medida { <value> A | mA ... | MIN | MAX | DEF} Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 16 -Manual de usuario- Parámetros de salida / acciones: Devuelve el valor de la corriente AC medida para un rango y una resolución determinados. Unidades de la medida: A 8. Medir frecuencia. Función: read_freq Parámetros de entrada: f_conf: Lista con la configuración del multímetro para medir frecuencia. Ejemplo: [list range {20 kHz} resolution {100 hz}] x x range: rango de medición { <value> kHz | Hz ... | MIN | MAX | DEF} resolution: resolución de la medida { <value> kHz | Hz ... | MIN | MAX | DEF} Parámetros de salida / acciones: Devuelve el valor de la frecuencia medida para un rango y una resolución determinados. Unidades de la medida: Hz 9. Repetir última medición. Función: read_meas Parámetros de entrada: Ninguno Parámetros de salida / acciones: Devuelve el valor correspondiente a la última medición realizada. La configuración del multímetro (rango y resolución) se mantienen constantes. Unidades de la medida: Depende de la última medición realizada Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 17 -Manual de usuario- Capítulo 5 Scanner: driver_gpib_agil34970a Librería destinada al comandado del escáner Agilent 34970A. Instanciación: Parámetros del constructor: visa_addrs: Dirección GPIB asignada al instrumento d_gpib: Referencia al objeto de la clase driver_gpib d_error_handle: Referencia al objeto de la clase error_handle Ejemplo de instanciación: set Scn_test [driver_gpib_agil34970a Scn_test "GPIB0::8::INSTR" $d_gpib $e_h] Funciones de la clase: 1. Encender | Apagar la pantalla del instrumento. Función: display Parámetros de entrada: on_off: (on | off) Selecciona el estado de la pantalla Parámetros de salida / acciones: Enciende o apaga la pantalla del instrumento Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 18 -Manual de usuario- 2. Medir tensión DC. Función: read_voltage_dc Parámetros de entrada: v_conf_dc: Lista con la configuración del escáner para medir tensión DC. Ejemplo: [list channel {105:110,215} range {5 mV} resolution {1 mV}] x x x channel: Indica el canal/es por los que se va a realizar la medida. { ( : ) (From : to) | ( , ) single } range: rango de medición {<value> V | mV ... | MIN | MAX | DEF} resolution: resolución de la medida {<value> V | mV ... | MIN | MAX | DEF} Parámetros de salida / acciones: Devuelve una lista con todas las mediciones realizadas. Unidades de la medida: V 3. Medir tensión AC. Función: read_voltage_ac Parámetros de entrada: v_conf_ac: Lista con la configuración del escáner para medir tensión AC. Ejemplo: [list channel {105:110,215} range {5 mV} resolution {1 mV}] x x x channel: Indica el canal/es por los que se va a realizar la medida. { ( : ) (From : to) | ( , ) single } range: rango de medición {<value> V | mV ... | MIN | MAX | DEF} resolution: resolución de la medida {<value> V | mV ... | MIN | MAX | DEF} Parámetros de salida / acciones: Devuelve una lista con todas las mediciones realizadas. Unidades de la medida: V Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 19 -Manual de usuario- 4. Medir corriente DC. Función: read_current_dc Parámetros de entrada: c_conf_dc: Lista con la configuración del escáner para medir corriente DC. Ejemplo: [list channel {105:110,215} range {200 mA} resolution {1 mA}] x x x channel: Indica el canal/es por los que se va a realizar la medida. { ( : ) (From : to) | ( , ) single } range: rango de medición {<value> A | mA ... | MIN | MAX | DEF } resolution: resolución de la medida {<value> A | mA ... | MIN | MAX | DEF } Parámetros de salida / acciones: Devuelve una lista con todas las mediciones realizadas. Unidades de la medida: A 5. Medir corriente AC. Función: read_current_ac Parámetros de entrada: c_conf_ac: Lista con la configuración del escáner para medir corriente AC. Ejemplo: [list channel {105:110,215} range {200 mA} resolution {1 mA}] x x x channel: Indica el canal/es por los que se va a realizar la medida. { ( : ) (From : to) | ( , ) single } range: rango de medición {<value> A | mA ... | MIN | MAX | DEF } resolution: resolución de la medida {<value> A | mA ... | MIN | MAX | DEF } Parámetros de salida / acciones: Devuelve una lista con todas las mediciones realizadas. Unidades de la medida: A Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 20 -Manual de usuario- 6. Medir resistencia de dos cables. Función: read_resistancex2 Parámetros de entrada: res_conf: Lista con la configuración del escáner para medir resistencias de dos cables. Ejemplo: [list channel {105:110,215} range {2 ohm} resolution {1 mohm}] x x x channel: Indica el canal/es por los que se va a realizar la medida. { ( : ) (From : to) | ( , ) single } range: rango de medición {<value> ohm | kohm ...| MIN | MAX | DEF} resolution: resolución de la medida {<value> ohm | kohm ...| MIN | MAX | DEF} Parámetros de salida / acciones: Devuelve una lista con todas las mediciones realizadas. Unidades de la medida: Ohms. 7. Medir resistencia de cuatro cables. Función: read_resistancex4 Parámetros de entrada: res_conf: Lista con la configuración del escáner para medir resistencias de cuatro cables. Ejemplo: [list channel {105:110,215} range {2 ohm} resolution {1 mohm}] x x x channel: Indica el canal/es por los que se va a realizar la medida. { ( : ) (From : to) | ( , ) single } range: rango de medición {<value> ohm | kohm ...| MIN | MAX | DEF} resolution: resolución de la medida {<value> ohm | kohm ...| MIN | MAX | DEF} Parámetros de salida / acciones: Devuelve una lista con todas las mediciones realizadas. Unidades de la medida: Ohms Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 21 -Manual de usuario- Capítulo 6 Carga dinámica: driver_gpib_kikuplz150u Librería destinada al comandado de la carga dinámica Kikusui PLZ150u. Instanciación: Parámetros del constructor: visa_addrs: Dirección GPIB asignada al instrumento d_gpib: Referencia al objeto de la clase driver_gpib d_error_handle: Referencia al objeto de la clase error_handle Ejemplo de instanciación: set DL_test[driver_gpib_kikuplz150u DL_test "GPIB0::1::INSTR" $d_gpib $e_h]" Funciones de la clase: 1. Elección de modo de trabajo. Función: set_mode Parámetros de entrada: l_dl_mode: Lista con la configuración del modo de trabajo de la carga dinámica. Ejemplo: [list channel {ch1 ch4} mode {cc}] x x channel: Indica el canal/es por los que se va a realizar la medida. {CH1, CH2, CH3... ALL | NONE} mode: modo de trabajo {CC | CR |CV | CCCV | CRCV } Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 22 -Manual de usuario- Modos posibles de trabajo: CC: Constant current CR: Constant resistance mode CV: Constant voltage mode CCCV: Constant current mode + constant voltage mode Parámetros de salida / acciones: Configura el modo de trabajo de los canales especificados. 2. Activar | Desactivar el consumo de potencia. Función: input Parámetros de entrada: state: (on | off) Selecciona el estado del consumo de potencia. Parámetros de salida / acciones: Habilita o deshabilita el consumo de potencia por parte de la carga dinámica. 3. Activar | Desactivar la fuente de alimentación. Función: output Parámetros de entrada: state: (on | off) Selecciona el estado de la salida de potencia. Parámetros de salida / acciones: Habilita o deshabilita la generación de potencia por parte de la carga dinámica. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 23 -Manual de usuario- 4. Configurar protección [Corriente | Tensión | Potencia]. Función: set_protection Parámetros de entrada: l_dl_protection: Lista con la configuración de las protecciones de corriente, tensión y potencia de la carga dinámica Ejemplo: [list channel {ch1 ch2} current {1 A} voltage {no} power {MAX}] x x x x channel: canales que serán comandados {CH1 CH2 CH3... ALL | NONE} current: nivel de corriente permitido {<value> mA | A... MIN | MAX | no} voltage: nivel de tensión permitido {<value> mV | V... MIN | MAX | no} power: nivel de potencia permitido {<value> W... MIN | MAX | no} Interpretación de valores: x x MAX: Se considera “deshabilitar” la protección. No: La configuración anterior no será modificada. Parámetros de salida / acciones: Habilita, o no modifica, la configuración de cada una de las protecciones de la carga dinámica 5. Deshabilitar protección y reiniciar flags de protección. Función: disable_prot Parámetros de entrada: Ninguno Parámetros de salida / acciones: Deshabilita todas las protecciones y flags de protección de la carga dinámica. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 24 -Manual de usuario- 6. Configurar conductancia. Función: set_conductance Parámetros de entrada: l_dl_conductance: Lista con la configuración de carga resistiva. Ejemplo: [list channel {ch1 ch2} conductance {0.2 sie} mode auto] x x x channel: canales que serán comandados {CH1 CH2 CH3... ALL | NONE} conductance: nivel de conductancia {<value> sie | msie} mode: módulo de conductancia {AUTO | LOW | MED | HIGH} Información adicional: x x El parámetro mode permite escoger el nivel de carga utilizado. Un módulo alto permite utilizar valores de módulos inferiores, pero no al revés. Si no se conoce los márgenes de trabajo de cada nivel, se recomienda utilizar el modo AUTO. Parámetros de salida / acciones: Configura la carga dinámica como una carga resistiva. 7. Configurar corriente de entrada. Función: set_current Parámetros de entrada: l_dl_current: Lista con la configuración de corriente contante. Ejemplo: [list channel {ch1 ch2} current {1.2 A} mode MED] x x x channel: canales que serán comandados {CH1 CH2 CH3... ALL | NONE} current: nivel de corriente {value mA | A... MIN | MAX} mode: módulo de corriente {AUTO | LOW | MED | HIGH} Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 25 -Manual de usuario- Información adicional: x x El parámetro mode permite escoger el nivel de carga utilizado. Un módulo alto permite utilizar valores de módulos inferiores, pero no al revés. Si no se conoce los márgenes de trabajo de cada nivel, se recomienda utilizar el modo AUTO. Parámetros de salida / acciones: Configura la carga dinámica en modo de corriente constante. 8. Configurar tensión de salida. Función: set_voltage Parámetros de entrada: l_dl_voltage: Lista con la configuración de tensión contante. Ejemplo: [list channel {ch1} voltage {5 V} mode auto] x x x channel: canales que serán comandados {CH1 CH2 CH3... ALL | NONE} voltage: nivel de tensión {value mV | V... MIN | MAX} mode: módulo de tensión {AUTO | LOW | MED | HIGH} Información adicional: x x El parámetro mode permite escoger el nivel de carga utilizado. Un módulo alto permite utilizar valores de módulos inferiores, pero no al revés. Si no se conoce los márgenes de trabajo de cada nivel, se recomienda utilizar el modo AUTO. Parámetros de salida / acciones: Configura la carga dinámica en modo de tensión constante. 9. Configurar parámetro ‘‘soft start’’. Función: soft_start Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 26 -Manual de usuario- Parámetros de entrada: l_soft: Lista con la configuración “soft start”. Ejemplo: [list channel {ch1 ch5} sst {5 ms}] x x channel: canales que serán comandados {CH1 CH2 CH3... ALL | NONE} sst: tiempo de alcance del régimen permanente {<value> mS | S... MIN | MAX} Parámetros de salida / acciones: Configura el parámetro “soft start” del isntrumento. 10. Configurar variación de corriente. Función: set_slew Parámetros de entrada: l_slew: Lista con la configuración de la variación de corriente por cada µs Ejemplo: [list channel {ch1 ch5} slew 0.5 mode auto] x x x channel: canales que serán comandados {CH1 CH2 CH3... ALL | NONE} slew: Amperios / µs { <value> } mode: módulo de corriente {AUTO | LOW | MED | HIGH} Información adicional: x x El parámetro mode permite escoger el nivel de carga utilizado. Un módulo alto permite utilizar valores de módulos inferiores, pero no al revés. Si no se conoce los márgenes de trabajo de cada nivel, se recomienda utilizar el modo AUTO. Parámetros de salida / acciones: Configura la variación de corriente por cada µs. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 27 -Manual de usuario- 11. Configurar un pulso | tren de pulsos de corriente. Función: set_pulse_train Parámetros de entrada: l_load_tran: Lista con la configuración del pulso / tren de pulsos. Ejemplo (pulso): [list channel {ch1 ch2} max {1 A} min {0.5 A} slew 0.01 mode {single}] Ejemplo (tren de pulsos) [list channel {ch1 ch2} max {1 A} min {0.5 A} slew 0.01 mode {train 5}] Ejemplo (desactivar tren de pulsos) [list channel {ch1 ch2} mode stop] x x x x channel: canales que serán comandados {CH1 CH2 CH3... ALL | NONE} max: valor máximo de corriente en cada pulso {<value > mA | A... MIN | MAX} min: valor mínimo de corriente en cada pulso {<value > mA | A... MIN | MAX} mode: selección del modo de pulso {{train freq_value } | single | stop}] o {freq_value}: frecuencia de pulso en Hz Parámetros de salida / acciones: Genera un pulso o un tren de pulsos de corriente. 12. Medir corriente de entrada | salida. Función: read_current Parámetros de entrada: channel: Canales cuya corriente se quiere medir. {CH1 CH2 CH3... ALL | NONE} Ejemplo : {CH1 CH3} Parámetros de salida / acciones: Devuelve la medida de la corriente en Amperios Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 28 -Manual de usuario- 13. Medir tensión de entrada | salida. Función: read_voltage Parámetros de entrada: channel: Canales cuyo voltaje se quiere medir. {CH1 CH2 CH3... ALL | NONE} Ejemplo : {CH1 CH3} Parámetros de salida / acciones: Devuelve la medida de la tensión en Voltios. 14. Medir potencia de entrada | salida. Función: read_power Parámetros de entrada: channel: Canales cuyo voltaje se quiere medir. {CH1 CH2 CH3... ALL | NONE} Ejemplo : {CH1 CH3} Parámetros de salida / acciones: Devuelve la medida de la potencia en Watios. 15. Medir conductancia. Función: read_conductance Parámetros de entrada: channel: Canales cuyo voltaje se quiere medir. {CH1 CH2 CH3... ALL | NONE} Ejemplo : {CH1 CH3} Parámetros de salida / acciones: Devuelve la medida de la conductancia en Siemens. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 29 -Manual de usuario- Capítulo 7 Osciloscopio: driver_rs232_tekttps2024 Librería destinada al comandado del osciloscopio Tektronix 2024. Instanciación: Parámetros del constructor: serial_port: Puerto serie por el que está conectado el instrumento Ejemplo: COM1 config_dir: Directorio donde se encuentran localizados los archivos de configuración del osciloscopio. Ejemplo de instanciación: set osci_config_dir "/oscilloscope_folder/" set Osci [driver_rs232_tekttps2024 Osci "COM1" $osci_config_dir] Funciones de la clase: 1. Guardar configuración actual. Función: getconfig Parámetros de entrada: file_name: Nombre que se le dará al fichero con la configuración del osciloscopio Ejemplo: Config_1 Parámetros de salida / acciones: Guarda la configuración actual del osciloscopio en un archivo. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 30 -Manual de usuario- 2. Configurar osciloscopio con una configuración guardada. Función: setconfig Parámetros de entrada: file_name: Nombre que tendrá el fichero de configuración que será cargado. Ejemplo: Config_1 Parámetros de salida / acciones: Carga un archivo de configuración en el osciloscopio. 3. Guardar pantalla del osciloscopio. Función: hard_copy Parámetros de entrada: bmp_name: Nombre que se le dará a la imagen de la pantalla del osciloscopio. Ejemplo: Imagen_1 Parámetros de salida / acciones: Guarda la pantalla del osciloscopio en un archivo de imagen (.BMP) 4. Guardar forma de onda de un canal [Manual | Auto]. Función: wave_curve Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 31 -Manual de usuario- Parámetros de entrada: wave_settings: Lista que contiene el modo de adquisición de la forma de onda. Ejemplo: [list mode time] (Devuelve la escala de tiempos) Ejemplo: [list mode auto channel 1] (Devuelve la forma de onda completa del canal 1) Ejemplo: [list mode manual channel 1] (Devuelve la forma de onda que se encuentra entre los dos cursores del osciloscopio) x x mode: selecciona el modo de adquisición de la forma de onda o la escala de tiempos. channel: selecciona el canal del cual se extrae la forma de onda. Parámetros de salida / acciones: x x Devuelve la forma de onda expresada en Voltios. Devuelve la escala de tiempos expresada en Segundos. Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 32 -Manual de usuario- Capítulo 8 Funciones privadas presentes en instrumentos comandados por GPIB. (Programador) Las siguientes funciones son comunes para todos los instrumentos que se comandan por GPIB. Cualquier función privada permanece oculta e inaccesible al usuario. Las funciones siguientes carecen de importancia a nivel de usuario, pero si se desea realizar cualquier cambio a bajo nivel es recomendable conocer su funcionamiento. 1. Instanciación del instrumento en el objeto gestor de errores (error_handle). Función: setup_error_handle Parámetros de entrada: Ninguno Parámetros de salida / acciones: Instancia, en el objeto de la clase “error_handle”, el nombre y el puntero hacia el instrumento, permitiendo al objeto poder comandar el instrumento desde su misma clase. 2. Lectura de errores y máxima severidad asociada a los mismos. Función: error_report Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 33 -Manual de usuario- Parámetros de entrada: option: selecciona el parámetro que será devuelto por la función. { error | severity } x x error: devuelve una lista con todos los errores producidos. severity: de entre todos los niveles de severidad producidos, devuelve el valor más alto. El nivel de severidad asociado a un error se asignará en el diccionario de errores propio de cada instrumento. Parámetros de salida / acciones: Error: devuelve una lista con todos los errores producidos incluyendo el error nulo {+0, No Error} Ejemplo: {-101, Invalid character} {-102, Syntax error } {+0, No Error} Severity: devuelve un número entero correspondiente a la máxima severidad producida. Ejemplo: 2 Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 34 DOCUMENTO III LIBRERIAS DEL SISTEMA Índice general DOCUMENTO III. LIBRERIAS DEL SISTEMA 1 I. 3 driver_gpib II. error_handle 7 III. driver_gpib_agil34970a 10 IV. driver_gpib_hp6653a 18 V. driver_gpib_hp34401a 26 VI. driver_gpib_kikuplz150u 34 VII. driver_rs232_tekttps2024 46 VIII.Clases abstractas 51 Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 2 PARTE I DRIVER_GPIB Librería de la clase Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 4 package provide driver_gpib 1.0 package require tclvisa package require Itcl namespace eval driver_gpib { ::itcl::class driver_gpib { ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable aux num_dev _id num id y end flag_nc status fp list_devices ## Initialize the parameters of the class # # @param d_log_name (list): List with the path and the name of the file that will be used to register all commands sent # - \b Fist element: File path # - \b Second element: Name of file # @param _list_devices (list): List with the instruments that are going to be used in the test secquence. # - \b First element of one list: Name # - \b Second element of the list: Bus connection # - \b Thrird element of the list: Bus address constructor { d_log_name _list_devices} { #Set Address and name in different variables set file_addrs [lindex $d_log_name 0] set file_name [lindex $d_log_name 1] #Open file in which the log is going to be written down set log_add [file join [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK) $file_addrs $file_name\.log]] set fp [open $log_add a+] #Set Instrument list path set list_devices $_list_devices } destructor { #Close file when test's sequence ends close $fp } ## Method to read all devices connected to the computer # # @param verbose (boolean): If true, the elements will be shown individually. If false, the elements will be returned as a list of values with the different measures. # @return (string): Just in no verbose mode, public method get_devices_connected {{verbose true}} { set num_dev 100 set list_adr [list] set rm [visa::open-default-rm] for { set x 0 } { $x < $num_dev } { incr x } { set aux "GPIB0::$x\::INSTR" if { [catch { set vi [visa::open $rm $aux] } rc] } { } else { #Read device ID puts $vi "*IDN?" #Remove useless part of ID set _id [gets $vi] #Characters until second "," set num [expr [string first "," $_id #Redefine device ID set id [string range $_id 0 $num] [expr [string first "," $_id]+1]]-1] lappend list_adr "$aux gpib $id" } } if {[llength $list_adr]==0} { puts "No equipment connected" } if { $verbose == "true" } { foreach gpib_device $list_adr { puts $gpib_device } return "" } return $list_adr } ## Method to check if all devices declared in the list are currecntly corrected. # # @return (boolean): If 0: Some devices are not connected. If 1: All devices are connected public method check_devices_connected {} { #Path / Source Device File #Number of devices that will be checked set y [llength $list_devices] #Bucle for writing for { set x 0 } { $x < $y} { incr x } { #Initialize flag not connected set flag_nc 0 #Check if instrument is connected array set instrument [lindex $list_devices $x] if { [catch { set rm [visa::open-default-rm] } rc] } { set flag_nc 1 } else { if { [catch { set vi [visa::open $rm $instrument(visa_addrs)] } rc ] } { set flag_nc 1 } else { set aux "$instrument(visa_addrs)" if { [catch { puts $vi "*IDN?" } rc] } { set flag_nc 1 } else { #Visa Address Right #Check if name corresponds with name in list set _id [gets $vi] set num [expr [string first "," $_id [expr [string first "," $_id]+1]]-1] set id_name [string range $_id 0 $num] if { $instrument(name) == $id_name } { set flag_nc 0 } else { set flag_nc 1 } } } } if { $x == [expr ($y -1)]} { if { $flag_nc == 1} { return 0 } else { return 1 } } } } ## Method to write in a file: time, device name, device addres, and command sent. # @param dev_name (string): Contains the name of the device connected # @param dev_addrs (string): Contains the gpib address of the device # @param _command (string): command sent to the device public method command_sent_wfile { dev_name dev_addrs _command} { set command $_command #DATE: set date [clock format [clock second] -format %D] set time [clock format [clock second] -format %T] #COMMAND LOG: Write in the file the "date" "time" "Device address" "Command sent" puts $fp "$date $time $dev_addrs \"$command\"" } } namespace export driver_gpib } PARTE II ERROR_HANDLE Librería de la clase Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 8 package provide error_handle 1.0 namespace eval error_handle { namespace import ::itcl::* ::itcl::class error_handle { #Variables private variable instrument_list private variable sequence_controlled_exit private variable crlogger #Constructor constructor { _crlogger} { set instrument_list [list] set crlogger $_crlogger } public method error_report_screen { dev_addrs error_data} { #ERROR LOG #ERROR STRING LENGTH set z [llength $error_data] for { set w 0 } { $w < [expr ($z-1)]} { incr w } { set val [expr [string first "," [lindex $error_data $w] 0]] lappend error_val [string range [lindex $error_data $w] 1 [expr ($val-1)]] if {[expr [lindex $error_val $w]] != 0} { # puts stdout "$dev_addrs [lindex $error_data $w]"; #Error message through screen $crlogger rep_error "$dev_addrs [lindex $error_data $w]"; #Error message through test logger } } } public method execute_controlled_exit { severity } { # array set in $instrument_list foreach {id ref} $instrument_list { eval "set $id $ref" } if {$severity < 10 && $severity > 0 } { puts "error leve producido" } if { $severity > 10 } { puts "error grave producido" foreach step $sequence_controlled_exit { eval $step } error $severity } } public method load_controlled_exit { controlled_exit } { set sequence_controlled_exit $controlled_exit } public method add_instrument { instrument_id instr_ref } { lappend instrument_list $instrument_id $instr_ref puts $instrument_list } } namespace export error_handle } PARTE III DRIVER_GPIB_AGIL34970A Librería de la clase Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 11 package provide driver_gpib_agil34970a 1.0 package require class_scanner package require Itcl namespace eval driver_gpib_agil34970a { ::itcl::class driver_gpib_agil34970a { inherit ::class_scanner::scanner ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable visaAddr vi rc rm device_name err gpib dict_err err_dict_output c_err_msg connection_error_value con_def_msg con_def_msg_er severity_nu max logger ## Initializate the parameters of the class # # - \b Constructor function: # + \b Stablish a GPIB connection through the GPIB port indicated # + \b Sets the error dictionary # + \b Sets the severity connection value # + \b Adds the instrument reference in the error_handle object # # @param _visa_addrs (string): instrument GPIB port # @param _gpib (reference): Class reference to driver_gpib object # @param _logger (reference): Class reference to CRLogger object constructor { _visa_addrs _gpib {_logger ::logger::CRLogger} } { set logger $_logger #Pointer to driver_gpib set gpib $_gpib # open device set visaAddr $_visa_addrs # get handle to default resource manager if { [catch { set rm [visa::open-default-rm] } rc] } { $logger rep_error "Error opening default resource manager\n$rc" } else { set rm [visa::open-default-rm] } # check if devide opened if { [catch { set vi [visa::open $rm $visaAddr] } rc] } { puts "Error opening instrument `$visaAddr`\n$rc" } else { set vi [visa::open $rm "$visaAddr"] # Set proper timeout fconfigure $vi -timeout 500 } # Get ID from instrument puts $vi "*IDN?" #Remove useless part of ID set _id [gets $vi] #Characters until second "," set num [expr [string first "," $_id #Redefine device ID set id [string range $_id 0 $num] #Device name set device_name $id [expr [string first "," $_id]+1]]-1] #Setup error dictionary set fp [open [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK) setup sw source tcl driver_gpib_agil34970a driver_gpib_agil34970a_dict_error.json] r] set dict_err [read $fp] set dict_err [json::json2dict $dict_err] # SEVERITY CONNECTION ERROR VALUE set severity_nu 2 set connection_error_value -1 set c_err_msg [list "$connection_error_value, \"Connection error\" $severity_nu" "+0, \"No Error\" 0"] set con_def_msg "error writing \"$vi\": Unknown error" #Specific error report when disconection set c_err_msg_er "$connection_error_value, \"Connection error\" $severity_nu" #Add instrument in error_handle $this setup_error_handle #Initialize maximum severity set max 0 } ## Method to change the display state: # @param on_off (string) : "on" (Turns on the display) "off" (Turns off the display) public method display { on_off } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "DISPlay $on_off" $gpib command_sent_wfile $device_name $visaAddr "DISPlay $on_off" $error_handle error_report_screen $visaAddr [$this error_report error_message] #------------------------------------------------------------------------------------------------------------ } err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method to read DC voltage # @param v_conf_dc (parameter_list) list with the following format: # - \b Example: [list channel {105:110,215} range {5 mV} resolution {1 mV}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure {<value> V|mV ...|MIN|MAX|DEF} # + \b resolution (string): Resolution of the measure {<value> V|mV ...|MIN|MAX|DEF} # @return (integer): Voltage measured (V) public method read_voltage_dc { v_conf_dc} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set v_param $v_conf_dc puts $vi "MEAS:VOLT:DC? $v_param(range),$v_param(resolution),(@$v_param(channel))" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:VOLT:DC? $v_param(range),$v_param(resolution),(@$v_param(channel))" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Method to read AC voltage # @param v_conf_ac (parameter_list) list with the following format: # - \b Example: [list channel {105:110,215} range {5 mV} resolution {1 mV}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure {<value> V|mV ...|MIN|MAX|DEF} # + \b resolution (string): Resolution of the measure {<value> V|mV ...|MIN|MAX|DEF} # @return (integer): Voltage measured (V) public method read_voltage_ac { v_conf_ac} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set v_param $v_conf_ad puts $vi "MEAS:VOLT:AC? $v_param(range),$v_param(resolution),(@$v_param(channel))" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:VOLT:AC? $v_param(range),$v_param(resolution),(@$v_param(channel))" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Method to read DC current # @param c_conf_dc (parameter_list) list with the following format: # - \b Example: [list channel {105:110,215} range {200 mA} resolution {1 mA}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure {<value> A|mA ...|MIN|MAX|DEF} # + \b resolution (string): Resolution of the measure {<value> A|mA ...|MIN|MAX|DEF} # @return (Integer): Current measured (A) public method read_current_dc { c_conf_dc } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set c_param $c_conf_dc puts $vi "MEAS:CURR:DC? $c_param(range),$c_param(resolution),(@$c_param(channel))" $gpib command_sent_wfile $device_name $visaAddr "MEAS:CURR:DC? $c_param(range),$c_param(resolution),(@$c_param(channel))" $error_handle error_report_screen $visaAddr [$this error_report error_message] set id [gets $vi] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Method to read AC current # @param c_conf_ac (parameter_list) list with the following format: # - \b Example: [list channel {105:110,215} range {200 mA} resolution {1 mA}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure {<value> A|mA ...|MIN|MAX|DEF} # + \b resolution (string): Resolution of the measure {<value> A|mA ...|MIN|MAX|DEF} # @return (Integer): Current measured (A) public method read_current_ac { c_conf_ac } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set c_param $c_conf_dc puts $vi "MEAS:CURR:AC $c_param(range), $c_param(resolution),(@$c_param(channel))" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:CURR:AC $c_param(range), $c_param(resolution),(@$c_param(channel))" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] return $id } ## Method to read 2 wires resistances # @param res_conf (parameter_list) list with the following format: # - \b Example: [list channel {105:110,215} range {2 ohm} resolution {1 mohm}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure {<value> ohm|kohm ...|MIN|MAX|DEF} # + \b resolution (string): Resolution of the measure {<value> ohm|kohm ...|MIN|MAX|DEF} # @return (Integer): Resistance measured (Ohm) public method read_resistancex2 {res_conf} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set res_param $res_conf puts $vi "MEAS:RES? $res_param(range),$res_param(resolution),(@$res_param(channel))" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:RES? $res_param(range),$res_param(resolution),(@$res_param(channel))" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Method to read 4 wires resistances # @param res_conf (parameter_list) list with the following format: # - \b Example: [list channel {105:110,215} range {2 ohm} resolution {1 mohm}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure {<value> ohm|kohm ...|MIN|MAX|DEF} # + \b resolution (string): Resolution of the measure {<value> ohm|kohm ...|MIN|MAX|DEF} # @return (Integer): Resistance measured (Ohm) public method read_resistancex4 {res_conf} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set res_param $res_conf puts $vi "MEAS:FRES? $res_param(range),$res_param(resolution),(@$res_param(channel))" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:FRES? $res_param(range),$res_param(resolution),(@$res_param(channel))" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## \private # Method that setup the instrument in an error_handle object previusly declared # No parameters needed private method setup_error_handle {} { set possition [string last "::" $this] set dev_name [string range $this [expr $possition+2] end] $error_handle add_instrument $dev_name $this } ## \private ## Method that returns the errors message or severty produced during the sequence # @param option string with the output option (error | severity) # @return (parameter_list) list with all the errors or max severity produced # - \b Example (error): {-101 "Sintax error"} {+0 "No error"} # + \b First value: Error Code # + \b Second value: Error message # - \b Example (severity): +5 private method error_report { option } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set err_dict_output [list] set err_sev_list [list] puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } for {set x 0} { $err != "+0,\"No error\"" } {incr x} { puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } } foreach n $err_sev_list { if {$n > $max} { set max $n } } set error_message $err_dict_output set severity $max #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle execute_controlled_exit $severity_nu } } else { #-----------------------------------------------------------------------------------------------------------if { $severity == 0 && $option == "severity"} { } else { if {$severity != 0 && $option == "severity"} { set max 0 } eval return $$option } } } } namespace export driver_gpib_agil34970a } Dicionario de errores Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 16 { "+0": {"No Error" "-100": {"Command error (generic command error)" "-101": {"Invalid character" "-102": {"Syntax error (unrecognized command or data type)" "-103": {"Invalid separator (illegal character encountered in place of separator)" "-104": {"Data type error (e.g., “numeric or string expected, got block date”)" "-105": {"GET not allowed ( <GET> inside a program message)" "-108": {"Parameter not allowed (too many parameters)" "-109": {"Missing parameter (too few parameters)" "-112": {"Program mnemonic too long (maximum 12 characters)" "-113": {"Undefined header (syntactical correct but not defined for this device)" "-114": {"Header suffix out of range" "-121": {"Invalid character in number (e.g. alpha in decimal data, etc.)" "-123": {"Exponent too large ( numeric overflow; exponent magnitude >32000)" "-124": {"Too many digits (number too long; more than 255 digits received)" "-128": {"Numeric data not allowed (numeric data not accepted where positioned)" "-131": {"Invalid suffix (unrecognized suffix, or suffix not appropriate)" "-134": {"Suffix too long" "-138": {"Suffix not allowed (numeric element does not allow suffixes)" "-141": {"Invalid character data (bad character, or unrecognized)" "-144": {"Character data too long (maximum length is 12 characters)" "-148": {"Character data not allowed (character data not accepted where positioned)" "-150": {"String data error (generic string error)" "-151": {"Invalid string data (e.g., END received before close quote)" "-158": {"String data not allowed (string data not accepted where positioned)" "-160": {"Block data error (generic data block error)" "-161": {"Invalid block data (e.g., END received before length satisfied)" "-168": {"Block data not allowed (block data not accepted where positioned)" "-178": {"Expression data not allowed" "-211": {"Trigger ignored" "-213": {"INIT ignored" "-214": {"Trigger deadlock" "-220": {"Parameter error" "-221": {"Settings conflict (uncoupled parameters)" "-222": {"Data out of range (e.g., outside the range of this device)" "-223": {"Too much data (out of memory; block, string, or expression too long)" "-224": {"Illegal parameter value" "-230": {"Data stale" "-240": {"Hardware error (device-dependent)" "-241": {"Hardware missing (device-dependent)" "-310": {"System error (device-dependent)" "-313": {"Calibration memory lost (out of calibration due to memory failure)" "-330": {"Self-test failed (more specific data after “;”)" "-350": {"Queue overflow (errors lost due to too many errors in queue)" "-400": {"Query error (generic query error)" "-410": {"Query INTERRUPTED (query followed by DAB or GET before response complete)" "-420": {"Query UNTERMINATED (addressed to talk, incomplete programming message received)" "-430": {"Query DEADLOCKED (too many queries in command string)" "-440": {"Query UNTERMINATED (query received after query for indefinite response)" "111": {"Channel list: slot number out of range" "112": {"Channel list: channel number out of range" "113": {"Channel list: empty scan list" "201": {"Memory lost: stored state" "202": {"Memory lost: power-on state" "203": {"Memory lost: stored readings" "204": {"Memory lost: time and date" "221": {"Settings conflict: calculate limit state forced off" "222": {"Settings conflict: module type does not match stored state" "223": {"Settings conflict: trig source changed to IMM" "224": {"Settings conflict: chan adv source changed to IMM" "225": {"Settings conflict: DMM disabled or missing" "226": {"Settings conflict: DMM enabled" "251": {"Unsupported temperature transducer type" "261": {"Not able to execute while scan initiated" "271": {"Not able to accept unit names longer than 3 characters" "272": {"Not able to accept character in unit name" "281": {"Not able to perform on more than one channel" "291": {"Not able to recall state: it is empty" "292": {"Not able to recall state: DMM enable changed" "301": {"Module currently committed to scan" "303": {"Module not able to perform requested operation" "305": {"Not able to perform requested operation" "306": {"Part of a 4-wire pair" "307": {"Incorrectly configured ref channel" "501": {"I/O processor: isolator framing error" "502": {"I/O processor: isolator overrun error" "511": {"Communications: RS-232 framing error" "512": {"Communications: RS-232 overrun error" "513": {"Communications: RS-232 parity error" "514": {"RS-232 only: unable to execute using HP-IB" "521": {"Communications: input buffer overflow" "522": {"Communications: output buffer overflow" "532": {"Not able to achieve requested resolution" "540": {"Not able to null channel in overload" "550": {"Not able to execute command in local mode" "601": {"Self-test: front panel not responding" "602": {"Self-test: RAM read/write" "603": {"Self-test: A/D sync stuck" "604": {"Self-test: A/D slope convergence" "605": {"Self-test/Cal: not able to calibrate rundown gain" "606": {"Self-test/Cal: rundown gain out of range" "607": {"Self-test: rundown too noisy" "608": {"Self-test: serial configuration readback" "609": {"Self-test: DC gain x1" "610": {"Self-test: DC gain x10" "611": {"Self-test: DC gain x100" "612": {"Self-test: Ohms 500 nA source" "613": {"Self-test: Ohms 5 uA source" "614": {"Self-test: DC 300V zero" "615": {"Self-test: Ohms 10 uA source" "616": {"Self-test: DC current sense" "617": {"Self-test: Ohms 100 uA source" "618": {"Self-test: DC high voltage attenuator" "619": {"Self-test: Ohms 1 mA source" "620": {"Self-test: AC rms zero" "621": {"Self-test: AC rms full scale" "622": {"Self-test: frequency counter" "623": {"Self-test: not able to calibrate precharge" "624": {"Self-test: not able to sense line frequency" "625": {"Self-test: I/O processor not responding" "626": {"Self-test: I/O processor self-test" "701": {"Cal: security disabled by jumper" "702": {"Cal: secured" "703": {"Cal: invalid secure code" "704": {"Cal: secure code too long" "705": {"Cal: aborted" "706": {"Cal: value out of range" "707": {"Cal: signal measurement out of range" "708": {"Cal: signal frequency out of range" "709": {"Cal: no cal for this function or range" "710": {"Cal: full scale correction out of range" "720": {"Cal: DCV offset out of range" "721": {"Cal: DCI offset out of range" "722": {"Cal: RES offset out of range" "723": {"Cal: FRES offset out of range" "724": {"Cal: extended resistance self cal failed" "725": {"Cal: 300V DC correction out of range" "730": {"Cal: precharge DAC convergence failed" "731": {"Cal: A/D turnover correction out of range" "732": {"Cal: AC flatness DAC convergence failed" "733": {"Cal: AC low frequency convergence failed" "734": {"Cal: AC low frequency correction out of range" "735": {"Cal: AC rms converter noise correction out of range" "736": {"Cal: AC rms 100th scale correction out of range" "740": {"Cal data lost: secure state" "741": {"Cal data lost: string data" "742": {"Cal data lost: DCV corrections" "743": {"Cal data lost: DCI corrections" "744": {"Cal data lost: RES corrections" "745": {"Cal data lost: FRES corrections" "746": {"Cal data lost: AC corrections" "747": {"Config data lost: HP-IB address" "748": {"Config data lost: RS-232" "749": {"DMM relay count data lost" "901": {"Module hardware: unexpected data received" "902": {"Module hardware: missing stop bit" "903": {"Module hardware: data overrun" "904": {"Module hardware: protocol violation" "905": {"Module hardware: early end of data" "906": {"Module hardware: missing end of data" "907": {"Module hardware: module srq signal stuck low" "908": {"Module hardware: not responding" "910": {"Module reported an unknown module type" "911": {"Module reported command buffer overflow" "912": {"Module reported command syntax error" "913": {"Module reported nonvolatile memory fault" "914": {"Module reported temperature sensor fault" "915": {"Module reported firmware defect" "916": {"Module reported incorrect firmware installed" } :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"24"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"1"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"} PARTE IV DRIVER_GPIB_HP6653A Librería de la clase Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 19 package provide driver_gpib_hp6653a 1.0 package require class_powersupply package require Itcl namespace eval driver_gpib_hp6653a { ::itcl::class driver_gpib_hp6653a { inherit ::class_powersupply::powersupply ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private private variable ## \private visaAddr on_off vi rc rm device_name err gpib dict_err err_dict_output c_err_msg connection_error_value con_def_msg con_def_msg_er severity_nu err_sev_list max error_handle ## Initializate the parameters of the class # # - \b Constructor function: # + \b Stablish a GPIB connection through the GPIB port indicated # + \b Sets the error dictionary # + \b Sets the severity connection value # + \b Adds the instrument reference in the error_handle object # # @param _visa_addrs (string): instrument GPIB port # @param _gpib (reference): Class reference to driver_gpib object # @param _logger (reference): Class reference to CRLogger object constructor { _visa_addrs _gpib d_error_handle} { #Pointer to $$error_handle class set error_handle $d_error_handle #Pointer to driver_gpib set gpib $_gpib # open device set visaAddr $_visa_addrs # get handle to default resource manager if { [catch { set rm [visa::open-default-rm] } rc] } { puts stderr "Error opening default resource manager\n$rc" } else { set rm [visa::open-default-rm] } # check if devide opened if { [catch { set vi [visa::open $rm $visaAddr] } rc] } { puts "Error opening instrument `$visaAddr`\n$rc" } else { set vi [visa::open $rm "$visaAddr"] # Set proper timeout fconfigure $vi -timeout 500 } # Get ID from instrument puts $vi "*IDN?" #Remove useless part of ID set _id [gets $vi] #Characters until second "," set num [expr [string first "," $_id #Redefine device ID set id [string range $_id 0 $num] #Device name set device_name $id [expr [string first "," $_id]+1]]-1] #Setup error dictionary set fp [open [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK) setup sw source tcl driver_gpib_hp6653a driver_gpib_hp6653a_dict_error.json] r] set dict_err [read $fp] set dict_err [json::json2dict $dict_err] # SEVERITY CONNECTION ERROR VALUE set severity_nu 2 set connection_error_value -1 set c_err_msg [list "$connection_error_value, \"Connection error\" $severity_nu" "+0, \"No Error\" 0"] set con_def_msg "error writing \"$vi\": Unknown error" #Specific error report when disconection set c_err_msg_er "$connection_error_value, \"Connection error\" $severity_nu" #Add instrument in error_handle $this setup_error_handle #Initialize maximum severity set max 0 } ## Method to change the display state: # @param on_off (string) : "on" (Turns on the display) "off" (Turns off the display) public method display { on_off } { #------------------------------------------------------------------------------------------------------------ if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "DISPlay $on_off" $gpib command_sent_wfile $device_name $visaAddr "DISPlay $on_off" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method to enable / disable power supply output # @param output_conf (boolean): If "on" the power supply will switch on. If "off" the power supply will switch off public method output { output_conf } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set on_off $output_conf puts $vi "OUTP $output_conf" $gpib command_sent_wfile $device_name $visaAddr "OUTP $output_conf" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method to configure voltage and current level without changing the state of the output. # @param output_vc (parameter_list) list with the following format: # - \b Example: [list voltage {50 mV} current {3 mA}] # + \b Voltage (string): Indicates voltage level {<value> V|mV...MIN|MAX} # + \b Current (string): Indicates current level {<value> A|mA...MIN|MAX}] public method set_ps_vc { output_vc } { $this set_psv $output_vc(voltage) $this set_psc $output_vc(current) } ## Configure voltage (Without changing output state) # @param output_v (parameter_list) list with the following format: # - \b Example: [list voltage {50 mV} # + \b Voltage (string): Indicates voltage level {<value> V|mV...MIN|MAX} public method set_psv { output_v } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set o_v $output_v puts $vi "VOLT $o_v(voltage)" $gpib command_sent_wfile $device_name $visaAddr "VOLT $o_v(voltage)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Configure maximun level of current (Without changing output state) # @param output_c (parameter_list) list with the following format: # - \b Example: [list current {100 mV} # + \b current (string): Indicates current level {<value> A|mA...MIN|MAX} public method set_psc { output_c } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set o_c $output_c puts $vi "CURR $o_c(current)" $gpib command_sent_wfile $device_name $visaAddr "CURR $o_c(current)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method to configure voltage and current protection (Voltage is set at v_level) (Without changing output state) # @param protect_vc (parameter_list) list with the following format: # - \b Example: [list v_level {70 mV} overv_level {1 V} c_level {60 mA}] # + \b v_level (string): Output voltage value {<value> V|mV...MIN|MAX} # + \b overv_level (string): Protection voltage level {<value> V|mV...MIN|MAX} # + \b c_level (string): Protection current level {<value> A|mA...MIN|MAX} public method set_prot_psvc { protect_vc } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set p_vc $protect_vc puts $vi "VOLT:PROT $p_vc(v_level)" $gpib command_sent_wfile $device_name $visaAddr "VOLT:PROT $p_vc(v_level)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "CURR:LEV $p_vc(c_level);PROT:STAT ON" $gpib command_sent_wfile $device_name $visaAddr "CURR:LEV $p_vc(c_level);PROT:STAT ON" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method to configure voltage protection (Voltage not modified) (Without changing output state) # @param protect_v (parameter_list) list with the following format: # - \b Example: [list overv_level {3 V}] # + \b overv_level (string): Protection voltage level {<value> V|mV...MIN|MAX} public method set_prot_psv { protect_v } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set p_v $protect_v puts $vi "VOLT:PROT $p_v(overv_level)" $gpib command_sent_wfile $device_name $visaAddr "VOLT:PROT $p_v(overv_level)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method to configure current protection # @param protect_c (parameter_list) list with the following format: # - \b Example: [list c_level {3 A}] # + \b c_level (string): Protection current level {<value> A|mA...MIN|MAX} public method set_prot_psc { protect_c } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set p_c $protect_c puts $vi "CURR:LEV $p_c(c_level);PROT:STAT ON" $gpib command_sent_wfile $device_name $visaAddr "CURR:LEV $p_c(c_level);PROT:STAT ON" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method that Clears any OV (overvoltage), OC (overcurrent, unless set via external voltage control),OT (overtemperature), or RI (remote inhibit) protection features. # Warning: This function removes protection state and protection configuration public method clear_prot {} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "CURRENT:PROTECTION:STATE OFF" $gpib command_sent_wfile $device_name $visaAddr "CURRENT:PROTECTION:STATE OFF" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "VOLT:PROT MAX" $gpib command_sent_wfile $device_name $visaAddr "VOLT:PROT MAX" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "OUTP:PROT:CLE" $gpib command_sent_wfile $device_name $visaAddr "OUTP:PROT:CLE" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Method to read protection events produced: OV (Over Voltage): 1 OC (Over Current): 2 OT(Over Temperature): 16 (Remote inhibit is active): 512 UNR (Power supply output is unregulated): 1024 # @return (integer): Event number public method read_events {} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "STAT:QUES?" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "STAT:QUES?" $error_handle error_report_screen $visaAddr [$this error_report error_message] RI #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Method to read power supply outputs {voltage (V) | current (A) | power (W) } # @param type (string): "voltage" (Reads voltage) "current" (Reads current) "power" (Reads power) "all" (Reads voltage current power) # @return (float): Value of a single measure # @return (list): List with the value of all measurements {voltage | current | power} public method read_outputs { type } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "MEAS:VOLT?" set voltage_read [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:VOLT?" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "MEAS:CURR?" set current_read [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:CURR?" $error_handle error_report_screen $visaAddr [$this error_report error_message] set power_read [expr $voltage_read*$current_read] set reads_list [list current $current_read voltage $voltage_read power $power_read all {$voltage_read $current_read $power_read}] array set reads $reads_list #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $reads($type) #-----------------------------------------------------------------------------------------------------------} } ## \private # Method that setup the instrument in an error_handle object previusly declared # No parameters needed public method setup_error_handle {} { set possition [string last "::" $this] set dev_name [string range $this [expr $possition+2] end] $error_handle add_instrument $dev_name $this } ## \private ## Method that returns the errors message or severty produced during the sequence # @param option string with the output option (error | severity) # @return (parameter_list) list with all the errors or max severity produced # - \b Example (error): {-101 "Sintax error"} {+0 "No error"} # + \b First value: Error Code # + \b Second value: Error message # - \b Example (severity): +5 private method error_report { option } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set err_dict_output [list] set err_sev_list [list] puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } for {set x 0} { $err != "+0,\"No error\"" } {incr x} { puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } } foreach n $err_sev_list { if {$n > $max} { set max $n } } set error_message $err_dict_output set severity $max #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg } { $error_handle execute_controlled_exit $severity_nu } else { $error_handle error_report_screen $visaAddr "Unknown error" } } else { #-----------------------------------------------------------------------------------------------------------if { $severity == 0 && $option == "severity"} { } else { if {$severity != 0 && $option == "severity"} { set max 0 } eval return $$option } } } } namespace export driver_gpib_hp6653a } Dicionario de errores Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 24 { "+0": "-100": "-101": "-102": "-103": "-104": "-105": "-108": "-109": "-112": "-113": "-121": "-123": "-124": "-128": "-131": "-138": "-141": "-144": "-148": "-150": "-151": "-158": "-160": "-161": "-168": "-220": "-221": "-222": "-223": "-240": "-241": "-310": "-313": "-330": "-350": "-400": "-410": "-420": "-430": "-440": } {"No Error" {"Command error (generic command error)" {"Invalid character" {"Syntax error (unrecognized command or data type)" {"Invalid separator (illegal character encountered in place of separator)" {"Data type error (e.g., “numeric or string expected, got block date”)" {"GET not allowed ( <GET> inside a program message)" {"Parameter not allowed (too many parameters)" {"Missing parameter (too few parameters)" {"Program mnemonic too long (maximum 12 characters)" {"Undefined header (syntactical correct but not defined for this device)" {"Invalid character in number (e.g. alpha in decimal data, etc.)" {"Exponent too large ( numeric overflow; exponent magnitude >32000)" {"Too many digits (number too long; more than 255 digits received)" {"Numeric data not allowed (numeric data not accepted where positioned)" {"Invalid suffix (unrecognized suffix, or suffix not appropriate)" {"Suffix not allowed (numeric element does not allow suffixes)" {"Invalid character data (bad character, or unrecognized)" {"Character data too long (maximum length is 12 characters)" {"Character data not allowed (character data not accepted where positioned)" {"String data error (generic string error)" {"Invalid string data (e.g., END received before close quote)" {"String data not allowed (string data not accepted where positioned)" {"Block data error (generic data block error)" {"Invalid block data (e.g., END received before length satisfied)" {"Block data not allowed (block data not accepted where positioned)" {"Parameter error" {"Settings conflict (uncoupled parameters)" {"Data out of range (e.g., outside the range of this device)" {"Too much data (out of memory; block, string, or expression too long)" {"Hardware error (device-dependent)" {"Hardware missing (device-dependent)" {"System error (device-dependent)" {"Calibration memory lost (out of calibration due to memory failure)" {"Self-test failed (more specific data after “;”)" {"Queue overflow (errors lost due to too many errors in queue)" {"Query error (generic query error)" {"Query INTERRUPTED (query followed by DAB or GET before response complete)" {"Query UNTERMINATED (addressed to talk, incomplete programming message received)" {"Query DEADLOCKED (too many queries in command string)" {"Query UNTERMINATED (query received after query for indefinite response)" :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"4"}, :"1"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"1"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"} PARTE V DRIVER_GPIB_HP34401A Librería de la clase Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 27 package provide driver_gpib_hp34401a 1.0 package require class_multimeter package require Itcl namespace eval driver_gpib_hp34401a { ##Namespace that implement a concrete multimeter hp34401a (inherit from multimeter class) namespace import ::itcl::* ::itcl::class driver_gpib_hp34401a { # Abstract class namespace import ::class_multimeter::* inherit ::class_multimeter::multimeter #Variables private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable visaAddr on_off vi rc rm device_name err gpib dict_err err_dict_output c_err_msg connection_error_value con_def_msg con_def_msg_er severity_nu error_handle max ## Constructor of the class # @param _visa_addrs (string) : Initialize the VISA device constructor {_visa_addrs _gpib d_error_handle} { #Pointer to $error_handle class set error_handle $d_error_handle #Pointer to driver_log class set gpib $_gpib # open device set visaAddr $_visa_addrs # get handle to default resource manager if { [catch { set rm [visa::open-default-rm] } rc] } { puts stderr "Error opening default resource manager\n$rc" } else { set rm [visa::open-default-rm] } # check if devide is opened if { [catch { set vi [visa::open $rm $visaAddr] } rc] } { puts "Error opening instrument `$visaAddr`\n$rc" } else { set vi [visa::open $rm "$visaAddr"] # Set proper timeout fconfigure $vi -timeout 500 } # Get ID from instrument puts $vi "*IDN?" #Remove useless part of ID set _id [gets $vi] #Characters until second "," set num [expr [string first "," $_id #Redefine device ID set id [string range $_id 0 $num] #Device name set device_name $id [expr [string first "," $_id]+1]]-1] #Setup error dictionary set fp [open [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK) setup sw source tcl driver_gpib_hp34401a driver_gpib_hp34401a_dict_error.json] r] set dict_err [read $fp] set dict_err [json::json2dict $dict_err] # SEVERITY CONNECTION ERROR VALUE set severity_nu 14 set connection_error_value -1 set c_err_msg [list "$connection_error_value, \"Connection error\" $severity_nu" "+0, \"No Error\" 0"] set con_def_msg "error writing \"$vi\": Unknown error" #Specific error report when disconection set c_err_msg_er "$connection_error_value, \"Connection error\" $severity_nu" #Add instrument in error_handle $this setup_error_handle #Initialize maximum severity set max 0 } ## Turn ON/OFF display # @param on_off (string) : "on" (Turns on the display) "off" (Turns off the display) # # Example: display on public method display { on_off } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "DISPlay $on_off" $gpib command_sent_wfile $device_name $visaAddr "DISPlay $on_off" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { # Report communication error if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Read resistance(x2) # @param r_confx2 (parameter_list) list with the following format: [ list range { <value> MOHM|KOHM|OHM...|MIN|MAX|DEF} resolution { <value> MOHM|KOHM|OHM...|MIN|MAX|DEF}] # # Example: read_resx2 [list range {5 ohm} resolution {1 ohm}] public method read_resx2 { r_confx2} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set r_paramx2 $r_confx2 puts $vi "CONF:RES $r_paramx2(range), $r_paramx2(resolution)" $gpib command_sent_wfile $device_name $visaAddr "CONF:RES $r_paramx2(range), $r_paramx2(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "READ?" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Read resistance(x4) # @param r_conf (parameter_list) list with the following format: [ list range { <value> MOHM|KOHM|OHM...|MIN|MAX|DEF} resolution { <value> MOHM|KOHM|OHM...|MIN|MAX|DEF}] # # Example: read_resx4 [list range {5 ohm} resolution {1 ohm}] public method read_resx4 { r_confx4} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set r_paramx4 $r_confx4 puts $vi "CONF:FRES $r_paramx4(range), $r_paramx4(resolution)" $gpib command_sent_wfile $device_name $visaAddr "CONF:FRES $r_paramx4(range), $r_paramx4(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "READ?" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Read voltage dc # @param v_conf (parameter_list) list with the following format: [ list range { <value> kV|V|mV...|MIN|MAX|DEF} <value> kV|V|mV ...|MIN|MAX|DEF}] # # Example: read_voltage_dc [list range {5 mV} resolution {1 mV}] public method read_voltage_dc { v_conf_dc } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set v_param $v_conf_dc puts $vi "CONF:VOLT:DC $v_param(range), $v_param(resolution)" $gpib command_sent_wfile $device_name $visaAddr "CONF:VOLT:DC $v_param(range), $v_param(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "READ?" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] resolution { if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Read voltage ac # @param v_conf (parameter_list) list with the following format: [ list range { <value> kV|V|mV...|MIN|MAX|DEF} <value> kV|V|mV ...|MIN|MAX|DEF}] # # Example: read_voltage_ac [list range {5 V} resolution {1 mV}] public method read_voltage_ac { v_conf_ac } { #------------------------------------------------------------------------------------------------------------ resolution { if { [catch { #-----------------------------------------------------------------------------------------------------------array set v_param $v_conf_ac puts $vi "CONF:VOLT:AC $v_param(range), $v_param(resolution)" $gpib command_sent_wfile $device_name $visaAddr "CONF:VOLT:AC $v_param(range), $v_param(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "READ?" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Read current dc # @param c_conf (parameter_list) list with the following format: [ list range { <value> A|mA ...|MIN|MAX|DEF} resolution { <value> A|mA ...|MIN|MAX|DEF}] # # Example: read_current_dc [list range {200 mA} resolution {1 A}] public method read_current_dc { c_conf_dc } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set c_param $c_conf_dc puts $vi "CONF:CURR:DC $c_param(range), $c_param(resolution)" $gpib command_sent_wfile $device_name $visaAddr "CONF:CURR:DC $c_param(range), $c_param(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "READ?" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Read current ac # @param c_conf (parameter_list) list with the following format: [ list range { <value> A|mA ...|MIN|MAX|DEF} { <value> A|mA ...|MIN|MAX|DEF}] # # Example: read_current_ac [list range {200 mA} resolution {1 A}] public method read_current_ac { c_conf_ac } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set c_param $c_conf_ac puts $vi "CONF:CURR:AC $c_param(range), $c_param(resolution)" $gpib command_sent_wfile $device_name $visaAddr "CONF:CURR:AC $c_param(range), $c_param(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "READ?" set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] resolution #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Read frequency # @param f_conf (parameter_list) list with the following format: [ list range { <value> kHz|Hz ...|MIN|MAX|DEF} { <value> kHz|Hz ...|MIN|MAX|DEF}] # # Example: read_freq [list range {20 kHz} resolution {100 hz}] public method read_freq { f_conf } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set f_param $f_conf puts $vi "CONF:FREQ $f_param(range),$f_param(resolution)" $gpib command_sent_wfile $device_name $visaAddr "CONF:FREQ $f_param(range),$f_param(resolution)" $error_handle error_report_screen $visaAddr [$this error_report error_message] resolution puts $vi "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Read current value # # Example: read public method read_meas {} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] set id [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "READ?" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr $c_err_msg } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $id #-----------------------------------------------------------------------------------------------------------} } ## Auto adds instrument in error_handle public method setup_error_handle {} { set possition [string last "::" $this] set dev_name [string range $this [expr $possition+2] end] $error_handle add_instrument $dev_name $this } ## Return error list from the error queue # @return err (parameter_list) list with all the errors present in the error queue # # Example_: error_report private method error_report { option } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set err_dict_output [list] set err_sev_list [list] puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } for {set x 0} { $err != "+0,\"No error\"" } {incr x} { puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } } foreach n $err_sev_list { if {$n > $max} { set max $n } } set error_message $err_dict_output set severity $max #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle execute_controlled_exit $severity_nu } else { $error_handle error_report_screen $visaAddr "Unknown error" } } else { #-----------------------------------------------------------------------------------------------------------if { $severity == 0 && $option == "severity"} { } else { if {$severity != 0 && $option == "severity"} { set max 0 } eval return $$option } } } } namespace export driver_gpib_hp34401a } Dicionario de errores Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 32 { "+0": "-101": "-102": "-103": "-104": "-105": "-108": "-109": "-112": "-113": "-121": "-123": "-124": "-131": "-138": "-148": "-158": "-160": "-161": "-162": "-163": "-164": "-165": "-166": "-167": "-168": "-170": "-171": "-172": "-173": "-174": "-175": "-176": "-176": "-176": "-211": "-213": "-214": "-221": "-222": "-223": "-224": "-230": "-330": "-350": } {"No error" {"Invalid character" {"Syntax error" {"Invalid separator" {"Data type error" {"GET not allowed" {"Parameter not allowed" {"Missing parameter" {"Program mnemonic too long" {"Undefined header" {"Invalid character in number" {"Numeric overflow" {"Too many digits" {"Invalid suffix" {"Suffix not allowed" {"Character data not allowed" {"String data not allowed" {"Block data errors" {"Block data errors" {"Block data errors" {"Block data errors" {"Block data errors" {"Block data errors" {"Block data errors" {"Block data errors" {"Block data errors" {"Expression errors" {"Expression errors" {"Expression errors" {"Expression errors" {"Expression errors" {"Expression errors" {"Expression errors" {"Expression errors" {"Expression errors" {"Trigger ignored" {"Init ignored" {"Trigger deadlock" {"Settings conflict" {"Data out of range" {"Too much data" {"Illegal parameter value" {"Data stale" {"Self-test failed" {"Too many errors" :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"}, :"0"} PARTE VI DRIVER_GPIB_KIKUPLZ150U Librería de la clase Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 35 package provide driver_gpib_kikuplz150u 1.0 package require class_electronic_load package require Itcl namespace eval driver_gpib_kikuplz150u { namespace import ::itcl::* ::itcl::class driver_gpib_kikuplz150u { # Abstract class namespace import ::class_electronic_load::* inherit ::class_electronic_load::electronic_load #Variables private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable private variable visaAddr on_off vi rc rm device_name err mode dict_err gpib err_dict_output c_err_msg connection_error_value con_def_msg con_def_msg_er severity_nu error_handle max ## Constructor of the class # @param _visa_addrs (string) : Initialize the VISA device constructor {_visa_addrs _gpib d_error_handle} { #Pointer to $error_handle class set error_handle $d_error_handle #Pointer to driver_gpib set gpib $_gpib # open device set visaAddr $_visa_addrs set visaAddr "GPIB0::1::INSTR" # get handle to default resource manager if { [catch { set rm [visa::open-default-rm] } rc] } { puts stderr "Error opening default resource manager\n$rc" } else { set rm [visa::open-default-rm] } # check if devide opened if { [catch { set vi [visa::open $rm $visaAddr] } rc] } { puts "Error opening instrument `$visaAddr`\n$rc" } else { set vi [visa::open $rm "$visaAddr"] # Set proper timeout fconfigure $vi -timeout 500 } # Get ID from instrument puts $vi "*IDN?" #Remove useless part of ID set _id [gets $vi] #Characters until second "," set num [expr [string first "," $_id #Redefine device ID set id [string range $_id 0 $num] #Device name set device_name $id [expr [string first "," $_id]+1]]-1] #Setup error dictionary set fp [open [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK) setup sw source tcl driver_gpib_kikuplz150u driver_gpib_kikuplz150u_dict_error.json] r] set dict_err [read $fp] set dict_err [json::json2dict $dict_err] # SEVERITY CONNECTION ERROR VALUE set severity_nu 14 set connection_error_value -1 set c_err_msg [list "$connection_error_value, \"Connection error\" $severity_nu" "0, \"No Error\" 0"] set con_def_msg "error writing \"$vi\": Unknown error" #Specific error report when disconection set c_err_msg_er "$connection_error_value, \"Connection error\" $severity_nu" #Add instrument in error_handle $this setup_error_handle #Initialize maximum severity set max 0 } ## Set working mode of the dl: CC|CR|CV|CCCV|CRCV # CC: Constant current CR: Constant resistance mode CV: Constant voltage mode CCCV: Constant current mode + constant voltage mode # @param l_dl_mode (parameter_list) list with the following format: [ list channel {CH1, CH2, CH3... ALL | NONE} mode {CC|CR|CV|CCCV|CRCV}] # # Example: set_mode [list channel {ch1 ch4} mode {cc}] public method set_mode { l_dl_mode} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set dl_mode $l_dl_mode #Select more than one device foreach chan $dl_mode(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $dl_mode(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] } puts $vi "FUNCtion $dl_mode(mode)" $gpib command_sent_wfile $device_name $visaAddr "FUNCtion $dl_mode(mode)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Turn ON | OFF device input # @param state (string) with the value: on | off # # Example: input on public method input {state} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "INP $state" $gpib command_sent_wfile $device_name $visaAddr "INP $state" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------# $error_handle execute_controlled_exit [$this error_report severity] } ## Turn ON | OFF device output # @param state (string) with the value: on | off # # Example: output off public method output {state} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "OUTP $state" $gpib command_sent_wfile $device_name $visaAddr "OUTP $state" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Set device protection of current, voltage and power # @param l_dl_protection (parameter_list) list with the following format: [ list channel {CH1 CH2 CH3... ALL | NONE} current {<value> mA|A... MIN|MAX|no)} voltage {value mV|V... MIN|MAX|no} power {value W... MIN|MAX|no}] # # Example: set_protection [list channel {ch1 ch2} current {1 A} voltage {2 V} power {2 W}] public method set_protection { l_dl_protection } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set dl_protection $l_dl_protection #Select more than one device foreach chan $dl_protection(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $dl_protection(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] } if($dl_protection(current) != "no") { #Set current protection puts $vi "CURR:PROT $dl_protection(current)" #Reporting $gpib command_sent_wfile $device_name $visaAddr "CURR:PROT $dl_protection(current)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #Enable current protection puts $vi "CURR:PROT:ACT" #Reporting $gpib command_sent_wfile $device_name $visaAddr puts $vi "CURR:PROT:ACT" $error_handle error_report_screen $visaAddr [$this error_report error_message] } if($dl_protection(voltage) != "no") { #Set voltage protection puts $vi "VOLT:PROT:UND $dl_protection(voltage)" #Reporting $gpib command_sent_wfile $device_name $visaAddr puts $vi "VOLT:PROT:UND $dl_protection(voltage)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #Enable / Disable voltage protection: puts $vi "VOLT:PROT:STAT ON" #Reporting $gpib command_sent_wfile $device_name $visaAddr puts $vi "VOLT:PROT:STAT ON" $error_handle error_report_screen $visaAddr [$this error_report error_message] } if($dl_protection(power) != "no") { #Set pwer protection puts $vi "POW:PROT $dl_protection(power)" #Reporting $gpib command_sent_wfile $device_name $visaAddr puts $vi "POW:PROT $dl_protection(power)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #Enable / Disable pwer protection puts $vi "POW:PROT:STAT on" $gpib command_sent_wfile $device_name $visaAddr puts $vi "POW:PROT:STAT on" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Disable all protections and clears protection flags # # Example disable_prot public method disable_prot {} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------puts $vi "CURR:PROT MAX" $gpib command_sent_wfile $device_name $visaAddr "CURR:PROT MAX" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "VOLT:PROT:UNDER MAX" $gpib command_sent_wfile $device_name $visaAddr "VOLT:PROT:UNDER MAX" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "INP:PROT:CLE" $gpib command_sent_wfile $device_name $visaAddr "INP:PROT:CLE" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "OUTP:PROT:CLE" $gpib command_sent_wfile $device_name $visaAddr "OUTP:PROT:CLE" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Set conductance value # @param l_dl_conductance (parameter_list) list with the following format: [ list channel {CH1 CH2 CH3... ALL | NONE} conductance {value sie|msie} mode {AUTO | LOW | MED | HIGH}] # # Example: set_conductance [list channel {ch1 ch2} conductance {0.2 sie} mode auto] public method set_conductance { l_dl_conductance} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set dl_conductance $l_dl_conductance #Select more than one device foreach chan $dl_conductance(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $dl_conductance(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #Unit default set cond(2) "sie" #Units used foreach unit $dl_conductance(conductance) { set cond([incr a]) $unit } #Automatic Conductance Module selector: if {$dl_conductance(mode) == "auto" || $dl_conductance(mode) == "AUTO"} { set cond_value $cond(1) if {$cond(2) == "msie" || $cond(2) == "MSIE"} { set cond_value [expr $cond(1)/1000] } if {$cond_value <= 0.2 } { puts $vi "COND:RANG LOW" $gpib command_sent_wfile $device_name $visaAddr "COND:RANG LOW" $error_handle error_report_screen $visaAddr [$this error_report error_message] } elseif {$cond_value <= 2 || $cond_value > 0.2} { puts $vi "COND:RANG MED" $gpib command_sent_wfile $device_name $visaAddr "COND:RANG MED" $error_handle error_report_screen $visaAddr [$this error_report error_message] } elseif {$cond_value > 2} { puts $vi "COND:RANG HIGH" $gpib command_sent_wfile $device_name $visaAddr "COND:RANG HIGH" $error_handle error_report_screen $visaAddr [$this error_report error_message] } } else { puts $vi "COND:RANG $dl_conductance(mode)" $gpib command_sent_wfile $device_name $visaAddr "COND:RANG $dl_conductance(mode)" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #set conductance puts $vi "COND $dl_conductance(conductance)" $gpib command_sent_wfile $device_name $visaAddr "COND $dl_conductance(conductance)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Set current value # @param mode (parameter_list) list with the following format: [ list channel {CH1 CH2 CH3... ALL | NONE} current {value mA|A... MIN|MAX} mode {AUTO | LOW | MED | HIGH}] public method set_current {l_dl_current} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set dl_current $l_dl_current foreach chan $dl_current(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $dl_current(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #Unit default set curr(2) "A" #Units used foreach unit $dl_current(current) { set curr([incr a]) $unit } #Automatic Current Module selector: if {$dl_current(mode) == "auto" || $dl_current(mode) == "AUTO"} { set curr_value $curr(1) if {$curr(2) == "ma" || $curr(2) == "MA"} { set curr_value [expr $curr(1)/1000] } if {$curr_value <= 0.315 } { puts $vi "CURR:RANG LOW" $gpib command_sent_wfile $device_name $visaAddr "CURR:RANG LOW" $error_handle error_report_screen $visaAddr [$this error_report error_message] } elseif {$curr_value <= 3.15 || $curr_value < 0.315} { puts $vi "CURR:RANG MED" $gpib command_sent_wfile $device_name $visaAddr "CURR:RANG MED" $error_handle error_report_screen $visaAddr [$this error_report error_message] } elseif {$curr_value > 3.15} { puts $vi "CURR:RANG HIGH" $gpib command_sent_wfile $device_name $visaAddr "CURR:RANG HIGH" $error_handle error_report_screen $visaAddr [$this error_report error_message] } } else { puts $vi "CURR:RANG $dl_current(mode)" $gpib command_sent_wfile $device_name $visaAddr "CURR:RANG $dl_current(mode)" } #set current puts $vi "CURR $dl_current(current)" $gpib command_sent_wfile $device_name $visaAddr "CURR $dl_current(current)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Set voltage value # @param l_dl_voltage (parameter_list) list with the following format: [ list channel {CH1 CH2 CH3... ALL | NONE} voltage {value mV|V... MIN|MAX} mode {AUTO | LOW | HIGH}] # # Example: set_voltage [list channel {ch1} voltage {5 V} mode auto] public method set_voltage {l_dl_voltage} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set dl_voltage $l_dl_voltage #Select more than one device foreach chan $dl_voltage(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $dl_voltage(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #Unit default set volt(2) "V" #Units used foreach unit $dl_voltage(voltage) { set volt([incr a]) $unit } #Automatic voltage Module selector: if {$dl_voltage(mode) == "auto" || $dl_voltage(mode) == "AUTO"} { set volt_value $volt(1) if {$volt(2) == "mv" || $volt(2) == "MV"} { set volt_value [expr $volt(1)/1000] } if {$volt_value <= 15.75 } { puts $vi "VOLT:RANG LOW" $gpib command_sent_wfile $device_name $visaAddr "VOLT:RANG MED" $error_handle error_report_screen $visaAddr [$this error_report error_message] } elseif {$volt_value > 15.75} { puts $vi "VOLT:RANG HIGH" $gpib command_sent_wfile $device_name $visaAddr "VOLT:RANG HIGH" $error_handle error_report_screen $visaAddr [$this error_report error_message] } } else { puts $vi "VOLT:RANG $dl_voltage(mode)" $gpib command_sent_wfile $device_name $visaAddr "VOLT:RANG $dl_voltage(mode)" $error_handle error_report_screen $visaAddr [$this error_report error_message] } puts $vi "VOLT $dl_voltage(voltage)" $gpib command_sent_wfile $device_name $visaAddr "VOLT $dl_voltage(voltage)"age] $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } ## Set soft start # @param l_soft (parameter_list) list with the following format: [ list channel {CH1 CH2 CH3... ALL | NONE} sst {value mS|S... MIN|MAX}] # # Example: soft_start [list channel {ch1 ch5} sst {5 ms}] public method soft_start {l_soft} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set soft $l_soft #Select more than one device foreach chan $soft(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $soft(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] } puts $vi "FUNC:SST $soft(sst)" $gpib command_sent_wfile $device_name $visaAddr "FUNC:SST $soft(sst)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } # Set current slope per micro Sec # @param l_slew (parameter_list) list with the following format: [ list channel {CH1 CH2 CH3... ALL | NONE} slew {value} mode {AUTO | LOW | MED | HIGH}] # # Example: set_slew [list channel {ch1 ch5} slew 0.5 mode auto] public method set_slew {l_slew} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set slew $l_slew #Select more than one device foreach chan $slew(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $slew(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $l_channel($i)" $error_handle error_report_screen $visaAddr [$this error_report error_message] } puts $vi "CURR:SLEW $slew(slew)" $gpib command_sent_wfile $device_name $visaAddr "CURR:SLEW $slew(slew)" $error_handle error_report_screen $visaAddr [$this error_report error_message] #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } # Set load level as a pulse or as a pulse train # @param l_load_tran (parameter_list) list with the following format: [ list channel {CH1 CH2 CH3... ALL | NONE} max {value mA|A... MIN|MAX} min {value mA|A... MIN|MAX} slew {value} mode {{train freq_value} | single | stop}] # # Example: set_load_tran [list channel {ch1 ch2} max {1 A} min {0.5 A} slew 0.01 mode {train 5}] # Example: set_load_tran [list channel {ch1 ch2} mode stop] public method set_pulse_train {l_load_tran} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------array set load_tran $l_load_tran #Select more than one device foreach chan $load_tran(channel) { set l_channel([incr i]) $chan lappend l_channelcoup "$chan," } puts $vi "INST:COUP $l_channelcoup" $gpib command_sent_wfile $device_name $visaAddr "INST:COUP $l_channelcoup" $error_handle error_report_screen $visaAddr [$this error_report error_message] foreach chan $load_tran(channel) { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #Stop transition if { $load_tran(mode) == "stop"} { puts $vi "PULS OFF" } else { puts $vi "CURR:SLEW $load_tran(slew)" $gpib command_sent_wfile $device_name $visaAddr "CURR:SLEW $load_tran(slew)" $error_handle error_report_screen $visaAddr [$this error_report error_message] set mode(1) 0 set mode(2) 1 set i 0 foreach type $load_tran(mode) { set mode([incr i]) $type } #Set Voltage $this set_current [list channel "$load_tran(channel)" current "$load_tran(max)" mode "auto"] #Set Pulse puts $vi "PULS:LEV:CURR $load_tran(min)" $gpib command_sent_wfile $device_name $visaAddr "PULS:LEV:CURR $load_tran(min)" $error_handle error_report_screen $visaAddr [$this error_report error_message] if {$mode(1)=="train"} { puts $vi "PULS:FREQ $mode(2)" $gpib command_sent_wfile $device_name $visaAddr "PULS:FREQ $mode(2)" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "PULS ON" $gpib command_sent_wfile $device_name $visaAddr "PULS ON" $error_handle error_report_screen $visaAddr [$this error_report error_message] } elseif {$mode(1)=="single"} { puts $vi "PULS OFF" $gpib command_sent_wfile $device_name $visaAddr "PULS OFF" $error_handle error_report_screen $visaAddr [$this error_report error_message] $this set_current [list channel "$load_tran(channel)" current "$load_tran(min)" mode "auto"] $this set_current [list channel "$load_tran(channel)" current "$load_tran(max)" mode "auto"] } } #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] } # # Measure current # @param channel (parameter_list) list with the following format: [ list {CH1 CH2 CH3... ALL | NONE}] # # Example: read_current {ch1 ch2} public method read_current {channel} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set c_meas [list] #Select more than one device foreach chan $channel { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "MEAS:CURR:DC?" lappend c_meas [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:CURR:DC?" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $c_meas #-----------------------------------------------------------------------------------------------------------} } # # Measure voltage # @param channel (parameter_list) list with the following format: [ list {CH1 CH2 CH3... ALL | NONE}] # # Example: read_voltage {ch1 ch2} public method read_voltage {channel} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set v_meas [list] foreach chan $channel { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "MEAS:VOLT:DC?" lappend v_meas [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:VOLT:DC?" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $v_meas #-----------------------------------------------------------------------------------------------------------} } # # Measure power # @param channel (parameter_list) list with the following format: [ list {CH1 CH2 CH3... ALL | NONE}] # # Example: read_power {ch1 ch2} public method read_power {channel} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set p_meas [list] #Select more than one device foreach chan $channel { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "MEAS:POW:DC?" lappend p_meas [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "MEAS:POW:DC?" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $p_meas #-----------------------------------------------------------------------------------------------------------} } # # Return conductance configured # @param channel (parameter_list) list with the following format: [ list {CH1 CH2 CH3... ALL | NONE}] # # Example: read_conductance {ch1 ch2} public method read_conductance {channel} { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set p_meas [list] #Select more than one device foreach chan $channel { puts $vi "INST $chan" #Reporting $gpib command_sent_wfile $device_name $visaAddr "INST $chan" $error_handle error_report_screen $visaAddr [$this error_report error_message] puts $vi "COND?" lappend p_meas [gets $vi] $gpib command_sent_wfile $device_name $visaAddr "COND?" $error_handle error_report_screen $visaAddr [$this error_report error_message] } #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle error_report_screen $visaAddr [$this error_report error_message] } else { $error_handle error_report_screen $visaAddr "Unknown error" } } #-----------------------------------------------------------------------------------------------------------$error_handle execute_controlled_exit [$this error_report severity] if { $err_code == "" } { #-----------------------------------------------------------------------------------------------------------return $p_meas #-----------------------------------------------------------------------------------------------------------} } ## Auto adds instrument in error_handle public method setup_error_handle {} { set possition [string last "::" $this] set dev_name [string range $this [expr $possition+2] end] $error_handle add_instrument $dev_name $this } ## Return error list from the error queue # @return err (parameter_list) list with all the errors present in the error queue # # Example_: error_report private method error_report { option } { #-----------------------------------------------------------------------------------------------------------if { [catch { #-----------------------------------------------------------------------------------------------------------set err_dict_output [list] set err_sev_list [list] puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } for {set x 0} { $err != "0,\"No error\"" } {incr x} { puts $vi "SYST:ERR?" set err [gets $vi] set val [expr [string first "," $err 0]] set error_val [string range $err 0 [expr ($val-1)]] if { [catch { set definition [lindex [dict get $dict_err $error_val] 0 ]} rc ]} { lappend err_dict_output "$err" lappend err_sev_list 1 } else { set severity_val [lindex [dict get $dict_err $error_val] 1 ] lappend err_dict_output "$error_val, \"$definition\"" lappend err_sev_list $severity_val } } foreach n $err_sev_list { if {$n > $max} { set max $n } } set error_message $err_dict_output set severity $max #-----------------------------------------------------------------------------------------------------------} err_code]} { if {$err_code == $con_def_msg} { $error_handle execute_controlled_exit $severity_nu } else { $error_handle error_report_screen $visaAddr "Unknown error" } } else { #-----------------------------------------------------------------------------------------------------------if { $severity == 0 && $option == "severity"} { } else { if {$severity != 0 && $option == "severity"} { set max 0 } eval return $$option } } } } namespace export driver_gpib_kikuplz150u } Dicionario de errores Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 44 { "0": "21": "22": "23": "24": "27": "31": "-100": "-101": "-102": "-103": "-104": "-105": "-108": "-109": "-110": "-120": "-130": "-131": "-134": "-138": "-140": "-150": "-160": "-170": "-180": "-200": "-300": "-350": "-400": } {"No error" {"Operation denied due to ALARM state" {"Operation denied due to PROGRAM running" {"Operation denied due to SWITCH running" {"Operation denied due to INPUT ON" {"Operation denied due to incompatible FUNCTION MODE" {"Operation denied due to incompatible PROGRAM MODE" {"Command error" {"Invalid character" {"Syntax error" {"Invalid separator" {"Data type error" {"GET not allowed" {"Parameter not allowed" {"Missing parameter" {"Command header error" {"Numeric data error" {"Suffix error" {"Invalid suffix" {"Suffix too long" {"Suffix not allowed" {"Character data error" {"String data error" {"Block data error" {"Expression error" {"Macro error" {"Execution error (generic)" {"Device-specific error(generic)" {"Queue overflow" {"Query error (generic)" : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"}, "0"} PARTE VII DRIVER_RS232_TEKTTPS2024 Librería de la clase Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 47 package provide driver_rs232_tekttps2024 1.0 # class abstract # package require driver_class_scanner package require Itcl namespace eval driver_rs232_tekttps2024 { namespace import ::itcl::* ::itcl::class driver_rs232_tekttps2024 { private variable vi private variable fp private variable config_dir ## Constructor of the class # @param serial_port (string) : Initialize RS232 communication constructor { serial_port _config_dir } { set vi [open $serial_port: RDWR] # set vi [open COM1: RDWR] fconfigure fconfigure fconfigure fconfigure fconfigure fconfigure fconfigure # $vi $vi $vi $vi $vi $vi $vi -blocking 1 -buffering full -encoding binary -mode 19200,n,8,1 -translation binary -eofchar {} -timeout 10000 Configuration files location set config_dir $_config_dir } ## Destructor of the class # Closes the channel destructor { close $vi } ## Get configuration from osciloscope # @param file_name (string) : name of the file in which the configuration is going to be saved # # Example: getconfig conf1 public method getconfig { file_name } { set log_add [file join [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK) work tektronix $file_name.SET]] set fp [open $log_add w] set settings [list] lappend lappend lappend lappend lappend lappend lappend lappend lappend lappend lappend lappend lappend lappend lappend settings settings settings settings settings settings settings settings settings settings settings settings settings settings settings "HEADER?" "DATA?" "DISPLAY?" "ACQUIRE?" "CH1?" "CH2?" "CH3?" "CH4?" "HORIZONTAL?" "TRIGGER?" "SELECT?" "CURSOR?" "MEASUREMENT?" "CURSOR?" "MATH?" foreach conf $settings { puts $vi $conf flush $vi set conf_out "" while {$conf_out == ""} { set conf_out [gets $vi] } puts $fp $conf_out } close $fp } ## Setup osciloscope configuration from file # @param file_name (string) : name of the file that contains the configuration # # Example: setconfig conf1 public method setconfig { file_name } { set log_add [file join [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK)/setup/sw/source/tcl/ $config_dir/$file_name.SET]] set fp [open $log_add r] set config [gets $fp] while { $config != "" } { puts $vi $config flush $vi set config [gets $fp] after 2000 } } ## Creates an image of the screen of the osciloscope # @param bmp_name (string) : name of the bmp file that will be created # # Example: hard_copy imagen1 public method hard_copy { bmp_name } { #Check if osciloscope is busy or not puts $vi "BUSY?" flush $vi set flag [gets $vi] if { $flag == ":BUSY 0" || $flag == "0" } { set log_add [file join [file join $::env(HOME_PROJECTS)/ $::env(NAME_PROJECT) $::env(USERWORK) work tektronix $bmp_name.bmp]] set fp [open $log_add w] # File configuration fconfigure $fp -encoding binary fconfigure $fp -translation binary # Image format settings puts $vi "HARDCopy:FORMat BMP" flush $vi # Start scann puts $vi "HARDcopy start" flush $vi # Read number of bytes in the buffer queue set data [lindex [fconfigure $vi -queue] 0] # Wait until data receiving while {$data == 0} { set data [lindex [fconfigure $vi -queue] 0] } # Wait for header while { $data < 54 } { set data [lindex [fconfigure $vi -queue] 0] } # Read header set header [read $vi 54] # Read image size in header set size_bin [string range $header 2 5] binary scan $size_bin i size # Write header in image file puts -nonewline $fp $header # Initialize counter value with the header length set counter 54 # Read data until reaching the total image size while { $counter < $size} { set data [lindex [fconfigure $vi -queue] 0] if { $data >= 1 } { set counter [expr $counter+$data] puts -nonewline $fp [read $vi $data] } } close $fp return 0 } else { return 1 } } ## Returns wave signal in values & time scale of values # # @param wave_settings (parameter_list) list with the following format: | 3 | 4} ] # If "time" mode is choosen, channel value is not needed. # "time" option just returns the time scale of the graphic # # Example: wave_curve [list mode time] # Example: wave_curve [list mode auto channel 1] public method wave_curve { wave_settings } { array set settings $wave_settings [list mode {auto | manual | time} channel { 1 | 2 if { $settings(mode) == "auto" } { $this auto_acquisisiton set wave_form [$this waveform $settings(channel)] return $wave_form } elseif { $settings(mode) == "manual" } { $this manual_acquisition set wave_form [$this waveform $settings(channel)] return $wave_form } elseif { $settings(mode) == "time" } { # Scale of time cursor puts $vi "HORizontal:MAIn:SCALe?" flush $vi set time_scl_string [gets $vi] set time_scl [string range $time_scl_string 23 end] return time_scl } } ## Configure acquisition time intervals in auto mode [FULL LENGHT] private method auto_acquisisiton {} { # Wave adquisition settings puts $vi "DATa:STARt 1" puts $vi "DATa:STOP 2500" flush $vi } ## Configure acquisition time intervals in manual mode [USE CURSORS TO DELIMIT TIME INTERVAL] private method manual_acquisition {} { # Horizontal time offset of cursor puts $vi "HORizontal:MAIn:POSition?" flush $vi set h_gt [gets $vi] set h_globaltime [string range $h_gt 26 end] # Scale of time cursor puts $vi "HORizontal:MAIn:SCALe?" flush $vi set time_scl [gets $vi] set time_scale [string range $time_scl 23 end] # Cursor 1 position puts $vi "CURSor:VBArs:POSITION1?" flush $vi set pos_c1 [gets $vi] set position_cursor1 [string range $pos_c1 24 end] # Cursor 2 position puts $vi "CURSor:VBArs:POSITION2?" flush $vi set pos_c2 [gets $vi] set position_cursor2 [string range $pos_c2 24 end] # Data Start calculation (Cursor 1) set t_start [expr floor((($position_cursor1-$h_globaltime)+5*$time_scale)/(10*$time_scale)*2500)] if {$t_start <= 0 } { set t_start 1 } # Data Stop calculation (Cursor 2) set t_stop [expr floor((($position_cursor2-$h_globaltime)+5*$time_scale)/(10*$time_scale)*2500)] if {$t_stop <= 0 } { set t_stop 1 } # Wave adquisition settings puts $vi "DATa:STARt $t_start" puts $vi "DATa:STOP $t_stop" flush $vi } ## Returns wave signal in values # # @param channel (string) : channel number whose signal will be scanned # # Example: waveform 1 private method waveform {channel} { # Wave acquisition settings puts $vi "DATa:ENCdg RIBinary" puts $vi "DATa:WIDth 1" puts $vi "DATa:SOUrce CH$channel" flush $vi { 1 | 2 | 3 | 4} # Start scan puts $vi "CURVE?" flush $vi # Header: set header [read $vi 9] set num_length_bytes [string range $header 8 end] set wave_data_length [read $vi $num_length_bytes] # Wave Data: set wave_data_bin [read $vi [expr $wave_data_length+1]] # Conversion from binary to ASCII binary scan [string range $wave_data_bin 0 end-2] c* wave_data_ascii #====== Wave_form offset and configuration ====== # Escalas de voltage puts $vi "CH$channel:SCAle?" flush $vi set v_scale_str [gets $vi] set v_scale [string range $v_scale_str 11 end] # Cursor Vertical possition [screen squares] puts $vi "CH$channel:POSition?" flush $vi set v_possition_str [gets $vi] set v_possition [string range $v_possition_str 14 end] #=========== Wave_form output ============= set counter 0 set new_wave_data [list] foreach value $wave_data_ascii { set wave_data_processed [expr ($value/25.0)*$v_scale - $v_possition* $v_scale ] set rounded_number [expr {double(round(1000*$wave_data_processed))/1000}] lappend new_wave_data $rounded_number } return $new_wave_data } } namespace export driver_rs232_tekttps2024 } PARTE VIII CLASES ABSTRACTAS Clase Escáner Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 52 ## \file # File that contains the Scanner abstract library package provide class_scanner 1.0 ## Namespace with the abstract class of the Scanner namespace eval class_scanner { ## This class is the abstract class with the common functions of a Scanner ::itcl::class scanner { ## Method to switch on | off the screen of the instrument. # @param mode string with the format: on | off public method display { mode } {} ## Method to read DC Voltage # @param parameter_list list with the following format: # - \b Example: [list channel {105:110,215} range {5 mV} resolution {1 mV}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measures (list) list with all reads public method read_voltage_dc { parameter_list} {} ## Method to read AC Voltage # @param parameter_list list with the following format: # - \b Example: [list channel {105:110,215} range {5 mV} resolution {1 mV}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measures (list) list with all reads public method read_voltage_ac { parameter_list} {} ## Method to read DC current (Read user manual to see which channels are compatible with current measures) # @param parameter_list list with the following format: # - \b Example: [list channel {105:110,215} range {200 mA} resolution {1 mA}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measures (list) list with all reads public method read_current_dc { parameter_list } {} ## Method to read AC current (Read user manual to see which channels are compatible with current measures) # @param parameter_list list with the following format: # - \b Example: [list channel {105:110,215} range {200 mA} resolution {1 mA}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measures (list) list with all reads public method read_current_ac { parameter_list } {} ## Method to read 2 wires resistances # @param parameter_list list with the following format: # - \b Example: [list channel {105:110,215} range {200 mohm} resolution {1 mohm}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measures (list) list with all reads public method read_resistancex2 { parameter_list} {} ## Method to read 4 wires resistances # @param parameter_list list with the following format: # - \b Example: [list channel {105:110,215} range {200 mohm} resolution {1 mohm}] # + \b channel (string): Indicates the channels that will be read (:) [From - to] || (,) single # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measures (list) list with all reads public method read_resistancex4 { parameter_list} {} ## \private ## Method that returns the errors message or severty produced during the sequence # @param option string with the output option (error | severity) # @return (parameter_list) list with all the errors or max severity produced private method error_report {option} {} ## \private # Method that setup the instrument in an error_handle object previusly declared # No parameters needed private method setup_error_handle {} {} } # export namespaces namespace export scanner } Clase Fuente de alimentación Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 54 ##\file # File that contains the Power Supply abstract library package provide class_powersupply 1.0 ## Namespace with the abstract class of the Power Supply namespace eval class_powersupply { ## This class is the abstract class with the common functions of a Power Supply ::itcl::class powersupply { ## Method to switch on | off the screen of the instrument. # @param mode string with the format: on | off public method display { mode } {} ## Method to switch the state of the output (current | voltage) of the instrument. # @param state (string): on | off public method output { state } {} ## Method to configure voltage and current level without changing the output state. # @param output_vc (list) with the following format: # - \b Example: [list voltage {50 mV} current {3 mA}] # + \b voltage: Voltage level # + \b current: Current level public method set_psvc { output_vc } {} ## Method to configure the voltage level without changing the output state. # @param output_v (string) with the following format: # - \b Example: {30 V} public method set_psv { output_v } {} ## Method to configure the current maximun level without changing the output state. # @param output_c (string) with the following format: # - \b Example: {2 A} public method set_psc { output_c } {} ## Method to configure the voltage level, the voltage protection level and the current protection level without changing the output state. # @param parameter_list (list) with the following format: # - \b Example: [list v_level {70 mV} overv_level {1 V} c_level {60 mA}] # + \b v_level: Voltage output level # + \b overv_level: Voltage protection level # + \b c_level: Current protection level public method set_prot_psvc { parameter_list } {} ## Method to configure just the voltage protection level. # @param protect_v (string) with the following format: # - \b Example: {25 V} public method set_prot_psv { protect_v } {} ## Method to configure just the current protection level. # @param protect_c (string) with the following format: # - \b Example: {1 A} public method set_prot_psc { protect_c } {} ## Method that clears any OV (overvoltage), OC (overcurrent, unless set via external voltage control),OT (overtemperature), or RI (remote inhibit) protection features. # No parameters needed public method cle_protect {} {} ## Method that reads any event produced due to a protection issue. (Over Voltage) (Remote inhibit is active) UNR (Power supply output is unregulated) # @return event (integer): Value with the event produced public method read_events {} {} ## Method that returns the output value indicated: (Current | Voltage | Power) # @param type (string) with the following format: # - \b Example: current # - \b Example: voltage # - \b Example: power # - \b Example: all # @return measure (value | list value) with the measures indicated public method read_outputs { type } {} ## \private ## Method that returns the errors message or severty produced during the sequence # @param option string with the output option (error | severity) # @return (parameter_list) list with all the errors or max severity produced private method error_report {} {} ## \private # Method that setup the instrument in an error_handle object previusly declared # No parameters needed private method setup_error_handle {} {} } # export namespaces namespace export powersupply } (Over Current) OT(Over Temperature) RI Clase Multímetro Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 56 ##\file # File that contains the Multimeter abstract library package provide class_multimeter 1.0 ## Namespace with the abstract class of the Multimeter namespace eval class_multimeter { ## This class is the abstract class with the common functions of a Multimeter ::itcl::class multimeter { ## Method to switch on | off the screen of the instrument # @param mode string with the following format: # - \b Example: on | off public method display { mode } {} ## Method to read a 2 wire resistance # @param parameter_list list with the following format: # - \b Example: [list range {5 ohm} resolution {1 ohm}] # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measure (value): value measured public method read_resx2 { parameter_list} {} ## Method to read a 4 wire resistance # @param parameter_list list with the following format: # - \b Example: [list range {5 ohm} resolution {1 ohm}] # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measure (value): value measured public method read_resx4 { parameter_list} {} ## Method to read DC Voltage # @param parameter_list list with the following format: # - \b Example: [list range {5 mV} resolution {1 mV}] # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measure (value): value measured public method read_voltage_dc { parameter_list } {} ## Method to read AC Voltage # @param parameter_list list with the following format: # - \b Example: [list range {5 V} resolution {1 V}] # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measure (value): value measured public method read_voltage_ac { parameter_list } {} ## Method to read DC Current # @param parameter_list list with the following format: # - \b Example: [list range {5 A} resolution {1 mA}] # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measure (value): value measured public method read_current_dc { parameter_list } {} ## Method to read AC Voltage # @param parameter_list list with the following format: # - \b Example: [list range {5 A} resolution {1 mA}] # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measure (value): value measured public method read_current_ac { parameter_list } {} ## Method to read the frequency of the signal # @param parameter_list list with the following format: # - \b Example: [list range {20 kHz} resolution {100 hz}] # + \b range (string): Range of the measure # + \b resolution (string): Resolution of the measure # @return measure (value): value measured public method read_freq { parameter_list } {} ## Method to repeat the last measure configured previously # No params recquired # @return measure (value): value measured public method read_meas {} {} ## \private ## Method that returns the errors message or severty produced during the sequence # @param option string with the output option (error | severity) # @return (parameter_list) list with all the errors or max severity produced private method error_report {option} {} ## \private # Method that setup the instrument in an error_handle object previusly declared # No parameters needed private method setup_error_handle {} {} } # export namespaces namespace export multimeter } Clase Carga Dinámica Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 58 ##\file # File that contains the Electronic Load abstract library package provide class_electronic_load 1.0 ## Namespace with the abstract class of the Electronic Load namespace eval class_electronic_load { ## This class is the abstract class with the common functions of an Electronic Load ::itcl::class electronic_load { ## Method to set the mode of the Electonic Load: CC|CR|CV|CCCV|CRCV # CC: Constant current CR: Constant resistance mode CV: Constant voltage mode voltage mode # @param parameter_list list with the following format: # - \b Example: [list channel CH1 mode CRCV] # + \b channel (string): Channel of the instrument that will be commanded # + \b mode (string): Mode in which the selected channel will work. public method set_mode { parameter_list } {} ## Method to switch the state of the input (current | voltage) of the instrument # @param state (string): on | off public method input {state} {} ## Method to switch the state of the output (current | voltage) of the instrument # @param state (string): on | off public method output {state} {} ## Method to set the protection levels of the instrument # @param parameter_list list with the following format: # - \b Example: [list channel {ch1 ch2} current {1 A} voltage {2 V} power {2 W}] # + \b channel (string): Channel of the instrument that will be commanded # + \b current (string): Current protection value # + \b voltage (string): Voltage protection value # + \b power (string): Power protection value public method set_protection { parameter_list } {} ## Method to disable all protections and clear protection flags # No parameters needed public method disable_prot {} {} ## Method to set the conductance level when mode CR | CRCV is activated # @param parameter_list list with the following format: # - \b Example: [list channel {ch1 ch2} conductance {0.2 sie} mode auto] # + \b channel (string): Channel of the instrument that will be commanded # + \b conductance (string): Conductance value # + \b mode (string): Set the range of the mode (AUTO | LOW | MED | HIGH) public method set_conductance { parameter_list} {} ## Method to set the current level when mode CC | CCCV is activated # @param parameter_list list with the following format: # - \b Example: [ list channel {ch1 ch2} current {1 mA} mode low] # + \b channel (string): Channel of the instrument that will be commanded # + \b current (string): Current value # + \b mode (string): Set the range of the mode (AUTO | LOW | MED | HIGH) public method set_current {parameter_list} {} ## Method to set the voltage level when mode CV | CCCV | CRCV is activated # @param parameter_list list with the following format: # - \b Example: [list channel {ch1} voltage {5 V} mode auto] # + \b channel (string): Channel of the instrument that will be commanded # + \b voltage (string): Voltage value # + \b mode (string): Set the range of the mode (AUTO | LOW | MED | HIGH) public method set_voltage {parameter_list} {} ## Method to set the soft start time # @param parameter_list list with the following format: # - \b Example: [list channel {ch1 ch5} sst {5 ms}] # + \b channel (string): Channel of the instrument that will be commanded # + \b sst (string): soft start time public method soft_start {parameter_list} {} ## Method to set the current slope per micro Sec # @param parameter_list list with the following format: # - \b Example: [list channel {ch1 ch5} slew 0.5 mode auto] # + \b channel (string): Channel of the instrument that will be commanded # + \b slew (value): Current slope (A) per micro Sec # + \b mode (string): Set the range of the mode (AUTO | LOW | MED | HIGH) public method set_slew {parameter_list} {} ## Method to set current as a single pulse | pulse train # @param parameter_list list with the following format: # - \b Example: [list channel {ch1 ch2} max {1 A} min {0.5 A} slew 0.01 mode {train 5}] # - \b Example: [list channel {ch1 ch2} max {1 A} min {0.5 A} slew 0.01 mode {single}] # - \b Example: [list channel {ch1 ch2} mode stop] # + \b channel (string): Channel of the instrument that will be commanded # + \b max (string): Maximun current value per pulse # + \b min (string): Minimun current value per pulse # + \b slew (value): Current slope (A) per micro Sec # + \b mode (string): Select working mode (train | single | stop) # + \b train (value): Oscilation fecquency public method et_pulse_train {parameter_list} {} ## Method to read the conductance programmed # @param parameter_list list with the following format: # - \b Example: {ch1 ch2} # @return string with the value measured public method read_conductance {parameter_list} {} ## \private ## Method that returns the errors message or severty produced during the sequence # @param option string with the output option (error | severity) # @return (parameter_list) list with all the errors or max severity produced private method error_report {option} {} ## \private # Method that setup the instrument in an error_handle object previusly declared # No parameters needed private method setup_error_handle {} {} } # export namespaces namespace export electronic_load } CCCV: Constant current mode + constant DOCUMENTO IV ESTUDIO DE COSTES Índice general DOCUMENTO IV. ESTUDIO DE COSTES 1 1. Recursos 1. Componentes del sistema . . 1.1. Dispositivos de medición 1.2. Dispositivos de control . 1.3. Otros . . . . . . . . . . 2. Software del sistema . . . . 2.1. Software requerido . . . 2.2. Diseño de librerías . . . 3. Formación del usuario . . . . 3.1. Manuales y Cursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 3 4 4 4 4 4 2. Precios unitarios 1. Componentes del sistema . . 1.1. Dispositivos de medición 1.2. Dispositivos de control . 1.3. Otros . . . . . . . . . . 2. Software del sistema . . . . 2.1. Software requerido . . . 2.2. Diseño de librerías . . . 3. Formación del usuario . . . . 3.1. Manuales y Cursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 5 6 6 6 6 6 . . . . . . . . . 7 7 7 7 7 8 8 8 8 8 4. Presupuesto general 1. Costes totales del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 2 3. 6XPDVSDUFLDOHV 1. Componentes del sistema . . 1.1. Dispositivos de medición 1.2. Dispositivos de control . 1.3. Otros . . . . . . . . . . 2. Software del sistema . . . . 2.1. Software requerido . . . 2.2. Diseño de librerías . . . 3. Formación del usuario . . . . 3.1. Manuales y Cursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capítulo 1 Recursos Esta parte del presupuesto recogerá el número recursos que participan en la composición y construcción del sistema de test. 1. Componentes del sistema 1.1. Dispositivos de medición !$ ) ! "# %&'( * &+,, Tabla 1. Recursos correspondientes a los dispositivos de medición 1.2. Dispositivos de control ) - Tabla 2. Recursos correspondientes a los dispositivos de control 1.3. Otros ) ./012/2 3 !4-. ./,5 67 12/8,9 67 :.,, " -.7 66!$%:/-'(- Tabla 3. Recursos correspondientes a otros elementos del sistema Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 3 2. Software del sistema 2.1. Software requerido .3; 12/6.3; *<558 *9 ϯϮϬ Tabla 4. Recursos correspondientes al software utilizado 2.2. Diseño de librerías 'LVHxRGH/LEUHUtDV +RUDVGHWUDEDMR 'ULYHUB*3,% (UURUBKDQGOH 'ULYHUBJSLEBDJLOD 'ULYHUBJSLEBKSD 'ULYHUBJSLEBKSD 'ULYHUBJSLEBNLNXSO]X 'ULYHUBUVBWHNWWSV 6HFXHQFLDGHWHVW9HULILFDFLyQ&RQYHUWLGRU +25$6727$/(6 Tabla 5. Recursos correspondientes al diseño de las librerías del sistema 3. Formación del usuario 3.1. Manuales y Cursos >A B3 *6'<5 6 *6'849 Tabla 6. Recursos correspondientes al material formativo para futuros usuarios Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 4 Capítulo 2 Precios unitarios Esta parte del presupuesto recogerá el precio de cada uno de los recursos que participan en la composición y construcción del sistema de test. 1. Componentes del sistema 1.1. Dispositivos de medición 'LVSRVLWLYRVGHPHGLFLyQ )XHQWHGHDOLPHQWDFLyQ 0XOWtPHWUR (VFDQHU 0yGXORFDUJDGLQiPLFD 2VFLORVFRSLR 0RGHOR +3$ +3D $JLOHQWD .LNXVXL3/=X 7HNWURQL[ 3UHFLR8QLGDG € € € € € Tabla 7. Precios unitarios correspondientes a los dispositivos de medición 1.2. Dispositivos de control 'LVSRVLWLYRVGHFRQWURO 2UGHQDGRU 0RGHOR 3UHFLR8QLGDG € Tabla 8. Precios unitarios correspondientes a los dispositivos de control 1.3. Otros 2WURV 86%*3,%,QWHUIDFH+LJK6SHHG86% &DEOH*3,%P &DEOH56GHSLQHV'6XE &DUFDVDSDUD&DUJD'LQiPLFD.5%3/=) 3UHFLR8QLGDG € € € € Tabla 9. Precios unitarios correspondientes a otros elementos del sistema Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 5 2. Software del sistema 2.1. Software requerido 6RIWZDUH *3,%&RPXQLFDWLRQ6RIWZDUH 7FO$FWLYH7FO &RVWHSRUOLFHQFLD /LEUHGLVWULEXFLyQ /LEUHGLVWULEXFLyQ Tabla 10. Precios unitarios correspondientes al software utilizado 2.2. Diseño de librerías 'LVHxRGHOLEUHUtDV 'ULYHUB*3,% (UURUBKDQGOH 'ULYHUBJSLEBDJLOD 'ULYHUBJSLEBKSD 'ULYHUBJSLEBKSD 'ULYHUBJSLEBNLNXSO]X 'ULYHUBUVBWHNWWSV 6HFXHQFLDGHWHVW9HULILFDFLyQ&RQYHUWLGRU &RVWH€KRUD &RVWH KRUD € € € € € € € € Tabla 11. Precios unitarios correspondientes al diseño de las librerías del sistema 3. Formación del usuario 3.1. Manuales y Cursos $SUHQGL]DMH\IRUPDFLyQ 0DQXDOGHXVXDULR7&/ &XUVRGHLQWURGXFFLyQD7&/K &RVWH € € Tabla 12. Precios unitarios correspondientes al material formativo para futuros usuarios Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 6 Capítulo3 Nph\nk\m^d\g`n Sumando los precios unitarios de cada recurso por su cantidad, se obtiene el precio unitario de cada recurso: 1. Componentes del sistema 1.1. Dispositivos de medición 'LVSRVLWLYRVGHPHGLFLyQ )XHQWHGHDOLPHQWDFLyQ 0XOWtPHWUR (VFDQHU 0yGXORFDUJDGLQiPLFD 2VFLORVFRSLR 0RGHOR +3$ +3D $JLOHQWD .LNXVXL3/=X 7HNWURQL[ 3UHFLR8G € € € € € 8QLGDGHV 727$/ &RVWHWRWDO € € € € € € Tabla 13. Sumas parciales correspondientes a los dispositivos de medición 1.2. Dispositivos de control 'LVSRVLWLYRVGHFRQWURO 2UGHQDGRU 0RGHOR 3UHFLR8G € 8QLGDGHV 727$/ &RVWHWRWDO € € Tabla 14. Sumas parciales correspondientes a los dispositivos de control 1.3. Otros 2WURV 86%*3,%,QWHUIDFH+LJK6SHHG86% &DEOH*3,%P &DEOH56GHSLQHV'6XE &DUFDVDSDUD&DUJD'LQiPLFD.5%3/=) 3UHFLR8G € € € € 8QLGDGHV 727$/ &RVWHWRWDO € € € € € Tabla 15. Sumas parciales correspondientes a otros elementos del sistema Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 7 2. Software del sistema 2.1. Software requerido 6RIWZDUH 8QLGDGHV *3,%&RPXQLFDWLRQ6RIWZDUH 7FO$FWLYH7FO &RVWHSRUOLFHQFLD /LEUHGLVWULEXFLyQ /LEUHGLVWULEXFLyQ 727$/ € Tabla 16. Sumas parciales correspondientes al software utilizado 2.2. Diseño de librerías 'LVHxRGHOLEUHUtDV 'ULYHUB*3,% (UURUBKDQGOH 'ULYHUBJSLEBDJLOD 'ULYHUBJSLEBKSD 'ULYHUBJSLEBKSD 'ULYHUBJSLEBNLNXSO]X 'ULYHUBUVBWHNWWSV 6HFXHQFLDGHWHVW9HULILFDFLyQ&RQYHUWLGRU +RUDV 3UHFLR€K 3UHFLR K € € € € € € € € 727$/ &RVWH7RWDO € € € € € € € € € Tabla 17. Sumas parciales correspondientes al diseño de las librerías del sistema 3. Formación del usuario 3.1. Manuales y Cursos $SUHQGL]DMH\IRUPDFLyQ 0DQXDOGHXVXDULR7&/ &XUVRGHLQWURGXFFLyQD7&/K 8QLGDGHV 727$/ 3UHFLR € € € Tabla 18. Sumas parciales correspondientes al material formativo para futuros usuarios Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 8 Capítulo 4 Presupuesto general Esta última parte del presupuesto recoge la suma de todos los costes unitarios del proyecto en una única tabla, obteniéndose así los costes totales del proyecto: 1. Costes totales del proyecto &RQFHSWR 'LVSRVLWLYRVGHPHGLFLyQ 'LVSRVLWLYRVGHFRQWURO 2WURV 6RIWZDUH 'LVHxRGHOLEUHUtDV $SUHQGL]DMH\IRUPDFLyQ 727$/ 3UHFLR € € € € € € € Tabla 19. Sumas parciales correspondientes a los dispositivos de medición Metodología aplicada a la creación de un sistema de test mediante librerías TCL Pablo Calvo Báscones 9