:自定义单元操作——把设备封装成可被流程调用的黑箱/白箱)
gPROMS二次开发教程09自定义单元操作——把设备封装成可被流程调用的黑箱/白箱版本声明块工具/软件gPROMS 桌面建模环境gPROMS ModelBuilder检索期官方发布锚点gPROMS Process 2022.1.0适用版本以官方发布说明为准语言/环境gPROMS 语言equation-oriented modelling实体MODELS/PROCESSES关键字UNIT、PORT、TOPOLOGY本文目标为一台设备设计一个能被流程调用的接口让它从一次性脚本变成可复用资产一句话结论把设备塞进流程的关键不是把方程写对而是把端口PORT设计对——因为TOPOLOGY中一条连接 两个端口内变量逐一等价这条语义决定了单元的稳态自由度必须恰好等于入口端口所携带的变量数示例单元中7 个未知量 − 4 条方程 3 个自由度正好由入口端口的F_in、C_Ain、T_in补齐端口漏放一个变量例如忘了把流量放进出口端口流程就会欠定一条方程。〇、本篇要解决的认知问题Q1自定义单元操作在流程建模中的位置与价值是什么为什么能算一个设备和能把它塞进流程是两件事Q2UNIT声明与PORT端口设计背后的变量契约是什么端口该按什么原则划分Q3TOPOLOGY中连接 端口内变量逐一等价的语义对单元设计有哪些硬约束Q4从能算到可复用封装规范里必须有哪些条目参数化、单位、命名Q5自定义单元如何接入 flowsheeting与 CAPE-OPEN Unit Operation 暴露路径又是什么关系一、机制解析1.1 位置与价值单元是流程的接口层一台设备在你的工程里会经历三种形态成本结构完全不同形态特征复用成本典型问题一次性脚本只为一个算例写的方程组参数硬编码几乎无法复用换工况要复制整段代码可调用单元参数化 端口化能被流程实例化低一个实例 一组参数需要设计接口标准单元操作单元可被流程调用并按需暴露给外部环境最低跨工具可用需要对接口标准做适配一次开发 ──▶ 多次复用 ──▶ 跨工具复用 脚本 UNIT PORT CAPE-OPEN Unit Operation 暴露路径 价值曲线开发成本集中在第一段收益在第二、三段指数放大。 反面把单元写成脚本 ⇒ 每一次新流程都在重复支付第一段的成本。经验法则只要一台设备被你用过第二次它就该被封装成单元。判断标准很朴素如果新流程需要你复制粘贴 手改参数那台设备就欠一个单元封装。1.2UNIT声明 PORT接口定义即变量契约UNIT单元声明与PORT端口合起来表达一份契约┌──────────────────────────────────┐ │ 自定义单元内部 │ 入口端口 feed ───▶ │ 内部方程守恒 本构 物性消费 │ ───▶ 出口端口 prod 3 个变量 │ 内部辅助量不暴露 │ 3 个变量 └──────────────────────────────────┘ 契约的含义 · 入口端口 外部必须给我这些量否则我解不出来需求 · 出口端口 我保证提供这些量下游可以取用承诺 · 端口内的变量构成连接时被逐一等价的集合因此端口的完备性 直接决定流程方程组是否闭合。端口设计三原则这三条是工程判据不是语法要求原则内容违反后果完备性连接下游所需的量必须全部放进端口含流量、温度、压力、各组分浓度下游变量无人赋值 → 流程欠定最小性只暴露下游真正需要的量内部辅助量如速率、中间变量不进端口端口臃肿 → 连接方程数无谓膨胀报错定位困难一致性同一端口内所有变量的单位与类型必须统一约定同一连接内的变量单位相同单位不一致 → 求解成功但数值荒谬第 05 篇的隐蔽失败铁律 1先查底账后落笔端口的具体声明语法、端口内变量的成员写法、单元模型与端口的绑定方式都属于 gPROMS 语言细节本系列不做语法推演正文代码块一律声明为结构示意细节以随附官方《gPROMS ModelBuilder Guide》为准。1.3 连接语义为什么端口设计是数学问题而不是风格问题第 04 篇已经建立连接即方程。在自定义单元语境下这条语义必须被展开成工程推论一条连接 ⇔ 上游出口端口内变量 与 下游入口端口内变量 逐一写成相等方程 推论 1数量守恒一条连接消去的方程数 端口内变量个数。 端口越大连接越重端口漏项连接就轻——而轻了就是欠定。 推论 2方向不影响方程入口/出口只是人为标注的语义方向 平台看到的仍然是一组等式因此接反了不会报语法错 只会给出物理上错的解例如把出口浓度当入口浓度。 推论 3端口完备性天然可检验对每个单元做一次自由度核对 若未知量 − 方程数恰好等于入口端口变量数则端口设计自洽。推论 3 是本篇最重要的可操作判据下面用代码 2-1 的示例单元实际验算一遍。1.4 从能算到可复用封装规范规范项做法反面案例参数化几何、动力学、传热等随实例变化的量全部提为可传入参数V 1e-3写死在方程里单位约定单元文件头写明全套单位端口变量的单位尤其要写端口里一个变量用 mol/s 另一个用 kg/s命名端口名表达角色feed/prod变量名表达物理量p1、p2、portA假设声明已忽略的物理如忽略压降“忽略径向梯度”在文件头显式写出假设只存在于作者记忆里范围声明单元适用的工况范围温区、流量区间一并写出单元被用在回归范围之外文档化每个单元附接口契约表下一篇与第 13 篇展开新人只能靠读方程猜接口铁律 9改完必验单元被改动改方程、改端口、改参数含义后必须用固定算例复跑并对比基线。端口变更尤其危险——它会让所有引用该单元的流程静默地改变方程结构。因此每次改端口都要把受影响的流程清单一并更新。1.5 接入 flowsheeting流程是单元的装配把单元接入流程建模官方能力名区分gPROMS flowsheeting、Steady state flowsheeting and optimization与Dynamic flowsheeting and optimization时流程层的工作只有三件实例化把单元模型实例化并按实例赋参数第 06 篇的参数化思路连接按TOPOLOGY语义把出口端口接到下游入口端口补边界把第一个单元的入口端口用进料规格补齐把末级出口声明为流程结果量。流程级自由度核对因此变成一句口诀“每个单元自足连接逐端口消去首尾补边界。”而优化则是在这之上再加一层把某些边界量进料条件、单元参数从给定改为待优化同时引入目标函数与约束——这时单元的参数化程度直接决定优化的可行域有多大。1.6 与 CAPE-OPEN 暴露路径的关系若需要把自定义单元暴露到其他模拟环境中使用存在一条标准化路径gPROMS ModelBuilder 提供向导把 gPROMS 模型暴露为 CAPE-OPEN Unit Operation。证据性质声明本条能力的公开佐证来自CAPE-OPEN 标准组织的材料属权威第三方证据等级 [B]见本篇 references 第三条不是 Siemens 一手产品页向导的具体操作步骤、支持的变量映射范围与版本兼容性以官方文档与标准组织的现行规范为准。这条路径与本篇的关系是端口设计得是否干净直接决定暴露出去之后接口是否好用。端口臃肿或语义模糊的单元即使成功暴露为标准单元操作外部用户也无法理解该给什么、该取什么——接口标准解决的是能不能通信接口设计解决的是能不能用。二、完整模型与逐行剖析代码 2-1自定义反应器单元——MODEL与端口定义结构示意% --------------------------------------------------------------------------- % 说明本块为结构示意。MODELS / PARAMETER / VARIABLE / UNIT / PORT 为已确证 % 关键字端口的具体声明语法、端口内变量的成员写法、端口与单元的绑定方式 % 以官方《gPROMS ModelBuilder Guide》为准。 % 数值均为教学示例值正式使用须替换为可引用文献数据铁律 10。 % 物理背景把绝热管式反应器单元封装成可被流程调用的单元操作白箱。 % --------------------------------------------------------------------------- MODELS PARAMETER V 1.0e-3 % 单元有效体积由流程按实例赋值 → 参数化 k0 1.0e5 % 阿伦尼乌斯指前因子示例值 Ea 5.0e4 % 活化能示例值 Rg 8.314 % 气体常数 dH -5.0e4 % 反应焓放热为负示例值 rho_cp 4.0e3 % 体积热容示例值 VARIABLE F_in % 入口体积流量由外部连接或进料规格给出 C_Ain % 入口 A 浓度由外部给出 T_in % 入口温度由外部给出 C_A % 出口 A 浓度供下游取用 T % 出口温度供下游取用 k % 速率常数内部辅助量不暴露 r_A % 净生成速率内部辅助量不暴露 %% 对外接口端口PORT——声明这个单元与外界交换哪些量 PORT feed IN % 入口端口外部必须补齐的三个量需求清单 F_in, C_Ain, T_in % 端口成员连接时与上游出口端口逐一等价 PORT prod OUT % 出口端口对外承诺提供的量承诺清单 F_in, C_A, T % 注意 F_in 也在出口端口内 % 连接后与下游入口流量等价 ⇒ 表达流量连续 % 若省略 F_in下游的 F_in 将无人赋值 ⇒ 流程欠定 %% 单元内部物理稳态形式先单点可解再考虑升级为动态 k k0*EXP(-Ea/(Rg*T)) % E1 速率常数的温度依赖 r_A -k*C_A % E2 一级反应速率示例本构 F_in*(C_A - C_Ain) - V*(-r_A) 0 % E3 A 的稳态物料衡算残差式 F_in*rho_cp*(T - T_in) - V*(-dH)*(-r_A) 0 % E4 绝热能量衡算放热全部用于升温 %% 说明单元内部只写一个设备自己的物理不写它在流程中的位置 %% ——这是可复用性的根本前提第 06 篇的子模型自足原则逐行剖析端口是本块的主角。PORT feed IN列出的三个量字面意思就是外部必须给我这三个量PORT prod OUT列出的三个量是我保证提供。端口不是注释它是可被平台解释的契约——连接时会被逐条展开成等式。F_in同时出现在两个端口这是本块最值得揣摩的设计决定出口端口里的F_in与下游入口端口的F_in一旦被连接就得到流量连续这条方程。如果只把浓度和温度放进出口端口下游的F_in就会是自由变量——流程级自由度核对会立刻暴露这个漏洞对应报错 3-1。k、r_A不放进端口它们是内部辅助量。端口设计的最小声原则要求下游不需要的量不暴露否则连接方程数无谓变多报错定位也会变困难。E3、E4与第 05、08 篇的写法完全一致残差式、符号逐项可核。单元内部物理与是否能被流程调用没有关系封装不改变物理只改变它与外界的接口。自由度核对铁律 8——端口自洽性的验算项数量明细未知量7F_in、C_Ain、T_in、C_A、T、k、r_A单元内部方程4E1 本构、E2 速率、E3 物料衡算、E4 能量衡算单元内部自由度37 − 4 3入口端口变量数3F_in、C_Ain、T_in结论自洽单元自由度恰好由入口端口清单补齐 ⇒ 该单元可被接入流程即闭合经验法则单元内部自由度 入口端口变量数就是端口设计的自校验公式。算出来不相等时自由度偏大说明端口漏了量外部补不上自由度偏小说明端口塞了多余的量外部会给一个单元内部已经确定的量导致超定。代码 2-2把两个自定义单元连成小流程PROCESSESTOPOLOGY结构示意% --------------------------------------------------------------------------- % 说明本块为结构示意。PROCESSES / UNIT / TOPOLOGY 为已确证关键字 % TOPOLOGY 段中连接的确切书写方式、端口成员访问语法、实例参数赋值写法 % 以官方《gPROMS ModelBuilder Guide》为准。 % 物理背景两级串联反应工段两个实例复用代码 2-1 的同一个单元模型。 % --------------------------------------------------------------------------- PROCESSES %% 1) 实例化同一个单元模型两个实例两组参数 UNIT stage1 AS my_reactor_unit % 实例 1单元模型 my_reactor_unit V 1.0e-3 % 实例参数赋值覆盖默认参数化收益在此体现 UNIT stage2 AS my_reactor_unit % 实例 2同一模型 → 复用不是复制 V 2.0e-3 % 末级放大 2 倍结构实验只改这一行 %% 2) 补边界把首级入口端口用进料规格补齐流程的三个外部条件 stage1.F_in 1.0e-4 % 进料流量 stage1.C_Ain 100.0 % 进料 A 浓度 stage1.T_in 300.0 % 进料温度 %% 3) 连接连接 上游出口端口内变量与下游入口端口内变量逐一等价 TOPOLOGY stage1.prod - stage2.feed % 一条连接展开为端口内变量的逐一相等 %% 该连接等价于示意 %% stage2.F_in stage1.F_in ← 流量连续靠端口里的 F_in 实现 %% stage2.C_Ain stage1.C_A ← 浓度传递反应器出口 → 下游入口 %% stage2.T_in stage1.T ← 温度传递绝热单元的热量随流带走 %% 4) 声明流程结果量把末级出口作为工段输出 C_A_out stage2.C_A % 工段出口 A 浓度 T_out stage2.T % 工段出口温度逐行剖析两个实例都写作AS my_reactor_unit这就是可复用的字面体现stage2之所以能被建出来仅仅因为它是一个有入口端口、有出口端口、可传参数的单元。若代码 2-1 里的V是硬编码的stage2就必须复制一份代码——复用彻底失效。进料规格只写了三条F_in、C_Ain、T_in恰好等于stage1入口端口的变量数这正是代码 2-1 自由度核对结论的直接用途。如果入口端口多了一个变量比如压力这里就必须多写一条否则流程欠定。TOPOLOGY中的一条连接展开为三条方程端口内有三个变量。注释里把展开结果写出来是良好习惯它让连接到底建立了几条约束这件事变得可数、可核。流程结果量C_A_out、T_out通过别名方式取得 stage2.C_A。不要把它们塞回单元端口——结果量是流程的对外输出不是单元接口的一部分。整个流程的自由度核对可以照 §1.5 的口诀走一遍步骤核算结果单元自足每个实例内部自由度 3由入口端口补齐单元闭合连接消去stage1.prod - stage2.feed展开 3 条方程消去stage2的 3 个自由变量消去完成首尾补边界stage1的 3 个入口变量由进料规格给定补齐完成流程总自由度0可解代码 2-3单元接口契约表供流程使用者与库维护者共用% % 单元接口契约表 % 单元模型my_reactor_unit 单元名称绝热管式反应器单元白箱 % 适用版本以官方发布说明为准检索期锚点 gPROMS Process 2022.1.0铁律 3 % --------------------------------------------------------------------------- % 一、端口契约这是对外承诺改动即影响全部引用它的流程 % 端口 | 方向 | 端口内变量 | 单位示例约定 | 物理含义 | 来源/去向 % ---------------------------------------------------------------------- % feed | IN | F_in | m^3/s | 入口体积流量 | 上游出口端口 % feed | IN | C_Ain | mol/m^3 | 入口 A 浓度 | 上游出口端口/进料规格 % feed | IN | T_in | K | 入口温度 | 上游出口端口/进料规格 % prod | OUT | F_in | m^3/s | 流量用于连续 | 下游入口端口 % prod | OUT | C_A | mol/m^3 | 出口 A 浓度 | 下游入口端口/流程结果 % prod | OUT | T | K | 出口温度 | 下游入口端口/流程结果 % % 二、可传入参数随实例变化 → 实例化时赋值 % 参数 | 单位 | 物理含义 | 取值范围示例 | 来源 % ----------------------------------------------------------------- % V | m^3 | 有效体积 | 1e-4 ~ 1e-2 | 设备几何 % k0 | 1/s | 指前因子 | 待标定 | 文献/参数估计 % Ea | J/mol | 活化能 | 待标定 | 文献/参数估计 % % 三、单元内部假设写清这个单元不做什么 % · 忽略压降不分压压力不做变量 % · 忽略径向梯度轴向为唯一考虑方向必要时升级为 DISTRIBUTED见第 08 篇 % · 一级反应、等密度、绝热无夹套移热 % % 四、适用边界与回归基线铁律 9 % 适用温区以动力学参数回归温区为准超出即外推失效铁律 10 % 基线场景[A] 单级标准工况 [B] 两级串联末级体积 2 倍 [C] 入口温度 20 K % 基线量 出口 C_A、出口 T、单元内部自由度(入口端口变量数) 校验通过 % 变更影响端口增删 ⇒ 必须同步更新引用本单元的流程清单并全部复跑 % 逐行剖析这张契约表把接口从口头约定变成可交付物。四个板块分别对应四类真实风险端口契约改端口影响所有下游流程必须显式登记引用清单、可传入参数哪些能改、改到什么范围、内部假设写清不做什么避免使用者误以为单元包含压降或径向分布、适用边界与基线把铁律 9 与铁律 10 落在单元的粒度上。在团队协作里这张表是整台设备唯一需要被读懂的东西——使用者读它就能接入不必读单元的方程。三、常见报错与排查报错 3-1流程欠定——某个入口变量无人赋值。现象流程求解报自由度不足或出现自由变量。根因端口漏放变量最典型的是出口端口漏了流量于是下游F_in没有方程约束或连接时漏连了某一对端口或进料规格少写一条。解法对每个单元执行单元内部自由度 入口端口变量数的自校验把一条连接展开成端口内变量的逐条等式逐项打勾把代码 2-3 的契约表与实际代码对照。报错 3-2流程超定——同一个量被赋予了两次。现象报约束冲突或残差不降。根因端口里塞了多余的量下游会给出一个单元内部已由方程决定的量或同一物理约束在单元内部与流程层各写了一次。解法执行端口最小性检查——把端口内每个变量都问一遍下游真的需要它吗确认同一物理关系只在单元内部出现一次流程层只负责连接与边界。报错 3-3连接接反——出口接出口。现象模型能求解但结果非物理例如下游入口温度等于上游出口温度以外的错误量或浓度方向反常。根因入口/出口端口方向标注与实际物理流向不一致。注意平台看到的是等式不会报语法错推论 2。解法按流向复核每条连接给端口命名带角色语义feed/prod并在契约表里写明来源/去向一列。报错 3-4单位不一致——求解成功但数值荒谬。现象温度算出几万度、流量相差几个数量级。根因端口内变量之间的单位约定不统一一个用 mol/s、一个用 kg/s或单元内部与流程层单位约定不同。解法在契约表里给每个端口变量写明单位单元文件头写全套单位约定第 05 篇的最佳实践做量纲走查。报错 3-5单元改端口后其他流程静默出错。现象改了单元的端口某条流程的结果变了或报错但没人立刻意识到原因。根因端口变更是跨流程的接口变更影响面不局限于当前工程铁律 9 的高危场景。解法维护引用本单元的流程清单端口变更后对该清单全部复跑基线在契约表的变更影响一栏留记录。报错 3-6暴露到外部环境后行为与预期不符。现象单元被暴露为 CAPE-OPEN Unit Operation 后外部环境给出的结果与 gPROMS 内不一致或某些变量无法映射。根因端口语义模糊外部无法判断该给什么、变量映射范围与标准规范不匹配或外部环境的物性/单位约定不同。解法先做端口语义清理完整性与最小性再核对标准组织的现行规范与官方文档对映射范围、单位与版本兼容性的说明。本条能力的佐证来自 CAPE-OPEN 标准组织材料证据等级 [B]具体操作与支持范围以官方文档与标准规范为准。四、动手练习练习 1端口自校验为代码 2-1 的单元做自由度核对算出未知量 − 方程数并与入口端口变量数比较。判定两者相等能指出若把k、r_A也塞进端口会得出什么结论自由度偏小 ⇒ 超定风险。练习 2漏项实验把代码 2-1 出口端口中的F_in删除重新求解代码 2-2 的流程。判定能观察到欠定类报错或自由变量能说明漏一个端口变量 ⇒ 流程少一条方程随后恢复并复跑基线。练习 3连接展开把代码 2-2 中stage1.prod - stage2.feed这条连接展开成逐条等式写出来。判定三条等式齐全且与端口成员一一对应能说明每条等式对应的物理含义流量连续、浓度传递、温度传递。练习 4封装改造把你课题里某台只为一个算例写过的设备改造成单元提参数、定端口、写契约表。判定改造后能被实例化两次并正常连接求解端口自校验通过契约表四板块齐全两次实例使用不同参数时均求解成功。练习 5思考题无标准答案如果一台设备在流程中必须知道上游压力例如为了算压降而你的单元当前忽略压降所以端口里没有压力你会怎样修改端口与单元假设请给出你的方案并说明它对已有流程的影响面。五、小结与下一篇预告本篇把设备变成了资产UNIT声明 PORT定义了一份可被平台解释的变量契约端口设计的三原则完备性、最小性、一致性决定流程能否闭合TOPOLOGY中连接 端口内变量逐一等价这条语义给出两个必须记住的推论——一条连接消去的方程数等于端口内变量个数漏项即欠定以及方向不影响方程接反不会报语法错只会给错解最重要的可操作判据是单元内部自由度 入口端口变量数这条自校验公式。可复用性则由四条封装规范保证参数化、单位约定、命名、假设与范围声明外加一份接口契约表。最后单元若要暴露给外部环境CAPE-OPEN Unit Operation 路径佐证来自 CAPE-OPEN 标准组织材料接口标准解决能不能通信接口设计解决能不能用。第 10 篇进入全系列的诊断科方程诊断与模型稳健化——自由度、初始化与求解失败排查。我们建立可复用的排查顺序现象 → 根因 → 处置三段式讲清结构奇异与数值奇异的区别、官方能力名Initialization procedures in gPROMS的分步求解思路、Making models robust的常见手法以及Troubleshooting failing simulations的系统排查顺序——这一篇的清单是你前面所有模型能否跑得稳的保障。本篇认知问题回显FAQQ1自定义单元操作的位置与价值是什么为什么能算一个设备和能把它塞进流程是两件事A设备在工程里有三种形态一次性脚本参数硬编码、几乎无法复用、可调用单元参数化加端口化、能被流程实例化、标准单元操作可按需暴露给外部环境。开发成本集中在第一段收益在第二、三段放大。能算一个设备只说明方程写对了能被流程调用还要求它给出清晰的对外接口即入口端口列出外部必须补齐的量、出口端口列出向外承诺提供的量否则流程层无法知道该给它什么、该取什么。判断标准很朴素只要这台设备被用过第二次它就该被封装。Q2UNIT 与 PORT 背后的变量契约是什么端口该按什么原则划分A契约有两半入口端口是需求清单含义是外部必须给我这些量否则解不出来出口端口是承诺清单含义是我保证提供这些量下游可以取用。端口内的变量构成连接时被逐一等价的集合因此端口完备性直接决定流程方程组是否闭合。划分遵循三原则完备性连接下游所需的量必须全部进端口含流量、温度、压力与各组分浓度最小性只暴露下游真正需要的量内部辅助量如速率与中间变量不进端口一致性同一端口内的变量单位与类型必须统一约定。Q3TOPOLOGY 中连接 端口内变量逐一等价对单元设计有哪些硬约束A有三个推论。数量守恒一条连接消去的方程数等于端口内变量个数端口越大连接越重端口漏项则连接变轻即欠定。方向不影响方程入口出口只是人为语义标注平台看到的仍是一组等式因此接反不会报语法错只会给出物理上错的解。端口完备性可检验对单元做自由度核对若未知量减方程数恰好等于入口端口变量数则端口设计自洽。因此端口设计是数学问题而非风格问题。Q4从能算到可复用必须有哪些封装规范A五条加一份交付物。参数化把几何、动力学、传热等随实例变化的量全部提为可传入参数单位约定单元文件头写明全套单位端口变量尤其要写命名端口名表达角色如 feed 与 prod变量名表达物理量假设声明已忽略的物理如忽略压降、忽略径向梯度必须在文件头显式写出范围声明单元适用的温区与流量区间一并写出。交付物是接口契约表包含端口契约、可传入参数、内部假设、适用边界与回归基线四个板块并登记引用本单元的流程清单因为改端口会让所有引用它的流程静默改变方程结构。Q5自定义单元如何接入 flowsheeting与 CAPE-OPEN 暴露路径是什么关系A接入流程只需三件事实例化单元并按实例赋参数按 TOPOLOGY 语义把出口端口接到下游入口端口补边界把第一个单元的入口端口用进料规格补齐并把末级出口声明为流程结果量。流程级自由度核对口诀是每个单元自足、连接逐端口消去、首尾补边界。若还要暴露到其他模拟环境存在一条标准化路径即 gPROMS ModelBuilder 提供向导把模型暴露为 CAPE-OPEN Unit Operation该能力的公开佐证来自 CAPE-OPEN 标准组织材料属权威第三方而非 Siemens 一手产品页向导步骤、变量映射范围与版本兼容性以官方文档与现行标准规范为准。端口设计得是否干净直接决定暴露之后接口是否好用。本文涉及的语言细节以所购版本随附的官方 gPROMS 文档为准。