【CAPE-OPEN】.NET类库说明与示例

类库说明

原标题:CAPE-OPEN for .Net Class Library

Cape-Open for .Net 类库是在 .Net 框架中实现 Cape Open v.1.0 接口的类的集合。这是一个工具,用于帮助流程建模组件(PMC)开发人员使用最新版本的 Visual Studio 集成开发环境生成符合 CAPE-OPEN 的对象。

安装包将在您的计算机上安装类库程序集,在 Visual Studio 中注册它,并安装一个可以从“Start menu”菜单访问的类文档帮助文件(单击“Start”按钮,选择“All Programs”,选择“CapeOpen .Net”文件夹,然后运行“Documentation.chm”文件)。当前文档文件包含类文档。它将扩展到包括一个教程,如下所示。

此类库仅用于测试和评估目的。如果您有任何意见,请通过以下方式联系 Bill Barrett: [email protected]

免责声明:

关于 Cape-Open .Net 软件和文档,无论是美国政府还是其任何员工,均不对所披露的任何信息、设备、产品或过程的准确性、完整性或有用性承担任何法律责任。此外,软件和文档“按原样”提供,不提供任何明示或暗示的保证或担保,包括但不限于对适销性或特定用途适用性的任何保证。

背书免责声明:

本文通过商品名、商标、制造商或其他方式提及任何特定的商业产品、工艺或服务,并不一定构成或暗示其得到美国政府的认可、推荐或支持。本文作者表达的观点和意见不一定代表或反映美国政府的观点和看法,也不得用于广告或产品代言目的。

版权状态:

美国政府保留非排他性、免版税的许可,可以发布或复制所提供的文件和软件。软件和文档可以自由分发,并可用于测试和评估目的。

Csharp模块示例

原标题:Creation of a Mixer class in C-Sharp

本示例将演示 Cape-Open .Net 类库,用于在 Visual Studio 中使用 C-Sharp 语言创建 Mixer 单元操作。

1 新建项目

创建项目。这是 Visual Studio 中的标准过程。在文件选项卡中选择“新建->项目”,选择“新项目”,选择 .NET 项目,如图:

2 导入类库

在“项目”中选择“添加引用”,在引用菜单中选择 CAPE-OPEN,如图:

3 构造类

单元模块衍生自 CapeOpen.CUnitBase 基类,并且需要被标记上 Serializable 属性,该基类实现了单元操作所需的所有 Cape-Open 接口,除了 ICapeUnit.Calculate() 方法。 Serializable 属性允许单元模块使用 .NET 基本序列化方法以实现持久化存储(保存到磁盘)。

还需要添加 ComVisible(true)GUID 属性,用于注册 COM 互操作类,请注意,每个类的 GUID 都是唯一的标识符。您需要使用 Visual Studio 中的 Create GUID 工具创建新的 GUID,如下所示:

点击“复制”按钮,将生成的 GUID 写入下列代码中,同时类库还提供了用于公开 CapeDescription 注册表项的自定义属性,如下所示。一旦完成,类将看起来像这样:

[Serializable]
[CapeOpen.CapeDescriptionAttribute("Mixer example class written in C#.")]
[CapeOpen.CapeVersionAttribute("1.0")]
[CapeOpen.CapeVendorURLAttribute("http:\\www.epa.gov")]
[CapeOpen.CapeHelpURLAttribute("http:\\www.epa.gov")]
[CapeOpen.CapeAboutAttribute("US Environmental Protection Agency\nCincinnati, Ohio")]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.Guid("8F39966B-6F94-4657-A67D-DAD971C898B4")]
	public class Class1: CapeOpen.CUnitBase
	{
	}
}

构造类时应该会有以下报错,不用担心,下面的步骤中将继续进行处理:

C:\MixerExample\MixerExample\MixerExample\Class1.cs(8,18): error CS0534: 'MixerExample.Class1' does not implement inherited abstract member 'CapeOpen.CUnitBase.Calculate()'
C:\Program Files\USEPA\CapeOpen\CapeOpen.dll: (Related file)

4 初始化方法

实现单元操作构造函数和/或初始化方法。

参数和端口集合在 CapeOpen.UnitBase 类构造函数中创建,该构造函数在对象创建期间在派生类的构造函数之前调用。但是,CAPE-OPEN 规范规定,端口和参数集合应在 ICapeUtilities.Initialize() 方法中创建,并要求流程建模环境在使用PMC(流程模拟环境)之前调用单元操作的 ICapeUtilities.Initialize() 方法。

initialize 方法被实现为一个虚拟函数,在 CapeOpen.UnitBase 类中不做任何事情。您可以选择在类中构造函数或 ICapeUtilities.Initialize() 方法中添加端口和参数。下面显示了如何将 Initialize() 方法添加到单元操作中。代码看起来像这样:

[Serializable]
	[Serializable]
	[CapeOpen.CapeNameAttribute("MixerExample")]
	[CapeOpen.CapeDescriptionAttribute("Mixer example class written in C#.")]
	[CapeOpen.CapeVersionAttribute("1.0")]
	[CapeOpen.CapeVendorURLAttribute("http:\\www.epa.gov")]
	[CapeOpen.CapeHelpURLAttribute("http:\\www.epa.gov")]
	[CapeOpen.CapeAboutAttribute("US Environmental Protection Agency\nCincinnati, Ohio")]
	[System.Runtime.InteropServices.ComVisible(true)]
	[System.Runtime.InteropServices.Guid("8F39966B-6F94-4657-A67DDAD971C898B4")]

public class Class1: CapeOpen.CUnitBase {
	public Class1() {
		this.ComponentName = "MixerExample";
		this.ComponentDescription = "Mixer easmple class written in C#";
	}
	public override void Initialize() {
		this.Ports.Add(new CapeOpen.CUnitPort("Inlet Port1", "Test Inlet Port1", CapeOpen.CapePortDirection.CAPE_INLET, CapeOpen.CapePortType.CAPE_MATERIAL));
		this.Ports->Add(new CapeOpen.CUnitPort("Inlet Port2", "Test Inlet Port2", CapeOpen.CapePortDirection.CAPE_INLET, CapeOpen.CapePortType.CAPE_MATERIAL));
		this.Ports->Add(new CapeOpen.CUnitPort("Outlet Port", "Test Outlet Port", CapeOpen.CapePortDirection.CAPE_OUTLET, CapeOpen.CapePortType.CAPE_MATERIAL));
		this.Parameters->Add(new CapeOpen.CRealParameter("PressureDrop", "Drop in pressure between the outlet from the mixer and the pressure of the lower pressure inlet.", 0.0, 0.0, 0.0, 100000000.0, CapeOpen.CapeParamModeCAPE_INPUT, "Pa"));
		this.Parameters->Add(new CapeOpen.CIntParameter("Parameter2", 12, CapeOpen.CapeParamMode.CAPE_INPUT_OUTPUT));
		this.Parameters->Add(new CapeOpen.CBoolParameter("Parameter3", false, CapeOpen.CapeParamMode.CAPE_INPUT_OUTPUT)); String[] options = { "Test Value", "Another Value" };
		this.Parameters->Add(new CapeOpen.COptionParameter("Parameter4", "OptionParameter", "Test Value", "Test Value", options, true, CapeOpen.CapeParamMode.CAPE_INPUT_OUTPUT));
		this.AvailableReports->Add("Report 2");
	}
}

构造函数设置单元操作的 ICapeIdentification.ComponentNameICapeIdenfication.ComponentDescription 属性。Initialize() 方法重写基类方法,并将端口和参数添加到各自的集合中。

创建端口:

端口由 CUnitPort 类实现。此类实现了 ICapeUnitPortICapeIdentification 接口。此类只有一个构造函数,它接受以下参数:

  • String ComponentName (设置 ICapeIdentification.ComponentName 值);
  • String ComponentDescription (设置 ICapeIdentification.ComponentDescription 值);
  • CapePortDirection direction (设置 Port Direction 端口描述值);
  • CapePortType type (设置 Port Type 端口类型值);

前面的是类型,后面的是值。

创建端口后,可以使用 PortCollection 类的 Add() 方法将其添加到端口集合中。

创建参数:

有 4 种类型的参数可用,CRealParameter \ CIntParameter \ CBoolParameter \ COptionParameter ,其中每一个都实现了 ICapeIdentification \ ICapeParameter \ ICapeParameterSpec 这三种接口,并且它们的实现是适当的规范的。构造函数被重载(多个版本),每个构造函数的描述都在上述文档文件中提供。

创建参数后,可以使用 ParameterCollection 类的 Add() 方法将其添加到端口集合中。

5 实现计算

有关混合器的实现,请参阅随附的“MixerExample.cs”文件:

MixerExample.cs

此示例使用 CapeOpen.ICapeThermoMaterialObect 接口和 MaterialObjectWrapper 类获得输入流的组分流量、压力和焓。

MaterialObjectWrapper 类包装一个材质对象,并将变量(对象)转换为适当的数组类型以方便使用。提供的示例使用 MessageBox.Show 方法在遇到异常时提供反馈,并要求将对 System.Windows.Forms 程序集的引用添加到您的代码中。

6 编译和输出

设置 IDE 以注册构建输出。这是通过打开项目属性页,选择“构建”选项卡并选中“注册 COM 互操作”复选框来完成的。此时,混合器单元操作可用于您的过程模拟应用程序,如 COFE。应该注意的是,通过选中“注册 COM 互操作”框,该组件仅在本地注册。如果要将组件分发到其他计算机,则需要使用 regasm.exe 或创建安装包来注册。

打开 COFE,选择添加单元操作按钮,您将在“选择单元操作”对话框中看到 MixerExample.Class1,如下所示:

选择“确定”,并将装置操作添加到流程图中:

然后选择一个属性包并将材质附着到端口:

配置入口物料流并求解流程图。在启动单元操作的 Calculate() 方法时,ICapeDiagnostic.LogMessageICapeDiagnostic.PopUpMessage 方法被调用,如下所示:

并且单元模块将会被执行计算:

DeBug

有两种方法可以访问调试器。首先,您可以在 Debugger 属性页上选择所需的模拟应用程序作为要启动的外部程序,如图所示:

当您选择“调试->开始调试”菜单项时,所选应用程序将作为主机启动。

或者,您可以通过选择“调试->附加到进程”菜单项来附加到正在运行的进程,这将打开如下所示的对话框:

选择所需的应用程序,然后单击“附加”按钮。然后,类库将在执行过程中遇到的所有断点处停止,如下所示:

单元模块管理者

这是一个与热力学包中提供的热系统类似的系统。它旨在允许开发人员创建可以在客户端计算机上开发、测试和安装的单元操作类,而不需要基于 COM 的开发所需的管理凭据。

安装此软件包时,将在 %program files% (通常为 C:\\Program Files 目录)中安装一个名为“CapeOpen Objects”的目录(见下文)。

单元模块管理者将检查“CapeOpen Objects”目录和所有子目录,以查找包含由该程序集构建的 CapeOpen 单元模块的程序集。此外,如果您正在调试测试单元,单元操作管理器将检测调试器,并在正在调试的程序集中定位任何单元操作。

要使用单元模块管理器,请将此软件包安装到目标计算机中。如果您开发了如上所示的单元操作,在调试时,请从流程图环境中选择 UnitOperationManager(如下所示):

单击“确定”,将显示单位操作选择器:

然后,您可以选择所需的单元模块,它将被创建并插入流程图中供您使用。