• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            AVEVA PMLNet Guide

            Posted on 2014-12-25 22:33 eryar 閱讀(4743) 評論(2)  編輯 收藏 引用 所屬分類: 4.AVEVA Solution

            AVEVA PMLNet Guide

            eryar@163.com

            Abstract. AVEVA PMLNet allows you to instantitate and invoke methods on .NET objects from PML proxy objects. The PML proxy objects behave just like any other PML object. The paper gives a hello world example to demenstrate the PMLNet usage.

            Key Words. AVEVA, PMLNet, PML, AVEVA .Net, C#, Managed C++

            1. Introduction

            AVEVA PMLNet允許在PML代理對象中實例化或調(diào)用.Net對象的方法。代理PML對象的定義通過.NET類運行時創(chuàng)建出來,其與.Net類有類似的方法;代理PML類方法的參數(shù)只能是指定的幾種,這幾種類型的參數(shù)與.Net類型對應(yīng)。代理PML對象的用法及功能表現(xiàn)與其他PML對象相同。

            可被PML調(diào)用的組件(即動態(tài)庫dll)通過命令I(lǐng)MPORT加載到AVEVA PDMS/Marine中來。組件可由任意.Net語言來定義,例如:Managed C++(托管C++)、C#或VB .NET等。PMLNet通過反射(reflection)來加載指定的組件。PMLNet引擎(Engine)只會加載包含有自定義屬性標(biāo)記PMLNetCallable的組件中的類和方法。為了在.Net類中定義代理PML類必須滿足一定的條件(rules)。

            綜上所述,在滿足PMLNet一定條件下創(chuàng)建的.Net組件中的類是可以被PML使用的,即可以在PML代碼中調(diào)用.Net組件中的資源。通過這種方式,可以獲得以下幾點優(yōu)勢:

            v 在簡單易學(xué)的PML中使用.Net庫中的海量資源,如Excel的讀寫庫等;

            v 程序關(guān)鍵部分用.Net實現(xiàn),代碼的保密性相對PML而言要好很多;

            v 由于PMLNet引擎支持.Net的組件,即C++、VB.Net寫的庫都可以被PML調(diào)用;

            本文主要通過一個簡單例子來說明PML代理類的定義方法,掌握后可以擴展到在PML中使用托管C++,代碼保密性更好且速度更快。這樣就可以在PML中應(yīng)用更廣泛的資源,來提高程序的開發(fā)效率。

            由于本人水平所限,文中的錯誤不妥之處在所難免,敬請不吝指教,將不勝感激。歡迎討論交流,共同進(jìn)步。

            2.Design Details

            下圖所示為如何在PDMS/Marine中使用PMLNet實現(xiàn)自定義。有一些.NET API可以用來訪問當(dāng)前數(shù)據(jù)庫任務(wù),顯示列表drawlist,幾何geometry和其他功能。用戶可以通過C#的API來訪問PDMS/Marine,但是直接在C#中調(diào)用PML是不可能的(It is not possible to directly to call PML from C#)。然而AVEVA提供了一個事件機制來允許PML去訂閱(subscrible)C#發(fā)出的事件(events),如下圖虛線所示。

            wps_clip_image-23162

            Figure 2.1 Using PMLNet

            使用PMLNet有如下限制:

            v 只有標(biāo)記了PMLNetCallable且滿足一定條件的.Net類才能被PML調(diào)用;

            v 模塊切換并不保留.NET對象,核心的C++或FORTRAN對象在模塊切換時也不會被保留;

            v PML調(diào)用.NET方法時只能傳入指定類型的變量,其他類型不支持,如DIRECTION, ORIENTATION等;

            v 在.NET中調(diào)用PML是不允許的,唯一的辦法就是通過.NET的事件來調(diào)用PML;

            v It is not possible to enter ‘partial’ namespaces as you might in C# and expect them to be concatenated;

            并不是所有的PML對象都可以傳遞到所調(diào)用的.NET方法中去,只有下表的PML類型的變量可以傳遞到調(diào)用.NET對象的方法中去:

            wps_clip_image-5893

            Figure 2.2 Only PML variables types maybe passed to methods of .NET class

            3.Using PMLNet

            AVEVA提供了一個簡單的PMLNet例子,程序名為PMLNetExample,將這個例子的代碼例出如下所示:

            using System;
            using System.Collections.Generic;
            using System.Text;
            using System.Windows.Forms;
            using System.Collections;

            using Aveva.PDMS.PMLNet;

            namespace Aveva.Pdms.Examples
            {
                [PMLNetCallable()]
                
            public class PMLNetExample
                {
                    [PMLNetCallable()]
                    
            public event PMLNetDelegate.PMLNetEventHandler PMLNetExampleEvent;

                    [PMLNetCallable()]
                    
            public PMLNetExample()
                    {
                    }

                    [PMLNetCallable()]
                    
            public void Assign(PMLNetExample that)
                    {
                        
            //No state
                    }

                    [PMLNetCallable()]
                    
            public void RaiseExampleEvent()
                    {
                        ArrayList args 
            = new ArrayList();
                        args.Add(
            "ExampleEvent");
                        
            if (PMLNetExampleEvent != null)
                            PMLNetExampleEvent(args);
                    }

                    
                    [PMLNetCallable()]
                    
            public void Method()
                    {
                        MessageBox.Show(
            "Called Method");
                    }
                }
            }

            如上述代碼所示,需要暴露給PML的方法或?qū)傩远家獦?biāo)記上PMLNetCallable。將上述代碼編譯后生成一個組件放到PDMS/Marine的安裝目錄下,就可以寫一個PML小程序來測試效果了。

            在CommandWindow中輸入如下圖所示的命令:

            wps_clip_image-24546

            Figure 3.1 Using PML proxy object in PML

            在PML中使用代理PML對象主要分為以下步驟:

            v 使用IMPORT命令導(dǎo)入組件;

            import 'PMLNetExample'

            其中PMLNetExample是生成的dll組件名;

            v 引入命名空間;

            using namespace 'Aveva.Pdms.Examples'

            命名空間的名稱與C#中命名空間對應(yīng);

            v 實例化類對象;

            != object PMLNetExample()

            實例化類對象的方式與其他PML對象一樣。

            v 調(diào)用對象方法;

            !a.method()

            調(diào)用對象的方法也和PML對象一樣,得到結(jié)果如下圖所示:

            wps_clip_image-3837

            Figure 3.2 Test PML proxy object method

            4.Rules for Calling .NET

            想要在PML中調(diào)用.NET類對象,就必須遵守一定的規(guī)則。這些規(guī)則如下:

            v 可被PML調(diào)用的.NET組件必須由PMLNetCallable標(biāo)記且位于%PDMSEXE%目錄中;

            v .NET組件中只有類可以被PML使用,結(jié)構(gòu)體、接口及枚舉除外;

            v .NET組件中需要被PML調(diào)用的類必須由PMLNetCallable標(biāo)記;

            v .NET組件中需要被PML調(diào)用的方法必須由PMLNetCallable標(biāo)記;

            v .NET組件中需要被PML調(diào)用的方法的參數(shù)類型必須為指定的幾種類型;

            wps_clip_image-5383

            Figure 4.1 Only PML variables types maybe passed to methods of .NET class

            v .NET組件中需要被PML調(diào)用的類和方法必須是公有的;

            v .NET組件中需要被PML調(diào)用的方法不支持默認(rèn)參數(shù)的定義;

            v .NET組件中需要被PML調(diào)用的類和方法名稱是區(qū)分大小寫的;

            v .NET組件中需要被PML調(diào)用的類中必須要有Assign()方法;

            v .NET組件中需要被PML調(diào)用的類必須有一個由PMLNetCallable標(biāo)記的公有的默認(rèn)構(gòu)造函數(shù);

            如果沒有遵守上述條件之一,當(dāng)加載相應(yīng)的組件時就會報出錯誤,錯誤信息如下所示:

            (46,87) PML: Object definition for XXX could not be found.

            5.Conclusion

            綜上所述,在PML中調(diào)用.NET組件中的類還是很方便的,只要滿足PML代理類定義的一些規(guī)則就可以了。

            由于.NET組件中的類是由.NET語言實現(xiàn)的,所以托管C++、C#及VB.NET編寫的組件都可以包裝成代理PML類,進(jìn)而被PML調(diào)用。這種方式就更加擴大了PML可使用的資源,如C++的庫都可以在PML中使用,且代碼更保密,不易查看源碼。

            在PML中調(diào)用.NET組件中類是可行的,但直接在C#中調(diào)用PML卻是不可行的。AVEVA也提供了在C#中調(diào)用PML的方式:即通過事件訂閱,詳細(xì)請參考文檔。

            6. References

            1. AVEVA .NET Customisation User Guide

            2. Example of PML Callable: PMLNetExample

            3. AVEVA Software Customisation Guide

            4. AVEVA Software Customisation Reference Manual

            5. AVEVA Data Access Routines User Guide

             

            PDF Version: AVEVA PMLNet Guide

            Feedback

            # re: AVEVA PMLNet Guide  回復(fù)  更多評論   

            2015-12-28 11:50 by lh
            請問在VB.NET中,如何標(biāo)記“PMLNetCallable”?謝謝

            # re: AVEVA PMLNet Guide  回復(fù)  更多評論   

            2015-12-28 19:43 by eryar
            @lh
            Hi 你好!

            PMLNetCallable只針對C#的,VB沒用過,不清楚。
            99久久无色码中文字幕人妻| 无码国内精品久久人妻蜜桃| 久久综合九色综合欧美狠狠| 7777久久亚洲中文字幕| 久久精品国内一区二区三区| 国产精品综合久久第一页| 精品伊人久久久| av午夜福利一片免费看久久| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲欧美日韩久久精品| 色综合久久无码五十路人妻| 久久婷婷国产麻豆91天堂| 久久经典免费视频| 国产高清国内精品福利99久久| 久久精品国产亚洲AV蜜臀色欲| 91精品国产综合久久香蕉 | 久久国产精品久久| 色99久久久久高潮综合影院| 99久久国产热无码精品免费 | 久久一本综合| 久久精品国产一区| 国内精品久久人妻互换| 久久婷婷色香五月综合激情| 91精品国产高清久久久久久国产嫩草 | 国产A级毛片久久久精品毛片| 一本色综合网久久| 青青草原综合久久大伊人导航| 久久亚洲国产精品一区二区| 亚洲精品无码久久久久sm| 欧美大战日韩91综合一区婷婷久久青草| 久久久久99精品成人片直播| 伊人久久大香线蕉av不变影院 | 欧美激情精品久久久久久久| 久久天堂电影网| 久久这里只有精品久久| 99久久精品国产高清一区二区| 漂亮人妻被中出中文字幕久久 | 五月丁香综合激情六月久久| 欧美精品乱码99久久蜜桃| 中文字幕久久亚洲一区| 精品久久久久久久国产潘金莲|