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

时间:2014-08-12 12:28:00

标签: dll fortran calling-convention modelica

Modelica建模语言支持从外部FORTRAN DLL调用函数,但是,MapleSim仅支持从C DLL调用函数,即使它说它完全支持Modelica语言,我别无选择,只能使用这个FORTRAN DLL(我无法在C中重新编程,也不能使用其他Modelica环境而不是MapleSim),所以我不在未记录的功能域中。

我尝试强制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;

我知道我应该将external "C"更改为external "FORTRAN",但我应该如何处理__Maplesoft_callconv = "stdcall"?即:FORTRAN函数的调用约定是什么? (我对调用约定的主题一无所知)。

请注意,MapleSim 6.1(Maple 17)的父级evnironment支持从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);

1 个答案:

答案 0 :(得分:1)

由于它具有的属性,这个特定的Fortran函数应该表现得像一个完全正常的C函数。不要添加任何external(FORTRAN)或类似内容。它的名称应为GETPSAT,并且按值接受1个浮点TC

使用相同的"stdcal"属性,它是DEC,Compaq和Intel Fortran的默认值https://software.intel.com/sites/products/documentation/hpc/mkl/mkl_userguide_win/GUID-E74229B0-7389-46A6-9FCF-91CD6CD5B0E4.htm