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

时间:2019-03-31 17:18:12

标签: java matlab simulink

我正在制作一个程序,在该程序中我需要从Simulink模型中收集值并将它们传递给Java程序。我在Matlab中设置了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像全球一样对待它。感谢您抽出宝贵的时间来提供帮助,非常感谢!

1 个答案:

答案 0 :(得分:1)

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

使用2级M代码S功能时,要共享的数据不是基本/基本数据类型(即不是double或int等),那么最简单的方法是使用该块的RunTime对象的UserData属性。

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

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

然后在您的Update方法中,使用

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

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