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);
答案 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