我正在制作一个程序,在该程序中我需要从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像全球一样对待它。感谢您抽出宝贵的时间来提供帮助,非常感谢!
答案 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对象。