main content

使用 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 图。该图包含输入事件(onoffblinkingsolid)与局部数据(delayapp)。图中的动作控制在每个状态下可以访问哪些小组件。例如,在 off 状态下的动作会导致用户界面中的信号灯小组件、mode 选项按钮和 blink rate 滑块灰显。

on 状态下,子状态 solidblinking 表示两种工作模式。为了实现闪烁的信号灯,图依赖时序逻辑运算符 。当图进入状态 blinking.off 时,出向转移上的表达式 after(delay,sec) 创建一个 matlab 计时器对象,该对象在几秒后执行图。然后,图转移到状态 blinking.on,并创建另一个计时器对象来触发返回到 blinking.off 的转移。当图在这两种状态之间不断转移时,您可以通过更改局部数据延迟的值来调整闪烁的速率,或通过调用输入事件 solidoff 来退出闪烁模式。

处于 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

当您运行用户界面时,您可以观察在图画布和信号灯小组件上调整控件小组件的效果。

另请参阅

相关主题

网站地图