Как запустить программу на Java с помощью функции S в Simulink? - PullRequest
0 голосов
/ 31 марта 2019

Я делаю программу, в которой мне нужно взять значения, собранные из модели Simulink, и передать их в программу Java. Я установил S-функцию уровня 2 в Matlab, где я создаю экземпляр класса, которому нужно передать значения. Получив эти значения, я хочу передать их моему объекту в функции 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, когда выполняется обновление, говоря, что оно не распознает мой объект (и, таким образом, получает исключение нулевого указателя). Я считаю, что это потому, что я создаю свой Java-объект в функции Start и вызываю там его main, но я пытаюсь передать значения в функцию Update, так что, возможно, объект обрабатывается как локальный? Я добавил файл jar, который я использую, к статическому пути к классам в Matlab. Я не уверен, как заставить Matlab обращаться с ним, как с глобальным. Спасибо, что нашли время помочь, я очень ценю это!

1 Ответ

1 голос
/ 01 апреля 2019

Каждый метод S-функции является отдельной функцией.В частности, он имеет собственную память и не разделяет память с другими методами.

С S-функцией M-кода уровня 2, где данные, которыми вы хотите поделиться, не являются базовым / фундаментальным типом данных (т.е.не double, или int и т. д.), тогда самый простой способ сделать это - использовать свойство UserData объекта RunTime блока.

Итак, в вашем методе Start вы хотите сохранить объект

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

Затем в вашем методе Update вы получите объект, используя

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

Почти наверняка вам также потребуется реализовать метод Terminate для уничтожения объекта java в концемоделирование.

...