常用知识点
声明:本系列教材摘自官方发布的PML程序开发说明,如有侵权,请联系删除。
AVEVA 支持用户使用 PML(Programmable Macro Language 可编程宏命令语言在 AVEVA Plant 系统软件上进行定制开发二次开发。
PML 是基于 AVEVA 命令讲法的可编程语言。随着技术的发展,PML 已增加更多现代开发语言的特点,更接近其它觉见的面向对象语言。
PML 可分为 3 个不同部分:
PML 1: 作为 PML 的第一个版本,基于命令语法。提供了基本的 IF 语句、DO 循环、变量及错误处理。
PML 2: 作为PML 的第二个版本,增加了面向对象语言的特点。可使用 Function、Object 及方法。
PML.Net: 可使用.NET 语言进行开发。
当 PML 写成宏命令操作符,PPDMS 将视其为独立的多行命令,并接顺序执行(相当于把命令接顺序输入到命令行中)
PML 1 写成的宏命令写成文件并保存为 ASCII 格式可使用$m/FileName 或直接拖拽到命令行中执行。
PML2 与现代的面向对象语言非常相似,包括提供了多态性和函数重载。
然后 PML2 并不提供继承及变量的Public/Private 定义。
通过方法的级连特点,PML2 可在一行代码中使用多个运算符,这在 PML1 中是不能实现的。
PML2 的特点:
-
- 提供内置的变量类型:STRING , REAL, BOOLEAN, ARRAY
- 通用的内置方法
- 函数取代宏
- 用户自定义对象
- PML 存放路径:PMLLIB
- 动态加载 Form, Function , Object
示例:
声明变量:
-
- 声明局部变量,为 Real 类型,值为 3: !realVariable = 3
- 声明全局变量,为 Boolean 类型,值为 Fail: !!booleanVariable = FALSE
- 设置数据成员 3 为 Fred:!ArrayVariable[3] = |Fred|
查询对象信息:
-
- 查询对象的值及类型:q var !exampleObject
- 查询对象的类型: q var !exampleObject.objectType()
- 查询对象包括的成员:q var !exampleObject.attributes()
对象的方法:
-
- 查询对象包含的方法:q var !exampleObject.methods()
- 查询对象是否设置值:q var !exampleObject.Set()
- 查询数据的成员数量:q var !arrayVariable.Size()
- 查询字符串长度:q var !stringVariable.length()
PML 中所有变量都有对象类型。变量的对象类型在变量定义时就被 设置并在变量征集周期内保持不变。变量符值时需要考虑对象类型是否匹配。
PML 中主要有以下三种对象类型:
-
- 系统内置类型。例如:String , Real , Boolean, Array
- 系统定义类型。包括:Position , Direction , Orientation
- 用户自定义类型。
当变量被定义为指定类型,则变量将含有该类型的 Member(成员)和Methods(方法)。
可使用用户自定义对象把不同类型的数据成组。以下是两个用户自定义对象的例子:
当 Object 更改后,可使用 pml reload object objectName 动态更新 Object
局部变量与全局变量
-
- !localVariable //局部变量
- !!globalVariable //全局变量
对象的声明:
PML 的变量不需要提前声明,在赋值时同时声明变量。
!name = |Fred|
!!answer = 42
!!flag = TRUE
PML 对象也可以提前声明,但声明后值为 UNSET.
!name = String()
!!answer = object Real()
!array = object Array()
使用对象的成员:
当变量定义成对象类型后,给对象成员赋值及读取对象成员值。
!newPlant = object Factory()
!newPlant.name = |ProcessA|
!newPlant.workers = 451
!newPlant.output = 2000
!numberOfWorkers = !newPlant.workers
PDMS 中特殊的全局对象类型
PDMS 中提前定义了特殊的全局变量类型,这些类型不般不能修改,但可以调用。
!!CE 全局的DBREF 类型,表示当前数据库中元件
!!ERROR 全局的错误对象,成员中包括了最后一个错误的信息
!!PML 包括了获取文件方法.GetPathName()
!!ALERT 提供错误、提示、警告的窗口
!!AIDNUMBERS 用户管理 Aid 显示
!!APPDESMAIN 表示 Design 模块接口
Function 和 Method 是 PML 语言的集合。当调用 Function 和 Method,将对命令进行接顺序执行(与 PML1 宏相同)
Function 和Method 基本相同,除了定义的关键字有区别外,调用的方法稍有不同。
函数调用方法: !!exampleFunction()
方法调用方法:!!exampleObject.exampleMethod()
参数在 Function/Method 内部是局部变量,同时可定义 Function/Method 的返回值类型。
调用示例: !area = !!area(12 , 200)
类型为 ANY 的参数
参数类型可定义为 ANY,表示参数任意类型都可以。
在 PDMS 中,每个 Form 都是一个全局变量,同时也是属于 Form 类型(与其它对象类型相同), 包括成员及方法。同时与其它对象类型的区别在于可添加显示的控件。
示例如下:
上面示例代码将保存成文件文件,命名为 nameCE.pmlfrm。
Form 更改后,可使用 pml reload form !!formName 动态更新 Form.
PML1 宏文件一般存放在 PDMSUI 环境变量指向的路径。该环境变量一般是在 PDMS 安装目录下的 evars.bat 中定义。如下:
把文件放到该环境变量指定目录的目标是可使用$M %PDMSUI%\DES\PIPE\MPIPE 代替输入完整路径。
在标准产品中,将使用 CALLP 代替上述PDMSUI 变量的调用语法
PML 2 的程序存放在 PMLLIB 环境变量指向的路径下。可在 PDMS 安装目录下的 evars.bat
中设置环境变量。
PMLLIB 目录下存放 pml.index 文件,里面描述该 PMLLIB 目录下的所有程序相对位置。可使用 PML REHASH ALL 更新pml.index。当更新后,程序才可调用 。
当 PML 程序开发完成,建议把新开发程序放到独立的 PMLLIB/PDMSUI,代替直接放在系统标准的PDMSUI/PMLLIB 下。这样做有以下好处:
-
- 当更新PDMS 标准功能程序时,不需要另外移动开发的程序
- 如果开发的程序有问题,方便回复系统标准程序
- 方便引用网络共享盘的程序
PMLLIB/PDMSUI 可以定义指向多个路径,排前面路径的程序优先。路径间以空格或”;”分开。使用的区分符号在一个环境变量中应统一。
示例:
set PDMSUI=C:\tmep\pdmsui %pdmsui%
set PMLLIB=C:\tmep\pmllib %pmllib%