2011-03-11 10 views
8

Tengo un modelo Simulink que se está ejecutando actualmente desde un script (es decir, no una función). El script escribe valores variables en el espacio de trabajo de MATLAB, ejecuta la simulación del modelo (que usa estos valores) y luego el modelo escribe valores adicionales en el espacio de trabajo. Si trato de convertir el script en una función (es decir, colocando function [output] = runSim() en la parte superior del archivo), Simulink se queja de que no conoce las variables, presumiblemente porque no están en el espacio de trabajo de MATLAB, sino que están en el alcance de la función.Cómo proporciono entrada a un modelo Simulink sin colocarlo en el área de trabajo

¿Existe una manera elegante de proporcionar un modelo Simulink con entradas y tomar salidas de un modelo Simulink que no sea pegarlas en el área de trabajo?

Respuesta

9

No es obvio, pero puede ingresar o enviar datos desde el comando sim() y el espacio de trabajo de una función de llamada. Lo he hecho antes de que & tenga un ejemplo en el trabajo, pero no puedo llegar hasta el lunes para verificarlo. Sin embargo, pruebe la solución correspondiente on Mathworks's site:

Solución:

Al utilizar parámetros variables máscara en Simulink, el espacio de trabajo de base es el espacio de trabajo por defecto de la fuente Simulink. Sin embargo, al usar el comando SIMSET, , este espacio de trabajo se puede cambiar. SIM es y luego se utiliza con esta estructura de opciones creada por SIMSET. El siguiente es un ejemplo de sobre cómo hacer esto.

options = simset('SrcWorkspace','current'); 
    sim('modelname',[],options) 

... aunque al parecer esto quedó en desuso en R2009b debido a la incompatibilidad con el Parallel Computing Toolbox> :(Parece que la solución correcta es empujar explícitamente variables en el modelo de espacio de trabajo de la simulación (diferentes que el espacio de trabajo base), usando assignin().

http://www.mathworks.com/matlabcentral/newsreader/view_thread/292544

tiene 2 opciones:

  1. Para versiones anteriores, R2009b vistazo a la documentación SIMSET. Le permite establecer la propiedad "SrcWorkspace" en "current" para usar los datos de su función .

http://www.mathworks.com/support/solutions/en/data/1-1BWDA/?solution=1-1BWDA

  1. En las versiones más recientes, esta opción es obsoleto porque no es compatible con el Parallel Computing Toolbox y parfor. Lo que recomiendo es:

http://www.mathworks.com/support/solutions/en/data/1-ASPEIV/?solution=1-ASPEIV

+0

¿Funcionaría este método para referencias de modelos y compilación con RTW? – Miebster

+0

que tendrías que preguntarle a la gente de Mathworks; Nunca he usado RTW, o lo he profundizado en Simulink aparte de ejecutar simulaciones desde un archivo M. –

+0

La primera opción funciona en 2009a ... así que solo me quedaré con eso hasta que me muerda. ¡Gracias! – JnBrymn

0

Respuesta corta: No.

podría estar equivocado, pero te voy a dar algunos antecedentes. Trabajo en un modelo Simulink que es muy grande, hemos estado trabajando en él durante años. Hasta el día de hoy todavía cargamos todas las variables necesarias en el espacio de trabajo. Esta ha sido una queja mía durante mucho tiempo, tanto que MathWorks incluso ha abordado el problema al proporcionar la función Simulink.save_vars. Parece que ya está configurando variables con un script/función, por lo que Simulink.save_vars no le servirá de mucho.

Puede limpiar el espacio de trabajo utilizando estructuras para algunas de las variables, la mayoría de los bloques Simulink no admiten estructuras, pero algunos sí. Además, evite poner cualquier cosa en el espacio de trabajo que no sean las variables que su modelo necesita.

+0

¿De verdad ?! Aw ... vómito. – JnBrymn

+1

-1 porque lo he hecho. –

2

Puede usar la función evalin() para ejecutar desde su propia función una expresión MATLAB (como una cadena) en un espacio de trabajo específico, en su caso la 'base' para que SIMULINK pueda encontrarlas. Sin embargo, si no desea utilizar el espacio de trabajo directamente, puede cargar y guardar las señales o variables de/a archivos MAT utilizando los bloques De/A Archivo.

0

Bueno, yo no sé cómo hacerlo de una función simple, pero es muy práctico hacerlo desde dentro de una función de clase (método). Funciona bien con la versión 2009b.

Coloque el código en el archivo Test.m:

classdef Test < handle 
    properties 
     mdl 
     % Default input signal 
     t = [0 1 1 2]' 
     u = [0 0 1 1]' 
    end 

    methods 
     function this = Test(mdl) % Constructor 
      this.mdl = mdl; 
     end 

     function sim(this) 
      % Load model 
      load_system(this.mdl); 
      % Prepare model configuration 
      conf = getActiveConfigSet(this.mdl); 
      cs = conf.copy(); 
      set_param(cs, 'StopTime', '4'); 
      set_param(cs, 'LoadExternalInput', 'on'); 
      set_param(cs, 'ExternalInput', '[test.t test.u]'); % <-- 1 
      % Run simulation 
      simout = sim(this.mdl, cs); 
      % Plot results 
      tout = simout.find('tout'); 
      yout = simout.find('yout'); 
      plot(tout, yout(:,1), 'b--'); 
     end 
    end 
end 

A continuación, sólo:

>> test = Test('TestSim'); 
>> test.sim(); 

¿Qué ocurre? Usted crea prueba de objeto, que tiene campos definidos t y u. Luego, en el método sim() le dice a Simulink que busque la entrada '[test.t test.u]'. Tanto Simulink como el método sim() tienen acceso a estas variables (creo que esto es lo más importante).

OK todavía tiene una gran desventaja que está marcada con el número 1. Tiene que saber explícitamente cómo se nombrará una referencia a la instancia de clase en el espacio de trabajo ('prueba' en este caso). Puede solucionarlo pasando el nombre en un constructor, o puede usar variables y métodos estáticos, pero de esta manera no le permitirá cambiar la señal de entrada de forma dinámica.

+0

Hmm, esto parece elegante al principio, pero estoy bastante seguro de que el objeto Test todavía tendría que estar en el espacio de trabajo base, por lo que esto simplemente cambia la ubicación del problema del OP. Además, un consejo: tenga cuidado al nombrar las cosas "XXXXtest" o "textXXXX": se encontrará con problemas con el framework unittest, que seleccionará los archivos de clases nombrados de esta manera como casos de prueba unitaria. – thclark

Cuestiones relacionadas