gpt4 book ai didi

java - 如何在Simulink中使用S函数运行Java程序?

转载 作者:行者123 更新时间:2023-12-02 10:03:49 24 4
gpt4 key购买 nike

我正在制作一个程序,需要从 Simulink 模型收集的值并将它们传递到 Java 程序中。我在 Matlab 中设置了一个 2 级 S 函数,在其中实例化了需要向其传递值的类的实例。获得这些值后,我想将它们传递给 Update 函数中的对象。但是,我的程序无法识别更新函数中的对象。

function Start(block)

gameObj = javaObject('millerek.lafayette.edu.Game'); %set up game
gameObj.main("");
%end Start

function Update(block)
X = block.InputPort(1).Data(1,1);
Y = block.InputPort(1).Data(2,1);
javaMethod('getMdlValues',gameObj,X,Y);
%gameObj.getMdlValues(1,0); %test. This did not work either
%end Update

我尝试过使用 javaObjectEDT 和 javaMethodEDT,但它们不起作用。

当 Simulink 运行时,我能够成功创建我的对象。执行 Update 时,我从 Matlab 收到错误,指出它无法识别我的对象(因此出现空指针异常)。我相信这是因为我在 Start 函数中创建了 java 对象并在那里调用它的 main ,但我尝试在 Update 函数中传递值,所以也许该对象被视为本地对象?我已将正在使用的 jar 文件添加到 Matlab 中的静态类路径中。我不知道如何让 Matlab 将其视为全局的。感谢您抽出宝贵时间提供帮助,非常感谢!

最佳答案

每个 S-Function 方法本身就是一个函数。具体来说它有自己的内存,不与其他方法共享内存。

使用 2 级 M 代码 S 函数,如果您要共享的数据不是基本数据类型(即不是 double 或 int 等),那么最简单的方法是使用 block 的 RunTime 对象的 UserData 属性。

因此,在您的 Start 方法中您要存储对象

set_param(block.BlockHandle,'UserData',gameObj);

然后在您的 Update 方法中,您使用以下方法获取对象

gameObj  = get_param(block.BlockHandle,'UserData');

您几乎肯定还需要实现一个 Terminate 方法来在模拟结束时销毁 java 对象。

关于java - 如何在Simulink中使用S函数运行Java程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com