Contenido principal

Ejecutar los objetos de un gráfico de Stateflow mediante scripts y modelos

Un gráfico independiente de Stateflow® es una clase de MATLAB® que define el comportamiento de una máquina de estado finito. Los gráficos independientes implementan la semántica de gráfico clásica con MATLAB como lenguaje de acción. Puede programar el gráfico utilizando todas las funciones de MATLAB, incluidas aquellas funciones restringidas para la generación de código en Simulink®. Para obtener más información, consulte Create Stateflow Charts for Execution as MATLAB Objects.

Este ejemplo muestra cómo ejecutar un gráfico de Stateflow independiente mediante un script de MATLAB o un modelo de Simulink.

Contar configuraciones de cambio para una cantidad de dinero

El archivo sf_change.sfx define un gráfico de Stateflow independiente que cuenta diferentes configuraciones de cambio para una determinada cantidad de dinero. El gráfico contiene los siguientes objetos de datos:

  • x es la cantidad de dinero que se desea cambiar. El valor predeterminado es 100.

  • coinValues es un vector de denominación de monedas dispuestas en orden creciente. coinNames es un arreglo de los nombres de moneda correspondientes. Los valores predeterminados representan monedas estadounidenses estándar (peniques, monedas de 5 centavos, 10 centavos y 25 centavos).

  • tally es el número de configuraciones de cambio válidas.

  • tabula es un arreglo que contiene las diferentes configuraciones de cambio válidas.

  • chg, done, i y n son datos locales utilizados por el algoritmo para contar cambio.

  • textWidth y quietMode son datos locales que controlan cómo el gráfico muestra sus resultados.

El gráfico comienza con una posible configuración de cambio que consta exclusivamente de monedas de menor valor, especificadas por un índice de 1. En cada paso de ejecución, el estado exchange modifica esta configuración de una de las siguientes dos maneras:

  • El subestado move_up cambia algunas monedas del menor valor por una moneda de mayor valor, especificada por el índice i.

  • El subestado move_down cambia algunas monedas con el valor especificado por el índice i por monedas del menor valor. Después, move_up cambia algunas monedas del menor valor por una moneda del valor especificado por el índice i+1 o superior.

Una posible configuración de cambio es válida cuando el número de centavos representado por las monedas del menor valor es divisible por el valor de ese tipo de moneda. Cuando el gráfico encuentra una nueva configuración válida, incrementa tally y añade la nueva configuración a tabula.

Cuando no se pueden intercambiar más monedas, el estado stop se convierte en activo. Este estado imprime los resultados del cálculo, transforma el contenido de tabula en una tabla y establece el valor de done en true.

Ejecutar un gráfico independiente en un script de MATLAB

Para ejecutar el algoritmo para contar cambio hasta el final, debe ejecutar el gráfico independiente varias veces. Por ejemplo, el script de MATLAB sf_change_script.m crea un objeto de gráfico chartObj e inicializa el valor de los datos locales x en 27. La opción de configuración '-warningOnUninitializedData', que el script establece en false, elimina la advertencia de que tabula es un arreglo vacío en el nuevo objeto de gráfico. El bucle while ejecuta el gráfico hasta que los datos locales done se convierten en true. Finalmente, el script muestra el valor de tabula.

chartObj = sf_change('-warningOnUninitializedData',false,x=27);

while ~chartObj.done
    step(chartObj);
end

disp(chartObj.tabula)
Cuando se ejecuta este script, el gráfico independiente cuenta las configuraciones de cambio de 27 centavos utilizando monedas estadounidenses estándar:
sf_change_script
.............
There are 13 ways to make change for 27 cents.
    Pennies    Nickels    Dimes    Quarters
    _______    _______    _____    ________

      27          0         0         0    
      22          1         0         0    
      17          2         0         0    
      12          3         0         0    
       7          4         0         0    
       2          5         0         0    
      17          0         1         0    
      12          1         1         0    
       7          2         1         0    
       2          3         1         0    
       7          0         2         0    
       2          1         2         0    
       2          0         0         1    

Para contar configuraciones de cambio por una cantidad de dinero diferente, o para utilizar un sistema de divisa diferente, cambie los valores de x y coinValues. Por ejemplo, para utilizar la divisa británica, inicialice coinValues en [1 2 5 10 20 25 50].

Ejecutar un gráfico independiente utilizando modelos de Simulink

Puede ejecutar un gráfico de Stateflow independiente desde un modelo de Simulink. Por ejemplo, el modelo sf_change_model contiene dos gráficos de Stateflow que utilizan el gráfico independiente sf_change para contar configuraciones de cambio de 27 centavos en dos sistemas de divisa diferentes. Puede simular el modelo, pero las funciones que ejecutan el gráfico independiente no admiten la generación de código.

Cada gráfico contiene los siguientes estados:

  • Initialize crea un objeto de gráfico local chartObj que implementa el algoritmo para contar cambio para el valor de entrada x.

  • Execute llama a la función step para ejecutar el gráfico independiente y almacena el resultado como los datos de salida tally.

  • Finish muestra los resultados del algoritmo en la ventana de Diagnostic Viewer y establece el valor de los datos de salida done en true.

Cuando ambos gráficos alcanzan su respectivo estado Finish, la simulación del modelo se detiene y los bloques Display muestran los valores finales de los dos recuentos.

Ejecución usando MATLAB como lenguaje de acción

El gráfico MATLAB syntax utiliza MATLAB como lenguaje de acción. Para ejecutar el gráfico de Stateflow independiente, este gráfico debe seguir las siguientes directrices:

  • La variable local chartObj que contiene el identificador del objeto de gráfico debe tener el tipo Inherit: From definition in chart.

  • Los estados Execute y Finish deben acceder a los datos locales para el gráfico independiente llamando a la función get.

Cuando se simula este gráfico con una entrada de x = 27, el bloque Display Olde English muestra un recuento de 4. La ventana de Diagnostic Viewer muestra los siguientes resultados:

   Pennies    Shillings    Florins
   _______    _________    _______
     27           0           0
     15           1           0
      3           2           0
      3           0           1

Ejecución utilizando C como lenguaje de acción

El gráfico C syntax utiliza C como lenguaje de acción. Para ejecutar el gráfico de Stateflow independiente, este gráfico debe seguir las siguientes directrices:

  • La variable local chartObj que contiene el identificador del objeto de gráfico debe tener el tipo ml.

  • El estado Initialize debe llamar a la función ml para crear el objeto de gráfico.

  • Los estados Execute y Finish debe utilizar el operador de espacio de nombres ml para acceder a las funciones step, get y displ para ejecutar el gráfico independiente, acceder a sus datos locales y mostrar los resultados del algoritmo.

Para obtener más información, consulte Access MATLAB Functions and Workspace Data in C Charts.

Cuando simula este gráfico con una entrada de x = 27, el bloque Display Modern American muestra un recuento de 13. La ventana de Diagnostic Viewer muestra los siguientes resultados:

   Safety    FieldGoal    TouchDown
   ______    _________    _________
     12          1            0
      9          3            0
      6          5            0
      3          7            0
      0          9            0
     10          0            1
      7          2            1
      4          4            1
      1          6            1
      5          1            2
      2          3            2
      3          0            3
      0          2            3

Consulte también

Temas