EBSILON®Professional Online Documentation
数据传输和结果显示 / 数据-输出 / DLL 导出
本主题中
    DLL 导出
    本主题中

    DLL 导出(用户 DLL)


    通用

    EBSILONProfessional 的开放式软件结构使程序能够简单地访问 EBSILONProfessional 的数据。

    本章介绍了用于数据交换的名为"TheUsersDLL.dll"的 DLL。还有另一个 DLL 接口(Programmable.dll)可以为计算内核定义自己的组件。

    用户 DLL 可以用于数据输出和输入

    • 用编译器创建一个 DLL
    • 用自己的 DLL 替换现有的"TheUsersDLL.dll"
    • 通过菜单命令"数据 à用户 DLL à调用..."或通过EbsScript 函数 callUserDll 或 callUserDllArgs 从 EBSILONProfessional 图形用户界面中调用这个 DLL。

    注意:

    由于一些结构已经改变(例如 LINERESULTS),建议用第 10 版的标头文件重新生成自带的 DLL。


    创建 DLL

    EBSILONProfessional 光盘中有一个 DLL 模板。可以在 Examples\DLL_Interfaces 中找到这个例子的源代码。有两个文件被用来创建"TheUsersDLL.dll"这个例子:.

    这些文件是用 Microsoft Developer Studio 6.0 编译并连接成 DLL 的。由此产生的 DLL 放在 EBSILONProfessional 的安装目录中。

    文件"userDll.h"定义了 DLL 接口。应该在应用程序中包含这个文件。

    请注意,这个接口可能在未来的 EBSILONProfessional 版本中被扩展。因此,当使用一个新的 EBSILONProfessional 版本时,要注意用最新版本的标头文件来重建应用程序。

    文件"userDll.c"是源代码文件,可以根据需要进行修改。

    在第一步中,应该尝试重建这个 DLL。建立自己的项目并使用 userDll.c 的源代码创建一个名为"TheUsersDLL.dll"的 DLL。将这个 DLL 复制到安装了 EBSILONProfessional 的目录中,并尝试从 EBSILONProfessional 调用这个DLL。

    如果创建的示例 DLL 与原始 Iqony Solutions 的 DLL 功能一致,可以进行下一步修改源代码。

    不要修改"userDll.h",因为这个文件必须与在生成 EBSILONProfessional 可执行文件时使用的"userDll.h"匹配。


    DLL 接口

    DLL 接口在标头文件"userDll.h"中描述。假设用户用 C 或 C++ 编写程序。一般来说,也可以使用其它编程语言。这是,必须注意对传输的数据进行正确的解释。

    DLL 接口由一个名为"EbsUserDLL"的函数组成,返回一个整数值。可以随意指定这个返回值

    函数"EbsUserDLL"的唯一参数是一个指向 EBS_USER_DATA 结构的指针。

     

    结构被定义为

    typedef struct {
    
        EBS_USER_CALL_PARAMS           callparams; // 调用参数
    
        EBS_USER_INTERFACE_CONTROL     control;    // 接口控制参数
    
        EBS_USER_CALCCONTROL_PARAMS    params;     // 计算控制参数 
    
        int                            nlines;     // 管道数量
    
        EBS_USER_LINEDATA              *lines;     // 管道
    
        int                            ncomps;     // 组件数量
    
        EBS_USER_COMPDATA              *comps;     // 组件
    
    } EBS_USER_DATA;
    

    EBSILONProfessional 调用 DLL 之前,创建这个结构,并将激活的工况的数据复制到这个结构中。因此在用户的 DLL 中,可以访问该结构中的所有这些数据。

     

    查看 userDll.c 中的函数"example1 ()",如何访问 EBSILONProfessional 的规格值、结果、特性线和其它参数。

     

    EBS_USER_CALL_PARAMS 可以在 DLL 对话框中指定,也可以作为 EbsScript 的参数。可以使用这些调用参数来决定 DLL 的不同功能行为。有一个叫做 nProgId 的整数参数,四个额外的整数参数,四个实数参数和四个字符串参数。关于结构的细节见 userDll.h。

    在示例 DLL 中,nProgId 被用来在三个不同的函数之间切换。

    Example1 是一个输出所有 EBSILONProfessional 数据的简单 ASCII。字符串参数 szParam1 用于指定应创建的文件的路径名称(当然,即使不想创建自己的 DLL,也可以将其作为报告函数)。

     

    EBS_USER_INTERFACE_CONTROL 结构包括一个标志,用来决定 EBSILONProfessional 是否要从 DLL中读回数据(参见 DLL 导入)。如果只从 EBSILONProfessional 接收数据,那么这个标志为 0。

     

    EBS_USER_CALCCONTROL_PARAMS 是在"附加 à 模型选项"中"模拟"、"校核"、"结果"和"用户定义流体"中指定的计算设置。用户定义的变量还没有包括在这个接口中。

     

    EBS_USER_LINEDATA 是一个包含 nlines 条目的数组,循环中的每一条管道都有一个条目。每个条目由几个子结构组成:

    typedef struct tagEBS_USER_LINEDATA{
    
          EBS_USER_BASICS         basics;     // 基础参数
    
          EBS_USER_LINETYPE       type;       // 管道类型
    
          EBS_USER_LINERESULTS    results;    // 管道结果
    
          EBS_USER_LINETOPO       topo[2];    // 管道结果
    
    } EBS_USER_LINEDATA;
    

    EBS_USER_BASICS 由管道的 ID、名称和描述组成。EBS_USER_LINETYPE 表示管道的类型(流体类型)。EBS_USER_LINERESULTS 包含计算出的管道的热力学特性(压力、温度、...;,还有材料组份)。EBS_USER_LINETOPO 结构表示拓扑结构:可以指向一个组件、一条管道(对逻辑管道)或者什么都不指向。topo[0] 和 topo[1] 包含两条管道端部的拓扑结构。

    EBS_USER_COMPDATA 是一个由 ncomps 条目组成的数组,循环中的每个组件都有一个。每个条目由几个子结构组成:

    typedef struct tagEBS_USER_COMPDATA{
    
          EBS_USER_BASICS   basics;     // 基础参数
    
          int               comptype;   // 组件类型
    
          int               npins;      // 连接点数量
    
          EBS_USER_COMPTOPO *pins;      // 带有拓扑结构信息的数组(npins 元素)
    
       
    
          int               nspecs;     // 规格值数量
    
          EBS_USER_SPECITEM *specs;     // 规格值
    
       
    
          int               nresults;   // 结果值数量
    
          EBS_USER_SPECITEM *results;   // 结果值
    
       
    
          int               ncharlines; // 特征线数量
    
          EBS_USER_CHARLINE *charlines; // 带特征线的数组(ncharlines 元素)
    
          int               blogiccomp; // 标志(TRUE,如果使用 logiccomp) 
    
          EBS_USER_COMPTOPO logiccomp;  // 一个逻辑组件的拓扑信息
    
    } EBS_USER_COMPDATA;
    

    EBS_USER_BASICS 由组件的 id、名称和描述组成。comptype 是组件类型的编号。EBS_USER_COMPTOPO 结构可以指向一条管道,也可以不指向什么。数组 pins 由 npins EBS_USER_COMPTOPO 条目组成,表示哪条管道在相应的连接点(如果有的话)被连接。

    The EBS_USER_SPECITEM 结构包含一个规格或结果值的名称和值:

    typedef struct {
    
          char                    *name;      // 规格值的短名称
    
          EBS_USER_VALUETYPE      valuetype;  // 标志值是 double 是 long
    
          union {
    
                double            doublevalue;// 值为 double
    
                long              longvalue;  // 值为 long
    
          };
    
          int                     bempty;     // flag: = 1, 如果值为空 
    
          EBS_USER_WRITEBACK      writeback;  // 如果值为空 
    
    } EBS_USER_SPECITEM;
    

    根据 valuetype 不同,该值可以是一个 double 或 long。如果规格值为空,标志 bempty 被设置为 1(TRUE)。这时,不应该使用 double 值或long 值(可能有任意的值)。回写标志只在数据导入的情况下使用。

    数组 specsresultsnspecsnresults 这样的条目组成。

    EBS_USER_CHARLINE 结构包含一个特征线的数据。

    typedef struct {
    
          char                    *name;      // 特征线名称
    
          int                     buseparam;  // 特征线是否有参数的标志
    
          double                  param;      // 参数
    
          int                     npoints;    // 点的数量
    
          EBS_USER_CHARLPOINT     *point;     // 点的数组(npoints 元素)
    
          EBS_USER_WRITEBACK      writeback;  // 回写的标
    
    } EBS_USER_CHARLINE;
    

    如果标志 buseparam 为 1 (TRUE),则该特征线有一个参数,在 param 中表示。如果 buseparam 为 0 (FALSE),param 的值是任意的,不应被使用。数组 points 包含特征线的 npoints 个点。回写标志仅在数据导入时使用。

    EBS_USER_COMPDATA 结构中的数组 array charlines 由 ncharlines 个此类条目组成。

    对于没有连接点但直接放置在管道上的组件(组件 33、45、46),拓扑结构用 logiccomp 表示。这是一个 EBS_USER_COMPTOPO 结构,指向组件所在的管道。标志 blogiccomp 表示是否使用这个值(=1)或不使用(=0)。如果 blogiccomp 为 0,就不应使用 logiccomp


    调用 DLL

    如果想从 EBSILONProfessional 导出计算数据到 DLL,必须在调用 DLL 之前在当前工况中进行计算。

    要调用 DLL,使用菜单命令"数据 à 用户 DLL à 调用..."。"调用用户-DLL"对话框被打开。

    在这个对话框中,除了EBSILONProfessional 的数据外,还可以指定传输到 DLL 的参数。如果不想在 DLL 中使用这些参数,就没有必要指定任何参数。

    在这个例子中,程序 id nProgID = 1 期望有一个字符串参数,该参数在此指定示例程序打印输出文件的路径名称。

    完成参数指定后,点击"调用 Dll...",DLL 现在将被调用。

    此后,右上角的"结果"栏显示了 DLL 的返回代码。

    现在可以改变参数并对 DLL 进行新的调用或关闭对话窗口。

    A另外,也可以从 EbsScript 中调用 DLL。参见 EbsScript 函数