Bienvenido al blog del noroeste de Mesopotamia! Aquí hablamos de todo:
Política, Dios, ciencia y tecnología, fe, Linux, Latex, Fails,etc.
Siéntase libre de comentar los artículos!

viernes, 16 de marzo de 2012

[How to] Comunicar Simulink y Matlab a través de una interfaz gráfica o a través del intérprete de órdenes

Seguramente muchos de mis estimados lectores han simulado alguna vez un sistema en Simulink, y lo más posible es que sientan que Simulink es una herramienta separada de Matlab, aislada que es poco sociable y que no se comunica con nadie.


Lo anterior no es cierto. Matlab permite, a través de su intérprete de órdenes, ajustar parámetros de bloques de un sistema hecho en Simulink, cargar sistemas, abrirlos sin la necesidad de abrir Simulink directamente y un laaaaaaaaaaaaaaaaaaaaargo etc. Solamente es cosa de tener un poquito de paciencia y darse el tiempo de probar como hacer estas cosas. Vayamos al grano.


Existen 4 instrucciones que son la base de cualquier ajuste por medio de la línea de comandos de Matlab.
  1. open_system('Nombre_del_sistema') : Esta instrucción abre el diagrama de bloques del sistema sin la necesidad de abrir Simulink directamente.
  2. load_system('Nombre_del_sistema') : Esta instrucción carga los datos necesarios del diagrama de bloques del sistema. Si se quiere establecer comunicación entre Matlab y Simulink es necesaria una de éstas 2 instrucciones.
  3. save_system : Guarda los cambios realizados en el sistema, ya sea por medio de la configuración de cada bloque o por medio de el intérprete de órdenes de Matlab. También se puede guardar la configuración de un sistema específico a través de save_system('Nombre_del_sistema').
  4. close_system : Cierra la ventana del diagrama de bloques del sistema en caso de haber sido abierta, o elimina los datos cargados por medio de load_system.
Ejecutando cualquiera de las primeras 2 instrucciones se tiene acceso a los datos del sistema hecho en Simulink. El acceso a cada bloque del diagrama del sistema se efectúa de una manera similar a como funcionan los directorios en Linux. Por ejemplo: Supongamos que el modelo del sistema se llama Prueba.mdl que contiene un escalón (Step) y un Scope (osciloscopio), entonces:


open_system('Prueba') %Abre el diagrama de bloques en la ventana correspondiente.
open_system('Prueba/Step') %Abre el diálogo de configuración del bloque escalón.
open_system('Prueba/Subsystem') %Abre el diagrama de bloques del subsistema en la ventana correspondiente, si existe. ETC,ETC.


Quizás ahora se preguntarán cómo ajustar los parámetros de algún bloque en particular. Cada bloque tiene un conjunto (GRANDE) de propiedades a través de las cuales se puede configurar cualquier aspecto del bloque. En este sentido existen 2 instrucciones básicas para su configuración:
  1. set_param('Nombre_del_sistema','Propiedad','Valor') : Esta instrucción permite ajustar una propiedad cualquiera de un bloque en particular. Si por ejemplo, se desea  mo-dificar el valor de una ganancia la instrucción que se debe emplear sería set_param('Nombre_Del_Sistema/Gain','Gain','Valor'), asumiendo que el nombre de la ganancia es Gain. Siempre el valor de la propiedad es un string y en caso de no saber las propiedades de cada bloque...
  2. get_param('Nombre_Del_Sistema','Propiedad') : Esta instrucción permite obtener el valor de una propiedad específica. En caso de no conocer las propiedades de un bloque se puede hacer lo siguiente: get_param('Nombre_del_sistema','ObjectParameters') y aparece una estructura de datos con todas las propiedades que posee el bloque o el sistema en estudio.
Ejemplo: Si queremos modificar el valor final del escalón se puede hacer de la siguiente manera:


load_system('Prueba'); %Carga los datos del modelo. Es fundamental.%
set_param('Prueba/Step','After','4.345'); %El valor final del escalón es 4.345%
save_system; %Si no se ejecuta esta instrucción es como no guardar ls cambios.%


Es importante mencionar que lo anteriormente expuesto sirve de igual manera, tanto en el intérprete de órdenes de Matlab o en una interfaz gráfica construida en GUIDE. Por ejemplo, si se tiene una interfaz gráfica se puede modificar la misma propiedad anterior a través de una caja de texto como sigue:


%asumimos que el modelo fue cargado cuando se levantó la interfaz%
function edit1_Callback(hObject,eventdata,handles)
%Comentarios... blabla%
set_param('Prueba/Step','After',get(hObject,'string'));
save_system;
%...%


La instrucción get(hObject,'string') devuelve el contenido de texto que fue ingresado en la caja edit1. También se puede reemplazar hObject por handles.edit1.


Espero que les sirva, abrazo.

5 comentarios:

  1. Hola Carlos!!!!!

    Muy buen aporte. Encontrar esta informacion por internet es muy dificil, no abunda la informacion relacionada con Matlab/Simulink en los foros. te pasaste, gracias el el pequeño tutorial.
    Sigue subiendo tutoriales relacionados con este tema.

    Saludos

    ResponderEliminar
  2. Hola!, disculpa deseo obtener el valor de un display de simulink desde matlab, pero no se en que parámetro se guarda dicho valor. Gracias!

    ResponderEliminar
    Respuestas
    1. hola amigo pudiste solucionar eso me podriar ayudar ...si pudiste solucionar tu problema

      Eliminar
  3. hola interesante he probado con una simple de 2 numeros enviando los datos del guide al simulink cuyo resultado se ve en simulnk pero quiero es mismo resulatdo aparesca en el guide tambien no lo he podido lograr

    ResponderEliminar

Ingresa un comentario