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
yn
son datos locales utilizados por el algoritmo para contar cambio.textWidth
yquietMode
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 índicei
.
El subestado
move_down
cambia algunas monedas con el valor especificado por el índicei
por monedas del menor valor. Después,move_up
cambia algunas monedas del menor valor por una moneda del valor especificado por el índicei+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)
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 localchartObj
que implementa el algoritmo para contar cambio para el valor de entradax
.
Execute
llama a la funciónstep
para ejecutar el gráfico independiente y almacena el resultado como los datos de salidatally
.
Finish
muestra los resultados del algoritmo en la ventana de Diagnostic Viewer y establece el valor de los datos de salidadone
entrue
.
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 tipoInherit: From definition in chart
.
Antes de crear un objeto de gráfico, el estado
Initialize
debe llamar a la funcióncoder.extrinsic
para declararsf_change
como una función extrínseca restringida para la generación de código en Simulink. Consulte Llamar a funciones de MATLAB extrínsecas en gráficos de Stateflow.
Los estados
Execute
yFinish
deben acceder a los datos locales para el gráfico independiente llamando a la funciónget
.
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 tipoml
.
El estado
Initialize
debe llamar a la funciónml
para crear el objeto de gráfico.
Los estados
Execute
yFinish
debe utilizar el operador de espacio de nombresml
para acceder a las funcionesstep
,get
ydispl
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