gpt4 book ai didi

modelica - 外部函数: Reference headers in C-script to compiled dll

转载 作者:行者123 更新时间:2023-12-02 18:54:44 26 4
gpt4 key购买 nike

使用 Dymola 2017。

情况 A) 调用外部 c 脚本

我已经成功实现了没有“# include <-->”语句的简单外部 C 函数:

Modelica 功能:

function chirp

input Modelica.SIunits.AngularVelocity w_start;
input Modelica.SIunits.AngularVelocity w_end;
input Real A;
input Real M;
input Real t;
output Real u "output signal";

external "C" u=chirp(w_start,w_end,A,M,t)
annotation(IncludeDirectory="modelica://ExternalFuncTest/Resources/Source/", Include="#include \"chirp.c\"");

end chirp;

C 脚本:

double chirp(double w1, double w2, double A, double M, double time)
{
double res;
res=A*cos(w1*time+(w2-w1)*time*time/(2*M));

return res;
}
<小时/>

情况 B)调用 .dll 文件中的外部函数

我还成功地在编译的 dll 中调用外部函数:

Modelica 功能:

function bessel_Jn
"Bessel function of the 1st kind (regular cylindrical) of order n"

extends Modelica.Icons.Function;

input Integer n;
input Real x;
output Real y;

external "C" y=gsl_sf_bessel_Jn(n,x) annotation(LibraryDirectory="modelica://ExternalFuncTest/Resources/Source/gsl-1.8/", Library="libgsl");

end bessel_Jn;
<小时/>

情况 C)调用外部 C 脚本,该脚本通过 header 使用外部 .dll 中的函数

我现在想做的是创建一个可以做更多有趣事情的 C 函数。我当前的方法是在引用编译的 dll(在本例中是 GNU 科学库的编译版本)的 c 函数中包含头文件。这个例子有标题(尽管它暂时没有做任何事情)。

Modelica 功能:

function chirp

input Modelica.SIunits.AngularVelocity w_start;
input Modelica.SIunits.AngularVelocity w_end;
input Real A;
input Real M;
input Real t;
output Real u "output signal";

external "C" u=chirp(w_start,w_end,A,M,t)
annotation(LibraryDirectory="modelica://ExternalFuncTest/Resources/Source/gsl-1.8/", Library="libgsl",
IncludeDirectory="modelica://ExternalFuncTest/Resources/Source/", Include="#include \"chirp.c\"");

end chirp;

C 脚本:

#include <gsl/gsl_sf_bessel.h> //<-- note the additional header

double chirp(double w1, double w2, double A, double M, double time)
{
double res;
res=A*cos(w1*time+(w2-w1)*time*time/(2*M));
return res;
}

当尝试调用上面的函数时,错误表明翻译失败,并且由于头文件的存在而没有其他错误。如果头文件被注释掉,函数将按预期运行。

如果您对如何正确实现此功能有任何见解,请告诉我。谢谢。

<小时/>

供引用:下图是外部c脚本和.dll的路径。

错误路径:注意 gsl header 文件夹位于 gsl-1.8 文件夹内 Resources Source Folder

正确路径:注意 gsl header 文件夹与 gsl-1.8 文件夹位于同一级别 Corrected Resources Source Folder

<小时/>

更新: header 有效,但函数调用导致翻译失败

我已经更新了 c 脚本,现在调用应由 header 处理的函数。在目前的状态下,它不会起作用。也许它找不到 .dll 文件,尽管它在 modelica 代码中指定了?我必须在 C 脚本中包含加载 .dll 命令吗?

#include <gsl/gsl_sf_bessel.h>

double chirp(double w1, double w2, double A, double M, double time)
{
double res;
double y;
res=A*cos(w1*time+(w2-w1)*time*time/(2*M));
y = gsl_sf_bessel_j0(time); // <-- Calls a function from the .dll file using the header
return res;
}

最佳答案

我相信这只能通过相对包含路径或实现 future Modelica 语言规范 3.4 的 future 工具来解决。请参阅https://trac.modelica.org/Modelica/ticket/2103了解 Modelica 语言规范的相应更新。

关于modelica - 外部函数: Reference headers in C-script to compiled dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41166086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com