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

如何在Simulink中使用S函数运行Java程序?,java,matlab,simulink,Java,Matlab,Simulink,我正在制作一个程序,需要从Simulink模型中获取收集的值,并将它们传递到Java程序中。我在Matlab中设置了一个level2s函数,在这里我实例化了需要将值传递给的类的一个实例。一旦我有了这些值,我想在Update函数中将它们传递给我的对象。但是,我的程序无法识别更新函数中的对象 function Start(block) gameObj = javaObject('millerek.lafayette.edu.Game'); %set up game gameObj.

我正在制作一个程序,需要从Simulink模型中获取收集的值,并将它们传递到Java程序中。我在Matlab中设置了一个level2s函数,在这里我实例化了需要将值传递给的类的一个实例。一旦我有了这些值,我想在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时,我能够成功创建对象。当执行更新时,我从Matlab得到一个错误,说它无法识别我的对象,因此得到一个空指针异常。我相信这是因为我在Start函数中创建了java对象,并在那里调用了它的main,但我试图在Update函数中传递值,所以可能对象被视为本地对象?我已经将使用的jar文件添加到Matlab中的静态类路径中。我不知道如何让Matlab像对待全局一样对待它。谢谢你花时间帮忙,我非常感激

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

对于2级M代码S函数,如果要共享的数据不是基本/基本数据类型,即不是double或int等,则最简单的方法是使用块的RunTime对象的UserData属性

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

set_param(block.BlockHandle,'UserData',gameObj);
然后在更新方法中,使用

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

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

这不起作用意味着什么?具体点。您确实可以使用InputPort.data获取数据。当您在Start函数中创建对象时,您将其存储在何处,以及如何在其他方法中访问它?嗨,Phil,所以我回到文档并解决了我的数据收集问题-我试图处理二维数据,但忘记了包含block.allowsignalswithmore 2D=1。然而,当程序现在运行时,我得到:未定义的函数或变量“gameObj”。我添加了两个函数来处理问题中的所有Java部分。谢谢你抽出时间来看看我的问题。谢谢你的帮助!在S函数的末尾,我有函数Terminateblock。