@版权声明:本文为版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
本文链接https://www.jianshu.com/p/9f2b3868ad5a
如有问题, 可邮件(yumxuanyi@qq.com)咨询。
关键字:PDMS、PML、.NET
pdms中目前还是支持用.NET进行开发的,但是提供的功能并不完善,还有很多限制。但是就是这样也阻止不了大家使用.net的热情。本文将就在.net对PDMS开发中的流程及问题做一个简要的介绍。
1. 限制
- 只有那些被标记为PMLNETCallable并且遵守一定规则的.NET类才能被pml调用。(关于调用规则将在后文介绍)
- Module switching does not persist .NET object。Core PML objects defined in FORTRAN or C++are not persisted either。
- 不支持将PML 系统或用户自定义对象传递给.net。例如pml中的DIRECTION,ORIENTATION,...都是不能转成.net对象的。但是,将数据库引用传递给.NET是可能的(可以作为数组或者String)。也可以将一个pml .net Proxy的实例传递给.net.
- 直接从.NET中访问PML对象是不允许的。要从.net中访问pml的唯一的方式是通过事件
- 不支持‘partial’关键字。and expect them to be concatenated.
2. 调用.NET的规则
当定义PML可以访问的.NET 类时,必须遵守一定的规则。这些规则是PMLNetEngine强制要求的。这些规则如下:
- 一个PML可调用的程序集必须被标记为PMLNETCallable。而且该程序集必须位于%PDMSEXE%目录或者子目录或者UNC path路径下。
- 只有部分类型是PML可以调用的。(不包括结构、接口、枚举等) 。
- Class必须被标记为PMLNETCallable。
- 能被PML访问的方法必须标记为PMLNETCallable。
- 要被PML调用的方法的参数类型必须是pml支持的类型。
- 要被PML调用的类和方法必须是public。
- 要被PML调用的方法中不允许存在默认参数。
- 要被PML调用的类和方法的名字不区分大小写。
- 要被PML调用的类中必须有一个Assign()方法。
- 类中必须存在默认的公共的构造函数,而且被标记为PMLNETCallable。
要是你不遵守这些规则。在加载程序集的时候就会出现错误而且pml类也不能正确创建。
3. 方法的参数规则
pml .net
Real double
String string
boolean bool
ARRAY Hashtable
OBJECT PMLNetCallable Class
例如创建自定义类
- 添加引用
添加的程序集为: PMLNET.dll - 引用命名空间
using Aveva.PDMS.PMLNET; - 创建自定义类
[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就好了。见以上代码
网友评论