如何在Simulink中调用MATLAB自定义类的实例与方法?
解决方案
方法1:用persistent变量在Simulink函数块复用已实例化对象
修改Simulink中MATLAB Function块的compute函数,把类对象声明为persistent,首次运行时从基础工作区加载,后续复用该对象:
function [y]=compute(x) persistent P1 P2 P10 % 首次执行时从工作区加载已实例化的对象 if isempty(P1) P1 = evalin('base','P1'); P2 = evalin('base','P2'); P10 = evalin('base','P10'); end a(1)=P1.method1(x+2); a(2)=P2.method1(x+2); a(3)=P10.method1(x+3); y=mean(a); end
persistent变量会在模型运行周期内保留对象状态,无需重复实例化;evalin('base',...)用于读取基础工作区的预实例化对象。
方法2:正确配置MATLAB System Block
如果之前使用MATLAB System Block失败,可自定义System类,在初始化阶段加载对象,后续调用方法:
- 创建MATLAB System类:
classdef ExampleSystem < matlab.System properties (Access = private) P1 P2 P10 end methods (Access = protected) function setup(obj) % 模型初始化时加载工作区的对象,仅执行一次 obj.P1 = evalin('base','P1'); obj.P2 = evalin('base','P2'); obj.P10 = evalin('base','P10'); end function y = step(obj,x) % 每次仿真步调用对象方法 a(1)=obj.P1.method1(x+2); a(2)=obj.P2.method1(x+2); a(3)=obj.P10.method1(x+3); y=mean(a); end end end
- 在Simulink中添加MATLAB System Block,选择上述
ExampleSystem类即可,模型运行时setup仅执行一次,全程复用已加载的对象。
方法3:用Data Store Memory共享类对象
适合多模块共享同一类对象的场景:
- 在Simulink中添加Data Store Memory模块,设置数据名称(如
ClassObjStore),数据类型选择Bus: <object>,关联你的ExampleClass;若存储多个对象,可改用结构体类型。 - 模型启动前,在工作区创建存储结构体:
ClassObjStore.P1 = P1; ClassObjStore.P2 = P2; ClassObjStore.P10 = P10;,再用Data Store Write模块在模型初始化阶段写入数据存储区。 - 在MATLAB Function块中读取并复用对象:
function [y]=compute(x) persistent objStore if isempty(objStore) objStore = coder.load('ClassObjStore'); end a(1)=objStore.P1.method1(x+2); a(2)=objStore.P2.method1(x+2); a(3)=objStore.P10.method1(x+3); y=mean(a); end
内容的提问来源于stack exchange,提问作者Hamzalihi
相关产品推荐
相关产品推荐

