主要内容

在 Stateflow 图中集成 MATLAB 函数

您可以使用 MATLAB® 函数在 Stateflow® 图中实现复杂算法。您可以使用 MATLAB 函数来:

  • 表达数学计算、处理数据或分析统计信息。

  • 将已建立的 MATLAB 算法合并到状态机中。

  • 封装复杂逻辑,使图设计更清晰。

有关创建用于 Stateflow 图的 MATLAB 函数的详细信息,请参阅通过定义 MATLAB 函数重用 MATLAB 代码

向 Stateflow 图添加 MATLAB 函数

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

设置模型

  1. 创建一个新 Simulink® 模型。

  2. 添加一个 Chart 模块、一个 Constant 模块和两个 Display 模块。

  3. 将 Constant 模块的值设置为 [2 3 4 5]。

    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.

从使用 MATLAB 函数的图生成代码

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

另请参阅

(Simulink)

主题