Ссылка на внешние файлы в JModelica

У меня есть файл Modelica, который ссылается на код c во время моделирования через файл внешней библиотеки * .a.

Например:

model CallAdd
    input Real FirstInput(start=0);
    input Real SecondInput(start=0);
    output Real FMUOutput(start=0); 
    function CAdd
        input Real x(start=0);
        input Real y(start=0);
        output Real z(start=0);
        external "C"  annotation(Library = "CAdd", LibraryDirectory = "modelica://CallAdd");
    end CAdd;

equation
    FMUOutput = CAdd(FirstInput,SecondInput);
    annotation(uses(Modelica(version = "3.2.1")));
end CallAdd;

При открытии модели Modelica в OpenModelica требуемые файлы загружаются автоматически, потому что это имитирует и дает соответствующие результаты.

Однако, когда я пытаюсь скомпилировать файл Modelica с помощью JModelica-SDK-1.12, я получаю сообщение об ошибке, что файл библиотеки * .a не может быть найден.

Итак, мой вопрос: Как правильно ссылаться на дополнительные файлы при использовании compile_fmu в JModelica?

Безуспешно я пробовал:

# Import the compiler function
from pymodelica import compile_fmu
model_name = "CallAdd"
mo_file = "CallAdd.mo"

# Compile the model and save the return argument, for use later if wanted
my_fmu = compile_fmu(model_name, mo_file, target="cs",compiler_options = {'extra_lib_dirs':'C:/ToFolderContainingLib/'})

Странно то, что когда я использовал JModelica-1.17 (не SDK), файл компилировался нормально, но результаты не имели смысла. Мне порекомендовали попробовать версию SDK, чтобы увидеть, исправила ли она мои ошибки в моем предыдущем сообщении здесь.


person Justin Shultz    schedule 24.08.2016    source источник


Ответы (2)


Попробуйте разместить внешнюю библиотеку в подпапке, названной вашей платформой. Итак, в вашем примере я бы поместил библиотеку (libCAdd.a) в подпапку с именем linux64, поскольку я нахожусь на 64-битной машине Linux, а затем запустил код.

person Christian Winther    schedule 04.09.2016
comment
Привет, Кристиан Андерссон, похоже, проблема устранилась. Большое спасибо! - person Justin Shultz; 06.09.2016

Если это небольшой фрагмент кода C, в качестве последней альтернативы вы можете попробовать включить файл C непосредственно в код Modelica:

external "C"  annotation(Include="
// the entire C code here
");

Надеюсь, специалисты JModelica скоро дадут вам лучший ответ. Вы также можете попробовать спросить об этом на их веб-сайте: http://www.jmodelica.org/forum

person Adrian Pop    schedule 24.08.2016
comment
Спасибо за ваш быстрый ответ. Я попробую. Когда я пытался поместить код C непосредственно в файл Modelica в прошлом, я получал такие ошибки, как Undefined ссылка на функцию. Другими словами, когда модель создается, функция теряется. Для справки: dropbox.com/s/lrz2sy0yics80w5/CallDirect.mo?dl = 0 - person Justin Shultz; 25.08.2016
comment
Кажется, я понял это. Я считаю, что имя функции C должно совпадать с именем функции Modelica, это правильно? Есть ли синтаксис, которому я должен следовать при работе между C и Modelica. Я нашел ограниченную информацию? Книга Xogeny (book.xogeny.com/behavior/functions/external) и это сообщение о совместимости (openmodelica.org/doc/OpenModelicaUsersGuide/latest/latest ) был лучшим ресурсом, который я нашел до сих пор. Но для отладки часто требуется более глубокая информация. Спасибо за уделенное время. - person Justin Shultz; 25.08.2016