使用 stateflow 图设计人机界面逻辑 -凯发k8网页登录
此示例说明如何在独立 stateflow® 图中对图形用户界面的逻辑建模。独立图使用 matlab® 作为动作语言来实现经典图语义。您可以使用 matlab 的全部功能对图进行编程,包括那些仅限于在 simulink® 中进行代码生成的函数。有关详细信息,请参阅create stateflow charts for execution as matlab objects。
您可以通过调用其输入事件并使用时序运算符来执行独立 stateflow 图。事件驱动和计时器驱动的执行工作流适用于设计人机界面 (hmi) 和图形用户界面 (ui) 的基础逻辑。
当您使用 matlab app 设计工具时,来自界面小组件的回调函数会调用图中的事件。
在 stateflow 图中,时序运算符和局部数据控制用户界面的属性。
有关如何使用 matlab 创建图形用户界面的详细信息,请参阅使用 app 设计工具开发 app。
控制 app 设计工具用户界面
此用户界面包含控制信号灯的开关。当开关处于 on 位置时,根据 mode(模式)选项按钮的位置,信号灯以 solid(常亮)或 blinking(闪烁)两种模式之一亮起。您可以通过移动 blink rate(闪烁速率)滑块来控制闪烁的速率。要启动 app,请在 app 设计工具的工具条中,点击运行。
文件 sf_lamp_logic.sfx
定义实现用户界面逻辑的独立 stateflow 图。该图包含输入事件(on
、off
、blinking
和 solid
)与局部数据(delay
和 app
)。图中的动作控制在每个状态下可以访问哪些小组件。例如,在 off
状态下的动作会导致用户界面中的信号灯小组件、mode 选项按钮和 blink rate 滑块灰显。
在 on
状态下,子状态 solid
和 blinking
表示两种工作模式。为了实现闪烁的信号灯,图依赖时序逻辑运算符 。当图进入状态
blinking.off
时,出向转移上的表达式 after(delay,sec)
创建一个 matlab 计时器对象,该对象在几秒后执行图。然后,图转移到状态 blinking.on
,并创建另一个计时器对象来触发返回到 blinking.off
的转移。当图在这两种状态之间不断转移时,您可以通过更改局部数据延迟的值来调整闪烁的速率,或通过调用输入事件 solid
或 off
来退出闪烁模式。
处于 on
状态的历史结点保留最近的激活子状态的信息,以便当您打开信号灯时用户界面返回到先前的工作模式。
使用事件执行独立图
您可以通过在 matlab 命令行窗口中调用其输入事件函数来执行独立图。stateflow 编辑器通过图动画突出显示激活状态和转移来显示每个命令的效果。
1.创建图对象 l
并将 delay
的值初始化为 0.5。此值对应于每秒闪烁一次的闪烁速率(保持 on 状态 0.5 秒,保持 off 状态 0.5 秒)。
l = sf_lamp_logic(delay=0.5);
2.打开信号灯。
on(l)
3.切换到闪烁模式。
blinking(l)
4.将 delay
的值设置为 0.25。此值对应于每秒闪烁两次的闪烁速率(保持 on 状态 0.25 秒,保持 off 状态 0.25 秒)。
l.delay = 0.25;
5.切换到常亮模式。
solid(l)
6.关闭信号灯。
off(l)
7.从 matlab 工作区中删除图对象 l
。
delete(l)
将独立图连接到用户界面
要在用户界面和独立 stateflow 图之间建立双向连接,请打开 app 设计工具窗口并选择代码视图。
1.在 app 设计工具窗口中,创建一个私有属性 lamplogic
来存储 stateflow 图对象的句柄。
properties (access = private)
lamplogic
end
2.创建一个 startupfcn
回调函数,该函数创建图对象并将其局部数据 app
设置为用户界面句柄。将该图对象句柄赋给 lamplogic
私有属性。
function startupfcn(app) app.lamplogic = sf_lamp_logic(delay=0.5,app=app); end
3.创建一个 closerequestfcn
回调函数,它在您关闭用户界面时删除图对象。
function uifigurecloserequest(app, event) delete(app.lamplogic); delete(app); end
4.对于每个用户界面小组件,添加一个回调函数来对独立图调用适当事件。
开关小组件的
valuechangedfcn
回调函数:
function switchvaluechanged(app, event) value = app.switch.value; switch lower(value) case "off" off(app.lamplogic); case "on" on(app.lamplogic); end end
mode 按钮小组件的
selectionchangedfcn
回调函数:
function modebuttongroupselectionchanged(app, event) selectedbutton = app.modebuttongroup.selectedobject; if selectedbutton == app.solidbutton solid(app.lamplogic); else blinking(app.lamplogic); end end
blink rate 滑块小组件的
valuechangedfcn
回调函数:
function blinkrateslidervaluechanged(app, event) app.lamplogic.delay = round(0.5/app.blinkrateslider.value,2); end
当您运行用户界面时,您可以观察在图画布和信号灯小组件上调整控件小组件的效果。