天天看點

PDMS.NET開發概述.NETPML + .NETSYSCOM

概述

PDMS 的.NET開發主要分以下兩種:

  • .NET
  • PML + .NET

.NET

AVEVA公司提供了.NET的二次開發接口,以友善有C#開發經驗的工程師可以快速的利用.NET架構對AVEVA的産品進行開發,如PDMS,MARINE等。

傳統的PDMS開發主要利用PML語言,但AVEVA提供的PML對象庫有限,如果想實作更多豐富的功能,使用PML開發就有很大的局限性。但利用.NET可以友善的使用各種第三方接口和類庫,也可以完成與其他各種軟體的內建,有利于資料的管理和維護。

PDMS.NET開發概述.NETPML + .NETSYSCOM

備注:

單純的.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的實作過程。

PDMS.NET開發概述.NETPML + .NETSYSCOM

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對象和方法。
    PDMS.NET開發概述.NETPML + .NETSYSCOM
    資料比對表:
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

配置檔案。

PDMS.NET開發概述.NETPML + .NETSYSCOM

命名空間為

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來調用。

繼續閱讀