PDMS二次开发之PML编程基础
PDMS-PML基础

PML基础王元AVEVA中国2005.11.19如何学习PML编程T需要具备的基本知识–熟悉Pdms的基本操作–了解Pdms的运行机制,模块之间的关系–Pdms属性的操作–Pdms命令的操作–Pml语法(本教程)–通过Pdms菜单查找示范程序课程将包括...T PML介绍–PML概念–PML功能–PML构成T PML程序语言–变量的定义及用法–循环Do、判断If、跳转Golabel–错误处理–文件处理–函数Functions、方法Method–对话框Forms和菜单Menu课程结束后...T您会具有以下知识…–PML构成及功能–编写简单的宏–PML变量的定义及应用–PML函数/方法的定义及调用–PML窗体/对象的定义及调用PML -功能强大的语言T P rogrammable M acro L anguage可编程宏语言T PML2基于面向对象(Object Oriented)概念的编程语言T支持用户自定义对象类型(Object Types)T简单易学,与PDMS无缝连接T丰富的内置函数,方法及对象T最简单的对话框,菜单编写语言PML构成T Macros–Macros是包含PDMS 命令序列的ASCII文件–Macros 在PDMS 中通过$m /FILENAME来执行T PML–变量(Variables)–判断语句(if Constrcuct)–循环(Do loops)–错误处理(Error Handling)–文件处理(Files and Directories)T窗体和菜单–PDMS大多数应用程序都由对话框(Forms)和菜单(Menus)来驱动一个简单的MacroT宏是包含PDMS 命令序列的一个文本文件T运行宏$M /MyFileASCII 文件MYFILE NEW EQUIP /FREDNEW BOXXLEN 300 YLEN 400 ZLEN 600NEW CYL DIA 400 HEI 600CONN P1 TO P2 OF PREVNEW EQUIP /$1NEW BOXXLEN $2 YLEN $3 ZLEN $4NEW CYL DIA $3 HEI $4CONN P1 TO P2 OF PREVASCII 文件MYFILE 一个简单的Macro ,继续,参数化宏Parameterized Macro T 宏可以参数化T 文件名后面的字符串是参数(parameters)$M /MyFile NEWEQUIP 300 400 600宏的参数T Macros 可以有多达9 个由空格分隔的参数.$M /MyFile PML TRAINING 55 66T 文本字符串可以以单个参数输入$M /MyFile $< PML TRAINING $> 55 66T $<和$>是分隔符,在它们之间的任何字符都被认为是单个参数变量VariablesT变量基本概念–变量用于存储数值,变量必须有名字,变量的数值可以改变,但变量名是固定的.T PML变量–在PML2中变量是一个对象(Objects)•每一个对象(变量)有一个唯一的名字•每一个对象都有一套函数与之相关联,这些函数称为方法(Methods).方法用于处理对象中的数据•生成对象时必须指明对象类型(Object type),不同的对象类型对应不同的方法对象(变量)类型Object TypesT内置(Build-in)的对象类型–字符串类型(String).如'Hello World'–实数类型(Real).整数类型包括在实数类型中,如99–布尔类型(Boolean).用于逻辑表达式,如True,False–数组类型(Array).可以存储任意类型的数据T系统定义(System-defined)的对象类型–指在PDMS中的变量类型,如Positon,ReferenceT用户自定义(User-defined)的对象类型生成、查询、删除变量T使用命令行或者文本文件测试T通过赋值声明变量类型!MyString= 'Hello World'Q var!MyString显示<STRING> 'Hello World'T直接声明变量类型!Length = Real()Q Var!Length显示<REAL> UnsetT删除变量用到方法!MyString.Delete()变量命名规则(Naming Conventions) T局部变量(Local)和全局变量(Global)!SurfaceArea! 表示局部变量!!Area !!表示全局变量T变量名最长16 个字符(不包括!和!!),变量名可以包含字母和数字T变量名不能用数字和点(.)开头T变量名的大小写不敏感T建议:一个变量一个用途,最好给变量名一个有意义的名字,并且区分大小写!!StartInUpperCasePDMS属性类型-系统定义变量类型T名字(Name)如NameT字符串(String)如Description,FunctionT实数(Real)如Angle,Temperature,RatingT布尔(Boolean)如Lock,Shop,BuiltT数组(Array)如LevelT参考(Reference)如Spref,Catref,Lstube,Ptref,Gmref T关键字(Word)如Type,PurposeT位置(Position)如Position,HpositionT方位(Orientation) 如OrientationT方向(Direction)如HDirection!!ceT特殊全局变量!!CE–得到当前元素的参考,DBref类型–‘.’点操作符可以提取元素的属性和隐含属性变量提取属性T用变量提取属性值,变量名=DBref变量.属性名!Name = !!!Desc= !!ce.Description!Pspec= !!ce.Pspec!Temp = !!ce.Temp!Purp= !!ce.Purp!Rating = !!ce.cref.pspec.rating!Pos = !!ce.Pposition[3]$*P-point[3]坐标!Dir = !!ce.Pdirection[1] $*P-point[1]方向T查询属性类型!Ref = RefQ var!Ref变量给PDMS属性赋值T属性名= 变量名–名字赋值,变量中第一个字符必须是/!!= !Name!!ce.Describsion=!Desc!!ce.Temp= !Temp!!ce.Pspec= !Pspec!!ce.Purp= !Purp常用的赋值方法T可以不是当前元素!A = !!CE!!CE = !!CE.Owner!A.Built= TRUET坐标的变化!Pos = !!CE.Position!Pos.Up= 2000!!CE.Position= !Pos练习-变量给属性赋值T使用文本编辑器编辑–获取当前元素的Name和Type–新建同样类型的元素–在命名中追加-NEWPDMS命令中使用变量T变量前加$表示提取变量的值!type = !!ce.type!name = !!!newname= !name + ‘-NEW’New $!type $!newnameT直接组合字符串New $!type $!name-NEW方法(Method)和函数(Function)T函数(Function)是执行特定功能的子程序T方法(Method)是对象(变量)的函数–在PML2中变量是一个对象(Objects)•每一个对象(变量)有一个唯一的名字•每一个对象都有一套函数与之相关联,这些函数称为方法(Methods).方法用于处理对象中的数据•生成对象时必须指明对象类型(Object type),不同的对象类型对应不同的方法–方法并不改变对象的类型和对象中的值T参考手册Cadcentre Software Customisation Reference Manual方法-字符串对象(String Object)T字符串长度Length()T类型转换Real(),Position(),Boolean()T大小写转换LowCase(),UpCase()T两端截取After(str2),Before(str2),Substring(index) T中间截取Substring(index,nchars)T分隔符截取Part(nth),Part(nth,delim)T替换Replace(str2,str3)T匹配Match(str2),MatchWild(str2)T分割(返回数组)Split()T修剪Trim(),Trim(option)方法实例T方法示例!str= 'hello how are you!'!newstr= !str.after('hello').trim().upcase()q var!newstr<String> 'HOW ARE YOU!'T练习-将字符串改为'where are you?‘!str= 'hello how are you!'!newstr= !str.after('hello').trim().replace('how', 'where').replace('!', '?')PML表达式T表达式运算符(Expression operators)–算术运算符+-* /–和并符&–比较运算符EQ NE LT LE GT GE–布尔运算符NOT AND OR表达式说明T表达式可以嵌套T运算符前后必须加空格T表达式前后的类型必须一致!X = 64!Y = 32!Z = !X + !Y!Z = 96!A = 'Hello '!B = 'World'!AB = !A + !B!AB = 'Hello World'!XY = !X & !Y!XY = '6432'方法-实数对象(Real Object)T 开方Sqrt()T 乘方Power(REAL)T 取整INT()定义函数T 函数定义成全局变量define function !!Area( !Length is REAL, !Width is REAL ) is REAL !Area = !Length * !Widthreturn !Area $*函数!!Area 有两个参数一个返回值EndfunctionT 文件命名和存放位置–文件名必须与函数名一样,后缀是小写的pmlfncPmllib/NewPmlfunctions forms area.pmlfnc xxx.pmlfrm objects xxx.pmlobj定义函数T函数定义成全局变量define function !!Area( !Length is REAL, !Width is REAL,!area is Real) !Area = !Length * !WidthEndfunction函数调用T将新建函数加到索引文件Pml.index中Pml Rehash AllT调用函数并且得到返回值!MyArea= !!Area(6,4)Q var!MyArea<Real> 24T练习-新建函数计算圆的面积,测试函数define function !!circleArea( !radius is REAL) is REAL!Area = PI * !Radius.Power(2)return !AreaEndfunctionPML通用功能-注释T单行注释--This is a new-style PML comment------------------------------$*The following lines calculate the new angle!Z = !X + !Y $*We are assuming both !X and !Y are REAL T段落注释$(skip if (!X EQ !Y)…$)PML通用功能-打印等T打印$P This text will be output to the screen.T换行$P This is an example of a much longer message $that will be output to the screenT退出程序if ( count EQ 0 ) thenreturnendif逻辑控制(Control Logic)T四种逻辑控制结构–条件判断语句If…else…endif–循环语句Do …enddo–跳转Label Golabel–错误处理Handle…Endhandle条件判断语句(If Construct) T判断表达式中必须是布尔值!Type = Type!OwnType= Type of OwnerIF(!Type eq'BRAN') THEN$P CE is Branch.ELSEIF(!OwnType eq'BRAN') THEN$P CE is Branch member.ELSE$P CE is $!Type,Pls select Branch.ENDIFT Elseif,else都是可选项判断元素是否有名字T判断元素是否有名字!Name = Name!FullName= FullNameIf(!Name EQ !FullName) then$p Named.Else$p No name.Endif判断常用例程T判断变量是否定义If(UnDefine(!x)) then$p Variables $!x not define.endifT判断变量值是否存在!x =real()用函数判断用方法判断If(Unset(!x)) then…if(!x.Unset()) then…If(Set(!x)) then…if(!x.Set()) then…练习-条件判断T判断当前元素类型(Type),添加当前元素和与之连接的元素–如果是'BRAN',加入头尾连接的元素add Href Tref–如果是'NOZZ',加入连接的管道add Cref–打印当前元素类型!type = typeadd ceAuto ceif(!type eq'BRAN') thenadd href trefelseif(!type eq'NOZZ') thenadd crefendif$p Current type = $!type循环(Do loops)T循环赋值!Total = 0Do!x From1 To100 By1!Total = !Total + !xEnddoT可以忽略的选项–如果循环起始为1,From选项可以忽略–如果步长为1,By选项可以忽略中断循环BreakT中断循环Break!Total = 0Do !x To 100!Total = !Total+ !xIf(!Total gt500) thenBreak$*或者Break if(!Total gt500)EndifEnddo跳过循环(Skip)T用skip 跳过奇数Do !x To 100If(Int(!x/ 2) NE (!x / 2)) thenSkip$*或者Skip If(Int(!x/ 2) NE (!x / 2))Endif!Total = !Total + !xEnddo跳转(Jump)T用golabel可以跳转到标记行,不限制前后顺序Label /Start…GoLabel/StartT Label名最长16 个字符,不包括'/'T不允许跳转到Do循环中golabel/illegal!Total = 0do !x from 1 to 5!Total = !Total + !xlabel /illegalenddo错误提示T测试程序Next$p OKT可能出现的错误(2,113) List exhausted2表示错误出现在PDMS中的哪个模块113是错误代码T出现错误通常有三种结果–出现一个警告框,用户必须确认–输出一个错误信息–从当前运行的程序中退出错误处理(Error Handling) T处理特定错误,使程序继续执行NextHandle (2,113)$p Last element.EndHandle$p OKT处理任何可能的错误NextHandle AnyEndHandle$p OK处理多个错误T处理多个错误NextHandle (2,113)$p Last element.ElseHandle(2,46)$p …EndHandle$p OK没有错误T处理没有错误!noteM= !sheetname+ '/LoadTable'$!noteMhandle anynew note $!noteMelsehandle nonedelete notenew note $!noteMendhandle数组(Array)T从字符串创建数组!Str= 'Benz,Bmw,Audi'!BestCar= !Str.Split(',')Q var!BestCar<ARRAY>[1] <STRING> 'Benz'[2] <STRING> 'Bmw'[3] <STRING> 'Audi'$*数组元素,索引号T逐个元素添加!BestCar[5] = 'Cadillac'方法-数组对象(Array Object)T数组元素数量Size()T数组最大宽度Width()T追加元素Append(value)T追加数组AppendArray(Array)T删除全部元素Clear()T删除单个元素!MyArray[N].Delete()T删除数组Delete()T压缩数组Compress()T排序Sort()T倒序Invert()T搜索Find(value),FindFirst(value) T和并重复项Unique()数组方法实例T数组追加,数组必须存在,否则提前声明!BestCar.Append('Lincoln')T声明数组!BestCar= array()数组循环T赋值循环Do valuedo!Name values!BestCar$*将!BestCar中元素逐个赋给!Name $p Array element is $!NameEnddo–自动跳过空的数组元素T索引循环Do indicesdo !n indices!BestCar$*将!BestCar中索引号逐个赋给!n !Car = !BestCar[!n]$p Array element $!n is $!CarEnddoT练习-测试数组循环PDMS中生成数组(Collections)T收集指定类型的Pdms元素Var!PipeComps Coll ect All Pipe For CE–生成的!PipeComps是数组,保存的是元素的参考号–不使用For CE则是从整个MDB中提取T类型用法示例ALL所有元素ALL Pipe所有的PipeALL BRANCH MEMBERS所有管件,包括TubeITEMS OF EQUI /D1201设备中的所有基本体继续…T限制条件Var!Elbows Coll All Elbow With (Abor gt100)for CEWith后面是一个表达式T限制区域Var!Elbows Coll All Elbow Within W0N0U0 to W2000N2000U2000 Var!Elbows Coll All Elbow Exclusive Within Volume /D1201 1500Exclusive表示完全包含在空间内的元素才被选中T追加Var!Elbows Append Coll all Bend for CE练习T选择一个设备,将所有Nozzle连接的管道加入显示–加入当前设备,居中显示–Nozzle的Cref属性记录连接的管道名称–通过参考号定位到Nozzle–加入显示Add CrefAdd ceAuto ceVar!nozzles Coll all nozzle for ceDo !nozzle value !nozzles$!nozzleAdd crefEndDo求值(Evaluate)T通过参考号提取属性值Var!Pipes Coll all Pipe for ce$*得到参考号Var!Names Eval name for all from!Pipes$*提取Name属性Q var!namesT练习-将Zone中所有的Pipe名称和等级打印到命令行–使用Do循环将Name和Pspec输出到一行Var!Pipes Coll all Pipe for ce$*得到参考号Var!Names Eval name for all from !Pipes$*提取Name属性Var!Pspecs eval pspec for all from !pipesDo !n indices !names$p $!names[$!n] $!pspecs[$!n]enddo排列字符串ComposeT按照宽度和对齐方式排列字符串,返回数组!a = ‘ABCDEFG’!b = ‘DEF’var!output compose‘$!a’width 5 L SPACE 2 ‘$!b’width 5 RQ var!outputT输出数组的第一个元素$p $!output[1]练习T完善前一个练习,排列Name和PspecVar!Pipes Coll all Pipe for ce$*得到参考号Var!Names Eval name for all from !Pipes$*提取Name属性Var!Pspecs eval pspec for all from !pipesDo !n indices !namesvar!out compose ‘$!names[$!n]’wid15 space 2 ‘$!pspecs[$!n]’wid15 $p $!out[1]enddo练习T继续完善前一个练习,自动设置宽度Width()Var!Pipes Coll all Pipe for ce$*得到参考号Var!Names Eval name for all from !Pipes$*提取Name属性Var!Pspecs eval pspec for all from !pipes!wid1 = !names.width()!wid2 = !pspecs.width()Do !n indices !namesvar!out compose ‘$!names[$!n]’wid$!wid1 space 2 $‘$!pspecs[$!n]’wid$!wid2$p $!out[1]enddo对话框(Form)系统对话框T警告对象(Alert Objects)!!Alert是系统定义的对象–三种无返回值的警告对象–三种带返回值的警告对象警告Alert ObjectsT三种无返回值的警告对象(Alert Object)!!Alert.Error( 'You cannot do this!' )!!Alert.Message( 'Saving your data now!' )!!Alert.Warning( 'Do not press this button again!' )T缺省情况,警告窗口出现在光标附近,可用X,Y值指定其在屏幕上的位置,整个屏幕左上角是0,0,右下角是1,1 !!Alert.Error( 'You cannot do this!' , 0.25, 0.1)确认-Comfirm Alert ObjectsT三种带返回值的警告对象(Alert Object)confirm, question 和inputT确认(Confirm),返回值是'YES'或'NO'!Answer = !!Alert.Confirm( 'Are you sure!' )练习T确认是否在管道上生成弯头,YES则生成,NO则退出–生成弯头New Elbow choose rtext–连接Conn!Answer = !!Alert.Confirm('Creat Elbow?')If(!answer eq'YES') thenNew Elbow choose rtextconnendif询问-Question Alert ObjectsT询问(Question),返回值是'YES' ,'NO'或'CANCEL' !Answer = !!Alert.Question( 'OK to delete Site?' )输入-Input Alert ObjectsT输入(Input)!Answer = !!Alert.Input( 'Enter Width of Floor','10' )–第一个值是输入提示,第二个值是缺省值–Input alerts 返回一个字符串值练习T完善上一个练习–如果生成弯头,询问出口方向和距离–改变方向Dir U–改变距离Dist 1000!Answer = !!Alert.Confirm('Creat Elbow?')If(!answer eq'YES') thenNew Elbow choose rtextconn!dir = !!Alert.Input('Direction?', 'N' )dir $!dir!dist = !!Alert.Input('Distance?', '1000' )dist $!distendif一个简单的对话框(Form)T 对话框是全局变量的对象setup form !!hello Title 'Hello'paragraph .Message text 'Hello world'button .bye 'Goodbye' OK exitT 控件(Gadget)Paragraph .Message 文字控件和控件名Button .bye 按钮控件和控件名T 对话框控制属性OK内置属性,关闭对话框对话框调用T 对话框存放位置文件名与对象名一样,后缀是小写的pmlfrm T 将新建对话框加到索引文件Pml.index 中,在命令行键入Pml Rehash All T 显示对话框Show !!hello T 命令行关闭对话框Hide !!helloPmllib/NewPml functions formsarea.pmlfncHello.pmlfrmobjects xxx.pmlobj调试对话框T调试对话框–对话框显示后,定义文件被加载到内存中,下一次直接从内存中加载对话框定义内容–对话框的定义文件被修改后,需要重新加载Pml reload form !!helloShow !!hello方法-对话框对象(Form Object)T显示状态shown()T判断命令行窗口的显示状态!shown = !!CADCBTH.shown()if(not!shown) thenshow !!CADCBTHendifvar!date clock datevar!time clock time$p Begin report at $!date $!time缺省构造方法(Constructor method)T增加一个输入框和方法setup form !!helloTitle 'Hello'paragraph .Message text 'Hello world'text .input 'Enter text' width 10 is string$*字符串类型的编辑框button .bye 'Goodbye' OKexitDefine method .hello()$*缺省构造方法,与Form同名,不带参数!this.input.callback= '!this.doinput()'$*Callback指明响应操作endmethodDefine method .doinput()$*响应操作,’.’前面加空格!this.message.val= !this.input.val$*!this = !!hello, val表示value endmethod缺省构造方法T缺省构造方法–与Form同名,不带参数–在调用对话框的时候自动执行–一般用于设置控件的缺省值和回调方法–再一次显示对话框时,缺省构造方法不再执行,因为对话框的定义内容已经全部加载到内存中,–Kill !!hello从内存中清除已经加载的定义内容控件的响应操作(Callbacks)T控件的callback成员用于指定控件的响应操作T控件的响应可以是以下的操作–显示另一个对话框form!this.show.Callback= 'show !!hello'–直接执行一条命令command!this.remove.Callback= 'remove all'–调用一个函数function!this.area.Callback= '!area = !!area(!length,!width)'–调用一个方法method!this.apply.Callback= '!this.Apply()'对话框布局(Form Layout)T对话框有一个隐含的定位网格,原点在Form的左上角T每个控件(Gadget) 有四个隐含变量可以用于参考定位XMIN, XMAX, YMIN, YMAX控件定位T自动定位(Auto-placement)–PATH Down 下一个控件在前一个控件的下方–PATH up,PATH Right(缺省), PATH LeftT相对前一个控件定位(Relative)setup form !!helloTitle 'Hello'paragraph .Message text 'Hello world'text .input 'Enter text' at x0 ymax width 10 is stringbutton .bye 'Goodbye' at x0 ymax OKexitT相对指定控件定位button .bye 'Goodbye' At xmax.input ymax.input OK 控件自动定位举例对话框程序-Copy&RenameT实现拷贝同时修改名字T用到的命令NEW type newname COPY oldname REN oldname newname By n 100对话框定义文件T对话框定义文件setup form !!mycopytitle 'Copy and rename'text .from 'From' at x0 width 20 is stringpath rightbutton .ce'CE 'text .to 'To ' at x0 ymax+ 0.3 width 20 is stringtext .by 'By ' at x0 ymax+ 0.3 width 10 is stringbutton .copy ' Copy ' at x2 ymax+ 0.3button .cancel 'Cancel' at x23 Cancelexit缺省构造方法T缺省构造方法Define method .mycopy()!this.ce.callback= ‘!this.ce()’!this.copy.callback= ‘!this.copy()’!this.by.val= ‘N0’EndmethodT得到CE的名字Define method .ce()!this.from.val= nameendmethod主程序T首先判断控件的值Define method .copy()!from = !this.form.val$!fromhandle any!!alert.message(‘$!from not existed.’)returnendhandle!type = type!to = !this.to.val!by = !this.by.valnew $!type $!to copy $!from ren$!from $!to by $!byendmethod控件的内置方法T控件的内置方法(Method)和成员(Member)–变灰一个控件!this.apply.Active = FALSE–聚焦控件!this.input.SetFocus()–编辑框只读!this.input.seteditable(false)–清除列表框的值!this.list.clear()–改变按钮上的文字!this.apply.tag = ' Add '–改变按钮的背景颜色!this.apply.backgroud= 2复杂对话框程序添加指定空间内的设计元素T添加指定空间内的设计元素T程序中用到的命令Var!Comps Append Coll All pipe Within Volume /D1*******控件定义(Gadget)T文本框Paragraph,对于Paragraph,at必须在text前面paragraph .cename at x0 ymax text 'No name' width 20 height 1 T编辑框Texttext .input 'Enter text' at x0 ymax width 10 is stringT多选框Toggletoggle .bran 'Branch'toggle .equi'Equipment'T框架FrameFrame .frame1 'Include' at x0 ymax+ 0.2toggle .bran 'Branch'toggle .equi'Equipment'Exit继续…T按钮Buttonbutton .ce'CE' at x0 ymax tooltip'Select pipe'button .ok 'OK' at x0 ymax OK $*关闭对话框,保留控件值button .apply 'Apply' at x0 ymax Apply $*不关闭对话框button .cancel 'Cancel' at x0 ymax Cancel $*关闭对话框,不保留控件值T图标按钮,png图像文件必须在Pmllib搜索路径内!icon = !!pml.getpathname('modmodeon16.png')button .pick pixmap/$!icon at x0 ymaxT列表框Listlist .list 'Drawlist' at x0 ymax width 18 height 5T练习-组合上述控件,生成新的对话框!!Addvolumn,比较Ok,Cancel的不同设置控件初始值T缺省构造方法设置控件初始值define method .addvolumn()!this.bran.val= true!this.input.val= '1500'endmethod按钮的应用实例T新建方法,将当前元素的名字显示在文本框中define method .ce()!this.cename.val= fullnameendmethodT在缺省构造方法中指定控件的响应操作define method .addvolumn()…!this.ce.callback= '!this.ce()'endmethod对话框控制属性-ApplyT新建方法,调用控件的值define method .apply()!dist = !this.input.val!name = !this.cename.val$p CE is $!name ,Dist = $!distendmethodT在缺省构造方法中指定Apply按钮的响应操作define method .addvolumn()…!this.apply.callback = '!this.apply()' $*不关闭对话框endmethod多选框状态判断T多选框(toggle)的状态通过.val成员判断!this.bran.val= true$*表示选中多选框的应用实例T完善Apply方法define method .apply()!name= !this.cename.val!dist= !this.input.val!elements = array()if(!this.bran.val) thenvar!elements append coll all bran Within Volume$!name$!distendifif(!this.equi.val) then …var!names eval name for all from !elementsdo !element value !elementsadd $!elementenddoendmethod列表框应用实例T列表框用数组赋值,dtext表示display text !this.list.dtext= !namesT从列表框获取值!name = !this.list.selection()T新建方法,提取List中的名字define method .doselection()!name = !this.list.selection()$!nameendmethodT在缺省构造方法中指定列表框的响应操作define method .addvolumn()…!this.list.callback = '!this.doselection()' endmethodView控件T四种View控件–输入输出显示窗口Alpha view–Plot图片显示窗口Plot view–Design显示窗口Volume view–Draft显示窗口Area ViewAlpha ViewsT自定义输入输出对话框Setup Form !!alphaviewtitle ' Input & Output'view .Input ALPHA hei10 width 40channel REQUESTSchannel COMMANDSExitbutton .apply 'Apply' at x0 ymax Applybutton .Dismiss 'Cancel' at Xmax form-size Cancel ExitPlot ViewT显示Plot图片setup form !!plotviewView .view1 plot width 41 hei23exitdefine method .plotview()!this.view1.borders = false!this.view1.add('c:/ladder.plt')endmethodVolumn ViewT Design的显示窗口setup form !!poptestview .vol volume width 50 hei9exitpath downbutton .press 'swap popup' call '!this.popswap()'menu .popmenuadd 'hello' ' 'add 'world' ' 'exitexitdefine method .popswap()!this.vol.popup = !this.popmenuendmethod文件处理(Handling Files)文件处理(Handling Files)T读写文件需要使用FILE对象!Input = object FILE('%pdmsexe%\abc.txt')!Lines = !Input.ReadFile() $* ReadFile将文件内容写到字符串数组中!ResultArray= ARRAY() $* 声明新数组do !Line VALUES !Lines!Column1 = !Line.Part(1)!ResultArray.Append( !Column1)Enddo!Output = object FILE('%pdmsexe%\def.txt')!Output.WriteFile('WRITE', !ResultArray) $* WriteFile将数组写到文件T ReadFile()方法可以自动打开(Open)和关闭(Close)文件T写文件还有覆盖模式'OVERWRITE'和追加模式'APPEND'练习-文件处理T将一个文本文件的内容显示在命令行中!Input = object FILE('d:\abc.txt')!Lines = !Input.ReadFile() $* ReadFile将文件内容写到字符串数组中do !Line VALUES !Lines$p $!LineEnddoT将Pipe名称写入到一个文本文件中Var!Pipes Coll all Pipe for ce$*得到参考号Var!Names Eval name for all from !Pipes$*提取Name属性!Output = object FILE('%pdmsexe%\def.txt')!Output.WriteFile('overWRITE', !names) $*将数组写到文件选择文件的标准函数T函数定义define function!!fileBrowser(!directory is STRING,!seedFile is STRING,!title is STRING,!existFlag is BOOLEAN,!callback is STRING)T使用实例!!filebrowser('%pdmsuser%','*','Text File',true,'!filename = !!()q var!filename')实例应用T调用标准函数setup form !!findfiletitle 'Find file'text .filename 'File name' at x1 ymax+0.3 width 35 is stringbutton .browser 'Browser'button .ok ' OK ' at x1 ymax+0.3 OKbutton .cancel 'Cancel' at x10 cancelexitdefine method .findfile()!this.browser.callback=|!!filebrowser('%pdmsuser%','*','',true,'!!findfile.filename.val= !!()')|endmethod练习-显示文件T File Browser选择文件,将内容显示在命令行中define method .findfile()!this.browser.callback=|!!filebrowser('%pdmsuser%','*','',true,'!!findfile.filename.val= !!()')|!this.ok.callback= '!this.display()'endmethodDefine method .display()!fname= !this.filename.val!output = object file(‘$!fname’)!lines = !output.readfile()q var!linesendmethod菜单(Menu)。
pml编程

Creating Variables新建变量
CADCENTRE
在 PDMs command line(命令行)中,为了提取变量值, 常常用 $ VAR !XLEN (1000) VAR !YLEN (1000) VAR !ZLEN (1000) NEW BOX XLEN $!XLEN YLEN $!YLEN ZLEN $!ZLEN
Variable types变量类型
CADCENTRE
s
There are four basic variable types:有4种基本的变量类型
– – – –
STRING REAL BOOLEAN ARRAY
‘ANY ALPHA NUMERIC CHARACTERS’ ANY NUMERIC VALUE TRUE /FALSE T/F (not 0 1) ANY COMBINATION OF THE ABOVE
Creating Variables新建变量
CADCENTRE
建立一个LOCAL(局部变量), STRING variable:(字符串变量) !Name = ‘Fred’ 建立一个GLOBAL(全程变量), REAL variable: (数字变量 ) !!Answer = 42 建立一个GLOBAL(全程变量), BOOLEAN variable: (逻辑变量) !!Flag = TRUE 建立一个空的LOCAL ARRAY (局部数组变量) !Values = ARRAY() !newarray[1] = |xxx| or !newarray[1] = ‘xxx’
PML2 – 功能更强大的语言
PML2 更象其它现代型语言 典型的是在 PML2中需要更少的代码行 更容易编写和阅读 大多数 PML1 编写的宏仍可在 PML2中运行 PML2 包含许多PML1所没有的功能
[原创]PDMS软件的二次开发及应用
![[原创]PDMS软件的二次开发及应用](https://img.taocdn.com/s3/m/0db3ecfa915f804d2a16c141.png)
[原创]PDMS软件的二次开发及应用PDMS软件的二次开发及应用姓名:王晶指导老师:郭琳实习单位:建造公司技术部电议室毕业院校:哈尔滨工业大学所学专业:软件工程2010 年 12 月摘要PDMS软件在许多行业中流行,适应多种行业建模,具有一定的普遍性。
PDMS软件能够进行的三维建模可直接生成自动标注的分专业或多专业布置图、单管图、配管图、结构图、支吊架安装图,并抽取材料等。
PDMS软件的引进为公司带来了更多的方便提高了效率和准确度,但由于该软件的普及性特点注定了对本公司所涉及的工程项目不具备针对性,虽然带来了巨大的效益,同时对于具体项目而言仍然不可避免的存在着某些繁琐复杂的手工工作程序。
本课题使用PML语言对PDMS软件进行了二次开发,提供了多个扩展功能,通过与原软件风格相融合的图形化形式展示给用户,操作方便,不但解决了工作中存在的许多重复、耗时的工作,提高工作效率,增强计算准确率,也成为PDMS的二次开发的真实实践,掌握一种新的技术。
对PDMS软件新增功能的使用将为公司带来更高效、更省时的收益,并将随着该技术的不断完善、熟练,成为公司的一种商品为公司带来新的效益。
关键词:PDMS;PML语言;文件存储;Add-ins;目录摘要.................................................I 目录................................................II 一概述..............................................1 1.1 课题背景及研究目的 . (1)1.1.1 与课题相关的研究综述 (1)1.1.2 课题研究目的与意义 ...........................2 1.2 课题研究的创新点 ................................. 2 二研究方案............................................52.1 技术方案 (5)2.1.1 PDMS运行机制及二次开发技术 (5)2.1.2 PML功能及构成 ..............................7 2.2 技术关键 (7)2.2.1 PML 中Add-ins的应用 (8)2.2.2 PML文件存储机制 (8)2.2.3 PML对象的应用 .............................10 三 PDMS扩展功能介绍及应用 ............................113.1 PDMS扩展功能界面展示 .......................... 11 3.2 电缆路径自动敷设及电缆长度统计功能 .............. 12 3.3 托架上某截面电缆信息的展示功能 .................. 15 3.4 填充率计算及护管选型功能 ........................ 16 3.5 错误路径删除及打印单个路径图纸功能 .............. 18 3.6 相关联的其它扩展功能 ............................ 19 四总结.............................................20 五参考文献...........................................21 六致谢 (22)一概述1.1 课题背景及研究目的PDMS软件作为一个三维工厂设计系统应用于五十多个国家,其中石油、化工、制药行业用户占42%。
利用PML语言提高PDMS建模效率

利用PML语言提高PDMS建模效率在PDMS三维建模的过程中,利用PML语言创建一些常用命令的快捷方式,能够减少建模过程中一些不必要的重复工作,缩短建模时间,不仅极大的提高建模的效率和准确度,也为之后模型的校对提供便利。
标签:PML语言;菜单小工具;效率PDMS (plant design management system)是英国的A VEV A公司开发的一款三维工厂设计管理软件,它是以元件数据库为核心,高度参数化,并具有直观、准确、方便、灵活的特点,已经非常广泛地应用于化工、电力及海洋工程等行业。
此外,PDMS 还是各设计专业设计、建模和交流协调的平台,能十分方便地检查出设计过程中出现的“错、漏、碰、缺”等问题;尤其是在设计空间紧张、设计密度高的工程行业,使用三维建模设计,能够更高效地实现总体布置的优化。
1 PDMS常用操作PDMS是一个适用性比较强的三维设计软件,但是每个设计单位并不会应用到PDMS所有的设计功能,一些揉和到一起的功能显得有些臃肿,并不方便。
因此,设计单位需要项目管理人员针对自身需要,利用PML语言对PDMS中的一些功能进行分类和剥离,从而减少建模过程中一些不必要的重复工作,缩短建模时间,提高创建三维模型的效率和准确度。
下面首先介绍一下在日常建模过程中遇到的一些常用操作。
1.1 管线管底对齐/管顶对齐在创建项目模型的过程中,经常需要对管线进行管底对齐或管顶对齐的操作,在常规操作过程中,首先需要测量该管线的管底标高/管顶标高,然后通过菜单栏position相关命令移动至相应的位置,当类似管廊的位置需要对齐的管线命令比较多时,就要多次重复相关操作,费时费力,还经常由于取点不准确造成一定的偏差。
1.2 管线头部收尾/尾部收尾在创建项目模型的过程中,有些管线的头尾或者尾部本身没有连接关系,需要在最后一个元件或指定位置进行收尾。
在常规的操作过程中,需要点选菜单栏上的connect下的branch命令进行相关操作,费时费力。
利用PML语言开发PDMS建模

利用PML语言开发PDMS建模作者:张博陈冬霞来源:《数字技术与应用》2014年第06期摘要:PDMS三维配管设计中,PDMS 前期的建模和后期的出图占据了很大的比重。
前期建立的PDMS数据库资源丰富,如何开发这个宝藏,是我们面临的一个重要课题。
本文简要介绍如何利用PML 语言,编程解决PDMS建模中的一些问题,重点阐述了如何编程实现一步设定一批管道绝热信息,在附录中列出程序并做了相应的程序说明。
通过开发利用PML语言编程,以期降低工作强度,提高工作效率。
关键词:PDMS PML语言编程管道绝热中图分类号:TQ050.2 文献标识码:A 文章编号:1007-9416(2014)06-0189-011 概述PDMS是英国AVEVA公司开发的三维工厂设计系统,是工厂设计管理系统(Plant Design Management System)的简称,目前在国内已被广泛应用于石化、冶炼、制药、电力等行业。
较之传统的CAD等平面设计软件,PDMS以数据库作支撑,通过PML(Programmable Macro Language)可编程宏语言后台运行,借助三维实体模型表观,直观而精准的体现了空间内设备、管道、结构等的相互位置关系,且支持提取平立面图纸和表格,经简单整理即可生成项目的施工文件,达到无差错,最优化设计,使现有的设计思想、方法及过程都发生一系列变革,为工程设计人员提供了全新的设计方法和手段。
本文通过PML编程语言的二次开发,找到了一种自动设置管道解热等级的方法,从而避免了手动设置,且可以批处理,从而大大提高了工作效率。
2 PML语言编程在PDMS建模中的应用PDMS常规上管道模型,一般是按照PID将各管件,法兰,阀门等依次合理的布置在某一空间里(当然包括管线命名,如XSC1303A-80-S9A-H3-GC2),最后再设置管道绝热。
管道的绝热设置一般是逐个手动设置绝热等级(如H3),因为只有设置好后,利用相应模板抽出的表格才有保温厚度。
发电厂烟风道数字化设计

发电厂烟风道数字化设计綦学良【摘要】针对采用工厂三维设计管理系统(PDMS)软件平台固有的供热通风与空气调节(HVAC)风道设计模式建立三维模型,精细化程度低,不能满足对烟风道零件开取材料的要求,通过基于三维设计软件平台的二次开发,在输入设计参数、布置三维模型、烟风道元件材料统计等方面,对发电厂烟风道数字化设计进行了研究.结果表明,发电厂烟风道数字化设计的应用不仅可以提高设计效率,同时能在专业间协同、设计数据传递及提取、材料统计、精细化设计和碰撞检查等方面提高设计质量.【期刊名称】《吉林电力》【年(卷),期】2018(046)001【总页数】4页(P22-25)【关键词】烟风道;数字化设计;二次开发;自动布置规则【作者】綦学良【作者单位】中国电力工程顾问集团东北电力设计院有限公司,长春 130021【正文语种】中文【中图分类】TP391.72随着发电设计行业对设计成品直观性、全专业化配合、高精细化程度、高效率的需求不断提升,以三维设计为主体的发电厂数字化设计正广泛普及和应用,其中工厂三维设计管理系统(PDMS)是较为主流的数字化设计平台之一[1]。
热机专业作为发电项目的主体专业对实体空间占位、专业间碰撞检查、高效率材料统计的需求尤为突出。
热机专业烟风道设计计算量大,烟风道零件形式复杂、多变,对空间占位的要求高;同时,零件的材料量统计项目繁多、耗时。
采用PDMS软件平台固有的供热通风与空气调节(HVAC)风道设计模式建立三维模型,已不能准确刻画零件的外形及占位,为实体碰撞检查提供有效依据且模型精细化程度低,不能满足对烟风道零件开取材料的要求,因此,针对于发电项目对烟风道设计精细化程度的迫切需求,烟风道三维设计的各类方法、体系、软件程序应运而生。
本文以基于PDMS12.1SP2三维设计平台进行的二次开发烟风道三维设计体系为例,与该软件平台固有的HVAC风道设计模式相对比分析,着重探讨发电厂烟风道三维设计的有效方法[2]。
基于PML语言的PDMS三维建筑模型设计

基于PML语言的PDMS三维建筑模型设计王楠;王黎;王云极【摘要】以规则建筑单体为例,探讨了在火力发电厂三维布置设计中运用可编程宏语言(PML)快速建立建筑模型的方法,通过采用三维工厂设计管理系统(PDMS)界面操作和PML语言2种方式建立输煤综合楼建筑模型,并进行建模效率对比,证明该方法在工程运用过程中与传统界面操作方式相比效率更高、规范性更好、人为误差更少.【期刊名称】《吉林电力》【年(卷),期】2016(044)006【总页数】3页(P43-45)【关键词】可编程宏语言(PML);三维工厂设计管理系统(PDMS);建筑模型【作者】王楠;王黎;王云极【作者单位】中国电力工程顾问集团东北电力设计院有限公司,长春130021;中国电力工程顾问集团东北电力设计院有限公司,长春130021;中国电力工程顾问集团东北电力设计院有限公司,长春130021【正文语种】中文【中图分类】TP391.72;TU271随着数字化设计在火力发电项目中的普及和深化应用,参与设计的各个专业都根据自身特点开展了服务于全专业协同的数字化设计研究工作,土建专业在数字化平台上的布置设计工作主要是建筑模型的建立,为汽机、锅炉、电气、结构、暖通、给排水、照明等其他专业提供房间布置,工作范围遍及全厂,提高建筑专业建模效率将对于促进数字化协同设计高效发展产生重要意义。
三维工厂设计管理系统(PDMS)是应用最为广泛的工厂三维设计软件之一,软件核心为7大类结构化数据库,建筑专业模型数据主要存储于其中的参照数据库,包含几何数据、材料属性、门窗信息等。
软件提供的可编程宏语言(PML)[1],具有强大的二次开发功能,包含丰富的内置函数、方法及对象[2],操作便捷,能够与PDMS无缝连接[3],几乎所有的建模工作都可以通过命令和函数的组合来实现[4]。
基于此,探索高效、规范化建立规则三维建筑模型的程序化方法,并通过实际应用验证其可行性。
规范化的建筑模型设计是基于数据库开展协同设计、三维绘图、材料统计的基础,同时也是与其他各专业开展协同配合的基础。
pml二次开发基础语法

第一部分: 基础知识PML基本概念Programmable Macro Language 可编程宏语言.通常的PML开发包括两部分, 一部分是PML宏,脚本语言; 另一部分是PML2,面向对象的编程语言.1.PML宏(Macro)宏, 就是一系列pml命令的集合.通过$m执行.格式为: $m filename [param1 param2 ….](举例)其中param1为参数, 宏可以参数化.(举例)2.面向对象的PML2PML支持对象(Object),对话框(Form)和菜单(Menu).(举例)一.变量,函数和方法1. 变量的定义及用法在PML2中, 每一个变量都是对象. 变量名以!或者!!开头,例如!weight. !开头的变量为局部变量, !!开头的为全局变量.PML内置了常用的变量类型.(1)Real 实属类型. 提供基本的四则运算操作. 例如!a = 10!b = 10!a = !a + !b$p $!a --输出变量a的值(2)String 字符串类型. 例如!strName = ‘/EQUI-TEST-1’(3)Boolean 用于逻辑表达式. 值只能是true/false(4)Array 数组(5)Position(6)Direction3.变量的创建, 删除, 查看变量可以用赋值来创建. 例如!str = ‘abc’也可以用类型标识来创建.! str = string()! str = ‘abc’删除: ! str.delete()查看:通常使用q var! str 也可以用$p $!str4.方法(method) 和函数(Function)Method是一个对象的子程序. 只有当对象存在,才可以调用对象的方法. 例如!strNum = ‘123’!num = !strNum.Real()$p $!num以上的代码, 调用的string类型的real()方法, 将字符串转换为数字,并输出.函数的用法与方法类似, 同样有参数和返回值. 但函数是独立存在的,全局的. 在任何地方, 都可以调用.二.程序的结构控制1.循环语句(1)Do循环例如:!sum = 0Do !i From 1 To 100 By 1!sum = !sum + !iEnddo其中!i为循环变量, 初始值为1, 终指为100, 步长为1. 当步长为1是,一般省略.(2)中断Break: 中断并跳出最内层循环(3)跳过Skip. 跳过当此存换. 例如!sum = 0Do !i From 1 To 100 By 1Skip if ( int(!i / 2) eq (!i / 2)) $* 跳过所有的偶数!sum = !sum + !iEnddo2.逻辑控制语句格式为if () then … else …其中括号内的必须是表达式.例如:IF (TYPE OF OWNER EQ ‘BRAN’) THEN$P BRANCH $!!ELSEIF (TYPE EQ ‘BRAN’) THEN$P BRANCH $!!ELSE$P NOT BRANCHENDIF其中elseif /else可选, elseif可多个.3.跳转语句定义标记Label /label1跳转Golabel /gol1不建议使用.三.其他相关语句1.数组字符串长度Length()类型转换Real(),Position(),Boolean()大小写转换LowCase(),UpCase()两端截取After(str2),Before(str2),Substring(index)中间截取Substring(index,nchars)替换Replace(str2,str3)匹配Match(str2)分割(返回数组) Split()修剪Trim()2.字符串元素数量Size()追加元素Append(value)追加数组AppendArray(Array)删除全部元素Clear()倒序Invert()搜索Find(value),FindFirst(value)和并重复项Unique()3.表达式(1)算术运算符+ - * /(2)连接运算符&(3)比较运算符LT GT EQ NEQ(4)逻辑运算符AND OR NOT4.计算函数Sqrt(x)Power(x, e)Int(x)Sin(x)Cos(x)5.注释单行注释用—开头. –之前不可出现空格之外的字符单行注释$*. $*之后的内容为注释. $*之前可出现其他字符段落注释. 用$(和$)将注释内容包括进来.(举例)6.打印$p 打印内容例如$p test line打印多行$p line 1 $Line 2输出内容包括变量$p is $!!其中$为转义字符, 如果要输出$, 则使用$$7.异常处理程序运行中, 可能需要意料之中的可能发生的异常/错误, 例如节点创建失败, 遍历子节点时超过最后一个等等. 这时需要捕捉异常,作出相应的处理.(1)异常捕捉例如Site /TEST_SITEHandle (2, 109) $*$p节点不存在Endhandle其中(2, 109)为错误编号. 也可以使用handle any捕捉任意类型的错误.(2)捕捉多个异常Site /TEST_SITEHandle (2, 109) $*$p节点不存在Elsehandle (2, 108)$p /TEST_SITE节点存在, 但不是SITE类型elsehandle none$p Site /TEST_SITE节点存在endhandle其中handle none表示没有遇到错误的情况.四.用户自定义方法/用自定义函数/自定义对象(1)自定义方法Define method .方法名(参数1 is 类型, 参数2 is 类型…) is 返回值类型其中参数可没有返回值可以没有例如Define method .Sum(!a is real, !b is real) is real!sum = !a + !bReturn !numendmethod(2)自定义函数Define function !!sum(!a is real, !b is real) is real!sum = !a + !bReturn !numendFunction与方法类似. 一个文件里只能定义一个函数,扩展名为pmlfnc, 必须放在指定的文件夹下,并执行pml rehash all(3)自定义对象Define object 对象名endobject五.文件处理(1)读取!file = object FILE(‘d:\abc123.txt')!lines = !file.ReadFile()Q var!lines(2)写入!arr = array()!arr.append(‘line1’)!arr.append(‘line1’)!file = object FILE('d:\abc.txt')!file.WriteFile('WRITE', ! arr) $*将数组!arr写入文件其中’Write’可以换成'OVERWRITE'(覆盖)和'APPEND'(追加)六.对话框及菜单1.系统对话框(1)询问!!alert!confirm = !!alert.confirm('确定要删除吗?')if(!confirm neq 'YES') thenreturnendif(2)警告!!alert.message(‘message’)(3)错误提示!!alert.error(‘error’)2.自定义对话框SETUP FORM !!custumFormTITLE '自定义对话框’Text .text1 ‘点击按钮’Button .okExit这是一个最简单的对话框, 显示一个文本框加上按钮, 但是点击按钮不会有任何反应. (截图)3.对话框调用/初始化Pmlhash allPml reload form !!custumFormShow !!custumForm4.默认构造方法/初始化方法每个form初始化时, 会自动调用与其名字相同的方法. 在刚才的代码中加上Define method .custumForm()!this.text1.tag = ‘初始化完成’Endmethod除此以外, 还可以加上默认的初始化函数在开头加上一行!this.initcall = '!this.init()', 调用构造方法结束,显示之前,会自动调用init()方法5.界面消息的响应界面消息的相应, 例如点击按钮, 选择下拉框等, 用callback关联.SETUP FORM !!custumFormTITLE '自定义对话框’Text .text1 ‘点击按钮’Button .ok ‘OK’ExitDefine method .custumForm()!this.text1.tag = ‘初始化完成’!this.ok.callback = ‘!this.ok()’EndmethodDefine method .ok()!!alert.message(‘OK’)Endmethod此时, 点击按钮, 会弹出对话框. (截图)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数调用
T 将新建函数加到索引文件Pml.index中
Pml Rehash All
T 调用函数并且得到返回值
!MyArea = !!Area(6,4) Q var !MyArea <Real> 24
T 练习-新建函数计算圆的面积,测试函数
define function !!circleArea( !radius is REAL) is REAL !Area = PI * !Radius.Power(2) return !Area
!!Area
!!表示全局变量
T 变量名最长 16 个字符(不包括!和!!),变量名可以包含字母 和数字
T 变量名不能用数字和点(.)开头
T 变量名的大小写不敏感
T 建议:一个变量一个用途,最好给变量名一个有意义的名字, 并且区分大小写
!!StartInUpperCase
7
7
PDMS属性类型-系统定义变量类型
– 方法并不改变对象的类型和对象中的值
T 参考手册Cadcentre Software Customisation Reference Manual
11
11
方法-字符串对象(String Object)
T 字符串长度 T 类型转换 T 大小写转换 T 两端截取 T 中间截取 T 分隔符截取 T 替换 T 匹配 T 分割(返回数组) T 修剪
T 直接声明变量类型
!Length = Real() Q Var !Length 显示<REAL> Unset
T 删除变量用到方法
!MyString.Delete()
变量命名规则(Naming Conventions)
T 局部变量(Local)和全局变量(Global)
!SurfaceArea
! 表示局部变量
PML - 功能强大的语言
T Programmable Macro Language可编程宏语言 T PML2基于面向对象(Object Oriented)概念的编程语言 T 支持用户自定义对象类型(Object Types) T 简单易学,与PDMS无缝连接 T 丰富的内置函数,方法及对象 T 最简单的对话框,菜单编写语言
!Y = 32
!Z = !X + !Y
!Z = 96
!A = 'Hello '
!B = 'World'
!AB = !A + !B
!AB = 'Hello World'
!XY = !X & !Y
!XY = '6432'
13
13
方法-实数对象(Real Object)
T 开方 T 乘方 T 取整
Sqrt() Power(REAL) INT()
T 查询属性类型
$*P-point[3]坐标 $*P-point[1]方向
!Ref = Ref
Q var !Ref
变量给PDMS属性赋值
T 属性名 = 变量名
– 名字赋值,变量中第一个字符必须是/ !! = !Name !!ce.Describsion = !Desc !!ce.Temp = !Temp !!ce.Pspec = !Pspec !!ce.Purp = !Purp
方法实例
T 方法示例
!str = 'hello how are you!' !newstr = !str.after('hello').trim().upcase() q var !newstr <String> 'HOW ARE YOU!'
T 练习-将字符串改为'where are you?‘
!str = 'hello how are you!' !newstr = !str.after('hello').trim().replace('how', 'where').replace('!', '?')
8
8
变量提取属性
T 用变量提取属性值,变量名=DBref变量.属性名
!Name = !!
!Desc = !!ce.Description !Pspec = !!ce.Pspec !Temp = !!ce.Temp !Purp = !!ce.Purp !Rating = !!ce.cref.pspec.rating !Pos = !!ce.Pposition[3] !Dir = !!ce.Pdirection[1]
T 名字(Name)
如Name
T 字符串(String) 如Description,Function
T 实数(Real)
如Angle,Temperature,Rating
T 布尔(Boolean) 如Lock,Shop,Built
T 数组(Array)
如Level
T 参考(Reference) 如Spref,Catref,Lstube,Ptref,Gmref
定义函数
T 函数定义成全局变量
define function !!Area( !Length is REAL, !Width is REAL ) is REAL
!Area = !Length * !Width
return !Area
$*函数!!Area有两个参数一个返回值
Endfunction
T 文件命名和存放位置
Pmllib/NewPml
functions area.pmlfnc
forms xxx.pmlfrm
objects xxx.pmlobj
– 文件名必须与函数名一样,后缀是小写的pmlfnc
14
14
定义函数
T 函数定义成全局变量
define function !!Area( !Length is REAL, !Width is REAL,!area is Real) !Area = !Length * !Width
4
4
参数化宏Parameterized Macro
一个简单的 Macro ,继续,
T 宏可以参数化 T 文件名后面的字符串是参数(parameters)
$M /MyFile NEWEQUIP 300 400 600
ASCII 文件 MYFILE
NEW EQUIP /$1 NEW BOX XLEN $2 YLEN $3 ZLEN $4 NEW CYL DIA $3 HEI $4 CONN P1 TO P2 OF PREV
宏的参数
T Macros 可以有多达 9 个由空格分隔的参数.
$M /MyFile PML TRAINING 55 66
T 文本字符串可以以单个参数输入
$M /MyFile $< PML TRAINING $> 55 66
T $< 和 $> 是分隔符,在它们之间的任何字符都被认为是单 个参数
5
5
变量Variables
– PML概念 – PML功能 – PML构成
T PML程序语言
– 变量的定义及用法 – 循环Do、判断If、跳转Golabel – 错误处理 – 文件处理 – 函数Functions、方法Method – 对话框Forms和菜单Menu
2
2
课程结束后 ...
T 您会具有以下知识 …
– PML构成及功能 – 编写简单的宏 – PML变量的定义及应用 – PML函数/方法的定义及调用 – PML窗体/对象的定义及调用
10
10
PDMS命令中使用变量
T 变量前加$表示提取变量的值
!type = !!ce.type !name = !! !newname = !name + ‘-NEW’ New $!type $!newname
T 直接组合字符串
New $!type $!name-NEW
方法(Method)和函数(Function)
PML基础
王元
AVEVA中国 2005.11.19
1
1
如何学习PML编程
T 需要具备的基本知识
– 熟悉Pdms的基本操作 – 了解Pdms的运行机制,模块之间的关系 – Pdms属性的操作 – Pdms命令的操作 – Pml语法(本教程) – 通过Pdms菜单查找示范程序
课程将包括...
T PML介绍
Length() Real(),Position(),Boolean() LowCase(),UpCase() After(str2),Before(str2),Substring(index) Substring(index,nchars) Part(nth),Part(nth,delim) Replace(str2,str3) Match(str2),MatchWild(str2) Split() Trim(),Trim(option)
T 窗体和菜单
– PDMS大多数应用程序都由对话框 (Forms)和菜单 (Menus)来驱动
一个简单的 Macro
T 宏是包含PDMS 命令序列的一个文本文件 T 运行宏
$M /MyFile
ASCII 文件 MYFILE
NEW EQUIP /FRED NEW BOX XLEN 300 YLEN 400 ZLEN 600 NEW CYL DIA 400 HEI 600 CONN P1 TO P2 OF PREV
3
3
PML构成
T Macros
– Macros是包含PDMS 命令序列的ASCII文件 – Macros 在 PDMS 中通过 $m /FILENAME来执行