美文网首页
使用.net(c#)对PDMS进行开发

使用.net(c#)对PDMS进行开发

作者: yumxuanyi | 来源:发表于2019-04-23 17:33 被阅读0次

    @版权声明:本文为版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
    本文链接https://www.jianshu.com/p/9f2b3868ad5a
    如有问题, 可邮件(yumxuanyi@qq.com)咨询。


    关键字:PDMS、PML、.NET

    pdms中目前还是支持用.NET进行开发的,但是提供的功能并不完善,还有很多限制。但是就是这样也阻止不了大家使用.net的热情。本文将就在.net对PDMS开发中的流程及问题做一个简要的介绍。

    1. 限制

    1. 只有那些被标记为PMLNETCallable并且遵守一定规则的.NET类才能被pml调用。(关于调用规则将在后文介绍)
    2. Module switching does not persist .NET object。Core PML objects defined in FORTRAN or C++are not persisted either。
    3. 不支持将PML 系统或用户自定义对象传递给.net。例如pml中的DIRECTION,ORIENTATION,...都是不能转成.net对象的。但是,将数据库引用传递给.NET是可能的(可以作为数组或者String)。也可以将一个pml .net Proxy的实例传递给.net.
    4. 直接从.NET中访问PML对象是不允许的。要从.net中访问pml的唯一的方式是通过事件
    5. 不支持‘partial’关键字。and expect them to be concatenated.

    2. 调用.NET的规则

    当定义PML可以访问的.NET 类时,必须遵守一定的规则。这些规则是PMLNetEngine强制要求的。这些规则如下:

    1. 一个PML可调用的程序集必须被标记为PMLNETCallable。而且该程序集必须位于%PDMSEXE%目录或者子目录或者UNC path路径下。
    2. 只有部分类型是PML可以调用的。(不包括结构、接口、枚举等) 。
    3. Class必须被标记为PMLNETCallable
    4. 能被PML访问的方法必须标记为PMLNETCallable
    5. 要被PML调用的方法的参数类型必须是pml支持的类型。
    6. 要被PML调用的类和方法必须是public
    7. 要被PML调用的方法中不允许存在默认参数
    8. 要被PML调用的类和方法的名字不区分大小写
    9. 要被PML调用的类中必须有一个Assign()方法
    10. 类中必须存在默认的公共的构造函数,而且被标记为PMLNETCallable
      要是你不遵守这些规则。在加载程序集的时候就会出现错误而且pml类也不能正确创建。

    3. 方法的参数规则

    pml .net
    Real double
    String string
    boolean bool
    ARRAY Hashtable
    OBJECT PMLNetCallable Class

    例如创建自定义类

    1. 添加引用
      添加的程序集为: PMLNET.dll
    2. 引用命名空间
      using Aveva.PDMS.PMLNET;
    3. 创建自定义类
    [assembly::PMLNETCallable()]      
    namespace AvevaPdmsExamples //程序集必须标记为PMLNETCallable
    {
        [PMLNETCallable()]                   //类必须标记为PMLNETCallable
        public class PMLNetExample:UserControl  //类必须为public 
       {  
             [PMLNETCallable()]
            public event PMLNetDelegate.PMLNetEventHandler  PMLNETExampleEvent;//定义事件
    
             ///触发事件的代码
             ///何时触发:界面中双击按钮时触发
             ///触发的目的:可以在pml中注册该事件当事件触发是将参数传递到pml中
             [PMLNETCallable()]
            public void RaiseExampleEvent()
            {
                 if(PMLNETExampleEvent != null)
                 {
                       ArrayList args = new ArrayList();//用于存储需要传递的参数
                       args.Add(object value1);
                       ...//添加pml支持的数据类型即可
                       args.Add(object valuen);
                       PMLNETExampleEvent(args);
                 }
            }
    
    
            //按钮点击时触发事件
            private void btnShowType_Click(object sender,EventArgs e)
           {
                  RaiseExampleEvent();//触发事件
           }
       
    
            [PMLNETCallable()]
            public PMLNetExample() //必须有一个公共的构造函数并标记为PMLNETCallable
           {
    
            }
          
            [PMLNETCallable()]
            public void Assign(PMLNetExample that)//必须有一个Assign方法并标记为PMLNETCallable
            {
    
            }
    
    
            ///PML中能访问的方法 必须为public 标记为PMLNETCallable
            [PMLNETCallable()]
           public void PmlCanCallMethod()
           {
                 MessageBox.Show("PML Can Called Method");
           }
    
    
             ///PML中不能访问的方法 要么不是public 
            ///要么未标记为PMLNETCallable
            public void PmlCanNotCallMethod()
           {
                 MessageBox.Show("PML Can not Called Method");
           }
       }
    }
    

    通过以上步骤,一个pml可访问的类就创建成功了。

    编译生成程序集。

    这里程序集名称为AvevaPdmsExamples.dll

    放置程序集

    将AvevaPdmsExamples.dll放置在PDMS安装目录下

    pml中使用该程序集

     import 'AvevaPdmsExamples'
     handle any
       --如果已加载就忽略
     endhandle
    
    --创建一个pml窗体
    setup form !!myPmlForm size 108 18
      using namespace 'AvevaPdmsExamples'
     
     container .mainUI PMLNetControl  ‘标题名’ width 103 height 20 $*--PML中一个usercontrol的容器
      member .myClass is PMLNetExample  $*-- 定义一个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
    
    //事件的调用者中的事件处理方法
    //事件处理方法
    //array 为前面传递过来的参数
    define method .myCallBackMethod(!array is array)
        !ladderNumber = !array[0]
       --下面就根据array的值进行建模了
    endmethod
    

    另外,可以将.net中的UserControl嵌套在pml的 Container中,所以在.net中不必继承于form直接继承于UserControl就好了。见以上代码

    相关文章

      网友评论

          本文标题:使用.net(c#)对PDMS进行开发

          本文链接:https://www.haomeiwen.com/subject/utrbgqtx.html