Aplicación de MATLAB / Simulink con equipos fabricados por InSys JSC

Una tarea práctica importante es el uso de Matlab / Simulink con equipos reales que le permitirán recibir una señal del mundo real. Esto es muy útil para depurar algoritmos. Este documento presenta la tecnología para conectar dispositivos ADC fabricados por InSys JSC a Simulink. Se utiliza una DLL para conectarse, que es visible en Simulink como un componente sm_adc. Se utiliza un programa de consola separado para trabajar con el equipo. La comunicación con la DLL es a través de la memoria compartida. Según esta tecnología, se puede conectar cualquier ADC en cualquier módulo de carga de InSys JSC. El trabajo presenta un sistema de un generador A7_DAC y un módulo de adquisición FMC128E / FM412x500M.

Este trabajo se demostró en la conferencia "Tecnologías para el desarrollo y la depuración de sistemas técnicos complejos" del 27 al 28 de marzo de 2018.





Declaración del problema.

Requiere el desarrollo de un sistema a partir de un generador de señal y un ADC que generará una señal con los parámetros dados y la digitalizará. Los datos recibidos deben transferirse a Simulink para su procesamiento.

Equipo

Para el trabajo, se montó un soporte desde el módulo ADC y el generador. Como ADC, se utiliza el submódulo FM412x500M en el que hay cuatro canales ADC con una frecuencia de muestreo de 500 MHz. El submódulo está instalado en el módulo de soporte FMC128E en el que hay un Artix 7 FPGA y una interfaz USB 3.0. Ambos dispositivos están conectados a una computadora portátil con Simulink. Para controlar el rendimiento, por supuesto, se utiliza un osciloscopio.

Apariencia del stand:



Diagrama estructural del stand:



Señal generada:



El algoritmo del stand:

  1. Simulink se prepara para lanzar el ADC y el generador
  2. Simulink indica al generador que comience
  3. El generador forma una luz estroboscópica (señal amarilla) y la señal real (azul)
  4. ADC en el frente de la puerta comienza a recopilar datos
  5. El ADC recoge la matriz y se la pasa a Simulink
  6. Simulink muestra la señal recibida del ADC


Este es un modo clásico de recolección única. Su peculiaridad es precisamente la soltería. El equipo a lo largo del frente de la señal recopila una matriz de datos dada. La fase de recopilación de datos ocurre en el modo de "tiempo real duro", pero el procesamiento es cómo obtenerla. La velocidad de recopilación está determinada por el número de canales seleccionados y la frecuencia de muestreo. Para cuatro canales ADC y una frecuencia de muestreo de 500 MHz, la velocidad de datos es de 4 GB / s. A esta velocidad, los datos se pueden escribir en el SODIMM del FMC128E. Es decir, se puede guardar una muestra de 4 GB.

Además, los datos deben transferirse a la computadora. El módulo FMC128E está conectado a la computadora a través de la interfaz USB 3.0. La velocidad de transferencia de datos es de 300 MB / s.

Simulink recibe una serie de datos y los pasa para su posterior procesamiento. El tiempo para este procesamiento ya está determinado por la complejidad del modelo. En este ejemplo, la matriz simplemente se muestra en el panel del osciloscopio.

En algún momento, Simulink decide que es necesario llevar a cabo el siguiente ciclo y todo se repite. Nuevamente, se envían comandos USB para preparar el ADC, iniciar el generador y recopilar datos.

Este modo es muy conveniente para depurar hardware y algoritmos. No puedes apresurarte a ninguna parte. Recopilar una matriz de datos. Puede mirarlo con calma, grabarlo en un disco y tomar café. Pero cuando todo está resuelto, entonces ya es posible cambiar a un modo de recopilación continua.

Conexión DLL

Matlab le permite conectar funciones implementadas en archivos DLL externos. Simulink también tiene la capacidad de conectar archivos DLL externos, mientras agrega algunos requisitos. Dentro de Simulink, la DLL externa se parece a un bloque S-Function.



MATLAB proporciona una gran cantidad de ejemplos, incluida la creación de archivos DLL externos. Sin embargo, el método que ofrece MATLAB no es muy conveniente. Hay un proyecto OpenSource easyLink . Este proyecto ha desarrollado una biblioteca de clase para conectarse a Simulink.

Para crear un componente, debe crear una clase derivada de BaseBlock y declarar puertos:





Problemas de conexión de DLL

Las DLL externas permiten mucho, pero hay una serie de problemas al trabajar con ellas. Los más significativos para mí personalmente son los siguientes:

  1. La depuración de DLL es difícil
  2. Es incómodo ver la salida de printf ()
  3. Recompilar una DLL requiere salir de MATLAB

Al depurar un programa, se requiere una depuración paso a paso. En el caso de una DLL, es posible conectarse a una DLL ya cargada en la memoria, asignar un punto de interrupción allí y realizar una sesión de depuración. Pero es necesario aprovechar el momento de cargar la DLL a través de Simulink, de alguna manera retrasar el inicio del trabajo. Todo esto se puede hacer, pero es inconveniente.

En el proceso, realmente quiero ver la salida de depuración que se forma como un flujo estándar estándar. En el caso de la DLL, este hilo de alguna manera puede ser interceptado, pero no tuve éxito.

Y, por último, el inconveniente más importante es la necesidad de salir de MATLAB al volver a compilar la DLL. De lo contrario, simplemente no puede escribir un nuevo archivo. Y la salida y posterior lanzamiento de MATLAB lleva mucho tiempo.

Para resolver estos problemas, hay una forma clásica de construir sistemas de software complejos. Esta es la interacción entre programas a través de la memoria compartida.

Conexión de memoria compartida

Los sistemas operativos modernos, tanto Windows como Linux, le permiten organizar áreas comunes de memoria. Esto le permite crear programas confiables. Por ejemplo, un programa puede contener una interfaz gráfica e interactuar con el operador, y otro programa puede interactuar con el equipo. En este caso, la congelación del programa que interactúa con el equipo no conducirá a la congelación del programa de interacción con el operador. En el caso de Simulink, este enfoque también ofrece algunas ventajas. El programa para trabajar con el equipo se iniciará una vez, preparará el equipo y esperará el comando a través de la memoria compartida. La DLL se cargará cada vez que ejecute Simulink en la simulación. Dado que la DLL no funciona directamente con el hardware, este lanzamiento será rápido.

Se han desarrollado dos programas y dos DLL para este stand:

  1. simulink_a7dac - programa de control del generador
  2. simulink_adc - programa de control ADC
  3. sm_ctrl - DLL de control del generador
  4. sm_adc - DLL de control de ADC


El diagrama de bloques se presenta en la figura a continuación:



El programa simulink_adc se basa en la biblioteca Bardy. Este programa le permite trabajar con cualquier ADC fabricado por InSys JSC. La sintonización de un ADC específico y un módulo portador se realiza mediante archivos de inicialización.

Vista de esquema en Simulink

Y finalmente, cómo se ve dentro de Simulink:



Todo se ve como está en Simulink. Una unidad para control ADC. El segundo bloque para controlar el generador. Hay varios parámetros disponibles para controlar el generador. Para el ADC, todo es a través del archivo de inicialización. Si es necesario, también se pueden mostrar varios parámetros de ADC a nivel de bloque.

Tenga en cuenta los dos osciladores maestros. En términos de tiempo de modelo, especifican la hora de inicio y el momento de la recopilación de datos. Estos puntos son muy importantes. De hecho, establecen la conexión entre el modelo y el mundo real. La señal de inicio ingresa al bloque ADC, se procesa en la DLL. A través de la memoria compartida, ingresa al programa ADC. Luego se convierte en una secuencia de comandos de escritura en los registros, que a través de USB ingresan al FPGA. Y dentro del FPGA, el borde frontal de búsqueda de la señal de inicio está armado. Y solo después de que la máquina se arma en la dirección opuesta, la confirmación pasa por la misma cadena. Cuando la confirmación llegue a Simulink, la señal start_out aparecerá en la salida del bloque sm_adc, que pasará al bloque sm_ctrl. Y será todo el mismo momento de tiempo modelo. En el bloque sm_ctrl, a lo largo de la misma cadena, la señal se transmitirá a la FPGA del generador y formará la señal. El ADC capturará esta señal en su memoria. Se generará una señal de adquisición de datos desde el segundo oscilador maestro. Del mismo modo, los datos van a Simulink y van a la salida de datos del bloque sm_adc. Por el momento, se devuelve un bloque de 16384 recuentos. El bloque recibido se muestra en el osciloscopio.



Resultados

Se ha demostrado que el trabajo a través de la memoria compartida es efectivo. El programa de administración de ADC le permite trabajar con cualquiera de nuestros ADC. Al mismo tiempo, queda una forma conveniente de configurar los parámetros a través del archivo de configuración. El programa está diseñado como una aplicación de consola, mientras que todos los resultados de depuración son visibles. Hay una indicación de operabilidad. El componente SM_CTRL le permite conectar varias aplicaciones externas para controlar equipos. La depuración del programa de control ADC no causa ninguna dificultad. Este es un programa común donde puede establecer puntos de interrupción y depuración. Usando la misma tecnología, se pueden desarrollar otros programas para la interacción entre Matlab / Simulink y el mundo exterior.

El trabajo se publica en el sitio hub.exponenta.ru ;

Referencias
  1. Proyecto SIMULINK_SM - código fuente del programa: https://github.com/dsmv/simulink_sm
  2. Proyecto EasyLink: https://sourcesup.renater.fr/frs/?group_id=1500
  3. Módulo portador FMC128E http://insys.ru/fmc/fmc128e
  4. Submódulo FM412x500M http://insys.ru/mezzanine/fm412x500m
  5. Canal de Telegram InSys Research

Source: https://habr.com/ru/post/470327/


All Articles