概述
PDMS 的.NET開發主要分以下兩種:
- .NET
- PML + .NET
.NET
AVEVA公司提供了.NET的二次開發接口,以友善有C#開發經驗的工程師可以快速的利用.NET架構對AVEVA的産品進行開發,如PDMS,MARINE等。
傳統的PDMS開發主要利用PML語言,但AVEVA提供的PML對象庫有限,如果想實作更多豐富的功能,使用PML開發就有很大的局限性。但利用.NET可以友善的使用各種第三方接口和類庫,也可以完成與其他各種軟體的內建,有利于資料的管理和維護。
備注:
單純的.NET開發和其他軟體的.net開發,有相同的弊端。
- 開發調試效率低
- 插件的異常會導緻PDMS的奔潰
IAddin接口
所有的AVEVA.NET插件都必須派生自IAddin接口,這也是AVEVA.NET插件與其他插件的不同之處。IAddin接口封裝在
Aveva.ApplicationFramework.dl
l動态庫中,是以在繼承時,必須從
Aveva.ApplicationFramework
命名空間中進行引用,并且需要重寫該接口。
該接口有2個屬性和2個執行個體化方法,
IAddin
接口的原型聲明如下:
string Description {get;}
string Name {get;}
void Start(ServiceManager serviceManager);
void Stop();
開發DLL
PDMS隻接受動态庫的方式作為接口。
建立項目
建立一個命名為HelloAddin的項目。
項目引用
Aveva.ApplicationFramework、Aveva.ApplicationFramework.Presentation
兩個動态庫。這兩個動态庫主要封裝了程式架構插件、釋出服務、程式設定以及菜單欄和标題欄的管理、指令對象、本地資源檔案、主程式視窗、狀态欄、MDI(多文檔程式)、使用者控件等屬性方法的類
// 1.引入命名空間
using Aveva.ApplicationFramework;
using Aveva.ApplicationFramework.Presentation;
// 2.聲明命名空間
namespace HelloAddin
{
// 3.聲明類,必須繼承IAddin接口
Public class HelloAddin : IAddin
{
// 4.重寫IAddin接口的屬性及函數.此處Start()函數是程式的入口函數,類似于普通C#程式中的Main函數。
public string Description
{
get {return "HelloAddin";}
}
public string Name
{
get {return "HelloAddin";}
}
public Void Start(ServiceManager serviceManager)
{
MessageBox.Show("Hello World");
}
public void Stop{}
}
}
編譯項目
生成動态庫檔案,HelloAddin.dll檔案。目前PDMS的12.0和12.1均隻能接受FrameWork 3.5的版本,請勿使用高版本,會導緻PDMS加載失敗。
PDMS操作
拷貝動态庫
将動态庫拷貝到PDMS的根目錄下,也可以拷貝到其他子目錄,隻要修改啟動檔案即可。
修改啟動檔案
我們如果想将剛才開發的HelloAddin,綁定在PDMS的Design子產品啟動程式的話。隻需要修改DesignAddin.xml檔案即可。
這個檔案在PDMS的根目錄下,如果是綁定Draft、Paragon等其他子產品,隻要修改子產品對應的xml檔案即可。
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string>ExplorerAddin</string>
<string>HelloAddin</string>
</ArrayOfString>
如果不想把動态庫放在根目錄,可以建一個檔案夾如:
mydevaddin
,放置我們的動态庫。但xml需要同步改成
<string>mydevaddin/HelloAddin</string>
啟動PDMS
運作界面如下圖所示,當然這個程式并不能實作任何操作,僅僅是為了示範AVEVA.NET的實作過程。
API概述
.NET開發主要是利用AVEVA提供的各種類和接口對PDMS各個資料層次進行通路,包括圖形使用者界面(GUI),資料庫(DATABASE),幾何庫(Geometry)等。所有的這些類和接口都被封裝在多個不同的dll(動态連結資料庫)中,這些dll主要可分為以下幾大類:
說明 | dll檔案 | 備注 |
---|---|---|
CAF(common application framework interface)通用程式架構接口 | Aveva.Application.Framework.dll | 該動态庫主要封裝了程式架構插件、釋出服務、程式設定管理等屬性方法的類 |
CAF(common application framework interface)通用程式架構接口 | Aveva.Application.Framework.Presentation.dll | 該動态庫主要封裝了菜單欄和标題欄的管理以及指令對象、本地資源檔案、主程式視窗、狀态欄、MDI(多文檔程式)以及使用者控件等屬性方法的類 |
資料庫接口 | Aveva.Pdms.Database.dll PDMSFilters.dll | 該動态庫主要封裝了與資料庫有關聯的操作 |
幾何庫接口 | AVEVA.Pdms.Geometry.dll | 該動态庫主要封裝了與幾何計算相關的類 |
共享接口 | AVEVA.Pdms.Shared.dll | |
功能接口 | AVEVA.Pdms.Utilities.dll | 該動态庫主要封裝了消息、字元串、錯誤處理、追蹤以及PML指令等類 |
圖形接口 | AVEVA.Pdms.Graphics.dll | 該動态庫主要封裝了圖形清單的相關類 |
PML + .NET
概述
PMLNET提供了在PDMS和.NET之間通信的服務。使用PMLNET可以實作以下三個功能:
- PML調用.NET中定義的對象和方法。
- PML在FORM中放置.NET中定義的控件。
- 在.NET中調用PML對象和方法。 資料比對表:
PML | .NET |
---|---|
real | double |
string | string |
bool | bool |
array | hash table |
object | PMLNetCallable Class |
PML調用.NET方法
C#開發
動态庫加載
添加PMLNET引用,引用PMLNET.dll動态庫,并引用命名空間。
using Aveva.PDMS.PMLNet
建立類庫
按正常C#類庫的開發方法運作,修改
AsemblyInfo.cs
配置檔案。
命名空間為
My.PMLNET
[PMLNetCallable()]
public class PMLNET
{
[PMLNetCallable()]
public PMLNET(){}
[PMLNetCallable()]
public void Assign(PMLNET that){}
[PMLNetCallable()]
public void MyMethod()
{
code
}
}
- 方法必須是公用的。
- 類必須有一個聲明無參數的構造函數。
- 隻能是類,不能是接口、結構等其他任意類型。
- Assign方法是必須的。
PML調用
将編譯好的DLL檔案,拷貝到PDMS根目錄以下。
加載動态庫
import '動态庫的名稱' // 動态庫加載後,無法解除安裝,必須重新開機PDMS才能更新,非常麻煩。
// 引入命名空間
using namespace '空間名'
!pmlnet = object PMLNET()
!pmlnet.MyMethod()
特殊說明
PML調用.NET方法,如果傳遞的資料類型是數組,則.NET中對應的是哈希表。如果用foeach循環的話,順序是混亂的。table中的鍵必須将double型的變量顯示轉換為object型。
public bool Update(Hashtable table)
{
for (int i = 1; i <= table.Count; i++)
{
string Guid = table[(object)double.Parse(i.ToString())].ToString();
}
}
如果對數組的順序不敏感的話,也可以使用foreach循環
foreach(DictionaryEntry de in table)
{
string str = de.Key.Tostring();
}
PML調用.NET控件
C#開發
使用者控件的開發流程,和使用者方法的類似。在建立的時候,不是選擇Class,而是選擇UserControl
[PMLNetCallable]
public partial class DateTimeControl : UserControl
{
//構造函數
[PMLNetCallable]
public DateTimeControl()
{
InitializeComponent();
}
//固定寫法
[PMLNetCallable]
public void Assign(DateTimeControl that)
{ }
//擷取dataTime的選擇結果
[PMLNetCallable]
public String GetDatePick()
{
string date = this.dateTimePicker1.Value.Year + "-" + this.dateTimePicker1.Value.Month + "-" + this.dateTimePicker1.Value.Day;
return date;
}
}
此處control類的名稱有要求,不能是Control後面加數字的寫法。比如不能為UserControl1,否則在PML調用時,會出現文法錯誤。PML在調用.NET類時候,類名也不能末尾是數字。
PML調用
窗體定義
// .NET控件必須被放置在一個容器中
FRAME .frmTest ''
using namespace '命名空間'
container .excont PmlNetControl 'Contol'
exit
// 定義一個成員變量
member .dateTime is DateTimeControl
// 構造函數
using namespace '命名空間'
!this.dateTime = object DateTimeControl()
// 調用Container控件的control方法,将其指定為成員變量的handle方法,這樣PML就可以響應.NET的事件。
!this.excont.control = !this.dateTime.handle()
// 調用方法
!this.dateTime.GetDatePick()
// 調用事件,PML若想調用.NET的事件,必須先在.NET注冊事件
!this.dateTime.AddEventHandler('OnPopup', !this, 'eventPML') // 注意事件方法是沒有括号的。
SYSCOM
SYSCOM
也是一條PML指令,其用法和其他PML指令一樣,隻是其參數是Windows中的DOS指令。如在指令視窗中輸入指令
syscom ‘dir’
,則可以在控制台視窗中顯示出目前檔案夾中的内容:
同理,輸入
syscom ‘help’
則可以顯示出常見DOS指令的使用說明:
由此可見,使用syscom相當于運作了一條DOS指令。因為DOS指令可以調用程式,如打開記事本,是以使用syscom也應該可以打開記事本。調用指令
syscom ‘notepad’
即可以了。
打開記事本後,可以看見PDMS程式處于等待狀态。隻有将記事本關閉,PDMS程式才恢複正常。如何使PDMS程式不用等待調用的程式是否執行完畢呢?PDMS中也提供了方法,那就是在程式名後加個
&
。如
syscom ‘calc&’
,就可以打開電腦程式而不用去等待是否将其關閉。
有了這條指令,把PDMS的擴充性又提高了,因為可以用syscom來調用Windows中的腳本即批處理檔案。這樣就可以用批處理來調用其他程式,由此擺脫因為AVEVA .NET(C#)開發時加載DLL後調試的不便,也可擺脫程式設計語言的限制,隻要是一個程式都可以通過批處理來調用,即可以用C/C++或C#甚至VB來編寫程式,再用通過syscom來調用。