主要内容

Stateflow 图中集成 MATLAB 函数

为了在 Stateflow® 图中实现复杂算法,请使用 MATLAB® 函数。MATLAB 函数允许您在 Stateflow 图中结合 MATLAB 的数学能力。有关创建 MATLAB 函数的详细信息,请参阅通过定义 MATLAB 函数重用 MATLAB 代码

支持的函数类型

Stateflow 图可以调用以下 MATLAB 函数类型:

  • 您在函数体中定义的局部函数。

  • 图形函数、Simulink® 函数和真值表函数。

  • 支持代码生成的内置 MATLAB 函数。

  • 仅用于仿真执行的外部函数。有关详细信息,请参阅Call Extrinsic MATLAB Functions in Stateflow Charts

向 Stateflow 图添加 MATLAB 函数

在此示例中,您构建一个包含两个 MATLAB 函数的模型,然后使用这些函数计算输入到图的数据的均值和标准差。

设置模型

  1. 创建一个新 Simulink 模型。

  2. 向您的模型添加以下模块:

    • Chart 模块

    • Constant 模块

    • 两个 Display 模块

  3. Simulink model that contains a Stateflow chart, a constant block, and two display blocks.

  4. 将模型另存为 call_stats_function_stateflow

配置 Stateflow

  1. 打开 Chart 模块。

  2. 使用 MATLAB 函数图标 添加两个 MATLAB 函数。

  3. 用以下签名标记函数:

    • meanout = meanstats(vals)

    • stdevout = stdevstats(vals)

      Stateflow chart with two MATLAB functions called meanstats and stdevstats.

  4. 添加到一个终止结点的默认转移,条件动作如下:

    {
    mean = meanstats(invals);
    stdev = stdevstats(invals);
    }

    Stateflow chart with a transition that calls the two MATLAB functions.

    如果函数签名的参量是标量,请检查函数调用的输入和输出是否遵循标量扩展规则。有关详细信息,请参阅为矩阵的所有元素赋值

定义数据元素

  1. 打开符号窗格。

  2. 使用类型列设置以下数据的类型:

    • invals:输入数据

    • stdev:输出数据

    • mean:输出数据

    The data in the symbols pane.

标准差函数编程

打开 stdevstats 函数并添加以下代码:

function stdevout = stdevstats(vals)
%#codegen

% Calculate standard deviation
len = length(vals);
stdevout = sqrt(sum(((vals-avg(vals,len)).^2))/len);

function meanfcn = avg(inputArray,inputSize)
    meanfcn = sum(inputArray)/inputSize;

函数 sum 计算 stdevout 的值。%#codegen 编译指令帮助检测支持代码生成的 MATLAB 函数中语法和语义的编译时违规。

均值函数编程

打开 meanstats 函数并添加以下代码:

function meanout = meanstats(vals)
%#codegen

% Calculate statistical mean
len = length(vals);
meanout = avg(vals,len);

% Plot results (simulation only)
coder.extrinsic("plot");
plot(vals,"-+");

function meanfcn = avg(inputArray,inputSize)
    meanfcn = sum(inputArray)/inputSize;

length 函数支持代码生成,并返回向量的长度。函数 avg 计算 meanout 的值。您将 plot 定义为外部函数,因为它不支持代码生成。

对模型进行仿真

要对模型进行仿真,请先将 Simulink 模块连接到图输入端口和输出端口。

The Simulink model is connected to Stateflow.

点击运行。均值和标准差数字出现在 Display 模块窗口中。

The Display blocks show the results of simulation.

代码生成要求

要生成代码,所有函数都必须支持代码生成。如果函数不支持代码生成,您可以使用 coder.extrinsic (Simulink) 将其标记为异常。对于 MATLAB 支持代码生成的函数的列表,请参阅 C/C++ 代码生成支持的函数和对象 (MATLAB Coder)

另请参阅

(Simulink)

主题