如何在 Simulink 中使用 S 函数 运行 一个 Java 程序?
How to run a Java program by using an S function in Simulink?
我正在编写一个程序,我需要从 Simulink 模型中获取值并将它们传递给 Java 程序。我在 Matlab 中设置了一个 Level 2 S 函数,我在其中实例化了一个 class 的实例,我需要将值传递给它。获得这些值后,我想将它们传递给 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 中的静态 class 路径。我不确定如何让 Matlab 将其视为全球性的。感谢您抽出宝贵时间提供帮助,非常感谢!
每个 S-Function 方法本身就是一个函数。具体来说它有自己的内存,不和其他方法共享内存。
使用 Level-2 M-Code S-Function,如果您要共享的数据不是 basic/fundamental 数据类型(即不是 double 或 int 等),那么最简单的方法是这样做是为了使用块的 RunTime 对象的 UserData 属性。
因此,在您的 Start
方法中您要存储对象
set_param(block.BlockHandle,'UserData',gameObj);
然后在您的 Update
方法中使用
获取对象
gameObj = get_param(block.BlockHandle,'UserData');
你几乎肯定还需要实现一个 Terminate
方法来在模拟结束时销毁 java 对象。
我正在编写一个程序,我需要从 Simulink 模型中获取值并将它们传递给 Java 程序。我在 Matlab 中设置了一个 Level 2 S 函数,我在其中实例化了一个 class 的实例,我需要将值传递给它。获得这些值后,我想将它们传递给 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 中的静态 class 路径。我不确定如何让 Matlab 将其视为全球性的。感谢您抽出宝贵时间提供帮助,非常感谢!
每个 S-Function 方法本身就是一个函数。具体来说它有自己的内存,不和其他方法共享内存。
使用 Level-2 M-Code S-Function,如果您要共享的数据不是 basic/fundamental 数据类型(即不是 double 或 int 等),那么最简单的方法是这样做是为了使用块的 RunTime 对象的 UserData 属性。
因此,在您的 Start
方法中您要存储对象
set_param(block.BlockHandle,'UserData',gameObj);
然后在您的 Update
方法中使用
gameObj = get_param(block.BlockHandle,'UserData');
你几乎肯定还需要实现一个 Terminate
方法来在模拟结束时销毁 java 对象。