Diseñar una lógica de interfaz persona-máquina utilizando gráficos de Stateflow
Este ejemplo muestra cómo modelizar la lógica de una interfaz de usuario gráfica en un gráfico de Stateflow® independiente. 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.
Puede ejecutar un gráfico de Stateflow independiente invocando sus eventos de entrada y utilizando operadores temporales. El flujo de trabajo de ejecución basado en eventos y en el temporizador es adecuado para diseñar la lógica que subyace a las interfaces persona-máquina (HMI) y a las interfaces de usuario (IU) gráficas.
Cuando utiliza MATLAB App Designer, las funciones de callback de los widgets de la interfaz invocan eventos en el gráfico.
En el gráfico de Stateflow, los operadores temporales y los datos locales controlan las propiedades de la interfaz de usuario.
Para obtener más información sobre cómo usar MATLAB para crear interfaces de usuario gráficas, consulte Desarrollar apps mediante App Designer.
Controlar una interfaz de usuario de App Designer
Esta interfaz de usuario incluye un interruptor de encendido y apagado que controla una lámpara. Cuando el interruptor se encuentra en la posición de encendido, la lámpara se ilumina en uno de los dos modos, fija o parpadeante, según la posición del botón de opción Mode. Puede controlar la velocidad de parpadeo moviendo el control deslizante Blink Rate (Velocidad de parpadeo). Para iniciar la aplicación, en la barra de herramientas de App Designer, haga clic en Run.
El archivo sf_lamp_logic.sfx
define un gráfico de Stateflow independiente que implementa la lógica de la interfaz de usuario. El gráfico tiene eventos de entrada (ON
, OFF
, BLINKING
y SOLID
) y datos locales (delay
y app
). Las acciones del gráfico controlan a qué widgets es posible acceder desde cada estado. Por ejemplo, las acciones del estado Off
hacen que el widget Lamp, los botones de opción Mode y el control deslizante Blink Rate aparezcan atenuados en la interfaz de usuario.
En el estado On
, los subestados Solid
y Blinking
expresan los dos modos de funcionamiento. Para implementar una lámpara parpadeante, el gráfico se basa en el operador de lógica temporal after
. Cuando el gráfico adopta el estado Blinking.Off
, la expresión after(delay,sec)
de la transición saliente crea un objeto temporizador de MATLAB que ejecuta el gráfico a tras un número concreto de segundos. Después, el gráfico cambia al estado Blinking.On
y crea otro objeto temporizador para activar la transición que la devuelve al estado Blinking.Off
. Mientras que el gráfico cambia entre ambos estados de forma continua, puede ajustar la velocidad de parpadeo modificando el valor del retardo de datos locales o la transición de salida del modo de parpadeo invocando los eventos de entrada SOLID
u OFF
.
La intersección histórica del estado On
conserva la información del subestado activo más reciente, de forma que la interfaz de usuario regresa al modo de funcionamiento anterior cuando enciende la lámpara.
Ejecutar un gráfico independiente utilizando eventos
Puede ejecutar el gráfico independiente llamando a sus funciones de eventos de entrada en la ventana de comandos de MATLAB. El editor de Stateflow muestra los efectos de todos los comandos resaltando los estados activos y las transiciones mediante la animación del gráfico.
1. Cree el objeto de gráfico L
e inicialice el valor de delay
en 0.5. Dicho valor se corresponde con una velocidad de un parpadeo por segundo (activado durante 0.5 segundos y desactivado durante 0.5 segundos).
L = sf_lamp_logic(delay=0.5);
2. Encienda la lámpara.
ON(L)
3. Seleccione el modo de parpadeo.
BLINKING(L)
4. Establezca el valor de delay
en 0.25. Dicho valor se corresponde con una velocidad de dos parpadeos por segundo (activado durante 0.25 segundos y desactivado durante 0.25 segundos).
L.delay = 0.25;
5. Seleccione el modo continuo.
SOLID(L)
6. Apague la lámpara.
OFF(L)
7. Elimine el objeto de gráfico L
del espacio de trabajo de MATLAB.
delete(L)
Conectar un gráfico independiente a la interfaz de usuario
Para establecer una conexión bidireccional entre la interfaz de usuario y el gráfico de Stateflow independiente, abra la ventana App Designer y seleccione Code View.
1. En la ventana App Designer, cree una propiedad privada lampLogic
para guardar el identificador del objeto de gráfico de Stateflow.
properties (Access = private)
lampLogic
end
2. Cree una función de callback StartupFcn
que cree el objeto de gráfico y establezca sus datos locales app
en el indicador de la interfaz de usuario. Asigne el identificador del objeto de gráfico a la propiedad privada lampLogic
.
function StartupFcn(app) app.lampLogic = sf_lamp_logic(delay=0.5,app=app); end
3. Cree una función de callback CloseRequestFcn
que elimine el objeto de gráfico cuando cierre la interfaz de usuario.
function UIFigureCloseRequest(app, event) delete(app.lampLogic); delete(app); end
4. Añada una función de callback que invoque el evento adecuado en el gráfico independiente en cada uno de los widgets de la interfaz de usuario.
Función de callback
ValueChangedFcn
para el widget Switch (Interruptor):
function SwitchValueChanged(app, event) value = app.Switch.Value; switch lower(value) case "off" OFF(app.lampLogic); case "on" ON(app.lampLogic); end end
Función de callback
SelectionChangedFcn
para el widget Mode Button (Botón de modo):
function ModeButtonGroupSelectionChanged(app, event) selectedButton = app.ModeButtonGroup.SelectedObject; if selectedButton == app.SolidButton SOLID(app.lampLogic); else BLINKING(app.lampLogic); end end
Función de callback
ValueChangedFcn
para el widget Blink Rate Slider (Control deslizante de velocidad de parpadeo):
function BlinkRateSliderValueChanged(app, event) app.lampLogic.delay = round(0.5/app.BlinkRateSlider.Value,2); end
Cuando ejecute la interfaz de usuario podrá observar los efectos que tiene ajustar los widgets de control en el área de trabajo del gráfico y en el widget de la lámpara.