@版權(quán)聲明:本文為版權(quán)歸作者所有吞滞,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明盾沫,且在文章頁(yè)面明顯位置給出,
本文鏈接http://www.reibang.com/p/9f2b3868ad5a
如有問題裁赠, 可郵件(yumxuanyi@qq.com)咨詢。
關(guān)鍵字:PDMS赴精、PML佩捞、.NET
pdms中目前還是支持用.NET進(jìn)行開發(fā)的,但是提供的功能并不完善蕾哟,還有很多限制一忱。但是就是這樣也阻止不了大家使用.net的熱情。本文將就在.net對(duì)PDMS開發(fā)中的流程及問題做一個(gè)簡(jiǎn)要的介紹谭确。
1. 限制
- 只有那些被標(biāo)記為PMLNETCallable并且遵守一定規(guī)則的.NET類才能被pml調(diào)用帘营。(關(guān)于調(diào)用規(guī)則將在后文介紹)
- Module switching does not persist .NET object。Core PML objects defined in FORTRAN or C++are not persisted either逐哈。
- 不支持將PML 系統(tǒng)或用戶自定義對(duì)象傳遞給.net芬迄。例如pml中的DIRECTION,ORIENTATION,...都是不能轉(zhuǎn)成.net對(duì)象的。但是昂秃,將數(shù)據(jù)庫(kù)引用傳遞給.NET是可能的(可以作為數(shù)組或者String)禀梳。也可以將一個(gè)pml .net Proxy的實(shí)例傳遞給.net.
- 直接從.NET中訪問PML對(duì)象是不允許的。要從.net中訪問pml的唯一的方式是通過事件
- 不支持‘partial’關(guān)鍵字肠骆。and expect them to be concatenated.
2. 調(diào)用.NET的規(guī)則
當(dāng)定義PML可以訪問的.NET 類時(shí)算途,必須遵守一定的規(guī)則。這些規(guī)則是PMLNetEngine強(qiáng)制要求的哗戈。這些規(guī)則如下:
- 一個(gè)PML可調(diào)用的程序集必須被標(biāo)記為PMLNETCallable郊艘。而且該程序集必須位于%PDMSEXE%目錄或者子目錄或者UNC path路徑下。
- 只有部分類型是PML可以調(diào)用的唯咬。(不包括結(jié)構(gòu)纱注、接口、枚舉等) 胆胰。
- Class必須被標(biāo)記為PMLNETCallable狞贱。
- 能被PML訪問的方法必須標(biāo)記為PMLNETCallable。
- 要被PML調(diào)用的方法的參數(shù)類型必須是pml支持的類型蜀涨。
- 要被PML調(diào)用的類和方法必須是public瞎嬉。
- 要被PML調(diào)用的方法中不允許存在默認(rèn)參數(shù)蝎毡。
- 要被PML調(diào)用的類和方法的名字不區(qū)分大小寫。
- 要被PML調(diào)用的類中必須有一個(gè)Assign()方法氧枣。
- 類中必須存在默認(rèn)的公共的構(gòu)造函數(shù)沐兵,而且被標(biāo)記為PMLNETCallable。
要是你不遵守這些規(guī)則便监。在加載程序集的時(shí)候就會(huì)出現(xiàn)錯(cuò)誤而且pml類也不能正確創(chuàng)建扎谎。
3. 方法的參數(shù)規(guī)則
pml .net
Real double
String string
boolean bool
ARRAY Hashtable
OBJECT PMLNetCallable Class
例如創(chuàng)建自定義類
- 添加引用
添加的程序集為: PMLNET.dll - 引用命名空間
using Aveva.PDMS.PMLNET; - 創(chuàng)建自定義類
[assembly::PMLNETCallable()]
namespace AvevaPdmsExamples //程序集必須標(biāo)記為PMLNETCallable
{
[PMLNETCallable()] //類必須標(biāo)記為PMLNETCallable
public class PMLNetExample:UserControl //類必須為public
{
[PMLNETCallable()]
public event PMLNetDelegate.PMLNetEventHandler PMLNETExampleEvent;//定義事件
///觸發(fā)事件的代碼
///何時(shí)觸發(fā):界面中雙擊按鈕時(shí)觸發(fā)
///觸發(fā)的目的:可以在pml中注冊(cè)該事件當(dāng)事件觸發(fā)是將參數(shù)傳遞到pml中
[PMLNETCallable()]
public void RaiseExampleEvent()
{
if(PMLNETExampleEvent != null)
{
ArrayList args = new ArrayList();//用于存儲(chǔ)需要傳遞的參數(shù)
args.Add(object value1);
...//添加pml支持的數(shù)據(jù)類型即可
args.Add(object valuen);
PMLNETExampleEvent(args);
}
}
//按鈕點(diǎn)擊時(shí)觸發(fā)事件
private void btnShowType_Click(object sender,EventArgs e)
{
RaiseExampleEvent();//觸發(fā)事件
}
[PMLNETCallable()]
public PMLNetExample() //必須有一個(gè)公共的構(gòu)造函數(shù)并標(biāo)記為PMLNETCallable
{
}
[PMLNETCallable()]
public void Assign(PMLNetExample that)//必須有一個(gè)Assign方法并標(biāo)記為PMLNETCallable
{
}
///PML中能訪問的方法 必須為public 標(biāo)記為PMLNETCallable
[PMLNETCallable()]
public void PmlCanCallMethod()
{
MessageBox.Show("PML Can Called Method");
}
///PML中不能訪問的方法 要么不是public
///要么未標(biāo)記為PMLNETCallable
public void PmlCanNotCallMethod()
{
MessageBox.Show("PML Can not Called Method");
}
}
}
通過以上步驟,一個(gè)pml可訪問的類就創(chuàng)建成功了。
編譯生成程序集。
這里程序集名稱為AvevaPdmsExamples.dll
放置程序集
將AvevaPdmsExamples.dll放置在PDMS安裝目錄下
pml中使用該程序集
import 'AvevaPdmsExamples'
handle any
--如果已加載就忽略
endhandle
--創(chuàng)建一個(gè)pml窗體
setup form !!myPmlForm size 108 18
using namespace 'AvevaPdmsExamples'
container .mainUI PMLNetControl ‘標(biāo)題名’ width 103 height 20 $*--PML中一個(gè)usercontrol的容器
member .myClass is PMLNetExample $*-- 定義一個(gè)PMLNetExample的成員變量
exit
define method .myPmlForm()
using namespace 'AvevaPdmsExamples'
!this.myClass = object PMLNetExample()
!handle = !this.myClass.addEventHandler('PMLNETExampleEvent',!this,'myCallBackMethod')
!ui = !this.myClass.handle();
!this.mainui.control = !ui; //使用pml中的容器來加載我們的.net中的界面
endmethod
//事件的調(diào)用者中的事件處理方法
//事件處理方法
//array 為前面?zhèn)鬟f過來的參數(shù)
define method .myCallBackMethod(!array is array)
!ladderNumber = !array[0]
--下面就根據(jù)array的值進(jìn)行建模了
endmethod
另外礼华,可以將.net中的UserControl嵌套在pml的 Container中,所以在.net中不必繼承于form直接繼承于UserControl就好了界牡。見以上代碼