【问题标题】:How to run a Java program by using an S function in Simulink?如何在 Simulink 中使用 S 函数运行 Java 程序?
【发布时间】:2019-03-31 17:18:12
【问题描述】:

我正在制作一个程序,我需要从 Simulink 模型中收集值并将它们传递给 Java 程序。我在 Matlab 中设置了一个 Level 2 S 函数,我在其中实例化了一个我需要将值传递给的类的实例。一旦我有了这些值,我想在 Update 函数中将它们传递给我的对象。但是,我的程序在 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 将其视为全球性的。感谢您抽出宝贵时间提供帮助,非常感谢!

【问题讨论】:

  • “这不起作用”是什么意思?请明确点。您确实使用InputPort.Data 获取数据。在 Start Function 中创建对象时,您将其存储在哪里,以及如何在其他方法中访问它?
  • 嗨 Phil,所以我回到文档并找出了我的数据收集问题 - 我试图处理 2D 数据,但我忘记包含 block.AllowSignalsWithMoreThan2D = 1; .但是,当程序现在运行时,我得到:未定义的函数或变量“gameObj”。我在我的问题中添加了处理所有 Java 部分的两个函数。感谢您花时间查看我的问题。

标签: java matlab simulink


【解决方案1】:

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

使用 Level-2 M-Code S-Function,如果您要共享的数据不是基本/基本数据类型(即不是 double 或 int 等),那么执行此操作的最简单方法是使用块的 RunTime 对象的 UserData 属性。

所以,在您的 Start 方法中,您要存储对象

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

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

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

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

【讨论】:

  • 感谢您的帮助!在我的 S 函数结束时,我有 function Terminate(block)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2022-06-14
  • 2014-10-28
相关资源
最近更新 更多