☰
PDMS-AVEVA-E3D二次开发教程(01):四条路全景与选型——PML1、PML2、PML.NET 与 .NET Addin 的能力边界
2026/10/17 10:33:41 网站建设 项目流程

版本声明(全系列统一口径)
本系列基线为AVEVA E3D Design 3.1。程序集、文档与产品版本必须一一对应,跨版本引用接口会直接踩空。AVEVA PDMS 自 2024 年 4 月 1 日起不再销售、不再提供支持,因此本系列不把 PDMS 作为新开发目标,只在讲"迁移"时回到它。
凡官方口径,正文给出help.aveva.com的静态文档链接(该站为静态 HTML,正文可抓取、可核对);凡来自 AVEVA Community 论坛或第三方博客的内容,正文一律标注为社区来源/第三方来源,不代表官方结论;凡按官方 API 签名构造、但未在任何本机环境跑通的代码,一律标注**“按官方 API 签名构造,需在本地 E3D Design 环境验证”**。
官方未公开的项(官方示例下载页、独立的 Core / Core3D API 参考站、官方 GitHub 仓库等)在正文中只写"官方未公开",不做任何推测性补全。

一句话结论

四条路不是同一件事的四种写法,而是四层成本阶梯——PML1 宏最快(几分钟出结果)、PML2 最像"做应用"(表单与对象)、PML.NET 最擅长算法与外部库、.NET Addin 才能改界面并接进企业系统;选型第一刀砍在"要不要动界面",第二刀砍在"要不要复杂算法与外部依赖"。

〇认知问题

  1. AVEVA PDMS 已经停售停支持,那我手上的 PDMS 定制代码还有意义吗?新开发该对着哪个版本写?
  2. PML1 和 PML2 是两种不同的语言吗?新人应该先学哪一个?
  3. 我想在 E3D 界面上加一个自己的菜单和停靠窗口,只用 PML 能做到吗?
  4. 我是 C# 程序员,不懂管道业务,能不能完全绕开 PML?
  5. 网上有人说"E3D 15.x",这是不是更新的版本?我该不该追?
  6. 四条路可以混用吗?混用时最容易踩的坑是什么?

一机制解析

1.1 先把产品和版本钉死

做二次开发,第一条纪律是版本对齐。写错版本的接口名,报错信息往往指向"类型不存在"而不是"版本不对",排查会非常耗时。

产品层面的事实:

  • AVEVA E3D Design是当前在售的三维工厂设计产品,官方产品页为 https://www.aveva.com/en/products/e3d-design/。它取代 AVEVA PDMS。
  • AVEVA PDMS:官方产品页已只剩退市通告——自 2024 年 4 月 1 日起,PDMS 不再销售、不再提供支持,研发投入全部转向 E3D Design(https://www.aveva.com/en/products/aveva-pdms/)。官方同时说明 E3D Design 仍与 PDMS 后续版本保持兼容,客户可以两平台并行,但 PDMS 最终会被淘汰。
  • 版本线:帮助站上实测存在1.1 / 2.1 / 3.1三代 E3D Design 文档;docs.aveva.com的版本索引把当前版本列为E3D Design 3.1。本系列统一以 3.1 为准,遇到历史差异会显式标注。
  • 一个常见误解必须纠正:15.x 不是 E3D Design 的版本,而是 AVEVA Engineering 的版本。文档站会同时列出 “E3D Design 3.1” 与 “Engineering 15.8” 这类条目,容易让人误以为 E3D 也走到了 15 版。实际在 E3D Design 上没有发现 15.x 的命名(https://docs.aveva.com/bundle/system-platform-2023-r2-sp1)。
  • 近年可核实的重大变更(官方发布页 https://www.aveva.com/en/info/e3d-design-releases/):**3.1.5.0(2022-04)**引入Graphical Explorer(只读三维导航视图),并引入"通过PMLNETCALLABLE对象把 Microsoft ML.NET 训练好的机器学习模型导入 AVEVA PML"的能力(Model 模块 Developer 标签页);**3.1.4.0(2022-02)**引入MultiCAD(30 余种 CAD 格式导入,可由命令行或 PML 对象调用,支持批处理)、Work Packs(含 Visual Queries)、Space Management以及 Rule Manager 扩展。需要留意的是:该发布页只回溯到 2022 年 2 月,2023–2026 的发布条目在公开页面上未找到——这意味着"最新版有什么新 API"这件事,不能靠这个页面下结论。

一句话:基线认 E3D Design 3.1;PDMS 只当历史;15.x 与 E3D 无关。

1.2 四条路各自是什么

官方文档体系里有四本与二次开发直接相关的手册,教程里会反复引用它们:

文档代号入口
.NET Customisation User GuideNCUGhttps://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG_FP.html
PML Customisation User GuidePMLCGhttps://help.aveva.com/AVEVA_Everything3D/3.1/PMLPUG/PMLCG_FP.html
Software Customisation(对象/成员/方法总参考)SCRMhttps://help.aveva.com/AVEVA_Everything3D/3.1/SCRM/SCRM_FP.html
AVEVA CAF API 参考(唯一公开的独立 API 参考站)—https://help.aveva.com/API/CAF/index.html

四条路的技术定位如下。

路一,PML1。PML 是AVEVA Programmable Macro Language。官方对 PML1 与 PML2 的关系有明确表述:当前版本常称PML2,可以视为对PML1能力的扩展,但**“许多编程任务的做法不同”,而有些任务用 PML1 更高效**(https://help.aveva.com/AVEVA_Everything3D/3.1/PMLPUG/PMLCG2.02.1.html)。PML1 的表达方式是"命令 + 变量注入",最典型的就是把宏当作一排按键回放。PML1 的表达式包在数据库手册(DBRM)里单独成章,官方口径是"一般来说这些设施与 PML 2 兼容"(https://help.aveva.com/AVEVA_Everything3D/1.1/DBRM/DBRM9.10.01.html)。

路二,PML2。官方定义很清楚:PML2 是面向对象语言,专为定制 AVEVA 产品的 Forms and Menus 而设计;窗体本身就是对象,用全局变量表示(例如!!EntryForm),因此窗体名不能与其他对象、全局变量或窗体重名(https://help.aveva.com/AVEVA_Everything3D/3.1/PMLPUG/PMLCG14.14.1.html、https://help.aveva.com/AVEVA_Everything3D/3.1/PMLPUG/PMLCG2.02.3.html)。PML2 的文件类型按官方培训材料口径为.pmlfnc(函数)、.pmlfrm(表单)、.pmlobj(对象),依赖环境变量PMLLIB。

路三,PML.NET。官方原文的定位是:“Through the use of PML.NET, an enhancement to PML which allows the PML programmer to call .NET code, customisation which utilizes the strengths of .NET compiled code and PML can be achieved.”也就是说,PML.NET 是"让 PML 调用 .NET 代码"的增强机制,而不是"让 C# 反过来指挥 PML"。它的价值点在于:PML 负责熟悉模型数据,C# 负责算法与外部库。

路四,.NET Addin。NCUG 把 .NET 定制分成两条路径:.NET Addin与PML.NET,官方强调"两者都提供了一种在运行时把 .NET 程序集(dll)动态载入模块的机制",并且定位是与既有的 PML 定制并存(https://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG1.02.02.html)。.NET Addin 的判定标准是:程序集内必须含有一个实现IAddin接口的类,CAF(Common Application Framework)加载时用反射找到该类、实例化它并调用IAddin.Start(https://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG2.03.02.html)。

1.3 四条路的对照表(选型主表)

维度PML1PML2PML.NET.NET Addin
本质上是什么命令语法的宏语言面向对象扩展,为 Forms and Menus 设计PML 调 .NET 代码的桥运行时载入 dll 并接入 CAF
编译成本零(改文件即生效)零需要 C# 编译需要 C# 编译
能否加表单/界面基本不能(无 PML2 对象体系)能(setup form、gadget)不能(它只负责"被 PML 调用")能(Command+ UIC 文件 + 停靠窗口)
能否改 E3D 主界面菜单/工具栏不推荐不推荐不能能(官方推荐做法)
复杂算法/外部库弱弱强(.NET 全生态)强
数据访问方式命令与元素属性同 PML1C# 侧DbElement等C# 侧DbElement等
主要风险命名冲突、写库不可逆窗体名与全局变量冲突命名空间必须写全版本与程序集引用
推荐定位一次性宏、批处理回放内部小工具界面计算密集型任务交付级工具、企业系统对接

1.4 官方写明的限制(这些是选型的硬约束)

不要等踩了才回头改架构。官方文档里已经写死的限制有四条:

  1. C# 不能直接调用 PML。NCUG 明确:无法从 C# 直接调用 PML,只能通过事件机制反向通知(https://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG5.07.1.html)。这直接决定了架构方向:PML 是"主动方",C# 是"被调用方"。如果你设想的方案是"C# 主程序去驱动 E3D 干活",按官方机制这条路是走不通的。
  2. 只有标注PMLNetCallable的类与方法才会被 PML.NET 加载可见(https://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG5.07.2.html)。"代码写了却调不到"十有八九是这个原因。
  3. USING NAMESPACE必须写完整命名空间,不允许写"部分命名空间";该语法大小写不敏感。官方举例说明:写USING NAMESPACE 'Aveva.Core'之后再去object namespace.NETObject()会报错(https://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG5.07.3.html)。
  4. 不能把DIRECTION、ORIENTATION这类 PML 对象传给 .NET;但数据库引用(DB 引用)可以以数组或字符串形式传递(同上)。另外官方还指出:模块切换不保持 .NET 对象。

还有一条与界面相关的官方态度必须记住:PMLCG 的 Commands 章写明,命令可以实现为PML command object或core command object,通过.uic文件把工具与命令对象关联;并且官方明确"不建议从标签页按钮直接调用 PML 宏"(https://help.aveva.com/AVEVA_Everything3D/3.1/PMLPUG/PMLCG24.27.01.html)。原因在于这与 command ribbon 的机制不兼容——旧式事件/工具栏方式虽然"仍受支持",但官方标注为不推荐(NCUG 2.03.05 / 2.03.06)。

1.5 决策树

按顺序问自己四个问题,答案会直接落到某一条路上:

  1. 这一步是一次性的吗?是 → 直接写 PML1 宏,用完即弃,不要去建工程。
  2. 需要用户输入/选择/预览吗?需要 → 上 PML2(表单 + 对象),但记住 gadget 有硬限制(见 1.4 与后续表单篇)。
  3. 需要复杂算法、正则、外部库、机器学习模型吗?需要 → 上 PML.NET(把 C# 写成库,用IMPORT+USING NAMESPACE调),注意 C# 侧不能反向调 PML。
  4. 需要出现在 E3D 界面(菜单、工具栏、停靠窗口)或与公司系统交互吗?需要 → 上.NET Addin +Command+ UIC 文件,这是官方推荐做法。

经验法则(本系列一致口径):纯数据搬运与格式整理优先用 PML;需要复杂算法或外部库时再上 PML.NET 或 .NET Addin;界面级功能一定走Command+ UIC。

二完整代码与逐行剖析

下面四段代码的目的是"看见路的样子",不追求功能完整。前三段出自官方培训材料/官方文档原文摘录,第四段按官方 API 签名构造并已标注验证要求。

2.1 路一:PML1 宏(官方培训材料原样)

NEW EQUIP /ABCD NEW BOX XLEN 300 YLEN 400 ZLEN 600 NEW CYL DIA 400 HEI 600 CONN P1 TO P2 OF PREV

逐行剖析:

  • NEW EQUIP /ABCD:在当前层级下新建一个名为ABCD的设备(Equipment)。注意名称以/开头,这是"给出元素名"的写法。
  • NEW BOX XLEN 300 YLEN 400 ZLEN 600:在上一步创建的元素(即当前元素)之下新建一个长方体,三个方向的长度分别是 300 / 400 / 600。这条命令的隐含前提是"当前元素已经切到位"——宏本质上就是命令回放,谁"当前",命令就作用在谁身上。
  • NEW CYL DIA 400 HEI 600:新建圆柱,直径 400、高 600。
  • CONN P1 TO P2 OF PREV:按官方培训材料的原样,这是把连接点P1连到PREV(上一个元素)的P2上。这一行的教学价值在于让人看见PREV这类"相对定位词"是 PML1 宏的常用手法。

运行方式(官方培训材料口径):$M/%PDMSUI%\examples\simpleMac.mac,或更通用的$m/FILENAME。

2.2 路二:PML2 表单片段(官方文档原文摘录)

setup form !!nameCE !this.formTitle = |Name CE| button .button |Print Name Of CE| call |!this.print()| exit define method .print() q var !!ce.flnn endmethod

逐行剖析:

  • setup form !!nameCE:定义一个名为nameCE的窗体。窗体是对象,用全局变量表示,所以这里写的是!!nameCE——这也是"窗体名不能与既有全局变量重名"这条规则的技术根源。
  • !this.formTitle = |Name CE|:!this指窗体自身;formTitle是窗体标题属性;|Name CE|是 PML 的字符串定界写法(竖线包裹)。
  • button .button |Print Name Of CE| call |!this.print()| exit:放一个按钮 gadget,按钮上的文字是Print Name Of CE;call |...|后面是回调——官方原文说,回调是以文本字符串形式提供的,“可以是任何合法的 PML 表达式、PML 函数或方法调用,包括任何窗体、gadget 或用户定义对象的方法”。exit表示这个按钮行为结束后关闭窗体。
  • define method .print()…endmethod:为窗体对象定义方法。方法体里q var !!ce.flnn是"查询当前元素的flnn属性并把变量形式打印出来",属于 PML 的调试型输出。注意方法体里操作的是!!ce(全局当前元素),而回调里写的是!this.print()(窗体自身的方法)。

这一段最值得记住的是:回调是字符串,不是函数指针;字符串里写什么,就会被当作 PML 代码执行。

2.3 路三:PML.NET 的入口(官方语法摘录)

IMPORT 'MyCompany.E3DExt' USING NAMESPACE 'Aveva.Core.Samples' -- 官方在说明"不允许部分命名空间"时给出的调用形式: -- object namespace.NETObject()

逐行剖析:

  • IMPORT '...'``:PML.NET 装载程序集的语法。装配件由 **PMLNetEngine** 用反射加载,查找路径为 **%AVEVA_DESIGN_EXE%` 目录、其子目录、映射驱动器或 UNC 路径**。
  • USING NAMESPACE 'Aveva.Core.Samples':指定命名空间,大小写不敏感,但必须写完整。写父级再去点取子对象,官方明说会报错。
  • object namespace.NETObject():官方文档里出现的调用形式,用于说明命名空间解析规则。真正可调用的类与方法,必须是被你自己的程序集里标注了PMLNetCallable的类与方法——程序集名与类名请替换成你自己的;本段只示范语法骨架,按官方 API 签名构造,需在本地 E3D Design 环境验证。

2.4 路四:.NET Addin 骨架(按官方 API 签名构造,需在本地 E3D Design 环境验证)

usingAveva.ApplicationFramework;// AddinManager / ServiceManager / SettingsManagerusingAveva.ApplicationFramework.Presentation;// CommandManager 等// CAF 的判定标准:程序集内必须有"一个"实现 IAddin 接口的类,// 加载时由 CAF 反射查找、实例化,并调用 IAddin.Start。// Start 的确切签名请以本地 NCUG 2.03.02 页与安装目录 Samples.zip 中的官方工程// (ExamplesAddin / AttributeBrowserAddin 等)为准;此处按官方结构构造骨架。publicclassMyFirstAddin:IAddin{publicvoidStart(){// 1) 从服务容器取到 CAF 服务(官方示例用 serviceManager.GetService(typeof(Xxx)))// 2) 在这里注册自定义 Command、停靠窗口、UIC 文件// 3) 具体写法见官方 NCUG 的 Addin 与 Command 章节}}

逐行剖析:

  • using Aveva.ApplicationFramework;:CAF 的核心命名空间。官方文档给出的命名空间清单包含Aveva.ApplicationFramework(含AddinManager、ServiceManager、SettingsManager)与Aveva.ApplicationFramework.Presentation(含CommandBarManager、CommandManager)。
  • public class MyFirstAddin : IAddin:实现IAddin是 Addin 的准入条件。注意官方描述是"反射找一个实现IAddin的类"——不是靠配置文件里声明类名,所以一个程序集里通常只放一个实现类,避免歧义。
  • Start():CAF 调用它,一切初始化都发生在这里。

装配件层面,官方文档逐页实测存在的程序集名为:Aveva.ApplicationFramework.dll、Aveva.ApplicationFramework.Presentation.dll(CAF 两件套);Aveva.Core.Database.dll、Aveva.Core.Database.Filters.dll(数据访问);Aveva.Core.Geometry.dll、Aveva.Core.Maths.Geometry.dll、Aveva.Core.Shared.dll、Aveva.Core.Utilities*.dll、Aveva.Core3D.Graphics.dll;以及Aveva.Engineering.Tags.Pml.dll。AVEVA Standalone 专用的是Aveva.Core3D.Standalone、Aveva.E3D.Standalone。

需要特别提醒的是代际陷阱:历史版本文档(PDMS 12.0 时代)中出现的程序集名是Pdms.Database.dll、PDMSFilters.dll。官方未给旧→新的命名空间迁移对照表;社区帖里流传的Aveva.Pdms.PMLNet→Aveva.Core.PMLNet、Aveva.Pdms.Presentation→Aveva.Core.Presentation、Aveva.Pdms.Presentation.PDMSCommands→Aveva.Core.Commands等映射仅为社区来源,只能当线索,不能当结论,必须逐个在目标环境验证。

三常见报错与排查

下面三条都是"选型选错"导致的典型症状,都按"现象 / 原因 / 处置"三段式给出。

症状一:C# 侧写完方法,PML 侧IMPORT之后"看不到"它。

  • 现象:PML 里IMPORT成功,但调用时报找不到对象/方法。
  • 原因:类或方法没有标注PMLNetCallable。官方规则是"只有标注为 PMLNetCallable 的类与方法才会被考虑"。
  • 处置:给目标类与目标方法补标注,重新编译,确认 dll 落在%AVEVA_DESIGN_EXE%目录或其子目录(也可以是映射驱动器或 UNC 路径)。

症状二:USING NAMESPACE 'Aveva.Core'之后取object namespace.NETObject()报错。

  • 现象:与官方文档里"不允许部分命名空间"的描述完全一致的报错。
  • 原因:把命名空间当成了可点取的层级。官方明确写"不允许书写部分命名空间"。
  • 处置:一次写全,例如USING NAMESPACE 'Aveva.Core.Samples';大小写可以随意,但层级不能省。

症状三:自定义菜单点下去没有任何反应。

  • 现象:.uic里菜单项显示正常,点击无响应。
  • 原因:命令类没有设置Command基类的Key,或者 UIC 里的引用与Key不一致。CAF 是"用Key把 UI 与逻辑解耦关联"的。
  • 处置:在命令类构造函数里设置this.Key = "..."(官方示例写法如this.Key = "Aveva.ShowAttributeBrowserCommand";),并让 UIC 文件里的引用与之严格一致;同时确认 dll 已注册到CommandManager.Commands。

症状四(思路性错误,最容易返工):架构设计成"C# 主程序驱动 E3D"。

  • 现象:设计阶段就卡住——找不到"从 C# 调 PML"的接口。
  • 原因:官方明确列出限制——无法从 C# 直接调用 PML,只能通过事件机制反向通知。
  • 处置:把主控方改成 PML(或 PML.NET 触发),C# 只做"被调用的库"与"事件响应者"。

四动手练习

练习 1(10 分钟,判定标准可量化):打开帮助站 https://help.aveva.com/AVEVA_Everything3D/3.1/PMLPUG/PMLCG_FP.html,在目录里数出与"对象/方法/表单/命令/Add-in"相关的章节标题至少 5 个,并抄写下来。合格判定:抄下的标题能在 SHELL 对应章节中一一找到;其中应当包含Form Concepts、Form and Gadget Callbacks、Commands、PML Add-ins这几个真实章节名。

练习 2(20 分钟):用手上的 E3D Design 环境,打开Command Window(官方路径:Tools 标签 → Display 组 → 点击 Commands),把本篇文章 2.1 节的四行宏逐行粘贴执行(务必在测试 MDB 上做,写库操作不可逆)。合格判定:NEW EQUIP /ABCD之后NEW BOX ...能挂到该设备下;失败时记下完整报错文本。

练习 3(15 分钟,纯纸面):用 1.5 的决策树,给你手上的三个真实需求各选一条路,并写出理由。合格判定:三个需求中至少有一个落在".NET Addin",一个落在"PML1 宏",且理由能引用本篇 1.3 表里的至少两个维度。

练习 4(10 分钟):在帮助站检索 “Console”,记录命中数量,再检索 “Command Window”。合格判定:能复现"检索 Console 零命中"这一事实,并在自己的笔记里写清官方入口名是Command Window。

五小结与下一篇预告

本篇钉死了三件事:版本基线是 E3D Design 3.1(PDMS 已停售停支持,15.x 是 AVEVA Engineering 而非 E3D);四条路的定位是"宏 / 表单对象 / 让 PML 调 .NET / 改界面并接系统";官方限制是不可绕的架构约束(C# 不能直接调 PML、命名空间必须写全、只有PMLNetCallable可见、界面走Command+ UIC)。

下一篇《环境盘点与开发前自检》会把"动手之前必须确认的东西"一次列完:Command Window 的确切打开路径、PMLLIB与四个 CAF 环境变量、安装目录里的Samples.zip、四本手册的入口,以及一份可执行的自检清单——因为绝大多数"代码没问题但就是跑不通",根因都在环境。

文末 FAQ

Q1:AVEVA PDMS 已经停售停支持,那我手上的 PDMS 定制代码还有意义吗?新开发该对着哪个版本写?
有意义。官方说明 E3D Design 仍与 PDMS 后续版本兼容,客户可以两平台并行,PDMS 最终被淘汰;所以存量 PDMS 定制代码是可以迁移的资产。但新开发应当对着AVEVA E3D Design 3.1写:程序集、文档与产品版本必须一一对应。PDMS 两侧的关键差异是程序集与命名空间换代——PDMS 12.0 时代文档里是Pdms.Database.dll、PDMSFilters.dll,E3D 侧是Aveva.Core.Database.dll、Aveva.Core.Database.Filters.dll;而官方没有给出旧→新命名空间迁移对照表,只能逐个验证,社区帖里的映射只能当线索。

Q2:PML1 和 PML2 是两种不同的语言吗?新人应该先学哪一个?
官方口径是:当前版本常称 PML2,可以视为对 PML1 能力的扩展,但"许多编程任务的做法不同",而且"某些任务用 PML1 更高效"。所以它们不是两个互不相干的语言,而是同一语言体系的两代风格:PML1 偏"命令 + 变量注入",PML2 是面向对象、专为 Forms and Menus 设计。新人建议先学 PML1(因为它是所有 PML 的地基,且表达式包在 DBRM 手册里单独成章、官方称与 PML2 兼容),再学 PML2 的对象与表单。文件扩展名按官方培训材料口径是.pmlfnc/.pmlfrm/.pmlobj,依赖环境变量PMLLIB。

Q3:我想在 E3D 界面上加一个自己的菜单和停靠窗口,只用 PML 能做到吗?
按官方推荐做法,界面级定制应当走.NET Addin +Command+ UIC 文件:命令类继承 CAF 的抽象基类Command,在构造函数里设置Key,用 XML 格式的 UIC 文件定义菜单/工具栏并通过Key关联;模块级配置文件是<模块名>Customisation.xml,其<UICustomizationFiles>按顺序列出要加载的 UIC,其中$1会被当前工程名替换。PML 侧也有 Command 机制(PML command object +.uic),但官方明确不建议从标签页按钮直接调用 PML 宏,因为与 command ribbon 不兼容;旧式事件/工具栏方式"仍受支持但不推荐"。

Q4:我是 C# 程序员,不懂管道业务,能不能完全绕开 PML?
不能完全绕开,但可以把 PML 压到最薄。官方为 .NET 提供了两条路径——.NET Addin与PML.NET——两者都通过在运行时把 dll 动态载入模块来实现,并且定位是"与既有 PML 定制并存"。关键约束是:无法从 C# 直接调用 PML,只能通过事件机制反向通知。因此哪怕你只写 C#,PML 仍然会是那条"触发链路"的入口(一行IMPORT+ 一行USING NAMESPACE,或一个命令对象)。另外还有两条限制要设计进去:模块切换不保持 .NET 对象;DIRECTION、ORIENTATION等 PML 对象不能传给 .NET,但数据库引用可以以数组或字符串形式传递。

Q5:网上有人说"E3D 15.x",这是不是更新的版本?我该不该追?
不必追,因为这个说法本身有误:15.x 是 AVEVA Engineering 的版本,不是 E3D Design 的版本。文档站的版本索引会同时列出 “E3D Design 3.1” 与 “Engineering 15.8” 这类条目,容易混。E3D Design 上未发现 15.x 命名,已确认的文档版本线是 1.1 / 2.1 / 3.1,当前版本为 3.1。追新时请以 3.1 为主线,遇到历史版本差异显式标注。

Q6:四条路可以混用吗?混用时最容易踩的坑是什么?
可以混用,而且是官方鼓励的形态——NCUG 明确 .NET 定制的定位就是"与既有 PML 定制并存"。典型组合是:PML/PML2 负责界面触发与数据巡检,PML.NET 负责被调用的计算库,.NET Addin 负责把入口挂到界面上。最容易踩的坑有三个:一是把主控方设计成 C#(方向反了,官方不支持);二是类或方法忘了PMLNetCallable标注,导致"写了却调不到";三是USING NAMESPACE写了部分命名空间,直接报错。此外还要注意:PML 的集合(collection)与界面上看到的 “My Collections” 不是同一回事——后者实为 GPWL/GPSET/GPITEMS 体系,这一条在做数据访问时会显著影响你的设计。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询