EBSILON®Professional Online Documentation
EbsScript 脚本 / 使用 EbsScript
本主题中
    使用 EbsScript
    本主题中

    使用 EbsScript

    创建和执行

    EbsScript 模块可以自动执行任务和计算。第一步,必须使用 EbsScript 编辑器来创建一个程序("EbsScript")。编程语言是 PASCAL,并为 EBSILONProfessional 定制了语言扩展。创建脚本后,可以在 EbsScript 编译器的帮助下检查语法的正确性并执行 EbsScript。已经创建的 EbsScripts 可以直接用 EbsScript 执行器进行编译和执行,而不必使用编辑器。

    当在使用 EbsScript 编辑器时,可以切换到 EBSILON 模型,然后再回到编辑器。这对查找某些名称或值,很有帮助。甚至可以在EbsScript 编辑器打开时修改 EBSILON 模型。但是如果在模型中插入、删除或重命名对象,应该使用 "附加à重建对象树 "菜单命令来更新编辑器中的对象树。

    如果已经打开了几个模型,可以为它们中的每一个打开一个 EbsScript 编辑器。在屏幕上,只能看到一个 EbsScript 编辑器,即分配给当前激活的模型的那一个。其它 EbsScript 编辑器是不可见的。如果从一个模型切换到另一个模型,对应于另一个模型的编辑器将变得可见。

    可以为一个模型开发几个 EbsScripts。这些脚本被存储在".ebs"文件中。有导入/导出功能,可以将 EbsScripts 从一个模型转移到另一个模型。

     

    访问模型数据

    EbsScript 是专门为处理模型数据而设计的。因此,模型中的名称可以直接在 EbsScript 中使用。例如,要给名称为 NDT_2B 的汽轮机级赋一个等熵效率的值,可以使用以下语法:

    NDT_2B.ETAIN:=0.89;

    与输入字框本身完全一样,表达式也可以分配给一个规格值。为了实现这些访问的可能性,EbsScript 使用它自己的原始数据类型 "ebsvar"。

     

    输入和输出

    执行 EbsScripts 的输入有几个来源:

    要获得 EbsScript的 结果,可以

    由于一些 EbsScript 函数是 EBSILONProfessional 性能优化系统,EPOS 的一部分,需要额外的授权许可。细节在函数列表中描述。

    注释(第11版)

                                       i,j:integer;

                                       s:string;

                                       b:boolean

                                       end =     (i:42;s:"hello");
                rec.i=42, rec.j=0, rec.s = “hello”, rec.b=false

    单位系统

    可以从 EbsScript 中直接访问模型中的量。但不使用界面上显示的单位,而是使用内部存储的 SI 单位系统,这也适用于 EBSILONProfessional 的计算内核:

    因此,一个直接的分配,如

    Turbine.M1N := 100;
    

    总是代表 100 kg/s.

    工况

    EbsScript 的主要优势之一是可以对不同的工况进行计算。在 EbsScript 中,可以创建新的工况并从一个工况切换到另一个。所有操作都基于两个工况的设置:

    当前的计算工况在进行计算时被使用。当从模型中读取数值或向模型中写入数值时,也会被使用。此外,很多工况的操作都适用于这个工况 (见 EbsScript 功能概述中的"工况")。

    当创建一个新的子工况时,将使用当前的父工况,即新的子工况是当前父工况的一个子工况。当前的父工况不一定是当前计算工况的父工况(尽管在 EbsScript 中刚创建的子工况时,当前计算工况的父工况为当前父工况)。

    当启动 EbsScript 时,当前的计算和当前的父工况都将被设置为 EbsScript 调用时被激活的工况。

    示例:如果在工况 A 中启动 EbsScript,并执行以下命令

    newSubProfile;
    newSubProfile;

    会得到两个新的工况,它们是工况 A 的子工况。

    如果第二个新的工况应该是第一个工况的子工况,必须写入

         i:=newSubProfile;
    setParentProfile( i );
    newSubProfile;

    COM - 接口

    访问 COM 库是可能的。相应的数据类型和函数被定义在接口“@ComObj´“

    在"EbsScript -> 从类型库添加单元"下,可以在 EbsScript 编辑器中打开一个类型库导入对话框。用它创建的 EbsScript 单元可用于实例化和使用 COM 对象。这使得 EbsScript 和具有 COM 功能的程序之间的交互变得容易。

     

    Python - 接口

    接口单元"@Python"允许直接从 EbsScript 中执行 Python 代码。直接的代码和 Python 文件(*.py)都可以被执行。要使用该接口

    1. 必须安装 Python(版本 2.7 或 3.0 或更新)。Windows 版 Python 可以从 https://www.python.org/downloads/windows/ 下载。
    2. 必须安装 Python扩 展"Windows 版 Python 扩展"(例如,见 http://sourceforge.net/projects/pywin32/ )。
    3. 必须注册 COM 类别 "EbsScriptPython.Interpreter” :为此请用 Python 执行 Python 脚本“<Ebsilon 安装路径>/Data/Python/ebsscript_python_interpreter.py”。

    在 EbsScript 的执行过程中,Python 的全局字典被保留,也就是说,可以连续执行几个 Python 调用,例如,创建 Python 变量并随后把读取变量。

    注意:终止 EbsScript 后,全局 Python 字典被删除。因此,通过字典访问先前 EbsScript 运行中的变量不再可能。(例如,这可以通过"Python pickling"来实现)

    @Python"中下列函数 / 程序:

    function pyEvaluate(expression:string):variant; internal;
    对"表达式"进行评估并返回结果。

    procedure pyExecute(expression:string); internal;
    执行"表达式"中的代码。

    procedure pyExecuteFile(file:string); internal;
    执行"文件"中包含的代码。

    function pyGetVariable(name:String):variant; internal;
    返回全局变量"name"的值(即全局字典的元素(element))。

    procedure pySetVariable(name:String; const value:variant); internal;
    设置全局变量"name"的值。

     

    匿名函数

    匿名函数是没有名字的函数或程序。两个简单的例子

    var p:procedure();
    begin
         p:=procedure ()
         begin
           println(445);
        end;
        p();
    end;

     

    var f:function():string;
    begin
        f:=function ():string
        begin
            println(445);
            result := "Hi";
        end;
        println (f());
    end;

     

    特别有用的是文本框或表达式中的匿名函数。它们允许使用变量和函数调用 - 所有 EbsScript 函数都可以访问。

    使用匿名函数的文本框的例子:

     

    风力发电机组的功率与风速的关系
    { function (v : real):string
         var s:string; P:real;
         begin 
             s := "Aktuelle Windgeschwindigkeit(当前风速): " + printtostring (v:5:2);
             s := s + "  m/s \nLeistung ";
             P := Windturb.CLPower.interpolate(v);
             s := s + printtostring (P:5:2) + "  MW\n";
            result := s;
      end (Sun.VWIND)   }

    在提供的示例中找到更多例子(以 anonymous_functions... 开头的文件)。