如何在Simulink的多个M函数模块间共享Python对象
解决Simulink复用Python类实例的可行方案
方案1:用MATLAB基础工作区存实例
- 在Simulink模型的初始化回调里创建实例并写入基础工作区:
打开模型属性→回调→InitFcn,添加代码:% 先确保Python环境初始化 if ~py.isinitialized() pyenv('Version','你的Python安装路径'); % 比如'C:\Python39\python.exe' end % 创建实例并存到基础工作区 x = py.your_module.ExampleClass(); assignin('base', 'x', x); - M函数模块里直接调用:
function y = fcn(u) % 从基础工作区拿实例 x = evalin('base', 'x'); y = x.get_property(u); - 注意:要保证模型运行期间基础工作区的
x不会被误删或覆盖。
方案2:用Simulink数据字典存储
- 创建
.sldd数据字典,在字典里添加MATLAB变量存储Python实例:- 新建数据字典后,在命令行执行:
dict = Simulink.data.dictionary.open('your_dict.sldd'); % 创建Python实例 x = py.your_module.ExampleClass(); % 把实例存入字典的设计数据区 dict.getSection('Design Data').addEntry('x', x); save(dict);
- 新建数据字典后,在命令行执行:
- M函数模块中从字典取实例:
function y = fcn(u) dict = Simulink.data.dictionary.open('your_dict.sldd'); x = dict.getSection('Design Data').getEntry('x').getValue(); y = x.get_property(u); - 好处:数据字典和模型绑定,不会和基础工作区的其他变量冲突,适合团队协作。
方案3:封装MATLAB句柄类做中间层
- 写一个MATLAB类,内部持有Python实例,对外提供调用接口:
classdef ExampleWrapper < handle properties (Access = private) pyInstance end methods function obj = ExampleWrapper() % 构造函数里只创建一次Python实例 if ~py.isinitialized() pyenv('Version','你的Python安装路径'); end obj.pyInstance = py.your_module.ExampleClass(); end function val = get_property(obj, input) val = obj.pyInstance.get_property(input); end end end - 在Simulink初始化回调里创建这个MATLAB类的实例:
wrapper = ExampleWrapper(); assignin('base', 'wrapper', wrapper); - M函数模块里调用:
function y = fcn(u) wrapper = evalin('base', 'wrapper'); y = wrapper.get_property(u); - 优势:MATLAB句柄类可以通过Simulink掩码参数传递(解决之前的类型报错问题),同时隐藏Python调用细节,更易维护。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

