PML Basics

November 29, 2017 | Author: Valeriu Constantinuc | Category: Computer Programming, Transport, Road Transport, Computing And Information Technology, Engineering
Share Embed Donate


Short Description

G...

Description

PML Basics The AVEVA Programmable Macro Language

Author: Romel E. Daguplo Email: [email protected]

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: [1] ’ARE’ [2] ’HOW’ [3] ’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 $ 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-.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: [email protected]

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF