概述
AVEVA PDMS(Plant Design Management System
)是一种专业的三维设计和建模软件,主要用于工程项目的设计、建模和管理。它是针对工厂和工艺设施设计的领先软件之一,广泛应用于石油、天然气、化工、能源等行业。以下是一些主要特点和功能:
- 三维建模和设计 :PDMS提供强大的三维建模能力,允许工程师和设计师创建复杂的工厂和设施模型。它支持多种对象类型和管道设计。
- 智能对象 :PDMS中的对象具有智能化特性,能够自动关联和调整,使得设计变更时能够快速反映在整个模型中。
- 工程设计集成 :PDMS能够与其他工程设计软件集成,如工艺流程模拟软件和结构分析软件,实现工程设计的全面协调。
- 项目管理 :通过PDMS,项目团队可以协同工作,管理设计进度、资源分配和成本控制等项目管理任务。
- 自定义和二次开发 :PDMS支持自定义功能和二次开发,使得用户可以根据特定需求扩展和定制软件功能。
- 可视化和报告 :PDMS提供丰富的可视化和报告功能,支持生成各种设计和管理报告,帮助用户进行决策和沟通。
用户手册
Pdms有很多的版本,以下教程采用的Pdms版本为Pdms12.1.SP2
。Pdms的用户手册集成在Pdms软件中,只要安装好Pdms软件即可查看,具体步骤如下:
- 运行Pdms软件(双击Pdms安装路径下的
pdms.bat
文件即可运行) - 点击
Help
菜单栏,选择Contents
菜单项,会打开User Guides AVEVA Plant
窗口 - 在目录中依次展开
Customisation
→.NET Customisation
→User Guide
,此部分介绍了Pdms的.NET二次开发 - Pdms还提供了对应的实例Demo项目,存放在Pdms安装目录下的
Samples.zip
压缩包文件中
编写第一个插件
创建项目
因为Pdms的版本比较旧,因此本项目采用的目标框架为.net framework3.5
。但是本人不喜欢.net framework
中复杂且冗长的.csproj
文件,因此我喜欢创建.net core
项目再手动将TargetFramework
目标框架改为net35
,从而获得一个简洁的.csproj
文件。同时在后续方便轻松的实现一键切换依赖的Pdms版本。
.net core
项目最高版本为.net core3.1
,之后的版本统称为.net
(从.net5
开始)
- 新建
.NET Core
或.NET
的WPF应用程序(这里采用的是.NET6
项目),取名为PdmsLibrary
- 双击项目名称,进入
PdmsLibrary.csproj
文件;修改目标框架,如下所示1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<Project Sdk="Microsoft.NET.Sdk">
<ProjectGroup>
<!-- 将WinExe改为Library(将Windows应用程序改为类库项目) -->
<OutputType>Library</OutputType>
<!-- 将.net6.0-windows 改为 net35 (目标框架改为.net framework3.5) -->
<TargetFramework>net35</TargetFramework>
<!-- 去掉如下配置,.net framework3.5没有这些配置 begin -->
--- <Nullable>enable</Nullable>
--- <ImplicitUsings>enable</ImplicitUsings>
<!-- 去掉如上配置,.net framework3.5没有这些配置 end -->
<!-- 对WPF程序的支持 -->
<UseWPF>true</UseWPF>
<!-- 添加对Winform程序的支持 -->
+++ <UseWindowsForms>true</UseWindowsForms>
</ProjectGroup>
</Project> - 将
App.xaml
文件的属性生成操作从应用程序定义
改为页
。此时App.xaml
会被移除(没有删除),可通过添加现有项找回,目的是想像开发WPF应用程序一样可在App.xaml中声明应用资源
引用Pdms程序程序集
-
在Pdms的安装目录下找到Pdms如下程序集
Aveva.ApplicationFramework.dll
Aveva.ApplicationFramework.Presentation.dll
-
在项目目录下新建名为
packages
的目录,然后在packages
目录下以Pdms的版本名新建一个目录,例如PDMS12.1.SP2
,将程序集复制到packages\PDMS12.1.SP2
目录 -
项目添加程序引用,选择浏览找到
packages\PDMS12.1.SP2
目录,将程序集添加为引用,引用成功后,可在.csproj
文件中看到如下1
2
3
4
5
6
7
8<ItemGroup>
<Reference Include="Aveva.ApplicationFramework">
<HintPath>..\packages\PDMS12.1.SP2\Aveva.ApplicationFramework.dll</HintPath>
</Reference>
<Reference Include="Aveva.ApplicationFramework.Presentation">
<HintPath>..\packages\PDMS12.1.SP2\Aveva.ApplicationFramework.Presentation.dll</HintPath>
</Reference>
</ItemGroup>
编写插件
现在,我们已经搭建好了Pdms的开发环境,接下来编写第一个HelloWorld
程序。
定义命令
定义一个命令用于处理按钮的点击事件。在项目中创建一个名为Commands
的目录,在Commands
目录下新建DisplayCommand.cs
文件,内容如下所示
1 | using System.Windows; |
编写Addin
为将WPF类库项目改造成同WPF应用类似的效果,这里将App.xaml.cs
文件作为Pdms插件的**Addin
**文本,打开App.xaml.cs文件,编写如下代码:
1 | using Aveva.ApplicationFramework; |
载入插件
-
选择解决方案重新生成解决方案,保证没有语法错误,生成动态链接库
-
在资源管理器中,打开生成的
dll
文件目录,例如:D:/Codes/PdmsLibrary/bin/Debug/net35
,复制资源管理器地址栏地址 -
打开Pdms安装路径,找到
DesignAddins.xml
文件,添加如下内容:1
2
3
4
5
6
7
8
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- 在最下面添加如下内容 -->
<!-- 这个路径指向D:/Codes/PdmsLibrary/bin/Debug/net35/PdmsLibrary.dll文件,省略.dll后缀; 这个路径可以是绝对路径或相对路径 -->
<string>D:/Codes/PdmsLibrary/bin/Debug/net35/PdmsLibrary</string>
</ArrayOfString> -
成功载入我们写好的自定义插件后,启动Pdms程序就可以看到工具栏上多了一个名为"
Button
"的按钮,点击按钮弹窗显示:“Hello World For Pdms!”
一键切换Pdms版本
这里可以体现使用.NET CORE新的
.csproj
文件格式的优点
-
在项目的解决方案文件目录下新建名为
directory.build.props
文件,名为directory.build.props会被MSBuild自动加载 -
在解决方案下新建名为
solution items
的解决方案文件夹,并添加现有项将directory.build.props
文件添加进来 -
将
directory.build.props
文件修改为如下内容:1
2
3
4
5
6
7
8
9
10
11
12<Project>
<PropertyGroup>
<!-- 定义一个名为PdmsVersion的变量表示Pdms版本,需同packages下目录同名 -->
<PdmsVersion>PDMS12.1.SP2</PdmsVersion>
<!-- 定义一个名为PdmsVersionForDefine的变量值为 将Pdms版本中的点替换为下划线 -->
<PdmsVersionForDefine>$(PdmsVersion.Replace(".","_"))</PdmsVersionForDefine>
<!-- 将PdmsVersionForDefine的值进行宏定义 -->
<DefineConstants>$(PdmsVersionForDefine)</DefineConstants>
</ProjectGroup>
</Project> -
打开
.csproj
文件,将PDMS.12.1.SP2
替换为$(PdmsVersion)
,后续添加新的Pdms的dll引用版本位置也需要替换为$(PdmsVersion)
。当前修改内容如下:1
2
3
4
5
6
7
8<ItemGroup>
<Reference Include="Aveva.ApplicationFramework">
<HintPath>..\packages\$(PdmsVersion)\Aveva.ApplicationFramework.dll</HintPath>
</Reference>
<Reference Include="Aveva.ApplicationFramework.Presentation">
<HintPath>..\packages\$(PdmsVersion)\Aveva.ApplicationFramework.Presentation.dll</HintPath>
</Reference>
</ItemGroup> -
现在只要维护
PdmsVersion
的值就能一键切换Pdms的版本了,同时如果在代码中存在版本的个性化差异,可通过条件编译实现差异1
2
3
4
5
Console.WriteLine("现在是PDMS12.1.SP2版本");
Console.WriteLine("现在是PDMS12.1.SP3版本");
调试插件程序
插件是运行在Pdms软件上,而不是独立运行的,因此,如果需要调试程序,需要附加到进程才能调试;
-
插件是运行在Pdms软件上,而不是独立运行的,因此,如果需要调试程序,需要附加到进程才能调试;
-
程序的运行速度很快,为了进行调试命中断点可通过如下方式阻塞程序运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public void Start(ServiceManager serviceManager)
{
// 在插件的入口函数处,通过MessageBox阻塞程序的运行
/*
具体做法:
1. 在入口函数通过弹窗阻塞程序往下运行,在弹窗的下面打上断点
2. 将pdms附加到vs进程
3. 关闭弹窗,即可发现命中断点
附加进程:
1. 运行pdms
2. 点击vs中的调试菜单
3. 选择附加到进程
4. 在可用进程中找到名为 des.exe 的进程点击附加 (可使用筛选进程)
*/
MessageBox.Show("Wait");
}