来自MapleSim/Modelica的FORTRAN DLL调用约定

来自MapleSim/Modelica的FORTRAN DLL调用约定,dll,fortran,calling-convention,modelica,Dll,Fortran,Calling Convention,Modelica,Modelica建模语言支持从外部FORTRAN DLL调用函数,然而,MapleSim只支持从C DLL调用函数,尽管它说它完全支持Modelica语言,我别无选择,只能使用这个FORTRAN DLL(我不能用C语言重新编程,也不能使用除MapleSim之外的其他Modelica环境),因此我不在未记录功能领域 我试图强制MapleSim包含FORTRAN DLL,并创建了一个自定义组件,但它不起作用。这是我打开自定义组件时得到的代码:[仅适用于相关部分] model External

Modelica建模语言支持从外部FORTRAN DLL调用函数,然而,MapleSim只支持从C DLL调用函数,尽管它说它完全支持Modelica语言,我别无选择,只能使用这个FORTRAN DLL(我不能用C语言重新编程,也不能使用除MapleSim之外的其他Modelica环境),因此我不在未记录功能领域

我试图强制MapleSim包含FORTRAN DLL,并创建了一个自定义组件,但它不起作用。这是我打开自定义组件时得到的代码:[仅适用于相关部分]

    model ExternalCode

    function GETPSAT
        input Real TC;
        output Real PC;
    external "C" PC = GETPSAT(TC)
        annotation (
            Library = "C:/Path/To/My/DLL/FORTRAN.dll", __Maplesoft_callconv = "stdcall");
    end GETPSAT;

    equation
        (PC) = GETPSAT(TC);
        annotation (
            experiment(__Maplesoft_engine = 2));
    end ExternalCode;
我知道我应该将
外部“C”
更改为
外部“FORTRAN”
,但我应该如何处理
\uMapleSoft\u callconv=“stdcall”
?即:FORTRAN函数的调用约定是什么?(我对调用约定一无所知)

请注意,MapleSim 6.1(Maple 17)的父EvnEnvironment支持从FORTRAN导入外部函数,因此我认为,尽管MapleSim未记录,但仍有可能支持它

编辑:顺便说一下,DLL是用Compaq visual fortran编译的(我不记得版本了)

edit2:FORTRAN DLL中的函数导出如下:

FUNCTION GETPSAT(TC) 
!DEC$ ATTRIBUTES ALIAS:'GETPSAT' :: GETPSAT
!DEC$ ATTRIBUTES DLLEXPORT :: GETPSAT
!DEC$ ATTRIBUTES VALUE :: TC
GETPSAT=PSAT11(TC)
RETURN
END
edit3:我不知道这有什么帮助,但同样的函数可以从C#调用,如下所示:

    [DllImport("C:\\Path\\To\\My\\DLL\\FORTRAN.dll")]
    static extern float GETPSAT(float T);

这个特殊的Fortran函数应该像一个完全正常的C函数,因为它具有属性。不要添加任何
external(Fortran)
或类似的函数。它的名称应该是
GETPSAT
,并且它接受1个float
TC
的值


使用相同的
“stdcal”
属性,这是DEC、Compaq和Intel Fortran的默认属性

是。
外部“C”
在这里工作,因为他声明函数使用值调用获取TC。但是如果传递了int,则它可能无法在所有编译器上工作(32位与64位的问题在64位平台上的f2c中很常见,尽管我认为在本例中是32位平台)。也可以添加一个C包装器库来调用标准C函数,而标准C函数又调用fortran函数。在将dll放入system32并像下面这样导出函数GETPSAT(TC)后,我不知何故成功地使其工作
!DEC$ATTRIBUTES别名:“'u GETPSAT'::GETPSAT
!DEC$ATTRIBUTES DLLEXPORT::GETPSAT并调用函数
GETPSAT
(不是导出的符号
\u GETPSAT
)但是我总是得到同样的错误结果,dll工作正常,我试着从c#调用它,它给出了正确的值,你真的使用Visual Fortran吗?