在 Simulink 中的块之间共享 Python 对象

问题描述 投票:0回答:1

我用Python创建了一个类。在我的应用程序中,此类是一种查找表。

这是一个示例类来说明该主题:

class ExampleClass:

    def __init__(self, var1):
        self.prop1 = var1

    def get_property(self):
        return self.prop1

Matlab 提供了直接在 Matlab 环境中调用 Python 模块的能力(请参阅 Matlab 文档

有人这样称呼Python:

>>> py.importlib.import_module("ExampleClass")
>>> x = py.ExampleClass.ExampleClass(1)
>>> x.get_property()
ans =

     1

我想做的是使

x
在 Simulink m 函数块s 中可用,以便从所有 m 函数块调用
get_property()
。请注意,创建
x
的计算成本很高,因此我想在初始化模拟时将其加载到工作区中一次。

到目前为止我尝试过的: 我尝试通过掩码参数将

ExampleClass
传递给 m 函数,但出现错误:

Error:Expression 'object name' for type of data 'x' did not evaluate to a valid type.

这是可以理解的,因为 Simulink 不允许使用

int
double
和其他标准数据类型以外的数据类型。

有没有办法可以从我的 m 函数调用

x.get_property()

python matlab simulink
1个回答
0
投票

注意:此解决方法有效,因此我在这里分享它,但由于

evalin
coder.extrinsic
调用,性能并不令人满意。

可以使用具有以下功能的 Simulink m-function 模块中的基础工作区中的对象:

在基础工作区中创建对象

>>> py.importlib.import_module("ExampleClass")
>>> x = py.ExampleClass.ExampleClass(1)

在 Simulink m 函数块中:

function out = fcn()
    coder.extrinsic('get_property_in_matlab') % goes outside of Simulink
    out = 0; % Initialize output type for Simulink
    out = get_property_in_matlab();
end

在Matlab中我们定义一个函数来调用

x

function [res] = get_property_in_matlab()
    x_in_matlab = evalin('base', 'x'); % Get the object from base workspace
    res = x_in_matlab.get_property(); % Use the get property method
end

此解决方法有效,但使用

coder.extrinsic
evalin
的惩罚使该解决方案在我的情况下在性能方面无法使用。

© www.soinside.com 2019 - 2024. All rights reserved.