PML Basics The AVEVA Programmable Macro Language Author: Romel E. Daguplo Email: romeldhagz@gmail.com Introduction PML stands for Programmable Macro Language It is a programming language for AVEVA PDMS Customization Difference between Macros and Programmable Macros: Macros are ASCII files containing PDMS command in sequence Programmable Macros are macros containing program constructs such as IF statements and loops Note: Solutions of the exercises are provided which are attached together with this guide. PML File Hierarchy des gen PML 1 PML 2 pdmsui pmllib dra admin pipe adm equi clib functions forms objects xxx.pmlfnc xxx.pmlfrm xxx.pmlobj PML 2 Designed to be easier to read and easier to write Most PML1 macros will still run under PML2 Contains many new features not in PML1 Is more like other modern object-oriented languages (C++, Java, Smalltalk, etc.) Provides classes of built-in, system-defined and userdefined object types Main deficiency is that it lacks inheritance Objects have members (their own variables) and methods (their own functions) Operators and methods are polymorphic What they do (their behavior) depends on the type of the variable PML 2 Variables Used to store values Are objects Has May be up to 16 characters long and can contain alpha and numeric characters NEVER start a variable name with a number NEVER use dot (.) in variable names Has unique name set of functions called methods Has an Object type when created PML 2 Variables PML 2 is supplied with Built-In Object Types in PML built-in object types system-defined object types and you can also define your own user-defined object types String – holds any text Real – used for numeric values including do loop counters Boolean – for results of logical expressions and holds the value TRUE or FALSE Array – holds many values of any type PML 2 Variables System-defined Object Types Position Orientation Direction Bore Dbref Pointvector etc… PML 2 Variables User-defined Object Types Examples: define object COMPANY member .Name is STRING member .Address is STRING member .Employees is REAL endobject define object SERVICES member .Description is STRING member .Cost is REAL member .Owner is COMPANY endobject PML 2 Variables User-defined object type definitions should normally stored in a file with a lowercase name matching the name of the object type and a .pmlobj suffix in PMLLIB search-path directory Example: For object COMPANY, it should be stored in a file named company.pmlobj PML 2 Variables Types of Variables GLOBAL Lasts for a whole session (or until you delete them) Represented by two exclamation points (!!) LOCAL Variables Variables Within one PML function or macro Represented by one exclamation point (!) Examples: !!var !var Global Local PML 2 Variables Other examples: creates !!number as a GLOBAL REAL variable !name = ’Romel’ creates !name as a !!number = 42 !grid = TRUE LOCAL STRING variable creates !grid as a LOCAL BOOLEAN variable PML 2 Variables Giving variables a type: !!number !name !grid !dimensions = = = = REAL() STRING() BOOLEAN() ARRAY() Creating Other Types of Variable !owner = object COMPANY() Text Delimiters Text strings must be enclosed in either single quotes or vertical bars Example: ’This is a text string.’ |This is a text string.| !str = ’text’ !str = |text| !str = |’text’| PML 2 Expressions Introduces enhanced facilities for expressions if and do commands When giving a PML variable a value using = sign In Example: !value = !number May be of any complexity May contain calls to PML Functions and Methods May include form gadget values Example: !value = !!MyFunction(!arg) * !!Form.Gadget.Val / !MyArray.Method() PML 1 Expressions Must still be used when an expression is used as an argument to a command Must be enclosed in () brackets Must be preceded with $ to obtain their value: var !value ($!number) The result of a PML 1 expression, even if it is a number, is of type STRING The VAR assign a (STRING) value to a PML variable var !value 99 var !newvalue ($!value + 1) !newvalue is now the STRING ‘100’ PML 2 Expressions Consists of operators and operands. Format: There must be a space before and after an operator. !a + !b + is the operator Operator Precedence Operators are evaluated in the following order: () Functions */ +– NE NEQ GT LT GE GEQ LE LEQ NOT AND OR PML 2 Expressions Expression operators + -/* LT GT EQ NE GT GE NOT AND OR SIN COS TAN SQR POW NEGATE ASIN ACOS ATAN LOG ALOG ABS INT NINT Examples: !a = 30 * sin(45) !b = pow(20,2) raises 20 to the power 2 (=400) !c = (match(name of owner,’LPX’) gt 0) PML 2 Expressions Operator Precedence Example: !a = 2 !b = 2 !result = (!a + !b) * 2 EQ 8 Value of !result would be TRUE. PML 2 Expressions Boolean Operators – returns TRUE or FALSE EQ - equal NE - not equal LT - lesser than GT - greater than LE or LEQ - lesser/lesser or equal GE or GEQ - greater/greater or equal NOT - TRUE if the expression is FALSE AND - TRUE if both expressions are TRUE OR - TRUE if either or both the expressions are TRUE PML 2 Expressions Concatenation Operator & Concatenates STRING values (joins them end-to-end) Result would be a STRING also Values of any type are automatically converted to STRING first before concatenation Example: !a = 64 !b = ’romel’ !c = !a & !b Value of !c is a STRING ’64romel’. PML 2 Expressions Nesting Expressions Expressions can be nested using brackets Example: ((SIN(!angleA) * 2) / SIN(!angleB)) Control Logic IF Construct Example: If (!x EQ ’romel’ OR !x EQ ’ella’) then !result = 2 Elseif (!x EQ ’bruno’) then !result = 1 Else !result = 0 Endif Simplest form: If (!x EQ ’romel’) then !result = TRUE Endif Control Logic Expressions based on BOOLEAN operators that give also a BOOLEAN result. Example (associated with IF statement): !pass = !value GT 0 If (!pass) then ………… PML functions can also be placed in the expression: If (!!MyFunction()) then ………… If (!!MyFunction() GT 0) then ………… !!MyFunction() returns BOOLEAN !!MyFunction() returns REAL Control Logic DO loops Enables a series of commands to be repeated more than once Optionally controlled by a counter Example: do !x from 10 to 100 !total = !total + !x enddo Simplest form – will loop forever unless something in the commands block stops the loop do commands block enddo Control Logic Other DO loop example: Loop a specified value Example: do !x from 10 to 100 by 2 !total = !total + !x enddo Decrementing: do !x from 10 to 1 by -1 …… enddo Control Logic Stopping a DO loop: break or break if Example: do !number if (!number GT 100) then break endif ………… enddo do !number break if (!number GT 100) ………… enddo Control Logic Skipping commands in a DO loop: skip or skip if Example: do !number if (!number EQ 4) then skip endif ………… enddo do !number skip if (!number EQ 4) ………… enddo Control Logic Jumping to a labelled line: golabel Example: if (!ok) then golabel /MyLabel else …… endif label /MyLabel -- do something Control Logic Conditional Jumping to a Labeled Line Example: do !x do !y to 3 !z = !x * !y golabel /Finished if (!z gt 100) !total = !total + !z enddo enddo label /Finished $P Total is $!total Control Logic Illegal Jumping Example: golabel /MyLabel do !y to 3 !total = !total + !y label /MyLabel $P here enddo The following is an illegal jump into a nested do block. Jumping to a block expression such as if and do is illegal. Comments in PML Lines One-line comment: Begins with -- or $* -- This is a new style PML comment $* This is a comment Inline comment: !c = !a + !b $* This is a comment Several line comment: Enclosed $( in the escape sequence $( and $) A comment containing more than one line $) Comments in PML Lines Comment-out lines Prevent a code to be executed w/out deleting from the file One-line Comment and Several line Comment is applicable Example: $( skip if (!x eq !y) $) or -- !skip if (!x eq !y) The Special Character $ It is an escape character that together with the character which follows it are treated as a special instruction to PML !strx = ’!!ce.type’ !dbrefx = $!strx $P – used to output message to the screen $P This text will be output to the screen !num = 24 $P My age is $!num As the last character on a line, $ means that the next line is a continuation line $P This is an example of a long $ message to output on screen PML 2 Functions Can optionally have ARGUMENTS May be built-in object, user-defined object or ANY Can optionally return values as their results Functions that don’t return values are known as PML Procedures Example: define function !!Area( !length is REAL, !width is REAL ) is REAL !result = !length * !width return !result endfunction PML 2 Functions PML Procedure A PML function that does not return a result Example: define function !!Area( !length is REAL, !width is REAL, !result is REAL ) !result = !length * !width endfunction !area = REAL() !partlength = 7 !partwidth = 6 call !!Area(!partlength, !partwidth, !area) !area now is equal to 42. PML 2 Functions Arguments of type ANY Example: define function !!AnyType( !input is ANY ) $P $!input endfunction Finding its actual type using ObjectType() method: define function !!AnyType( !input is ANY ) !type = !input.ObjectType() if (!type eq ’STRING’) then … elseif (!type eq ‘REAL’) then … else … endif endfunction RETURN Command At any point within a PML File a return command will stop further execution Example: if (!count EQ 0) then return endif Storing PML 2 Functions Loaded automatically when called via PMLLIB Filename must have suffix .pmlfnc !!CALCULATE or !!Calculate or !!calculate all corresponds to calculate.pmlfnc !! Signifies that the function is user-defined and that it is global All user-defined functions are global and only one may be defined per file define function must be the first line in the file and that its name and the file name must correspond Loading PML 2 Files Must be stored in directories pointed to by the PMLLIB environment variable At start up: scans all files in the PMLLIB pml.index is created All PML files listed in the pml.index file are loaded PML Filename Extensions The naming conventions are as follows: .pmlfnc for PML function definition files .pmlobj for PML object type definition files .pmlfrm for PML form definition files Note: Filename extensions must be entered in lower case. PML 2 Directives pml rehash all - rebuild file index pml index - updates pml.index pml reload form !!formname – reload the form definition file kill !!formname – use if you experienced problems of an edited form definition not being re-loaded pml reload object ObjectName – reload an object definition pmlscan DirectoryName - updates pml.index without running an AVEVA products Exercises Exercise 1: Create a function that will convert a value from MM to INCH. Function details: !!convertUnit(!value is REAL, !mode is STRING) is REAL Sample Usage: !value = 20 !inch = !!convertUnit(!value, 'INCH') !mm = !!convertUnit(!value, 'MM') Exercise 2: Implement Exercise 1 as PML Procedure. Sample Usage: !value = 20 call !!convertUnitProcedure(!value, ’INCH') $P !value 20 converted to MM equal $!value Exercises Exercise 3: Implement Fibonacci number using PML function. Fibonacci numbers are the numbers in the ff. sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … By definition, the first two Fibonacci numbers are 0 and 1, and each remaining number is the sum of the previous two. Some sources omit the initial 0, instead beginning the sequence with two 1s. Function details: !!generateFibonacciSequence(!numshow is REAL) is STRING Sample usage: !numsequence = 7 !sequence = !!generateFibonacciSequence(!numsequence) $P $!sequence Output: 0, 1, 1, 2, 3, 5, 8 Exercises Exercise 4: Implement Hailstone number sequence using PML function. The German mathematician, Lothar Collatz, proposed that for any number it's possible to make a sequence of numbers that will eventually end in one by following a simple rule; if the number is even halve it by two, if it's odd, times it by three and add one (e.g., starting with the number 5 the sequence would be 5 16 8 4 2 1). The name hailstone comes from the way the pattern of numbers rise and fall, like a hailstone in a weather cloud before it drops to the ground. Function details: !!generateHailstoneSequence(!value is REAL) is STRING Sample usage: !value = 17 !sequence = !!generateHailstoneSequence(!value) $P $!sequence Output: 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 PML 2 Methods Each object types has several methods May optionally have arguments Can optionally return values as their results Reference: Vantage Plant Design Software Customization Reference Manual contains a list of all PML Methods PML 2 Methods STRING Object example using Length() method: !name = ’ROMEL’ !numname = !name.Length() !numname is equal to 5. Note: Notice the dot separator between the name of the variable and the name of the method. PML 2 Methods Converting a STRING to BOOLEAN !myString = ’TRUE’ !myBoolean = !myString.Boolean() if (!myBoolean) then …………… PML 2 Methods Method on User-Defined Object Types Example: define object MAN member .Age is REAL endobject define method .Man() !this.Age = 42 endmethod define method .Answer() is REAL return !this.Age endmethod define method .Answer(!value is REAL) !this.Age = !value endmethod PML 2 Methods These methods might be used in the following way: The method .Man() was called automatically !number = !manObj.Answer() !number is set to value 42 !manObj = object MAN() !manObj.Answer(40) !number = !man.Answer() !number now is set to value 40 Note: When creating new object type, or change an existing definition, it must be loaded by using the command; pml reload object [NAME OF OBJECT] PML 2 Method Overloading Two or more methods on an object may share the same name providing they have different arguments will invoke the method with the arguments which match the method call PML To use a method with the same name as a member and one argument of the same type to set the member’s value. !manObj.Answer(65) To use a method of the same name as a member returning a value of the same type but with no arguments to get the member’s value. !num = !manObj.Answer() PML 2 Methods Constructor Methods with Arguments Example Object: define object MAN member .num is REAL endobject define method .Man(!value is REAL) !this.num = !value + 5 endmethod Main function: !manObj = object MAN(40) !value = !manObj.num !value now is 45 PML 2 Methods Invoking a Method from Another Method Example: define object MAN member .num is REAL endobject define method .Man(!value is REAL) !this.num = !value + !this.addFive() endmethod define method .addFive() is REAL return 5 endmethod Main function: !manObj = object MAN(40) !value = !manObj.num !value now is 45 Invoking a method from another method can be attained using !This.Methodname() PML 2 Method Concatenation Any number of methods can be combined providing the passed data is valid at each stage !line = ’how are you’ !newline = !line.UpCase().Split().Sort() q var !newline Output: <ARRAY> [1] <STRING> ’ARE’ [2] <STRING> ’HOW’ [3] <STRING> ’YOU’ Deleting PML 2 Variables A variable that exists can be explicitly made UNDEFINED with the Delete() method Example: !!x.Delete() !y.Delete() UNSET Values and UNDEFINED Variables UNSET indicates that a variable does not have a value if (Unset(!x)) then …… if (Set(!x)) then …… Using Method: if (!x.Unset()) then …… if (!x.Set()) then …… UNDEFINED variable is one that does not exist if (Undefined(!x)) then …… if (Defined(!x)) then …… Exercises Exercise 5: Create a function that will check if a word is a palindrome. A palindrome is a word, phrase, number or other sequence of units that can be read the same way in either direction (the adjustment of punctuation and spaces between words is generally permitted). Punctuation, capitalization, and spacing are usually ignored. Examples: ’level’ ’rotator’ ’civic’ ’radar’ ’Step on no pets’ ’Dammit, ’I’m mad!’ ’Go hand a salami I’m a lasagna hog.’ Use STRING methods in implementing. (Using ARRAY methods is not acceptable.) Function details: !!isStringPalindrome(!word is STRING) is BOOLEAN Exercises Exercise 6: Create an Object that will calculate the product, quotient, sum, and difference of two specified values. Object name: object CALC() Sample Usage: !num1 = 15 !num2 = 3 !calculate = object CALC(!num1, !num2) !prod = !calculate.product() !quot = !calculate.quotient() !sum = !calculate.sum() !diff = !calculate.difference() Default values if values not specified are 4, 2 respectively. Exercises Exercise 7: Create an Object that will count the number of vowels and consonants in a specified string. Object name: object COUNTVC Sample Usage: !str !cObj !numvowels !numconso = = = = ’Remember the one I told you?’ object COUNTVC(!str) !cObj.countVowels() !cObj.countConsonants() Exercise 7 Solution An Object that has a count vowels and count consonants method. define object COUNTVC member .text member .vowels member .consonants member .textlen endobject is is is is STRING STRING STRING REAL -- Constructor method define method .countvc(!str is STRING) !this.text = !str.Lowcase() !this.textlen = !str.Length() !this.vowels = ’aeiou’ !this.consonants = ’bcdfghjklmnpqrstvwxyz’ endmethod -- countVowels() Method define method .countVowels() is REAL return !this.count(!this.vowels) endmethod Solution Continuation… -- countConsonants() Method define method .countConsonants() is REAL return !this.count(!this.consonants) endmethod -- Method to do the counting process either counting the vowels or the consonants define method .count(!reference is STRING) is REAL !cntr = 0 do !itr1 from 1 to !this.textlen do !itr2 from 1 to !reference.Length() if (!this.text.Substring(!itr1, 1) eq !reference.Substring(!itr2, 1)) then !cntr = !cntr + 1 break endif enddo enddo return !cntr endmethod Arrays A variable that can contain many values, each of which is called an array element Example: !arr[1] = ’ROMEL’ !arr[12] = 50 An empty ARRAY: !arr = ARRAY() Arrays of Arrays (Multi-dimensional Arrays) An ARRAY may itself be an ARRAY Example: !forname = 1 !employee[1][!forname] = ’Romel’ !employee[1][2] = ’Daguplo’ !fullname = !employee[1][!forname] & ’ ’ & !employee[1][2] Assigning an entire array to an array element: Example: !tempname[1] = ’Romel’ !tempname[2] = ’Daguplo’ !employee[3] = !tempname !fullname = !employee[3][1] & ’ ’ & !employee[3][2] Array Methods Vantage Plant Design Software Customization Reference Manual contains a list of all PML Methods Are built-in functions for performing a variety of operations on the array Example: !myArray[1] !myArray[2] !myArray[3] !myArray[4] = = = = ’romel’ 3 ’gadz’ ’gadz’ !nelements = !myArray.Size() !felements = !myArray.Find(’gadz’) !myArray.Clear() Using VAR Command for Arrays Example: Sorting an ARRAY in alphabetical order: !myArray[1] !myArray[2] !myArray[3] !myArray[4] = = = = ’abcdefg’ 1 ’efg’ ’bcd’ var !result SORT !myArray CIASCII !result is now equal to: !result[1] = ’2’ !result[2] = ’1’ !result[3] = ’4’ !result[4] = ’3’ DO VALUES and DO INDICES with Arrays With do values, the counter takes the value of each array element in return Example: !myArray[1] = ’romel’ !myArray[8] = 3 !myArray[15] = ’gadz’ do !result values !myArray $P Array element is $!result enddo Output: Array element is romel Array element is 3 Array element is gadz DO VALUES and DO INDICES with Arrays With do indices, the counter takes the value of each array subscript at which an array element is stored Example: !myArray[1] = ’romel’ !myArray[8] = 3 !myArray[15] = ’gadz’ do !n indices !myArray !stored = !myArray[!n] $P Array element $!n is $!stored enddo Output: Array element 1 is romel Array element 8 is 3 Array element 15 is gadz Exercises Exercise 8: Create a recursive function that will search all specified string value in an array element with any size. Return value is the count value. Don’t use .Find() method. Function name: !!searchValueRecursive() Sample Usage: !search !arr[1] !arr[2][1] !arr[2][2] !arr[2][2][1] !arr[2][2][2] = = = = = = ’5’ ’xx’ ’5’ ’10’ ’yz’ ’5’ Upon calling the function, result should be equal to 3 Exercises Exercise 9: Create an Object similar to the built-in ARRAY object with the following limited methods only: FindFirst(), First(), Last(), Indices() and an additional method FindLast() Object name: object RAWARRAY Don’t use the built-in methods. PML Macros Are command sequences that are stored in text files May include synonyms and user-defined variables May also act on data which you define when you give the command to run the macro – parameterised macros A Macro file can be given any name, .mac is often used but it is optional To run a macro, enter: $M filename Where filename is the pathname of the macro file May optionally be preceded by a slash (/) character PML Macros Example: A macro that will create a box in file box.mac. NEW BOX /MyBox LEVE 2 10 XLEN 150 YLEN 150 ZLEN 150 Using PML variables: !name = ’/MyBox’ !dim = 150 NEW BOX $!name LEVE 2 10 XLEN $!dim YLEN $!dim ZLEN $!dim PML Macros Macros with Arguments Escape code for macro arguments: $n Where n is an integer in the range 1 to 9 Example: If a macro named rod.mac includes the ff. line; NEW BOX XLEN $1 YLEN $2 ZLEN $3 then the macro call will be, $M/rod.mac 3500 100 200 Will run the macro and will set the lengths defined as $1, $2, $3 to 3500, 100, 200. PML Macros Macros with Arguments For arguments in text, note that a space will be interpreted as separator Example: argument.mac has the ff. line; $P first argument is $1 $P second argument is $2 $P third argument is $3 and is called by a command, $M argument.mac $<my life$> ella romel or using a another separator $, and $., $M argument.mac $,my life$,ella$,gadz$. then the output will be, $P first argument is my life $P second argument is ella $P third argument is romel Exercises Exercise 10: Create a parameterised macro that will automatically create the object shown below: Macro file: varobject.mac The “var” specifies that the dimension is a variable and consider as an argument of the macro. Accessing PDMS DB Elements as Objects !!CE – a special global variable provided by PDMS Refers to current element Its object type is DBREF !bore = !!ce.bore !owner = !!ce.owner !rating = !!ce.cref.pspec.rating To view all pseudo-attributes of !!CE q var !!ce Assigning Values to PDMS Element Attributes Ensure that the type of new value matches the type of attribute Example: !!ce.built = TRUE !a = !!ce !a.desparam[1] = 250 !posce = !!ce.position !posce.up = 2000 !!ce.position = !posce Accessing Information About a PDMS Session A number of special commands have been provided to set a PML Variable with the information about the current PDMS session Current Session Sessions Projects Teams Users MDBs DBs etc… Example: !sess = current session !mdbcurrent = !sess.mdb() !users = !sess.user() Collections Creating an array which includes all elements which satisfy a selection criteria Example: var !arr1 collect all elbo With expression: !qitem = ’all elbo’ var !arr1 collect all elbo for CE var !arr2 collect $!qitem with(name eq ’/ELBO1’) Assigning Values to a Variable with PDMS Commands Examples: var !owner OWNER OF CE var !spco COLLECT ALL SPCO var !pick IDP@ Copies and References Assignment Assignment always makes a copy of the right-hand-side to replace what is on the left-hand-side !a = !b Form and Gadget References !!Form and !!Form.Gadget are both PML references !a = !!Form.Gadget !a.Val = ’new value’ !!Form.Gadget.Val = ’new value’ !a is now a new reference, but the gadget itself has not been copied both have the same effect and will assign a new value to the original gadget !!CE is a DB reference and is a PML reference DB References !a = !!CE !a is now a new reference to the same DB element, but the element itself has not been copied Errors and Error Handling An error arising during the processing of a PML macro or function does not immediately give rise to an error message – these depends on the next line of input To handle an error, the matching handle and endhandle block should be put on the next line in which the error occurs upon processing Example: $* a command causes error(46,28) here handle (46,27) $* not processed this time elsehandle (46,28) $* The commands on this block is processed elsehandle ANY $* an ANY handle block is processed for any error elsehandle NONE $* a NONE handle block is processed only if $ there were no errors endhandle Errors and Error Handling Responses to an Error Output the detail of the error message: $P $!!Error.Text $P $!!Error.Command $P $!!Error.Line do !line values !!Error.Callstack $P $!Line enddo To abandon a running PML macro or function: return error Re-instate the error but suppress the alert: return error noalert Generate a new error (or replace a user-defined error) plus an optional message: return error 1 return error 1 ’Your error message’ return error 1 noalert To handle this, a special form of handle command is used: handle 1 … endhandle Handling Files and Directories Creating a File Object Example: !MyFile = object File (’C:\mydir\list.txt’) !MyDir = object File (’C:\mydir’) With Methods: !access = !MyFile.AccessMode() !files = !MyDir.Files() Handling Files and Directories Example Code: This example reads pairs of number from file C:\data.txt, adds them together and writes the answers in file C:\result.txt !Input = object File (’C:\data.txt’) !Input.Open(’READ’) !Output = object File (’C:\result.txt’) !Output.Open(’WRITE’) do !Line = !Input.ReadRecord() if (!Line.Set()) then !arr = !Line.Split() !Total = !arr[1].Real() + !arr[2].Real() !Output.WriteRecord(!Total.String()) else break endif enddo !Output.Close() !Input.Close() Handling Files and Directories Reading from Files When reading a file one line at a time using the ReadRecord() method you must open the file first with the Open(‘READ’) method and close it afterwards with the Close() method Writing to Files Open(‘WRITE’) method for files that don’t exist yet or Open(‘OVERWRITE’) if overwriting an existing one, use WriteRecord() method to write to data to the file and close it also with the Close() method Use Handling Files and Directories Reading and Writing ARRAYS Example: !Input = object File (’C:\data.txt’) !Output = object File (’C:\result.txt’) !Lines = !Input.ReadFile() !ResultArray = ARRAY() do !Line values !Lines !arr = !Line.Split() !Total = !arr[1].Real() + !arr[2].Real() !ResultArray.Append(!Total.String()) enddo !Output.WriteFile(’WRITE’, !ResultArray) The Alpha Log and PML Tracing One way of tracing PML: Type Alpha log /C:\trace.txt OVERWRITE $R102 Run in the following in sequence: any macro (example: showing any form in the GUI) The tracing code is shown in the alpha window On this state, the output is recorded in the specified file above C:\trace.txt When it is done, type in the following: $R0 Alpha log end Querying Values of PML Variables Queries: Q var !LocalName – value of a specific local variable Q var LOCAL – values of all local variables Q var !!GlobalName – value of a specific global variable Q var GLOBAL – values of all global variables Q var !MyArray[1] – value of a specific element of an array Q var !MyArray – values of all elements of an array Q var !MyArray.Size() – number of elements currently in an array Exercises Exercise 11: Create a function that will query all TEE in DESIGN with run size bore, branch size bore, and hierarchy being specified. Handle invalid hierarchy input. Returns an array of names. Function usage: !tees = !!queryTee(50, 25, ’/SITE’) Exercise 12: Create an object that will query the available component types and descriptions in a specified piping spec. Sample usage: !spec = object SPEC(’/1P1’) !types = !spec.Types !desc = !spec.Descriptions !types value: ARRAY [1] [2] [3] [4] [5] [n] = = = = = = ’TEE’ ’PCOM’ ’FLAN’ ’ATTA’ ’FBLI’ … !desc value: ARRAY [1] [2] [3] [4] [5] [n] = = = = = = ’Tee’ ’Piping Component’ ’Flange’ ’Attachment Point’ ’Blind Flange’ … Getting noun definition of type: var !def nounDef ATTA rptx Exercises Exercise 13: Create a PICK function that will automatically create a report file based on an option file. Handle invalid data specified. Example, file.opt contains the ff. lines: TEE: P1BORE # P2BORE # P3BORE # ORI # ANG ELBO: P1BORE # ANG # LSTUBE ATTA: ATTYPE # STEXT # LSTUBE Upon picking an element with type found in file.opt, it will automatically generate a report with data specified in the option file (i.e. P1BORE, ORI, etc.). Output report file name: pick-<TYPE>.rpt Report delimiter is based on the option file. Function name: Syntax for picking: !!pickAndGenerate() var !pick PICK That’s all folks! DISCLAIMER: This guide is for information purpose only. It is recommended that users following this guide have undergone training first. You may use this manual at your own risk. In no event shall the writer be liable for any direct, indirect, incidental, exemplary or consequential damages. All examples in this guide are tested in PDMS 11.6 SP3 and SP5. Author: Romel E. Daguplo Email: romeldhagz@gmail.com