如何禁用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
相关产品推荐
相关产品推荐

