You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用SIMULINK代码生成或调用不支持代码生成的MATLAB函数

在Simulink中调用非代码生成兼容的复杂MATLAB模型方案

核心思路

无需重建模型,通过Simulink的MATLAB解释型模块直接在MATLAB环境中运行代码,完全规避代码生成检查。以下针对你的问题逐一解决:

1. 解决Interpreted MATLAB Function Block多输入输出问题

该模块完全支持多输入输出,只需正确配置参数:

  • 双击模块,在「输入数量」中填写输入变量个数,「输出数量」填写输出变量个数。
  • 你的MATLAB主函数需对应定义输入输出,示例:
function [out1, out2, out3] = myMainFunc(in1, in2)
    % 调用子函数处理逻辑
    temp = subFunc1(in1);
    out1 = temp + in2;
    out2 = subFunc2(in1);
    out3 = subFunc3(in1, in2);
end

% 子函数1
function res = subFunc1(input)
    res = input .* 3;
end

% 子函数2
function res = subFunc2(input)
    res = table(input, input.^2); % 支持table类型操作
end

% 子函数3
function res = subFunc3(a, b)
    res = max(a, b);
end
  • 模块参数中指定主函数名称myMainFunc,运行仿真即可。

2. 封装含子函数的MATLAB函数正确语法

所有子函数必须与主函数放在同一个.m文件中,且主函数作为文件的第一个函数(入口函数),子函数依次放在主函数之后(如上例所示)。主函数负责接收Simulink的输入,调用子函数处理后返回输出,子函数仅需保证在同一文件内,无需额外声明。

3. Level-2 MATLAB S-Function Blocks调用同一文件的函数

Level-2 S-Function完全支持调用同一.m文件内的所有函数,且灵活性更强,适合复杂输入输出场景。示例实现如下:

function myComplexSFcn(block)
    % 初始化模块
    setup(block);

function setup(block)
    % 配置输入端口数量
    block.NumInputPorts = 2;
    % 配置输出端口数量
    block.NumOutputPorts = 3;
    
    % 设置输入端口属性(继承信号类型,无需代码生成兼容)
    block.SetPreCompInpPortInfoToDynamic;
    block.InputPort(1).DatatypeID = 0; % double类型
    block.InputPort(2).DatatypeID = 0;
    
    % 设置输出端口属性
    block.SetPreCompOutPortInfoToDynamic;
    block.OutputPort(1).DatatypeID = 0;
    block.OutputPort(2).DatatypeID = 0;
    block.OutputPort(3).DatatypeID = 0;
    
    % 设置采样时间(继承模型采样时间)
    block.SampleTimes = [-1 0];
    
    % 注册输出更新回调函数
    block.RegBlockMethod('Outputs', @Outputs);

function Outputs(block)
    % 获取Simulink输入信号
    in1 = block.InputPort(1).Data;
    in2 = block.InputPort(2).Data;
    
    % 调用同一文件内的主函数及子函数
    [out1, out2, out3] = myMainFunc(in1, in2);
    
    % 赋值给输出端口
    block.OutputPort(1).Data = out1;
    block.OutputPort(2).Data = out2;
    block.OutputPort(3).Data = out3;

% 以下是你的核心模型函数(主函数+子函数)
function [out1, out2, out3] = myMainFunc(in1, in2)
    temp = subFunc1(in1);
    out1 = temp + in2;
    out2 = subFunc2(in1);
    out3 = subFunc3(in1, in2);
end

function res = subFunc1(input)
    res = input .* 3;
end

function res = subFunc2(input)
    res = table(input, input.^2);
end

function res = subFunc3(a, b)
    res = max(a, b);
end

将上述代码保存为.m文件,在Simulink中添加Level-2 MATLAB S-Function模块,指定该文件名称即可运行。

禁用代码生成的关键设置

只需保证Simulink处于仿真运行模式,而非代码生成模式:

  • 不点击「生成代码」或「构建模型」按钮,仅点击「运行仿真」。
  • 若需彻底禁用代码生成检查,可在模型配置参数的代码生成选项卡中,取消勾选「生成代码」相关选项,或设置「目标选择」为「无」。

内容的提问来源于stack exchange,提问作者OnePokeBloke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:40:22