ࡱ>  @ 8bjbjFF ,,m 4 ...h.0| PAxG0H0H0H0HHx[ a#%%%%%%$RFI c0H0HccI 0H0H^mmmc> 0H 0H#mc#mmOq [s 0HA .i@/ssGt0EsVi<,gs  gs ccmcccccII dn$m n PlantSuite RDBMS to PI Interface via ODBC Driver for Windows NT (Intel, ALPHA) Version 2.16 How to Contact Us Phone(510) 297-5800 (main number) (510) 297-5828 (technical support)Fax(510) 357-8136Internet HYPERLINK mailto:techsupport@osisoft.com techsupport@osisoft.comWorld Wide Web HYPERLINK http://www.osisoft.com http://www.osisoft.comBulletin Board(510) 895-9423 Telebit WorldBlazer modem (Hayes, MNP, or PEP compatible) 8 data bits, 1 stop bit, no parity, up to 14400 bps download protocols: Xmodem, Ymodem, Zmodem, KermitMailOSI Software, Inc. P.O. Box 727 San Leandro, CA 94577-0427 USA OSI Software GmbH Hauptstra(e 30 D-63674 Altenstadt 1 Deutschland OSI Software, Ltd P. O. Box 8256 Level One, 6-8 Nugent Street Auckland 3, New ZealandUnpublished -- rights reserved under the copyright laws of the United States. RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 Trademark statementPI is a registered trademark of OSI Software, Inc. Microsoft Windows, Microsoft Windows for Workgroups, and Microsoft NT are registered trademarks of Microsoft Corporation. Solaris is a registered trademark of Sun Microsystems. HPUX is a registered trademark of Hewlett Packard Corp.. IBM AIX RS/6000 is a registered trademark of the IBM Corporation. DUX, DEC VAX and DEC Alpha are registered trademarks of the Digital Equipment Corporation.  FILENAME \* MERGEFORMAT PSrdbms_2.16.doc ( 2001 OSI Software, Inc. All rights reserved 777 Davis Street, Suite 250, San Leandro, CA 94577 Table of Contents  TOC \o "1-4" Introduction  PAGEREF _Toc453142370 \h 5 Functionality  PAGEREF _Toc453142371 \h 7 Input of Data from a Relational Database into PI  PAGEREF _Toc453142372 \h 8 Input Query strategies  PAGEREF _Toc453142373 \h 8 Output of Data from PI into a Relational Database  PAGEREF _Toc453142374 \h 12 SQL Statements  PAGEREF _Toc453142375 \h 14 Language Requirements  PAGEREF _Toc453142376 \h 14 SQL Placeholders  PAGEREF _Toc453142377 \h 15 Mapping of Placeholder Data Types to SQL Data Types  PAGEREF _Toc453142378 \h 18 Timestamp Format  PAGEREF _Toc453142379 \h 19 Inputs to PI via the SELECT Clause  PAGEREF _Toc453142380 \h 20 Data acquisition strategies  PAGEREF _Toc453142381 \h 23 SQL SELECT Command for Retrieving Data for Single PI Tag  PAGEREF _Toc453142382 \h 23 SQL SELECT Command for Retrieving Data for Tag Groups  PAGEREF _Toc453142383 \h 24 SQL SELECT Command for Tag Distribution via Tagname Key  PAGEREF _Toc453142384 \h 26 Event based Input  PAGEREF _Toc453142385 \h 29 Multistatement SQL Clause  PAGEREF _Toc453142386 \h 29 Stored Procedures  PAGEREF _Toc453142387 \h 30 Outputs from PI via Update and Insert Clause  PAGEREF _Toc453142388 \h 31 Data Output for DIGITAL Points  PAGEREF _Toc453142389 \h 32 Data Output for INTEGER Points  PAGEREF _Toc453142390 \h 33 Data Output for REAL and String Points  PAGEREF _Toc453142391 \h 34 Global Variables  PAGEREF _Toc453142392 \h 34 Data Mapping between PI and RDBMS  PAGEREF _Toc453142393 \h 36 Mapping of SELECT Data Types to PI Point Types Data Input  PAGEREF _Toc453142394 \h 36 Evaluation of STATUS Field for All PI Data Types - Input from RDBMS  PAGEREF _Toc453142395 \h 38 Storage of PI POINT Database Changes  PAGEREF _Toc453142396 \h 40 PI Batch Database Output  PAGEREF _Toc453142397 \h 44 Database specifics  PAGEREF _Toc453142398 \h 45 Oracle 7.0  PAGEREF _Toc453142399 \h 45 Oracle RDB  PAGEREF _Toc453142400 \h 45 Oracle 8.0  PAGEREF _Toc453142401 \h 46 dBase III, dBase IV  PAGEREF _Toc453142402 \h 46 MS Access  PAGEREF _Toc453142403 \h 46 MS SQL Server 6.5  PAGEREF _Toc453142404 \h 47 MS SQL Server 7.0  PAGEREF _Toc453142405 \h 47 PI Point Configuration  PAGEREF _Toc453142406 \h 48 Performance Point  PAGEREF _Toc453142407 \h 53 IO Rate Tags  PAGEREF _Toc453142408 \h 54 Interface Files  PAGEREF _Toc453142409 \h 56 Installation  PAGEREF _Toc453142410 \h Error! Bookmark not defined. Updating the Interface  PAGEREF _Toc453142411 \h 59 Startup  PAGEREF _Toc453142412 \h 60 Command line switches for the RDBMS to PI interface  PAGEREF _Toc453142413 \h 60 Detailed explanation for command line parameters  PAGEREF _Toc453142414 \h 61 Startup as console application  PAGEREF _Toc453142415 \h 66 Startup as Windows NT Service  PAGEREF _Toc453142416 \h 66 PILOGIN.INI  PAGEREF _Toc453142417 \h 67 Shutdown  PAGEREF _Toc453142418 \h 69 Error and information messages  PAGEREF _Toc453142419 \h 70 Hints for PI System Manager  PAGEREF _Toc453142420 \h 71 Interface Test Environment  PAGEREF _Toc453142421 \h 73 More Examples  PAGEREF _Toc453142422 \h 76 Insert or Update  PAGEREF _Toc453142423 \h 76 Limitations and future enhancements  PAGEREF _Toc453142424 \h 77  Introduction The Interface allows bi-directional transfer of data between the PI System and any relational database that supports ODBC (Open Database Connectivity) drivers. The interface runs under Windows NT Server or Workstation, Intel or ALPHA Platform. This machine runs either a PI3 Server Node or the PI-API Node and can connect to any PI Node in the network. The PI Interface makes internal use of the PI-API-NT in order to keep a standard way of interfacing from a client node to the PI Server Node. This version of the Interface only supports one ODBC connection per running copy (but it is possible to use multiple instances of this connection). SQL statements are generated by the end user in form of ASCII files or are defined in the Extended Descriptor of a PI Tag. SQL statements can serve as a source of data for one or more PI Tags defined in the PI database. The Interface generates exception reports for all associated tags. The following Relational Databases were explicitly tested with the interface: Oracle RDB, Oracle, MS SQL Server, DB2, MS Access, dBase For RDBMS version details refer to the section  REF bkmkTestEnv \* MERGEFORMAT Interface Test Environment  Databases and ODBC drivers not yet tested with our interface may require additional onsite testing which will translate to additional charges. Please refer to the section entitled  REF bkmkTestEnv \* MERGEFORMAT Interface Test Environment  for a list of databases and ODBC drivers that the interface is known to work with. Even if your database and/or ODBC driver is not shown, the interface still may work. However, if you experience problems, the interface will need to be enhanced to support your environment. Please contact your OSI sales representative. Supported FeaturesOrder CodePI-IN-OS-RELDB-NT PI-IN-OS-RELDB-NAInterface Platforms supportedWindows NT 4 or higher (Intel, ALPHA)Vendor Software RequiredYesVendor Software minimum requirementsODBC 3.x Driver Manager Level 1 ODBC API MINIMUM GrammarSign up for UpdatesYesException Reporting YesPI API Node Support YesUNIINTNoInputScan based, Event TriggerOutputs Event basedText TransferYesConfiguration DataOutputMultiple LinksYesFailoverNoHistory RecoveryYesNumber of PointsUnlimited Functionality The Interface runs on Windows NT operation system as a Console Application or as Service. It uses the standard PI-API-NT to connect to the PI Server node. The Interface Computer must have the related ODBC driver installed and configured to be able to connect to the specified database. A DSN (Data Source Name) must be configured via the ODBC Administrator. The DSN name is passed in the startup arguments of the Interface. In case of ODBC connection failure the Interface will try to reconnect to the RDBMS (see specific note in the Management section). SQL queries are provided by the user in form of either ASCII files, which are read after startup of the Interface into the memory, or as definition in the Extended Descriptor of a tag. SQL statements are executed according to the scan class type (cyclic or event driven). When data is read from a relational database, the Interface will try to convert the result set of the query into a value, status or timestamp appropriate for the related PI Tag. The opposite direction - writing data out of the PI system works accordingly. In the current version the Interface we support the following general features: Support of Timestamp, Value, Status and String fields in RDBMS Tables Support of string tags Query data (read) for single tag, one value per scan, with or without timestamp from RDBMS Query data (read) for single tag, time series per scan Query data (read) for multiple tags (Tag Group), one value per tag per scan, with or without timestamp from RDBMS Query data (read) for multiple tags (Tag Group), time series per tag per scan Query data (read) via Tagname Key (Tag Distribution), time series per tag per scan Scan or Event based SELECT queries Event based UPDATE DELETE and INSERT queries Support of multiple statements per query Support of stored procedures Support of runtime placeholders Timestamp (Scan Time, Snapshot Time,...), Value, Status Support of all classic point attribute placeholders (except userint and userreal) Support of placeholders for Value, Status, Timestamp of foreign Tag (Tag outside interface point source) Support of batch placeholders Storage of point attribute (type classic) changes in RDBMS Recovery options for output points Support of Interface running in a different Timezone/DST setting than PI Server Input of Data from a Relational Database into PI The SQL statement can be considered as a source of both, timestamp and value for the PI Point. Each SQL statement retrieves data from RDBMS and the Interface sends the results into the PI database - to the particular point. There can be multiple statements in one query as well as there are different strategies used for transforming the result set. The Interface can also define a group of tags, which share one SQL statement and the result set of the query will be distributed to all tags in a group (see chapter  REF bkmkTagGroup \h  \* MERGEFORMAT SQL SELECT Command for Retrieving Data for Tag Groups). It reduces the number of the ODBC calls and thereby increases performance. Input Query strategies Query for single tag one value per scan There are DCS systems that can keep current values in a relational table. Via scan based queries it is possible to emulate the same behavior like a scan based DCS interface. An example is getting data from an ABB IMS station (Oracle). The disadvantages for this kind of data retrieval are low performance and accuracy limited to scan frequency. Example 1.1 query single tag: SQL Statement (file PI_REAL1.SQL)SELECT PI_TIMESTAMP,PI_VALUE,PI_STATUS FROM PI_REAL1 WHERE PI_KEY_VALUE = ?;Relevant PI Point AttributesExtended DescriptorLocation1Location2Location3Location4Location5P1=Key_123410010InstrumenttagPointtypePI_REAL1.SQLFloat32RDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUSPI_KEY_VALUEDatetime (MS SQL Server) Date/Time (MS Access)Real (MS SQL Server) Number-Single Precision (MS Access)Smallint (MS SQL Server) Number-Whole Number (MS Access)Varchar(50) (MS SQL Server) Text(50) (MS Access) Query for single tag multiple values per scan A good strategy for high data throughput is to have low scanning rates (e.g. 1 minute) instead of doing one query every second. This assumes that we are not scanning updated records (values that went into the RDBMS via UPDATE statements and that do overwrite the current value). Instead we assume that we can query the RDBMS for a time period (e.g. 1 minute) and expect that new data (stored by INSERT statement) appear there. In other words getting the same amount of data in one call is faster than getting it in many calls. A typical high throughput query is given below. In this example we get all data since snapshot time. Example 1.2 query data array for single tag: SQL Statement (file PI_STRING1.SQL)SELECT PI_TIMESTAMP,PI_VALUE,0 FROM PI_STRING1 WHERE PI_TIMESTAMP > ?;Relevant PI Point AttributesExtended DescriptorLocation1Location2Location3Location4Location5P1=TS11010InstrumenttagPointtypePI_STRING1.SQLStringRDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUSDatetime (MS SQL Server) Date/Time (MS Access)Varchar(1000) (MS SQL Server) Text(255) (MS Access)Smallint (MS SQL Server) Number-Whole Number (MS Access) A typical low throughput query is: SELECT TIMESTAMP, VALUE, STATUS FROM DATA WHERE NAME= ?; P1=AT.TAG, Location2=0 Here we get only the current value. The interface works very similar to an online DCS interface. Note: SQL syntax and parameter description is given later in this manual. Query data in Tag Groups Another way of improving performance compared to single value read is grouping tags together. This might be possible if the data is somehow related, e.g. when transferring LAB data and all data come from the same sample and have the same timestamp or if the RDBMS table is structured in the way that multiple values are stored for the same record (table has multiple value fields). Querying Tag Groups can also be combined with getting complete time series per scan. The limitation is in the fact that a timestamp field must be present and that only one timestamp is available per data record. The particular group is formed by tags, using the same Instrumenttag point attribute. Example 1.3 three points used are of PI data type Int32: SQL Statement (file PI_INT_GROUP1.SQL)SELECT PI_TIMESTAMP, PI_VALUE1, PI_STATUS1 ,PI_VALUE2,PI_STATUS2, PI_VALUE3,0 FROM PI_INT_GROUP1 WHERE PI_TIMESTAMP > ?;Relevant PI Point AttributesExtended DescriptorLocation1 All pointsLocation2 All pointsLocation3 Location4 All pointsLocation5 All pointsP1=TS11Target point1 2 Target point2 4 Target point3 610InstrumenttagPointtypePI_INT_ GROUP1.SQLInt32 RDBMS Table DesignPI_TIMESTAMPPI_VALUEnPI_STATUSnDatetime (MS SQL Server) Date/Time (MS Access)Smallint (MS SQL Server) Number-Whole Number (MS Access)Smallint (MS SQL Server) Number-Whole Number (MS Access) Tag Distribution Compared to Tag Groups where grouping happens in form of columns, Tag Distribution means multiple records per query while each record can contain data for a different tag. To achieve this, a field must be provided in the query which contains the tagname or the alias tagname. This option is very efficient for getting exception-based data from an RDBMS table where it is unknown how many data will arrive per single tag. We only know that there will typically be an average number of data records per scan. Only one distributor point carries the SQL statement. This point does not receive any actual data, instead the number of rows successfully delivered to according PI tags get stored in the distributor tag. The target points are selected either according to Tagname (value retrieved in PI_NAME column should match the Tagname of the point) or according to /ALIAS=Some_key definition found in the Extended Descriptor of the particular point. Example 1.4 query database for tags, matching a wildcard: SQL Statement (file PI_REAL_DISTR1.SQL)SELECT PI_TIMESTAMP, PI_NAME, PI_VALUE, PI_STATUS FROM PI_REAL_DISTR1 WHERE PI_NAME LIKE Key_% ;Relevant PI Point AttributesExtended Descriptor DistributorLocation1 All pointsLocation2 All pointsLocation3Location4 All pointsLocation5 All pointsP1=TS 10Distributor -1 Target points 010Instrumenttag DistributorPointtype All pointsPI_REAL_ DISTR1.SQLFloat32 RDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUSPI_NAMEDatetime (MS SQL Server) Date/Time (MS Access)Real (MS SQL Server) Number-Single Prec.(MS Access)Varchar(12) (MS SQL Server) Text(12) (MS Access)Varchar(80) (MS SQL Server) Text(80) (MS Access) Output of Data from PI into a Relational Database Moving data from PI to a relational database is accomplished similar to input. The relational database can receive timestamp, value and status of a PI point as well as all actual values of attributes addressable by placeholders (see chapter  REF bkmkPlaceholders \h  \* MERGEFORMAT SQL Placeholders ). For copying new data to the relational database, usage of standard event based output points are supported. In this case the source tag should be provided as a source of actual data and the output point itself gets the copy of the exported data to verify output operation. If the output operation reports a failure (ODBC SQLExecute() fails), the output point gets a status of Bad Output. Note: Besides Batch Database Output, all output tags are event based output. If scan based output is required, an equation tag can provide frequent events. Another alternative is to use a stored procedure and use a scan based input tag. Example 2.1 insert 2 different sinusoid values into table: SQL Statement (file PI_SIN_VALUES_OUT.SQL)INSERT INTO PI_SIN_VALUES_OUT (PI_NAME1, PI_TIMESTAMP1, PI_VALUE1, PI_STATUS1, PI_NAME2,PI_VALUE2,PI_STATUS2) VALUES (?,?,?,?,?,?,?);Relevant PI Point AttributesExtended DescriptorLocation1 Location2Location3Location4Location5/EXD=path\ pi_sin_values_out.plh Content of the above stated file: P1=AT.TAG P2=TS P3=VL P4=SS_I P5='SINUSOIDU'/AT.TAG P6='SINUSOIDU'/VL P7='SINUSOIDU'/SS_I10000InstrumenttagPointtype All pointsSourcetagPI_SIN_VALUES_ OUT.SQLFloat16SINUSOIDRDBMS Table DesignPI_TIMESTAMPnPI_VALUEnPI_STATUSnPI_NAMEnDatetime (MS SQL Server) Date/Time (MS Access)Real (MS SQL Server) Number-Single Precision (MS Access)Smallint (MS SQL Server) Number Whole Number (MS Access)Varchar(80) (MS SQL Server) Text(80) (MS Access) SQL Statements SQL statements can be generated out of ASCII files, placed in the directory specified by /SQL=path keyword found in the start-up file. Names of these files are arbitrary (the recommended form is filename.SQL). The name of an associated ASCII file for a particular point is stated in the Instrumenttag attribute. When the Instrumenttag field is blank, the Interface will look for the SQL statement definition in the Extended Descriptor denoted by the keyword /SQL = valid SQL statement;. Each file can contain a sequence of SQL commands separated by the ; separator and all these particular statements will be examined consecutively. Here is an example of such a definition: /SQL=SELECT PI_TIMESTAMP,PI_VALUE,0 FROM TABLE1 WHERE PI_TIMESTAMP>? P1=ST Note: The entire statement definition text has to be double-quoted ( ). Note: The Extended Descriptor attribute is limited to 80 characters. Therefore only short statements can be given by this method. Language Requirements The level of conformance of the used ODBC API is checked while the Interface starts-up. The Interface requires the ODBC driver to be least of Level 1 API conformance and used SQL statements should be of the MINIMUM Grammar conformance. The information of the conformance levels (both API and Grammar) are written into the log-file. If the API conformance of some ODBC driver is less then Level 1, the Interface stops. The Interface supports the following Data Manipulation Language commands that can be used in SQL queries: SELECT [ALL,DISTINCT] select-list FROM table-reference-list [WHERE search-condition] [order-by-clause] INSERT INTO table-name [(column-identifier[,column-identifier]...)] VALUES (insert-value[,insert-value]...) UPDATE table-name SET column-identifier ={expression} [,column-identifier ={expression}]...[WHERE search-condition] DELETE FROM table-name [WHERE search-condition] The check-up of SQL statements against a relational database is expected to be done by the user. If the syntax of some SQL statement is not proper, the Interface writes down an error message and the tag (and each related tag e.g. tags which share the same SQL command) is excluded from the interface list. The Interface allows testing of a particular tag against the relational database, having the /TEST=Tagname keyword in the start-up file (See chapter  REF _Ref438394023 \h  \* MERGEFORMAT Detailed explanation for command line parameters ). Note: It is highly recommended to test a new query for the interface with MS Query first. The query produced by MS Query can mostly directly be stored in the query file, required by the interface. Current versions of MS Query also support placeholders (?), so that even complex queries can graphically be produced and tested before used in the RDBMS interface. SQL Placeholders The concept of placeholders allows passing runtime values, timestamps of various formats and other configurable parameters (point attributes defined in PIPONT database) into the SQL statement on places marked by ?. Question marks are only allowed on places in the SQL statement where they are syntactically correct e.g. in the search condition part of the SQL SELECT command, in the argument list of stored procedures, e.t.c. Placeholders are defined in the tags Extended Descriptor and should be separated by spaces. The assignment of runtime values (retrieved from the PI system) to the SQL statement is done according to the position of the placeholder. That means that the first definition of a runtime placeholder refers to the first question mark found in the SQL statement. If more space (more than 80 characters) is required for placeholder definition, a new keyword /EXD=filename was introduced. This construct allows extending the Extended Descriptor with the contents of the specified file. The list and syntax of placeholder definitions is as follows: Placeholder Keywords for Extended DescriptorMeaning / Substitution in SQL queryRemarkSnapshot placeholdersPn=TSTimestamp taken from the PI Snapshot (detailed description see chapter  REF _Ref438396779 \h  \* MERGEFORMAT Timestamp Format ) Pn=LSTTimestamp, Last Scan-Time (Scan Time = start time of this scan class)Pn=STInput: Timestamp = Start of a new scan for all members of this scan class Output: Timestamp = Time of the output eventPn=LETTimestamp, Last Execution Time, Execution Time = exact time when query finished This time is different to LST depending on how much time passed between start of scan for the class and execution of this particular tag. Since queries can be very time consuming, this time difference should not be underestimated.Pn=VLCurrent valuePn=SS_ICurrent status in the form of integer representationPn=SS_CCurrent status in the form of digital code stringMax. 12 charactersPn=tagname/VLCurrent value of the tag tagname Pn=tagname/SS_I Pn=tagname/SS_CCurrent status of the tag tagname Max. 12 charactersPn=tagname/TSTimestamp taken from the PI Snapshot of the tag tagnamePI point database placeholdersPn=AT.TAGTag name of the current tagMax. 80 charactersPn=AT.DESCRIPTORDescriptor of the current tagMax. 26 charactersPn=AT.EXDESCExtended Descriptor of the current tagMax. 80 charactersPn=AT.ENGUNITSEngineering units for the current tagMax. 12 charactersPn=AT.ZEROZero of the current tagPn=AT.SPANSpan of the current tagPn=AT.TYPICALVALUETypical value of the current tagPn=AT.DIGSTARTCODEDigital start code of the current tagPn=AT.DIGNUMBERNumber of digital states of the current tagPn=AT.POINTTYPEPoint type of the current tagMax. 1 characterPn=AT.POINTSOURCEPoint source of the current tagMax. 1 characterPn=AT.LOCATION1Location1 of the current tagPn=AT.LOCATION2Location2 of the current tagPn=AT.LOCATION3Location3 of the current tagPn=AT.LOCATION4Location4 of the current tagPn=AT.LOCATION5Location5 of the current tagPn=AT.SQUAREROOTSquare root of the current tagPn=AT.SCANScan flag of the current tagPn=AT.EXCDEVException deviation of the current tagPn=AT.EXCMINException minimum time of the current tagPn=AT.EXCMAXException maximum time of the current tagPn=AT.ARCHIVINGArchiving flag of the current tagPn=AT.COMPRESSINGCompression flag of the current tagPn=AT.FILTERCODEFilter code of the current tagPn=AT.RESResolution code of the current tagPn=AT.COMPDEVCompression deviation of the current tagPn=AT.COMPMINCompression minimum time of the current tagPn=AT.COMPMAXCompression maximum of the current tagPn=AT.TOTALCODETotal code of the current tagPn=AT.CONVERSConversion factor of the current tagPn=AT.CREATIONDATECreation date of the current tagPn=AT.CHANGEDATEChange date of the current tagPn=AT.CREATORCreator of the current tagMax. 12 charactersPn=AT.CHANGERChanger of the current tagMax. 12 charactersPn=AT.RECORDTYPERecord type of the current tagPn=AT.POINTNUMBERPoint ID of the current tagPn=AT.DISPLAYDIGITSDisplay digits after decimal point of the current tagPn=AT.SOURCETAGSource tag of the current tagMax. 80 charactersPn=AT.INSTRUMENTTAGInstrument tag of the current tagMax.32 charactersPI point change placeholdersPn=AT.ATTRIBUTEChanged attributeMax. 32 charactersPn=AT.NEWVALUENew value Max. 80 charactersPn=AT.OLDVALUEOld valueMax. 80 charactersPI batch database placeholdersPn=BA.UNITBatch unitMax. 80 charactersPn=BA.BAIDBatch identificationMax. 80 charactersPn=BA.PRIDBatch product identificationMax. 80 charactersPn=BA.STARTBatch start timePn=BA.ENDBatch end timeMiscellaneousPn=any stringDouble quoted string (can contain spaces)No limit Note: Pn denotes Placeholder number (n) and will be used as P1 P2 P3 Example for Extended Descriptor referring to an SQL statement using 3 placeholders: P1=TS P2=SS_I P3=AT.TAG If the same placeholder definition is used multiple times in a query, it is possible to shorten the definition string, using a back reference. Example: P1=TS P2=VL P3=P1 Note: Placeholders like SS_I or SS_C can also be used in SELECT statements, e.g. to serve as index. One should know that for tags of type real or integer containing valid data (value is not in error and therefore is not a digital state), SS_C would use the Digital State at position 0 of the System Digital State Table. See chapter  REF _Ref438177675 \h  \* MERGEFORMAT Evaluation of STATUS Field for All PI Data Types - Input from RDBMS. The default value for PI3 at position 0 is ?????????? Mapping of Placeholder Data Types to SQL Data Types Placeholders also represent values, which get stored into database fields. Those fields must be of certain data types. In order to assist database administrators in setting-up correct tables, here is a list of how the interface maps Placeholders to SQL data types. When testing against different databases and ODBC drivers, we found that it is helpful to automatically support more than one data-type. For example integer fields in dBase appear as data type SQL_DOUBLE while most of the databases use SQL_INTEGER. Placeholder and PI Data TypeSQL Data TypeSnapshot placeholdersVL for real tagsSQL_REAL If error ( SQL_FLOATVL for integer tagsSQL_INTEGER If error ( SQL_FLOATVL for digital tagsSQL_VARCHARVL for string tagsSQL_VARCHARSS_I for all PI data types pointsSQL_INTEGER If error ( SQL_FLOATSS_C for all PI data types pointsSQL_VARCHARTS,ST,LET,LST for all PI data type pointsSQL_TIMESTAMPPI point database placeholdersAT.TAG, AT.DESCRIPTOR, AT.EXDESC, AT.ENGUNITS, AT.POINTTYPE , AT.POINTSOURCE, AT.CREATOR , AT.CHANGER, AT.SOURCETAG, AT.INSTRUMENTTAG, AT.ATTRIBUTE, AT.NEWVALUE, AT.OLDVALUE, any_stringSQL_VARCHARAT_DIGSTARTCODE, AT_DIGNUMBER, AT_LOCATION1, AT_LOCATION2, AT_LOCATION3, AT_LOCATION4, AT_LOCATION5, AT_SQUAREROOT, AT_SCAN, AT_EXCMIN, AT_EXCMAX, AT_ARCHIVING, AT_COMPRESSING, AT_FILTERCODE, AT_RES, AT_COMPMIN, AT_COMPMAX, AT_TOTALCODE, AT_RECORDTYPE, AT_POINTNUMBER, AT_DISPLAYDIGITS, SQL_INTEGER If error ( SQL_FLOAT If error ( SQL_DOUBLEAT_TYPICALVALUE, AT_ZERO, AT_SPAN, AT_EXCDEV, AT_COMPDEV, AT_CONVERSSQL_REAL If error ( SQL_FLOATPI batch database placeholdersBA.UNIT BA.BAID, BA_PRIDSQL_VARCHARBA.START, BA.ENDSQL_TIMESTAMP If the ODBC driver used supports Level 2 Conformance (actually the ODBC driver must support SQLDescribeParam(), which is a Level 2 function), the interface can query the ODBC driver for the SQL Data Type. In this case a wider range of conversions can be supported. Timestamp Format The time format used in various databases is not the same. ODBC drivers do the corresponding data type transformation and so the only mandatory rule is to use the appropriate timestamp format in the particular relational database. Note: The interface expects the full timestamp (date+time) to be read from the relational database. The interface offers these time references to populate placeholders: KeywordTime usedInput:TSTimestamp from PI Snapshot of a particular point. (Due to the Exception Reporting mechanism in the interface it does not always correspond to the visible PI Snapshot) E.g. SELECT WHERE PI_TIMESTAMP > ?; P1=TS : this allows scanning the relational database only for newly arrived values (rows) independent of the scan frequency.LSTLast Scan-Time Scan Time is the time a Scan Class starts a new scanning period This can be used to limit the amount of data. Events are skipped if older timestamped data arrive in a RDBMS table.STTime before query executions. A good example is to transfer future data from RDBMS. Only data before ST can be transferred to PI.LETTime when the previous query was finished (Last-Execution-Time)Output:TSTimestamp from current PI Snapshot of source tagSTAt interface startup - ST=Snapshot Time From that time on - ST=event time When interacting with a relational database, some SQL commands (SELECT) may take a while when executing and some data transfer to PI can therefore be delayed. When the scan class is scheduled for a particular time and the real start time is delayed for more than 2 seconds (e.g. because of some long SQL operation preceded) the whole scan is skipped and an error message is written into the log-file. The Interface offers scheduled time (ST) which is used when a relational database does not have the timestamp available and the program should join some appropriate time to send to PI. Last execution (LET) and last scheduled time (LST) would allow new data to be moved since the last scan. On Interface start-up both timestamps are preset with PI Snapshot Time. Note: On interface startup LST and LET are preset with PI Snapshot timestamps. Note: For Input Tags, TS will be taken from the internal Interface snapshot. This is not the same as the PI Snapshot since Exception Reporting runs on the interface side. If for example the value is stable for a long time, the PI Snapshot will not be updated with scanned data as long no exception occurs. Not using the PI Server Snapshot timestamp but the Interface internal snapshot timestamp will avoid querying for the same data (from unchanged PI Server snapshot timestamp) multiple times as it would be for queries of type SELECT WHERE Timestamp > ? and P1=TS. Note: All PI related timestamps are synchronized to the PI Server time. Inputs to PI via the SELECT Clause For passing values in direction to PI, it is necessary to have a SELECT statement defined. Data obtained by ODBC API calls are distributed to the relevant PI points according to the specified distribution strategy (see chapter  REF bkmkStrategy \h  \* MERGEFORMAT Data acquisition strategies ). The SELECT statement can return NULL values for any column. The interface uses the following algorithm to handle this: If timestamp is NULL, the scheduled time (ST) is used instead. If status is NULL and the returned value is not NULL then the value is valid. When both value and status are NULL the No Data digital state is used to convey the information that the expected value is absent. The Interface accepts integer and string data types for digital tags and status values. When an integer is provided the interpretation is given by the PI-API: If negative, this is an absolute state value. If zero or positive, this is an offset into the defined range of digital states. Example 3.1 query integer data for Digital PI tag: SQL Statement (file PI_DIGITAL1.SQL)SELECT PI_TIMESTAMP,PI_VALUE_INT,PI_STATUS_INT FROM PI_DIGITAL1 WHERE PI_KEY_VALUE = ?;Relevant PI Point AttributesExtended DescriptorLocation1Location2Location3Location4Location5P1=Key_123410010InstrumenttagPointtypePI_DIGITAL1.SQLDigitalRDBMS Table DesignPI_TIMESTAMPPI_VALUE_INTPI_STATUS_INTPI_KEY_VALUEDatetime (MS SQL Server) Date/Time (MS Access)Smallint (MS SQL Server) Number-Whole Number (MS Access)Smallint (MS SQL Server) Number-Whole Number (MS Access)Varchar(50) (MS SQL Server) Text(50) (MS Access) If the value, that should be interpreted as status or value for a digital tag, is retrieved in the string form, the interface checks the Digital State Table and performs the substitution. Example 3.2 query string data for Digital PI tag: SQL Statement (file PI_DIGITAL2.SQL)SELECT PI_TIMESTAMP,PI_VALUE_STR,PI_STATUS_STR FROM PI_DIGITAL1 WHERE PI_KEY_VALUE = ?;Relevant PI Point AttributesExtended DescriptorLocation1Location2Location3Location4Location5P1=Key_123410011InstrumenttagPointtypePI_DIGITAL2.SQLDigitalRDBMS Table DesignPI_TIMESTAMPPI_VALUE_STRPI_STATUS_STRPI_KEY_VALUEDatetime (MS SQL Server) Date/Time (MS Access)Varchar (12) (MS SQL Server) Text(12) (MS Access)Varchar (12) (MS SQL Server) Text(12) (MS Access)Varchar(50) (MS SQL Server) Text(50) (MS Access) The SELECT statement usually returns a set of data records, which fulfil the desired search condition. When the relational database also provides a timestamp, then it is possible to setup a query like this: SELECT TIMESTAMP, VALUE, STATUS FROM TABLE WHERE TIMESTAMP > ?; P1=LST Normally we put all returned records into PI. Sometimes however, it is desirable to get only the first record from the result set and write it into PI. The distinction is made by the Location2 parameter. Location2Bulk option0Only the first record is valid1The interface tries to put all the returned data into PI Note: It is important to provide records with timestamps sorted in ascending order. Only in this case the PI System can support Exception Reporting and Compression. Use SELECT ORDER BY TIMESTAMP; if necessary. An example for Location2=0 might be to request the maximum or minimum of a list of values with timestamps between 2 scan periods. The way to achieve this (in addition to Location2=0) is sorting the SELECT(ed) data in descending or ascending order. Data acquisition strategies To interpret records obtained by SELECT statement in a flexible way, we have defined different data acquisition strategies. The strategy can be selected by Location3 parameter of the PI tag. Location3Data acquisition strategy0SQL query populates a Single PI Tag> 0Selects Tag Group mode Location3 points to the column number of a multiple field query where the selected column contains data for this tag-1Selects Tag Distribution mode The SQL statement must return a key to denote the particular point SQL SELECT Command for Retrieving Data for Single PI Tag Option 1: Fixed Positions of Fields in a SELECT Statement To get values from a relational database, which will be stored in one PI point, the following field sequence must be kept: SELECT [Timestamp,] Value, Status FROM... If provided, the Interface always expects the Timestamp field to be in the first position followed by the Value and Status columns. The Interface detects a Timestamp field by checking the field data type against SQL_TIMESTAMP. If a database does not support timestamps, (e.g. dBase IV, there are ways to convert other field types in the query. See also chapter  REF _Ref438394620 \h  \* MERGEFORMAT Database specifics. Valid combinations of Timestamp, Value and Status in a SELECT statement are: SELECT Timestamp, Value, Status FROM... SELECT Value, Status FROM... Note: The Interface expects the Status column to be provided in form of a constant (zero) in the SELECT list when the database does not have any notion of the status code. (SQL allows using such a constant that is then interpreted as the PI status code). E.g. SELECT Value, 0 FROM Note: The above stated rule applies to all PI data types. Option 2: Arbitrary Positions of Fields in a SELECT Statement - Aliases If the used ODBC driver supports aliases, e.g. if we can use the SELECT statement in the form: SELCT SAMPLE_TIME AS PI_TIMESTAMP, SAMPLE_VALUE AS PI_VALUE there are keywords defined to re-name the fields used in the RDBMS: PI_TIMESTAMP, PI_TAGNAME, PI_VALUE, PI_STATUS. The Interface recognizes and assigns the fields appropriately. In this case there is no need to have fixed positions of column names in the SELECT statement. Note: In debug mode, the Interface prints out the alias support information to the log file (if the ODBC driver supports aliases or not). (Debug level 1 ( /deb=1) Note: It is sufficient to use the alias fieldnames directly. E.g. SELECT PI_VALUE, PI_STATUS FROM to become independent of the field order. Example 3.3 field name keywords for single tag: SQL Statement (file PI_STRING2.SQL)SELECT VALIDITY AS PI_STATUS, SCAN_TIME AS PI_TIMESTAMP, DESCRIPTION AS PI_VALUE FROM PI_STRING2 WHERE KEY_VALUE = ?;Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5P1=Key_123410010InstrumenttagPointtypePI_STRING2.SQLStringRDBMS Table DesignSCAN_TIMEDESCRIPTIONVALIDITYKEY_VALUEDatetime (MS SQL Server) Date/Time (MS Access)Varchar(1000) (MS SQL Server) Text(255) (MS Access)Smallint (MS SQL Server) Number-Whole Number (MS Access)Varchar(50) (MS SQL Server) Text(50) (MS Access) SQL SELECT Command for Retrieving Data for Tag Groups The SELECT command can serve as a source of data for multiple PI Tags (a group of tags). The filename that is stated in the Instrumenttag attribute is considered to be an unambiguous key that forms the group. This means that each member of the group points to the same SQL query file. The tag that triggers the execution (the master tag) should have in its Extended Descriptor corresponding placeholders defined which relate to the question marks in its SQL statement. It is not required that other group member tags contain the placeholder definitions. The other criteria for building a group is to have Location3 <> 0. Note: Single PI tags can also share the same SQL file, but they are not member of a group if Location3 = 0. Option 1: Fixed Positions of Fields in a SELECT Statement All the tags in a group should be numbered according to the sequence of field names used in the SELECT command. These numbers are expected to be in Location3 parameter of each tag in the group. Furthermore, the master tag has to have the Location3 parameter set to either 1 or 2, depending on whether the optional timestamp field is available or not. When the above-described conditions are fulfilled, the result set returned after each execution is sorted into all group points. If a timestamp comes from a relational database, the time field in the SELECT statement is expected to be in the first position. The simplest example is: SELECT TIMESTAMP, VALUE1, STATUS1, VALUE2, 0, The second status value is forced to be of value zero (or possibly any constant applicable for a particular point). This is the same zero-status-rule as described in chapter  REF bkmkSingle \h  \* MERGEFORMAT SQL SELECT Command for Retrieving Data for Single PI Tag . The Location3 parameter of the group member tags is as follows: Master Tag and Group members TagInstrument tagExtended DescriptorLocation2Location3CommentMaster tagFilename.SQLP1=0 first row only 1 Bulk read1 if no timestamp field used 2 if first field is timestamp Master tag gets first value, statusGroup member(s)Filename.SQLNot evaluatedField number of value field All tags must refer to the same SQL statement Note: Those PI points, which have SQL statements defined in the Extended Descriptor (not in a file pointed to by Instrumenttag ) are expected to retrieve data only for themself, they do not have the grouping feature. Note: Since the above statement contains a timestamp field, the Location3 sequence is 2,4,6 otherwise it would be 1,3,5 Option 2: Arbitrary Positions of Fields in a SELECT Statement - Aliases A similar construction with ALIASES used in SELECT commands is applicable also in this strategy. The column names used in the RDBMS table can be re-named to the known keywords PI_TIMESTAMP, PI_TAGNAME, PI_VALUE, PI_STATUS. Because we will have more PI_VALUEs and PI_STATUSes present in the SELECT statement, these should be numbered. The regularity should be obvious from the following example. Example 3.4 field alias names: SQL Statement (file PI_STR_GR1.SQL)SELECT PI_TIMESTAMP, PI_VALUE1, PI_VALUE3,PI_VALUE4, PI_STATUS1 ,PI_STATUS3,PI_STATUS4 FROM PI_STR_GROUP1 WHERE PI_TIMESTAMP > ?; or SELECT TST AS PI_TIMESTAMP, V1 AS PI_VALUE1, V2 AS PI_VALUE3, V3 AS PI_VALUE4, S1 AS PI_STATUS1 , S2 AS PI_STATUS3, S3 AS PI_STATUS4 FROM PI_STR_GROUP1 WHERE PI_TIMESTAMP > ?;Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3 Location4Location5P1=TS11Point1 1 Point2 3 Point3 410InstrumenttagPointtypePI_STR_GR1.SQLStringRDBMS Table DesignPI_TIMESTAMPPI_VALUEnPI_STATUSnDatetime (MS SQL Server) Date/Time (MS Access)Varchar(50) (MS SQL Server) Text(50) (MS Access)Varchar(50) (MS SQL Server) Text(50) (MS Access) Numbers used in column names (PI_VALUE1,PI_STATUS1) correspond to the numbers stated in Location3. The main difference to the numbering scheme used in the fixed position strategy is that Value and Status are of the same number. The master tag (the point that actually gets executed) is still recognized by having Location3 = 1. Note: It is sufficient to use the alias fieldnames directly. E.g. SELECT PI_VALUE, PI_STATUS FROM to become independent of the field order. SQL SELECT Command for Tag Distribution via Tagname Key Option 1: Fixed Positions of Fields in a SELECT Statement The second possibility how to get data for multiple PI points out of one result set is to have one field configured as an unambiguous key (e.g. name of a point). The SELECT command should be of the following form: SELECT [Time], Tagname, Value, Status FROM Table WHERE Time > ?; P1=LST A result set will look like this: [timestamp1,]tagname1, value1, status1 ... [timestampX,]tagnameX, valueX, statusX ... Note: The corresponding sequence of columns used in the SELECT clause should be kept according to the example above. Brackets denote an optional column. The query execution is controlled by one PI point that carries the SQL command called distributor point. The distributor point and the target points should relate to the same Interface Location1, be of the same scan class Location4, and of the same PointSource, otherwise the Interface will drop the data. Distributor Point and Target Point attributes TagInstrument tagExtended DescriptorLocation2Location3Location4Distributor tagFilename.SQLP1=1 -1nTarget tagNot evaluatedNot evaluated nNot evaluatedNot evaluatedn Note: The difference between a master tag for Tag Groups and a distributor tag for Tag Distribution is that the second one is a management tag only (does not get any data from the query) while the master tag for Tag Groups is at the same time management tag and first member of the group. Note: The name of the Distributor Point should not be listed in the result set. He gets only the number of rows retrieved from the relational database. This is for administration purposes. /ALIAS ! changed behavior Since names of variables in the RDBMS might not be exactly the same as in PI we support an optional keyword /ALIAS=rdbms_tagname or /ALIAS=rdbms tagname. This allows mapping of PI points to rows retrieved from the relational database. Please note that this switch is now case sensitive. PI2 Tagname matching rules ! changed behavior PI2 tagnames are always upper case. The Interface makes case insensitive comparison in order to reduce failure rates (user error). Experience with the previos interface version (1.x) showed that this is a source for hidden errors. When using PI2 short names, they are internally evaluated in their delimited form e.g. XX:YYYYYY.ZZ Spaces will be preserved as well. E.g. 'XX:YYYY .ZZ' PI3 Tagname matching rules ! changed behavior PI3 tagnames preserve the case. The default tagname comparison is now case insensitive. If a case sensitive test is required, the /ALIAS option can be used to force a case sensitive test. Note: See Example 1.4 Option 2: Arbitrary Positions of Fields in a SELECT Statement - Aliases Using aliases in a SELECT command containing a tagname field is also possible. The SELECT AS PI_TIMESTAMPconstruction renames the column names. This allows the interface to recognize the meaning of a column via their name. Note: Do not mismatch field name aliases with the /ALIAS keyword. Example 3.5 distributor strategy and alias field names: SQL Statement (file PI_ALL_TYPES_DISTR1.SQL)SELECT NAME AS PI_TAGNAME, VALUE AS PI_VALUE , STATUS AS PI_STATUS, DATE_TIME AS PI_TIMESTAMP FROM PI_ALL_TYPES_DISTR1 WHERE NAME LIKE Key_%;Relevant PI Point AttributesExtended DescriptorLocation1 All pointsLocation2 Location3 Location4 All pointsLocation5 All pointsDistributor P1=Key_1234 Target points - /ALIAS=value retrieved in NAME column11 Target points Not evaluated-1 Target points Not evaluated10InstrumenttagPointtypePI_ALL_TYPES_DISTR1.SQLPoint1 Int32 Point2 Digital Point3 Int32 Point4 Float16 Point5 StringRDBMS Table DesignDATE_TIMENAMEVALUESTATUSDatetime (MS SQL Server) Date/Time (MS Access)Char(80) (MS SQL Server) Text(80) (MS Access)Real (MS SQL Server) Text(255) (MS Access)Real (MS SQL Server) Text(12) (MS Access) Event based Input Input points can be triggered on a time period basis as well as they can be event based (any time the PI snapshot of a trigger tag changes, an event is generated). To achieve this, the keyword /EVENT=tagname must be in the Extended Descriptor of the particular input tag. The SQL statement (usually SELECT) is executed each time the value of the event tag changes. The following example shows reading data from a relational database, triggered by sinusoid events. Example 3.6 event based input: SQL Statement (file PI_STR_EVENT1.SQL)SELECT PI_TIMESTAMP,PI_VALUE,PI_STATUS FROM PI_STRING_EVENT1;Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5/EVENT=sinusoid100Not evaluated0InstrumenttagPointtypePI_STR_ EVENT1.SQLStringRDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUSDatetime (MS SQL Server) Date/Time (MS Access)Varchar(1000) (MS SQL Server) Text(255) (MS Access)Smallint (MS SQL Server) Byte (MS Access) Note: If no timestamp field is provided in the query, retrieved data will be stored in PI using the event timestamp rather than the query execution time. A separate document called PlantSuite Lookup Utility is available that shows how this feature can be used to synchronize timestamps for use with the PlantSuite Rlink product. Multistatement SQL Clause The interface can handle execution of more than one SQL statement. Semicolons must be used to separate multiple statements. In the example below we keep the most recent value of the sinusoid point in the relational database by inserting the snapshot value and deleting the previous record. Output is event based. Example 3.7 multi statement query: SQL Statement (file PI_SIN_PER_SCAN1.SQL)INSERT INTO PI_SIN_PER_SCAN1 (PI_TIMESTAMP,PI_VALUE,PI_STATUS) VALUES (?,?,?); DELETE FROM PI_SIN_PER_SCAN1 WHERE PI_TIMESTAMP <=?;Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5P1=TS P2=VL P3=SS_I P4=LST100Not evaluated0InstrumenttagPointtypeSourcetagPI_SIN_PER_SCAN1.SQLInt16SINUSOUDRDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUSDatetime (MS SQL Server) Date/Time (MS Access)SmallInt (MS SQL Server) Number-Whole Number (MS Access)Smallint (MS SQL Server) Number Single Precision (MS Access) Stored Procedures The interface also offers the possibility of executing stored procedures. Stored procedure calls can use placeholders in their argument lists and behave the same way as standard queries do. The syntax for a procedure invocation conforms to the rules of SQL extensions defined by ODBC: {call procedure-name[([parameter][,[parameter]]...)]} Please consult the manual of your RDBMS for calling syntax. Some RDBMS do not require curly braces. A procedure can have zero or more input parameters. In this version of the interface stored procedures which return values via parameters are not supported. Stored procedures can therefore be used mainly for triggering some actions in relational databases and supply parameters for these actions. Note: Some data sources like MS SQL Server allow to define a SELECT statement inside the procedure body without having output parameters. The execution of such a procedure then returns the standard result data set. In this case the interface is able to process the returned data in the same way the output from a SELECT clause gets evaluated. See the following example. Example 3.8 stored procedure call: SQL Statement{CALL SP_1(?,?,?,?,?)};Stored procedure definitionCREATE PROCEDURE SP_1 @pi_tstmp datetime, @pi_val real, @pi_stat smallint, @Beginning_Date DateTime, @Ending_Date DateTime AS SELECT PI_TIMESTAMP,PI_VALUE,PI_STATUS FROM PI_SP_1 WHERE PI_TIMESTAMP BETWEEN @Beginning_Date AND @Ending_Date INSERT INTO PI_SP_1 ( PI_TIMESTAMP, PI_VALUE,PI_STATUS) VALUES (@pi_tstmp,@pi_val,@pi_stat)Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5P1=ST P2=G8 P3=G16 P4=LST P5=TS /SQL="{CALL SP_1(?,?,?,?,?)};"11020InstrumenttagPointtypeSourcetagFloat16RDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUSDatetime (MS SQL Server)Real (MS SQL Server)Smallint (MS SQL Server) Outputs from PI via Update and Insert Clause Output of data towards a relational database is either internally handled via exceptions generated by the source tag or we can use scan-based output. Writing data from PI to a relational database is accomplished by using INSERT, UPDATE or CALL SQL commands. The following example keeps only one record in the relational database with the latest value of the sinusoid point. Output of the example point is event based. Example 3.9 event based output: SQL Statement (file PI_SIN_PER_SCAN2.SQL)UPDATE PI_SIN_PER_SCAN2 SET PI_TIMESTAMP=?, PI_VALUE=?, PI_STATUS=?;Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5P1=sinusoid/TS P2=sinusoid/VL P3=sinusoid/SS_I100Not evaluated0InstrumenttagPointtypeSourcetagPI_SIN_PER_ SCAN2.SQLFloat16SINUSOIDRDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUSDatetime (MS SQL Server) Date/Time (MS Access)Real (MS SQL Server) Byte (MS Access)Smallint (MS SQL Server) Number Whole Number (MS Access) Note: To update a row in a relational database - some record(s) (that match the WHERE condition, if there is any) should be present in the updated table. If the table is empty, the update will return success but the table will remain empty. For alternatives, please check the INSERT_UPDATE example in section  REF bkmkMore More Examples The output point (tag that does not contain the original data) will be copied with successfully written data. If the SQL statement fails, the output tag will receive a digital state of BAD OUTPUT. This mechanism allows simple verification of output operation. Data Output for DIGITAL Points For output of PI data in direction of RDBMS, there is no fixed structure of output fields the query must supply. Instead any supported placeholder can be used for an output field. However, the placeholders VL, SS_I, SS_C apply to similar rules as value and status fields for input. Digital point output values are mapped only to strings, means the data type in the corresponding relational database for storing the value of a digital tag should be of type string. PI ValueVL Field Type StringSS_I Field Type Integer OR FloatSS_C Field Type StringDigital State not in Error Range0O.K.Digital State is in Error Range1Bad Value Note: More data type conversions are supported for ODBC drivers with Level 2 Extensions. Example 3.10 Output tag is triggered by sinusoid, but values come from x_digital2: SQL Statement (file PI_DIGITAL_OUT1.SQL)UPDATE PI_DIGITAL_OUT1 SET PI_TIMESTAMP=?, PI_VALUE=?, PI_STATUS_I=?, PI_STATUS_STR=?;Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5P1=x_digital2/TS P2=x_digital2/VL P3=x_digital2/SS_I P4=x_digital2/SS_C100Not evaluated0InstrumenttagPointtypeSourcetagPI_DIGITAL_ OUT1.SQLFloat16SINUSOIDRDBMS Table DesignPI_TIMESTAMPPI_VALUEPI_STATUS_IPI_STATUS_STRDatetime (MS SQL Server) Date/Time (MS Access)Char(12) (MS SQL Server) Text(12) (MS Access)Smallint (MS SQL Server) Number Single Precision (MS Access)Smallint (MS SQL Server) Text(12) (MS Access) Data Output for INTEGER Points Please note that the usage of Placeholder VL also depends on the PI tag data type. Since an Integer PI Tag can only contain integer data, we only support mapping of VL to Integer (exact) or Float (approximate) RDBMS type fields. PI ValueVL Field Type Integer or FloatSS_I Field Type Integer or FloatSS_C Field Type StringValue >= 00O.K.Digital State1 Note: More data type conversions are supported for ODBC drivers with Level 2 Extensions. In such cases it is for example possible to write integer values as ASCII representation into a string field. Data Output for REAL and String Points Data mapping for real tags is very similar to integer tags. Of course the preferred data type for VL is Float. PI ValueVL Field Type Float (or Integer)SS_I Field Type Integer or FloatSS_C Field Type StringValue not in error (<(int)Value>)0O.K.Digital State01 Note: More data type conversions are supported for ODBC drivers with Level 2 Extensions. In such cases it is for example possible to write float values as ASCII representation into a string field. Global Variables The Extended Descriptor has a 80-character length limitation (PI-API). One way to allow string parameters longer than 80 characters is to define global variables. A file containing definitions for all global variables is referenced as interface start-up parameter. The syntax for global variables is the same as for placeholders Pn, but starting with character G (see chapter  REF bkmkPlaceholders \h  \* MERGEFORMAT SQL Placeholders). The syntax used in global variable file is obvious from the next example: Example 3.11 Global variables (referenced by keyword /global=d:\pipc\interfaces\rdbmspi_2.0\data\global.dat; SQL Statement (file PI_SIN_VALUES_OUT2.SQL)UPDATE PI_SIN_VALUES_OUT2 SET NAME1_TS=?,NAME2_TS=?,DSC3=?,NAME1=?,NAME1_DSC=?, NAME1_ENG_UNITS=?,DSC1=?,NAME1_VL=?,NAME1_SS_C=?, DSC4=?,DSC5=?,DSC6=?,NAME2=?,NAME2_DSC=?, NAME2_ENG_UNITS=?, DSC2=?,NAME2_VL=?,NAME2_SS_C=?;Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5/EXD=path\ pi_sin_values_out2.plh Content of the above stated file: P1=G7 P2=G13 P3=G3 P4=G4 P5=G5 P6=G6 P7=G1 P8=G8 P9=G9 P10=G1 P11=G2 P12=G3 P13=G10 P14=G11 P15=G12 P16=G2 P17=G14 P18=G1510020InstrumenttagPointtypePI_SIN_VALUES_ OUT2.SQLInt16RDBMS Table DesignDSCn NAMEn NAMEn_DSC NAMEn_ENG_UNITSNAMEn_TSNAMEn_VLNAMEn_SS_CChar(50) (MS SQL Server) Text(50) (MS Access)Datetime (MS SQL Server) Date/Time (MS Access)Real (MS SQL Server) Number Single Precision (MS Access)Char(12) (MS SQL Server) Text(12) (MS Access)Content of the global variables fileG1="Actual-Value" G2="of-the" G3="PI-point:" G4='sinusoid'/AT.TAG G5='sinusoid'/AT.DESCRIPTOR G6='sinusoid'/AT.ENGUNITS G7='sinusoid'/TS G8='sinusoid'/VL G9='sinusoid'/SS_C G10='sinusoidu'/AT.TAG G11='sinusoidu'/AT.DESCRIPTOR G12='sinusoidu'/AT.ENGUNITS G13='sinusoidu'/TS G14='sinusoidu'/VL G15='sinusoidu'/SS_CData Mapping between PI and RDBMS A single PI tag can only historize value or status, but never both together in only one tag. Therefore we need to provide a method of mapping a given value / status pair into one type of information. PI System interfaces mostly apply the rule: If the status of a value is good, store the value in the PI tag. If the status of a value is other than good, store the status in the PI tag instead. Note: Any requirement that goes beyond that needs more than one tag. In the previous chapter we have learned that we always need to select a value field and a status field in the SQL query. The following section will explain how these two fields provide data for the PI tag. Mapping of SELECT Data Types to PI Point Types Data Input Four types of input fields after a SELECT keyword can be validated for this interface: Timestamp, Tagname, Value and Status fields. To be able to evaluate those fields, the interface makes some considerations for their data types. The following table shows what combinations between PI point types and field data types are working. Tags that do not match those criteria are rejected by the interface. This does not mean that those tags cannot be serviced. It only means that additional explicit conversion might be required. Input field SQL Data TypePI Point TypeTimestampSQL_TIMESTAMPAll PI point typesTagnameSQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHARAll PI point typesReal (R) Integer(I)Digital(D)String(S)ValueApproximate (floating points) data types SQL_NUMERIC, SQL_DECIMAL, SQL_REAL , SQL_FLOAT, SQL_DOUBLECasted to the particular floating-point type.Casted to long integer Casted to integer and interpreted as pointer to Digital SetConverted from floating-point to string.Exact (integer) data types SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT, SQL_BITCasted to the particular floating-point type.Casted to the particular integer typeInterpreted as pointer to Digital SetConverted from integer to string.Character data types SQL_CHAR, SQL_VARCHAR , SQL_LONGVARCHARConverted from string to double. The double number is after that casted to particular floating-point PI type.Converted from string to long integer and casted to integer PI data type.Checked against Digital Set.Retrieved number of bytes copied.StatusSee chapter:  REF _Ref438362272 \h  \* MERGEFORMAT Evaluation of STATUS Field for All PI Data Types - Input from RDBMS Note: The full conversion of all possible data types supported in relational world to PI data types goes beyond the ability of this Interface. To allow additional conversions, use the convert function described below. Explicit data type conversion is specified in terms of SQL data type definitions. The ODBC syntax for the explicit data type conversion function does not restrict conversions. The validity of specific conversions of one data type to another data type will be determined by each driver-specific implementation. The driver will, as it translates the ODBC syntax into the native syntax, reject those conversions that, although legal in the ODBC syntax, are not supported by the data source. In this case, the error message will be forwarded to the interface log file and, of course, the tag will be rejected. The format of the CONVERT function is: CONVERT(value_exp, data_type) The function returns the value specified by value_exp converted to the specified data_type, where data_type is one of the valid SQL data types. Example: { fn CONVERT( { fn CURDATE() }, SQL_CHAR) } converts the output of the CURDATE scalar function to a character string. Because ODBC does not mandate a data type for return values from scalar functions as the functions are often data sourcespecific, applications should use the CONVERT scalar function whenever possible to force data type conversion. Note: More information about the CONVERT function can be gained from the ODBC.HLP file which comes with Microsoft ODBC Data Manager. Evaluation of STATUS Field for All PI Data Types - Input from RDBMS In this version of the Interface presence of a status field is mandatory. Status field can be provided either in numeric or string format. For a numeric field, we only test against zero. For a string field evaluation is more complex and in order to verify this status we have to define 2 areas in the digital state table, one for successful states, another one for error or bad value states. The status areas in the digital state table are referenced via /succ1, /succ2, /bad1, /bad2 interface start-up parameters. Note: In the following table the term used in the column SQL Data Type of Status Field denotes these SQL data types: String SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR Numeric SQL_NUMERIC, SQL_DECIMAL, SQL_REAL , SQL_FLOAT, SQL_DOUBLE, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT, SQL_BIT The Table shows mapping of the status into a PI point: SQL Data Type of Status FieldSuccessBadNot FoundResult for TagString String is between /succ1 and /succ2Go and evaluate Value FieldString is between /bad1 and /bad2 (the one which was found)String was not foundBad InputNumeric > 0Bad Input< 0 (from SYSTEM Digital State table)0Go and evaluate Value FieldStringNULL (Status Field contains NULL)Go and evaluate Value FieldNumericNULLGo and evaluate Value Field Note: Searches in success and bad areas are case insensitive! Storage of PI POINT Database Changes The Interface can keep track of changes made in the PI Point Database. The concept is similar to regular output point handling. The difference is that the managing (output) point is not triggered by a change of PI snapshot data but by point attribute modification. Two methods of recording are available. Short Form The first one offers the following attributes to be stored in the relational database: TagName, AttributeName, ChangeDateTime, Changer, NewValue, OldValue. The following placeholders are at hand: AT.TAG, AT.ATTRIBUTE, AT.CHANGEDATE, AT.CHANGER, AT.NEWVALUE, AT.OLDVALUE to form appropriate INSERT statement. Long Form The second method allows any combination of point database placeholders (AT.___ see chapter  REF bkmkPlaceholders \h  \* MERGEFORMAT SQL Placeholders ). The difference is that the first method inserts a new record into the RDBMS table for any attribute changed and that the second method is supposed to use a complex INSERT query that stores all needed information in one record. Both methods require a managing point that carries the SQL statement (INSERT) and the definition of placeholders. The following examples show how these managing points have to be set. Example 5.1 Short Form: SQL Statement (file PIPT_CHG_RED.SQL)INSERT INTO PI_PT_CHG_REDUCED_FORM ( PI_CHANGEDATE, PI_TAG, PI_ATTRIBUTE, PI_CHANGER, PI_NEWVALUE,PI_OLDVALUE)VALUES (?,?,?,?,?,?);Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5/EXD=path\ pipt_chg_red.plh Content of the above stated file: P1=AT.CHANGEDATE P2=AT.TAG P3=AT.ATTRIBUTE P4=AT.CHANGER P5=AT.NEWVALUE P6=AT.OLDVALUE100-1 This is relevant and says that it is going to be the managing point for method one recording0InstrumenttagPointtypePIPT_CHG_RED.SQLInt32RDBMS Table DesignPI_TAGPI_ATTRIBUTEPI_CHANGEDATEPI_CHANGERVarchar(80) (MS SQL Server) Text(80) (MS Access)Varchar(32) (MS SQL Server) Text(32) (MS Access)Datetime (MS SQL Server) Date/Time (MS Access)Varchar(12) (MS SQL Server) Text(12) (MS Access)PI_NEWVALUEPI_OLDVALUEVarchar(80) (MS SQL Server) Text(80) (MS Access)Varchar(80) (MS SQL Server) Text(80) (MS Access) Example 5.2 Long Form: SQL Statement (file PIPT_CHG_FULL.SQL)INSERT INTO PIPT_FULLCHANGE (CREATIONDATE, CHANGEDATE, TAG, DESCRIPTOR, EXDESC, ENGUNITS, TYPICALVALUE, ZERO, SPAN, DIGSTARTCODE, DIGNUMBER, POINTTYPE, POINTSOURCE, LOCATION1, LOCATION2, LOCATION3, LOCATION4, LOCATION5, SQUAREROOT, SCAN, EXCDEV, EXCMIN, EXCMAX, ARCHIVING, COMPRESSING, FILTERCODE, RES, COMPDEV, COMPMIN, COMPMAX, TOTALCODE, CONVERS, CREATOR, CHANGER, RECORDTYPE, POINTNUMBER, POINTID, DISPLAYDIGITS, SOURCETAG, INSTRUMENTTAG) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);Relevant PI Point AttributesExtended DescriptorLocation1 Location2 Location3Location4Location5/EXD=path\ pipt_chg_full.plh Content of the above stated file: P1=AT.CREATIONDATE P2=AT.CHANGEDATE P3=AT.TAG P4=AT.DESCRIPTOR P5=AT.EXDESC P6=AT.ENGUNITS P7=AT.TYPICALVALUE P8=AT.ZERO P9=AT.SPAN P10=AT.DIGSTARTCODE P11=AT.DIGNUMBER P12=AT.POINTTYPE P13=AT.POINTSOURCE P14=AT.LOCATION1 P15=AT.LOCATION2 P16=AT.LOCATION3 P17=AT.LOCATION4 P18=AT.LOCATION5 P19=AT.SQUAREROOT P20=AT.SCAN P21=AT.EXCDEV P22=AT.EXCMIN P23=AT.EXCMAX P24=AT.ARCHIVING P25=AT.COMPRESSING P26=AT.FILTERCODE P27=AT.RES P28=AT.COMPDEV P29=AT.COMPMAX P30=AT.COMPMIN P31=AT.TOTALCODE P32=AT.CONVERS P33=AT.CREATOR P34=AT.CHANGER P35=AT.RECORDTYPE P36=AT.POINTNUMBER P37=AT.DISPLAYDIGITS P38=AT.SOURCETAG P39=AT.INSTRUMENTTAG 100-2 This is relevant and says that it is going to be the managing point for method two recording0InstrumenttagPointtypePIPT_CHG_FULL.SQLInt32RDBMS Table DesignPI_TAG PI_DESCRIPTOR PI_EXDESC PI_POINTTYPE PI_POINTSOURCE PI_SOURCETAG PI_INSTRUMENTTAG PI_ENGUNITS PI_CREATOR PI_CHANGER PI_CREATIONDATE PI_CHANGEDATEPI_ZERO PI_SPAN PI_TYPICALVALUE PI_EXCDEV PI_COMPDEVPI_DIGSTARTCODEPI_DIGNUMBER PI_LOCATION1-5 PI_SQAREROOT PI_SCAN PI_ARCHIVING PI_COMPRESSING PI_FILTERCODE PI_RES PI_COMPMIN PI_COMPMAX PI_TOTALCODE PI_CONVERS PI_SCAN PI_SQAREROOT PI_RECORDTYPE PI_POINTNUMBER PI_DISPLAYDIGITSVarchar(80) (MS SQL Server) Text(80) (MS Access)Datetime (MS SQL Server) Date/Time (MS Access)Real (MS SQL Server) Single Precision (MS Access)Varchar(12) (MS SQL Server) Text(12) (MS Access) PI Batch Database Output The Interface keeps track of PI Batch database new events and stores this data in the relational database. The managing point that carries the SQL statement (INSERT) is recognized by the presence of any of the PI batch database placeholders (see chapter  REF bkmkPlaceholders \h  \* MERGEFORMAT SQL Placeholders). The PI Batch database is scanned on a time basis (managing point should be input point) and newly arrived data is inserted into the relational database. The managing point itself gets the number of new batches exported since last scan. Example 6.0 Batch Export: SQL Statement (file PI_BATCH1.SQL)INSERT INTO PI_BATCH1 (PI_BATCH_START,PI_BATCH_END, PI_BATCH_UNIT, PI_BATCH_ID, PI_BATCH_PRODUCT_ID) VALUES (?,?,?,?,?);Relevant PI Point AttributesExtended DescriptorLocation1Location2Location3Location4Location5P1=BA.START P2=BA.END P3=BA.UNIT P4=BA.BAID P5=BA.PRID10010InstrumenttagPointtypePI_BATCH1.SQLFloat32RDBMS Table DesignPI_BATCH_UNIT PI_BATCH_ID PI_BATCH_PRODUCT_IDPI_BATCH_START PI_BATCH_ENDVarchar(80) (MS SQL Server) Text(80) (MS Access)Datetime (MS SQL Server) Date/Time (MS Access) Database specifics Although ODBC is a standard, there are implementation differences of ODBC drivers compared to each other. Also the databases which are behind ODBC have differences in functionality, supported data-types, limits, SQL syntax and so on. The following section will describe some of the differences, which are important for this Interface, but this list is by far not complete. However, many of the ODBC driver specifics are handled automatically via the Interface itself. Oracle 7.0 Statement Limitation We have found that there is a limitation in the number of statements, which can be open at the same time. Although it is possible to increase this limit via the keyword OPEN_CURSORS configured in the file INIT.ORA, we could not get more than 100 statements to work. INIT.ORA is located at the server side of the ORACLE database. Since this Interface normally uses one SQL statement per tag, not more than 100 tags per Interface process can be serviced. Exceptions are grouping and multiple statements per tag. The only way we found to support more than 100 tags was to use Tag Groups or Tag Distribution. ODBC drivers used: Oracle72 1.13.0500 Visegenic 32-bit Oracle driver 2.00.0000 We did not see this problem in higher versions of ORACLE. Oracle RDB TOP 10 If it is required to limit the number of returned rows, e.g. in order to reduce CPU load, there is a possibility to formulate the SQL query accordingly. Unfortunately this option is database specific. RDB allows the following statement which returns up to 10 records: SELECT * FROM test LIMIT TO 10 ROWS; In the form SELECT * FROM test LIMIT TO 10 ROWS WHERE timestamp > ?; And having P1=TS, this query allows smooth history recovery when the Interface was down for a longer time. Note: Number 10 is of course only an example value. Oracle 8.0 TOP 10 Similar to the example for RDB (see above), the statement to select a maximum of 10 records looks as follows: SELECT * FROM test WHERE ROWNUM=10; dBase III, dBase IV Timestamps dBase does not support the datatype TIMESTAMP. There is a workaround to at least output data with timestamps. The target field for the timestamps must be of type TEXT(20). The Interface and the ODBC driver will automatically convert the Placeholder from type SQL_TIMESTAMP into SQL_VARCHAR. The other way around is not that simple. Actually it is not possible to read a timestamp from a TEXT field because the required ODBC function CONVERT does not support SQL_VARCHAR into SQL_TIMESTAMP. However a workaround is possible: Use the dBase database as linked table from within MS Access. Now we can use the MS Access ODBC driver which unfortunately also does not support CONVERT from SQL_VARCHAR into SQL_TIMESTAMP. But there is a function available called CDATE. The input query looks like below and works for timestamps in dBase TEXT fields of the format DD-MMM-YY hh:mm:ss : SELECT cdate(CTIMESTAMP), RVALUE, ISTATUS FROM RECEIVE WHERE cdate(CTIMESTAMP) > ?; ODBC drivers used: Microsoft dBase Driver 3.50.360200 Microsoft Access Driver 3.50.360200 Login dBase works without Username and Password. In order to get access from the Interface a dummy username and password must be used in the startup line. /user_odbc=dummy /pass_odbc=dummy Multi-User Access The Microsoft dBase ODBC driver seems to lock the dBase table. That means no other application can access the table at the same time. We did not look for workarounds, other than the MS Access linked table. MS Access Login MS Access can also be configured not to use (by default) Username and Password. In order to get access from the Interface a dummy username and password must be used in the startup line. /user_odbc=dummy /pass_odbc=dummy TOP 10 Similar to the example for RDB (see above), the statement to select a maximum of 10 records looks as follows: SELECT TOP 10 * FROM test; MS SQL Server 6.5 TIMESTAMP There are 2 data types for timestamps available in SQL Server, TIMESTAMP and DATETIME. For this Interface only DATETIME works in combination with Placeholders of type SQL_TIMESTAMP. MS SQL Server 7.0 TOP 10 Similar to the example for RDB (see above), the statement to select a maximum of 10 records looks as follows: SELECT TOP 10 * FROM test; CA Ingres II Software Development Kit The ODBC driver which comes with the Ingres II Software Development Kit does not work for this interface. This is due to the fact that the ODBC driver expects the statements being re-prepared before getting executed while the same ODBC driver reports SQL_CB_CLOSE when checking SQL_CURSOR_COMMIT_BEHAVIOR. That means that the ODBC driver is inconsistant with the ODBC specification (a bug?). Other ODBC drivers for Ingres II may still work. Informix RDBMS : Informix; Version : 07.31.0000; Intersolv ODBC Driver Version : 02.12.0000 SQLExecute [S][S1104]: [INTERSOLV][ODBC Informix driver]Timestamp parameters with zero scale must have a precision of 13, 16, or 19. Parameter number: 2, precision: 0. The ODBC driver has special requirements for Timestamp fields. Also this ODBC driver does not support SQLDescribeParam, so we do not get information about the field properties. The problem seems to be in the design of the ODBC driver and the interface will not work. Other ODBC drivers for Informix may still work. However, at this time the RDBMSPI interface was not tested with Informix from OSI Software. PI Point Configuration A PI point corresponds to a single parameter in the interfaced system. For example, a counter, a set point, a process variable, and the high and low control limits would each serve as a separate point in the PI System database. Each of these points must be defined and configured individually using the PIDIFF or PICONFIG utilities. For more information regarding point configuration, see the Data Archive (DA) section of the PI System Manuals. The following point attributes are relevant to configure tags used with the RDBMS to PI Interface. Point Name The point name is free, according to the normal PI point naming conventions. Because the interface is PI-API based, the tagname length should not exceed 80 characters. Extended Descriptor The Extended Descriptor is mainly used to define placeholders (See chapter  REF bkmkPlaceholders \h  \* MERGEFORMAT SQL Placeholders ). Possible keywords used in the Extended Descriptor are described in the following table: KeywordExampleRemark/ALIAS/ALIAS=Level321_in or /ALIAS=Tag123 Alias (support white spaces) Used when DISTRIBUTOR strategy takes place. This allows having different point names in RDBMS and in PI./EXD/EXD=D:\PIPC\DATA\PLACEHOLDER1.DEFAllows getting over the 80-character limit of the Extended Descriptor. (Suitable for tags with more placeholders.)/SQL/SQL=SELECT PI_VALUE,PI_STATUS FROM PI_TABLE WHERE PI_TIMESTAMP >?; P1=TSSuitable for shorter SQL statements. Allows the on-line statement changes (sign-up-for-updates). The actual statement should be double-quoted and the ending semicolon is mandatory./EVENT/EVENT=sinusoid or /EVENT=ProcessorTime 1 Used for event driven input points. Each time the particular (in our case sinusoid) point changes, the actual point is processed. Note: Each keyword has to be in uppercase. Point Source All points defined in the PI Point Database for use with this interface must share a common point source. That means that the interface is able to write retrieved data from a relational database only to tags of this point source. The point source is a single character, for example R (Relational Database). The point source must be defined in the point source library before point configuration (PI 2.x only). Note: See in addition Location1 parameter! Point Type The Interface supports the following PI point types: Point TypeHow It Is UsedDigitalUsed for points whose value can only be one of several discrete states. These states are predefined in a particular state set (PI 3.x).Int1615-bit unsigned integers (0-32767)Int3232-bit signed integers (-2147450880 2147483647)Float16Scaled floating-point values. The accuracy is one part in 32767Float32Single-precision floating-point values.Float64Double-precision floating point values. StringStores string data of up to 1000 characters.BlobBinary large object stores any type of binary data up to 1000 bytes. Scan flag This is usually ON for all points of this interface. If you edit this Point Attribute to OFF, then the tag is OFFLINE (no values are exchanged for this tag). In this case and if the interface is running while editing, the tag will automatically get a Shutdown event. Instrument Tag This is the filename containing the SQL statement(s). The file location is defined in a startup parameter using /SQL= directory path. The SQL file is only evaluated on startup and on tag change events. This is to avoid getting a new SQL statement but having wrong placeholders left in the tag configuration. If a SQL statement needs to be changed during interface operation, we recommend to provide a new SQL file and edit the Instrument Tag field (and may be the Extended Descriptor if required) to point to the new SQL file. The point edit will cause the Interface to re-evaluate this tag, including the new SQL statement. SourceTag This attribute is used only for output points. The Interface decides if it is an output tag when this attribute is not empty. The source tag is the PI tag from which the output gets the values for sending to the RDBMS. The interface tag will receive a copy of all data sent to the relational database. In case of an ODBC call failure the Interface tag will receive the status BAD OUTPUT. Location 1 This is the number of the Interface process that shall collect data for this tag. The interface can run multiple times and so distribute CPU power to groups of tags. E.g. it is possible to provide a number of tags with a separate process, e.g. to scan those tags with high frequency. The parameter required here should match the parameter /IN= in the startup file. Note: It is even possible to start multiple Interface processes on different PI Nodes. But then a separate Software License for the Interface is required per PI Node. Location 2 The second location parameter specifies if all rows of data returned by ODBC API calls in form of a result set should be written into the PI database or if only the first row is valid. For Tag Groups the master tag will define this option for all tags related. It is not possible to read only the first record for one tag and all records for another tag. Note: For Tagname Distribution Strategy the Interface tries to get all retrieved rows to the PI database regardless of the Location2 value. Location2Data acquisition strategy0Only the first record is valid (except the Tagname Distribution Strategy)1The interface tries to put all the returned data into PI Note: It is recommended to provide a timestamp field when trying to send all retrieved rows from RDBMS to PI. Location 3 The third location parameter specifies the Distribution Strategy - how retrieved data from the relational database should be interpreted and written into PI: Location3Data acquisition strategy0SQL query populates a single tag> 0Location3 represents the column number of a multiple field query< 0SQL statement returns the tagname  Location 4 Specifies the scan class used. The startup command procedure has parameters like /f=00:00:30 or /f=00:00:30,00:00:10 This parameter specifies cycle time for scan groups. The first /f= relates to scan group 1 etc. This parameter should be set to zero if event controlled reading is configured (see Extended Descriptor keyword /EVENT). The Interface has the facility to keep track of PI Point Database changes. There are two approaches of recording the PIPOINT changes in RDBMS. The first one (short form) requires a table in RDBMS which contains fields to store PI Tag Attribute changes. The interface then records the following information: TAG_NAME, ATTRIBUTE_NAME, CHANGE_DATE, CHANGER, OLD_VALUE and NEW_VALUE The managing tag that holds the appropriate SQL (INSERT) query must have Location4=-1 The second approach (long form) of storing PI Point Database changes is designed in a way that whenever a PI Tag is modified, the complete Tag configuration after the change is recorded. This method can make use of all possible PI Point Database related placeholders (see chapter  REF bkmkPlaceholders \h  \* MERGEFORMAT SQL Placeholders). The corresponding managing tag must have Location4=-2 Location4Kind of evaluationPositive numberIndex to the position of /f= startup parameter keyword (scan class number)0Event based output and event based input-1Specifies the managing tag for recording PIPOINT changes in the short form-2Specifies the managing tag for recording PIPOINT changes in the full form. Location 5 Decides about Exception Reporting feature. Location5Behavior0The Interface does the Exception Reporting in the standard way. For points of type int16, int32, float16, float32, float64 and digital, out of order data are supported but existing archive values cannot be replaced. For PI points of type String and Blob data transfer as follows: Exception Deviation=0 means sending each value to PI. Exception Deviation<>0 means sending only changes to PI.1For points of type int16, int32, float16, float32, float64 and digital, the Interface gives up the Exception Reporting. Each retrieved value is sent to PI (pisn_putsnapshotx()). Existing archive values are replaced (overwritten). Typical usage for Lab Data. For PI points of type String and Blob data transfer as follows: Sending only changes to PI, independent of Exception Deviation setting. Note: PI Snapshot values (current value of a tag) cannot be replaced. Note: If a string or blob tag is in status <> 0, each query result is forwarded to PI. The archive storage is then dependant on the compression settings. Exception Reporting Standard PI usage (if Location5=0), see PI System Manual I. Not used if Location5=1. Zero, Span Standard PI usage, see PI System Manual I. The Interface does not use the following tag attributes Square root code Totalization code Conversion factor Performance Point You can configure a Performance Point to monitor the data transfer rate. The performance point measurement is a number, which specifies the time (in seconds) that is required to update the scan list. The scan list is specified using the interface startup script and the point attributes Location4 and Location1. To configure a performance point, create a tag with the point source specified for the interface. The point type should be float or integer. The extended descriptor should say PERFORMANCE_POINT all in uppercase. Location4 specifies the scan class of interest. Location1 determines the instance of the interface. IO Rate Tags An IO Rate Tag can be configured to receive 10 minute averages of the total number of post-exception events that are sent to PI every minute by the interface (events/minute). The IO Rate will appear to be zero for the first 10 minutes that the interface is running. The post-exception restriction means that a new value that is received by the interface does not count toward increasing the IO Rate unless the value passes exception (i.e. ExcDev or ExcMax is exceeded). To implement an IO Rate Tag, perform the following steps: Create an IO Rate Tag. To create an IO Rate tag called sy:mod001, for example, create a file called iorates.dif similar to: iorates.dif@table pipoint @ptclas classic @stype keyword @mode create,t tag, sy:mod001 Descriptor, "TI505 Rate Tag #1" zero, 0 span, 100 TypicalValue, 50 PointType, float32 PointSource, L Compressing, 0 @ends Adjust the Zero, Span, and TypicalValue as appropriate and then type the command: C:\pi\adm\piconfig < iorates.dif to create the IO Rate Tag. Create a file called iorates.dat in the PIHOME\dat directory. The PIHOME directory is defined either by the PIPCSHARE entry or the PHOME entry in the pipc.ini file, which is located in the \Winnt directory. If both are specified, the PIPCSHARE entry takes precedence. Since the PIHOME directory is typically C:\PROGRAM FILES\PIPC, the full name of the iorates.dat file will typically be C:\Program Files\PIPC\dat\iorates.dat. Add a line in the iorates.dat file of the form: sy:mod001, x where x corresponds to the event counter specified by the /ec=x flag in the startup command file of the interface. x can be any number between 1 and 34 or between 51 and 200, inclusive. To specify additional rate counters for additional copies of the interface, create additional tags and additional entries in the iorates.dat file as appropriate. The event counter, /ec=x, should be unique for each copy of the interface. Set the /ec=x flag on the startup command file of the interface to match the event counter in the iorates.dat file. The interface must be stopped and restarted in order for the IO Rate tag to take effect. IORates will not be written to the tag until 10 minutes after the interface is started. The 10-minute rate averages (in events/minute) can be monitored, for example, on a ProcessBook trend. Interface Files The startup files for the interface reside in the PI/interfaces/RDBMSPI directory. Listed below are the files required for starting up the interface. Directory PI\interfaces\RDBMSPI RDBMSPI.BATStart interface as console applicationRDBMSPI.EXEInterfaceGLOBAL.DATExample file for globale variables  Directory PI\interfaces\RDBMSPI\EXAMPLES\ Filename.SQLExample SQL Query filesFilename.difExample piconfig fileFilename.xlsExample PI-SMT fileFilename.mdbExample DatabaseFilename.qrtSQL query to create example tableReadme_dbname.docExample Description Example of a start-up script: rdbmspi.exe /in=2 /ps=x /ec=21 /f=00:01:10,00:00:10 /f=00:10:20,00:01:00 /SQL=d:\pi\interfaces\rdbmspi\SQL /global=d:\pi\interfaces\rdbmspi\data\global.dat /host=localhost:5450 /output=d:\pi\interfaces\rdbmspi\logs\rdbmspi.out /dsn=MS_ACCESS /succ1=200 /succ2=211 /bad1=212 /bad2=220 /deb=1 /USER_PI=pi_user /USER_ODBC=odbc_user /tf=x_tf1 /tf=x_tf2 /stopstat=shutdown Time Zone and Daylight Savings Until version 2.08, the interface did not explicitly support RDBMS, PI-API Node and PI Server being in different Time Zones and/or different DST settings. Only due to the fact that Extended PI-API functions do this automatically, those parts of the interface that used Extended PI-API functions did timestamp conversions correctly while other parts did no timestamp conversion. Now, the interface was updated to use Extended PI-API functions wherever available and do additional conversion when no equivalent Extended PI-API functions is available. As a side effect, this also means that the interface will not run anymore with PI-API versions before 1.3.x! ODBC however has no standard way of telling about the Time Zone and/or DST setting of the connected RDBMS. Therefore no timestamp conversion can be applied here. The only method can be to use the same settings for the Interface node as for the RDBMS system. For various reasons many RDBMS systems are running without DST setting. A valid scenario could then be to set the Interface node also to DST off, while the PI Server and other PI Clients can use their own independent setting. The PI-API node running the interface will take care on the timestamp conversion, means finally that the PI Archive gets UTC timestamps. Note: Parameters and Fields affected by interface specific timestamp transformation are for example AT.CHANGEDATE, AT.CREATIONDATE, BA.START, BA.END. Installation Before installing the interface, PI-API 1.3.x.x must be installed (if not already present due to other PI Client Software). To install the interface, you must define a point source code and modify the PI startup and shutdown command files on that node. You can optionally specify one performance monitoring tag as shown in section "Performance Point". In the PI2 System Point Source Editor, set up the following values: Point Source Code: O Point Source Descriptor: RDBMS via ODBC Location Minimum10-100-20Location Maximum101100100 For PI3 Systems no Location Parameter Limits need to be specified.  REF bkmkStartup Startup The standard PI API installation also creates an environment for PI Client login management. Please verify that a file PILOGIN.INI exists and modify it according to your needs. See section PILOGIN.INI in chapter  REF bkmkStartup Startup REF bkmkStartup Startup for more details. REF bkmkStartup Startup Insert the installation disk For Intel based Windows NT: Run the file PSrdbms_2.16i.exe. For ALPHA based Windows NT: Run the file PSrdbms_2.16a.exe. The Interface Setup files will be extracted to a temporary directory, e.g c:\temp\disk1 Run the setup.exe file from the temporary directory. Example: c:> a:PSrdbms_2.16i.exe c:\temp\disk1\setup.exe Configure the Startup file RDBMSPI.BAT to your needs and follow instructions in the following sections. Updating the Interface from a previous version For an update of the RDBMS to PI Interface make a backup of all interface files at PIPC/interfaces/RDBMSPI directory. For example: c:> md /PIPC/interfaces/RDBMSPI/RDBMSPI_old c:> copy /PIPC/interfaces/RDBMSPI/*.* /PIPC/interfaces/RDBMSPI/ RDBMSPI _old/*.* If the interface was installed as service, also remove the service using rdbmspi remove. If not already installed, update your PI-API with version 1.3.x. The new interface version does not run with previous PI-API versions. Now insert the RDBMS to PI interface diskette in the floppy disk drive and For Intel based Windows NT: Run the file PSrdbms_2.16i.exe. For ALPHA based Windows NT: Run the file PSrdbms_2.16a.exe. The Interface Setup files will be extracted to a temporary directory, e.g c:\temp\disk1 Run the setup.exe file from the temporary directory. Example: c:> a:PSrdbms_2.16i.exe c:\temp\disk1\setup.exe Perform all configuration steps (see following sections) and use your existing configuration files from the backup. Startup Command line switches for the RDBMS to PI interface ParameterMeaning/ps=OPoint Source/in=1Interface number (Location1)/ec=21Event counter. /f=00:00:01 or /f=00:01:00,00:00:05Scan Class frequency, optional use of multiple /f=/tf=tagnameI/O rate tag per scan /stopstat or /stopstat=digstate Optional default: see rightIf the /stopstat flag is present on the startup command line, then the digital state I/O Timeout will be written to each PI Point when the interface is stopped. If /stopstat=digstate is present on the command line, then the digital state digstate will be written to each PI Point when the interface is stopped. /host= localhost:5450PI Home Node/global=c:\\global.datName and location of the global variable file/sql=c:\\datLocation of the SQL statement files/output=c:\\rdbmspi.logInterface specific log file name and location/dsn=dsn_nameData Source Name/user_pi=username(PI)Account for PI access (case sensitive evaluation)/pass_pi=password(PI)Password for PI Server access (case sensitive evaluation)/user_odbc=username(odbc)Username for RDBMS access (case sensitive evaluation)/pass_odbc=password(odbc)Password for RDBMS access (case sensitive evaluation)/test=tagnameTest mode for tag=tagname/NO_INPUT_ERRORSuppress writing I/O Timeout and Bad Input to all tags./deb=0Debug level/succ1=100Begin of range in (system) digital state table which contains successful status strings/succ2=120End of range in (system) digital state table which contains successful status strings/bad1=121Begin of range in (system) digital state table which contains Bad Input status strings/bad2=130End of range in (system) digital state table which contains Bad Input status strings/recovery=shutdownRecovery flag. Possibilities are SHUTDOWN and TS/recovery_time=*-8 hoursIn conjunction with the recovery flag determines the maximum amount of time for going back into the archive. The time syntax is in PI Time Format. (See the Data Archive Manual for more information on the time string format.)/sr=20Sign-Up-For-Updates rate in seconds./skip_time=10Maximum delay time in seconds for scan class. Default value=2 Detailed explanation for command line parameters /ps = O Specifies the point source of the tags the Interface will operate on. /in = 1 The Interface number is specified here. It corresponds to the Location 1 of a tag. /ec = 21 For additional configuration information regarding IORates, see the section entitled  REF _Ref441852290 \h  \* MERGEFORMAT IO Rate Tags. /f = HH:MM:SS,hh:mm:ss The scan frequency for different scan classes. There is no set limit on the number of scan classes . Example: You can specify 3 scan frequencies by inserting: . . . /f=00:00:03 /f=00:00:05 /f=00:00:30 which defines 3 scan classes 1, 2 and 3. The tag having the value of 1 in location 4 will belong to scan class 1, being scanned every 3 seconds. Each instance of the /f flag on the command line defines a scan class for the interface. Each scan class is, in turn, associated with a scanning frequency. The time between scans for a class is given in terms of hours (HH), minutes (MM), and seconds (SS). The scans can be scheduled to occur at a particular offset with respect to the hour in terms of hours (hh), minutes (mm), and seconds (ss). The first occurrence of the /f flag on the command line defines the first scan class of the interface, the second occurrence defines the second scan class, and so on. All PI Points that have location4 set to 1 will receive values at the frequency defined by the first scan class. Similarly, all points that have location4 set to 2 will receive values at the frequency specified by the second scan class, and so on. Two scan classes are defined in the following example: /f=00:01:00,00:00:05 /f=00:00:07 The first scan class has a scanning frequency of 1 minute with an offset of 5 seconds with respect to the minute. This means that if the interface is started at 12:03:06, the first scan will be at 12:03:10, the second scan will be at 12:03:15, and so on. The second scan class has a scanning frequency of 7 seconds. Since there is no offset given, the absolute times at which the scans are made is not defined. The definition of a scan class does not guarantee that the associated points will be scanned at the given frequency. If the interface is under a large load, some scans may occur late or be skipped entirely. If a scan is skipped, the interface will print out an error message. Note : To specify an offset of 0, use the frequency instead. E.g. /f=01:00:00,01:00:00 defines a scan at every full hour. /f=01:00:00,00:00:00 is the same as /f=01:00:00 and starts the scan without offset /deb=0 The interface is able to print additional information into the interface specific logfile, depending on the debug level used. The amount of log information increases with the debug number as follows: Debug levelOutput0Normal interface operation, Print out error messages causing data loss. Examples: connection loss, tag rejected due to wrong configuration,1Additional information about interface operation Examples: tag information, startup parameter defaults, ODBC related info2Information about errors which will be handled by the interface and will not cause data loss but points out problems examples: protocol errors which were recovered by retry function3display original data and data types (raw values received by ODBC fetch calls) per tag per scan; this helps to trace data type conversion Placeholder run-time values are logged as well.4prints out the actual values before sending to PI (values used in pisn_putsnapshotx and pisn_sendexceptions functions) per tag per scan5prints out each subroutine the program runs through; (only for onsite test purposes) /dsn=DSNname Data source name created via ODBC administrator utility, found on the Windows NT Control Panel. We do only support Machine Data-sources and preferably System Data-sources. When the Interface is installed as Service, only System Data-sources will work! For more information on how to setup a DSN, please see your 32bit ODBC Administrator Help file (Control Panel) or the documentation of your ODBC driver. /global = c:\pi\sql\globals.dat Points to the filename that contains the definition of global variables. (See chapter  REF bkmkGlobal \h  \* MERGEFORMAT Global Variables) /host = computer_name This is the hostname of the computer running the PI Server. /NO_INPUT_ERROR A valid and efficiant scenario uses the PI timestamp to limit the number of retrieved data and avoids to query for data already read. Example: SELECT time,value,0 WHERE time>?; P1=TS ? will be updated in run-time with the latest timestamp already read. Now if the interface runs into a communication problem, it writes "I/O Timeout" to all tags. The latest timestamp will be now the one of "I/O Timeout". The next query will miss all values between the last real data timestamp and the "I/O Timeout" timestamp. Solution: We introduced a new switch for the command line: /NO_INPUT_ERROR. This suppresses writing IO_TIMEOUT and BAD_INPUT on all input tags. /output = c:\pi\sql\rdbmspi.log The Interface generates output messages into the given log-file. In order to not overwrite a previous log-file after interface restart, the interface renames the previous log-file to log-file.log;n, where n is a continuous number. The System Manager is responsible to purge old log-files. /user_pi User name for the PI connection. PI Interfaces usually logs in as piadmin. This switch allows logging in as different PI user. /pass_pi The password for piadmin account (default) or for the account set by /user_pi parameter. As an alternative, you can wait for the logon prompt and enter the password when it runs in console mode. This will avoid the situation to have a password stored in a startup BAT file, readable for every user on this machine. The password has to be entered only once. On all future startups the interface will remember the password from an encrypted file. This encrypted file has the name of the output file (defined by /output= startup parameter) and the file extension is PI_PWD. The file gets stored in the same directory. Example: /in=2 /output=d:\pi\interfaces\rdbmspi\data\rdbmspi.log The encrypted password is stored in: d:\pi\interfaces\rdbmspi\data\rdbmspi.PI_PWD When running the interface as service, the interface must be called at least one time in interactive mode, in order to specify the password after the prompt and let the interface create the encrypted file. The file can be deleted any time and the interface will prompt for a new password after next interactive startup. Note: The interface will fail when started as service and not having a valid passwordfile (or having /pass_pi=password). Note: In order to achieve a connection with the PI Server, the file PILOGIN.INI must contain a reference to that PI Server. This can be done in the easiest way via ProcessBook Connection Dialog. If ProcessBook is not installed, please see section PILOGIN.INI at the end of this chapter. /user_odbc User name for the ODBC connection. This parameter is required. Databases like MS Access or dBase may not always have usernames set up. In this case a dummy username must be used, e.g /user_odbc=dummy. /pass_odbc Password for the ODBC connection. If this parameter is omitted, the standard ODBC connect dialogue prompts the user for the user name and password. This will avoid the situation to have a password stored in a startup BAT file (readable for every user on this machine). The password has to be entered only once. On all future startups the interface will remember the password from an encrypted file. This encrypted file has the name of the output file (defined by /output= startup parameter) and the file extension is ODBC_PWD. The file gets stored in the same directory. Example: /in=2 /output=d:\pi\interfaces\rdbmspi\data\rdbmspi.log Encrypted password is stored in: d:\pi\interfaces\rdbmspi\data\rdbmspi.ODBC_PWD When running the interface as service, the interface must be called at least one time in interactive mode, in order to specify the password after the prompt and let the interface create the encrypted file. The file can be deleted any time and the interface will prompt for a new password after next interactive startup. Note: The interface will fail when started as service and not having a valid passwordfile (or having /pass_odbc=password). Databases like MS Access or dBase may not always have security set up. In this case a dummy username and password must be used, e.g /pass_odbc=dummy. /recovery This start-up flag determines how to handle output points after Shutdown or I/O Timeout digital states. After start-up, the Interface checks these two digital states and goes into the archive for events of the sourcetag. The SQL statement is then executed for each event retrieved from the PI archive. /recovery_time Used in conjunction with the /recovery flag and sets the maximum time to go back into the archive. Following table describes the behavior. /recovery=BehaviorSHUTDOWNIf Shutdown or I/O Timeout digital states are encountered, the Interface goes back into the PI archive either starting at /recovery_time (when Shutdown or I/O Timeout timestamp is older than /recovery_time ) or starts the recovery at the time of the last event (Shutdown or I/O Timeout). Note: If no Shutdown or I/O Timeout event is encountered, no recovery takes place.TSStarts the recovery from /recovery_time= time or from the last snapshot of the output point if this is later.NO_RECDefault value. No recovery takes place. The /recovery_time keyword is ignored. Note: Remember, the output point contains a copy of all data successfully downloaded from the source point. The current snapshot of the output point therefore marks the last downloaded value. See also section  REF bkmkLimits \* MERGEFORMAT Limitations and future enhancements /sql = c:\pi\sql Points to the destination where ASCII files with SQL statements reside. /sr Sets the Sign-for-Updates scan period in seconds. The Interface checks each defined period of time if some changes in point database were made. Default value is 35 sec. /stopstat If the /stopstat flag is present on the startup command line, then the digital state I/O Timeout will be written to each PI Point when the interface is stopped. If /stopstat=digstate is present on the command line, then the digital state digstate will be written to each PI Point when the interface is stopped. digstate can be any digital state that is defined in the PI 2 digital state table or the PI 3 system digital state table, depending upon whether the home node is a PI 2 or PI 3 system. If neither /stopstat nor /stopstat=digstate is specified on the command line, then the default is not to write digital states to each input point when the interface is stopped. Note: digstate can contain spaces but then the string must be embedded in double quotes. Example: /stopstat=I/O Timeout The /stopstat=shutdown option is the recommended flag. /skip_time Timeout in seconds for scan class. If the actual execution time for a scan class gets over the predicted scheduled time of more than skip_time seconds the scan execution is skipped. Default value is two seconds. /succ1 Defines the start of successful area filled with strings representing a positive status. /succ2 Defines the end of successful area filled with strings representing a positive status. /bad1 Defines the start of bad value area filled with strings representing a negative status. /bad2 Defines the end of bad value area filled with strings representing a negative status. /test = tagname The /test mode allows to test only one query at a time. For example, /test=tag1means connect, run the configuration for tag1, print results and then exit. No data is stored in RDBMS and PI. /tf=tagname Each scan class can get its own I/O rate tag. The order in the startup line will lay down the tagname to the related scan class. After finalized scan of a certain scan class the number of successfully executed queries will be stored into the related I/O rate tag. Example: You can specify 2 scan frequencies by inserting: . . . /f=00:00:03 /f=00:00:05 /tf=tagname1 /tf=tagname2 Scan class 1 will have I/O rate tag tagname1 and scan class 2 will own tagname2. Note: In the current version we only support tagnames without spaces related to their occurrence in the startup line. Startup as console application To start the interface, run the rdbmspi.bat batch file from the Interface directory. To stop the interface type Ctrl^C or Ctrl^Break in the Interfaces standard output window. To automate startup, you may add rdbmspi.bat to c:\pi\adm\pisitetsart.bat. Startup as Windows NT Service NT Service Installation Rdbmspi Interface is installed as NT service by running the command rdbmspi -install from the Interface directory. To remove the service from the Windows NT Registry Database type rdbmspi remove. Note: The service is created to start in manual mode without any dependency! NT Service Start and Stop The Interfaces directory should contain two files with the same name but different file extensions: rdbmspi .exe and rdbmspi.bat. (The batch file contains all the startup parameters used when the executable starts.) Once the service is created (via rdbmspi install command) it can be started, stopped, paused and resumed from the Services dialog box in the Control Panel or directly by typing rdbmspi start or rdbmspi stop. To determine if the Interface is running as a service, look at the Control Panel - Services dialog box. The status says Started if the Interface is running; the status is blank if it is not running. Alternatively you can list all of the NT services that are currently running by typing net start at the command prompt and see if rdbmspi is listed there. Note: Services are automatically stopped on system shutdown but are not stopped when a user logs off from an NT console. To manually stop all running PI services, run the pisrvstop.bat command file from the pi\adm directory. This command file calls pisrvsitestop.bat, which stops the interfaces and other site-specific programs that have been configured to run as NT services. Any site-specific services that are expected to be associated with PI should have startup and shutdown commands added to the pisrvsitestart.bat and the pisrvsitestop.bat command files. By default the PI services are set in manual mode. This means that the services must be told to start and stop using the pisrvstart.bat and pisrvstop.bat commands. To allow the PI System to start automatically on reboot, services can be set to automatic from the Services dialog box in the Control Panel. Optional Switches rdbmspi install depend tcpip pinetmgr -auto -depend Starts the interface after activation of specified services. Possibilities are: -depend tcpip pinetmgr -depend bufserv tcpip -depend tcpip -auto Automatically starts the service after reboot of the operating. PILOGIN.INI The PILOGIN.INI file contains configuration and preference settings for the PI Server connections with PI-Client Software (e.g. ProcessBook or Interface). The file generally resides in the PIPC\DAT directory. ProcessBook SETUP.EXE creates this file with default settings. As you use PIProcessBook and the Connections feature, this file is modified. Withot having ProcessBook installed, the file must be manually modified using any ASCII text editor. The settings used in the examples are samples and not necessarily the default values. The Services section of the PILOGIN.INI identifies the server type: PI1=PI The Defaults section specifies the default server and user ID: PIServer=tomato PI1USER=DLeod The PINodeIdentifiers section of PILogin.ini maps the PI Server names to codes which are stored in the ProcessBook files. ProcessBook uses these codes instead of the actual node names in order to save space and facilitate changing server names. You usually make changes to this section through the Connections command under the PIProcessBook File menu. Here is an example of this section: [PINodeIdentifiers] ;PI#=Servername, NodeID, Port# PI1=casaba,11111,545 PI2=orange,85776,545 PI3=localhost,62085,5450 PI4=olive,2153,5450 PI5=206.79.198.232,41369,5450 The first parameter after the equal sign is the PI Server name. This is usually a TCP/IP node name, but it can also be a TCP/IP address as shown on the last line. The second parameter is the node identifier, which is stored with each tag name used in a ProcessBook file. This parameter is relevant for ProcessBook but not for the RDBMSPI Interface. The third parameter is the TCP port number. Port 545 is used for PI Servers on OpenVMS. Port 5450 is used for PI Servers on Windows NT and UNIX. Example (minimum) PILOGIN.INI File: [Services] PI1=PI [PINODEIDENTIFIERS] PI1=alpha22,48872,5450 [DEFAULTS] PIServer=alpha1 PI1USER=piadmin Shutdown You can manually stop the interface by pressing Ctrl^C or Ctrl^Break, when used in interactive mode. When the interface runs as service, you can stop it via the Control Panel or by entering the command: rdbmspi -stop On a Windows NT PI3 Home Node, include the interface stop procedure in pisrvsitestop.bat. It should look like this: echo Stopping Site Specific PI System Services... ..\interfaces\rmp_sk\rmp_sk stop ..\interfaces\random\random stop ..\interfaces\rdbmspi\rdbmspi stop :theend Error and information messages You can find messages from the interface in two places: The standard PI message log called PIPC.LOG (located in \PIPC\DAT directory) accepts general information and error messages like used point source, number of points handled,... The second file is interface-specific (/output=filename) and has all important information printed out by the interface. The amount of information is dependent on the debug level used (/deb=1-5). Note: Errors related to tag values will also be reported in giving the tag a BAD INPUT state. This happens, if the status of a value derived from the RDBMS is BAD. Points can also get a status of I/O Timeout if the Interface detects connection problems. Hints for PI System Manager When using the option to query a complete time series for a tag, the query must solve the problem that the value/timestamp pairs arrive ordered by timestamp. Otherwise the interface cannot perform exception reporting and the piserver cannot do compression. Reconnect attempts are modified to be more general. In the past we have learned that only a few ODBC drivers report detailed error codes for networking problems. This was required for RDBMSPI Version 1.28 to reconnect (codes 08xxx (network problems) and xxTxx (timeout) were required). As a result, the interface reported an error (typically S1000) but did not reconnect (because S1000 is a general error). Now, on any serious error we test the connection with the RDBMS and do a reconnect if necessary. This new behavior was tested with Oracle and SQL Server. A common problem was that for backup reasons the RDBMS was shutdown periodically. Since the interface then reports a connection problem (I/O Timeout gets written to all interface tags), queries with reference to previous timestamps being read only queried back in time to the shutdown event. As a result data were missing. In such a situation the startup flag /NO_INPUT_ERROR can help. If the field size is less than required for the current value to be passed, the interface prints an error message into the log file but continues to try on the next event with the value valid at that time. E.g. if the field length of a character field is 2 and the interface tries to store ON and OFF values, ON will work, OFF will generate an error. If the query contains a constant in the select range and the constant is a string, the ODBC driver transforms this string to capital letters. E.g. SELECT timestamp,0,No Sample WHERE the NO SAMPLE arrives in the PI part of the interface. Searches in the Bad and Good area are now case insensitive to address this problem. Error messages in the logfile are only displayed on first occurance. To avoid logfiles with many same messages, we report only when the error is resolved. The minimum field size for digital state output is 12 characters. Some ODBC drivers also require one additional character for the string termination byte (NULL). In this case we need a minimum field size of 13 characters. SELECT statements using LST or LET may not get any data if the clocks of PI System computer and RDBMS System are not synchronised. That is because LST and LET are filled from the Interface but compared to RDBMS timestamps. Interface Test Environment The Interface Version 1.28 was tested using the following software versions: Intel platform onlyOperating SystemWindows NT 4.0 Workstation and Server, SP1 and SP3C-CompilerMS Visual C/C++ 5.0PIPI 3.1 on NT (Intel), Build 2.71 and 2.81 PI-API 1.2.3.4 and PI-API 1.3.0.0 PI-ODBC-PC 1.1.0.0 (12/27/96) UNIINT 2.23, 2.25, 2.31 RDBMSODBC driverOracle - RDB Database 6.1 (Alpha)Oracle ODBC Driver for RDB 2.10.1100MS SQL Server 6.5MS SQL Server ODBC Driver 2.65.0240Oracle 7MS Oracle ODBC Driver 2.00.00.6325 Oracle72 1.13.05.00 Visegenic 32-bit Oracle driver 2.00.00.00dBase III, dBase IVMicrosoft dBase Driver 3.50.360200MS Access 95, MS Access 97Microsoft Access Driver 3.50.360200 The Interface Version 2.08 was tested using the following software versions: Intel platform onlyOperating SystemWindows NT 4.0 Workstation SP4 C-CompilerMS Visual C/C++ 6.0 SP2PI3.2 - SR1 Build 357.8 PI-API 1.2.3.4 and PI-API 1.3.0.0 RDBMSODBC driverMS SQL 6.50.201 (ROBUSTNESS tests only)3.60.03.19MS SQL 7.00.6233.70.06.23ORACLE 7.11.13.05.00 (Oracle72) 2.00.00.00 (Visigenic 32-bit Oracle driver) 2.00.00.6325 (Microsoft ODBC Driver for Oracle) ORACLE 8.0 8.0.5.0.08.00.06.00 The Interface Version 2.14 was tested using the following software versions: Intel platform onlyOperating SystemWindows NT 4.0 Workstation SP5C-CompilerMS Visual C/C++ 6.0 SP2PI3.2 - SR1 Build 357.8 PI-API 1.3.1.3 RDBMSODBC driverMS SQL 7.0 (07.00.0623) 3.70.06.90ORACLE 8 (8.0.5.0.0)8.00.05.00 (Oracle) DB2 (05.02.0000)05.02.0000 The Interface Version 2.16 was tested using the following software versions: Intel platform onlyOperating SystemWindows NT 4.0 Workstation SP5C-CompilerMS Visual C/C++ 6.0 SP2PIPI 3.2 Build 357.17 PI-API 1.3.2 RDBMSODBC driverMS SQL 7.0 (07.00.0623) 3.70.06.90ORACLE 8 (8.0.5.0.0)8.00.05.00 (Oracle) DB2 (05.02.0000)05.02.0000 More Examples Insert or Update A usual request is to keep a copy of current snapshot values in a relational table. The problem is that the query must decide between INSERT and UPDATE. If the PI tag already has a record in that table, UPDATE is required. If there is no record for this tag yet, INSERT has to be used. Unfortunately SQL language does not provide ifthen mechanisms. The usual solution is to write a stored procedure to get this flexibility. Luckily we also support stored procedures. But there is also a SQL solution to this problem: Use a second table with the same fields defined as the target table. This dummy table has to have exactly one record with dymmy data. To do an INSERT or UPDATE, use a RIGHT JOIN between the two tables as in the example below: Table1 has 2 fields, V1 and P1 Table2 has 2 fields, V1 and P1 Table2 has exactly one record with data. Query INSERT_UPDATE: UPDATE Tbl1 RIGHT JOIN Tbl2 ON Tbl1.P1 = Tbl2.P1 SET Tbl1.P1 = Tbl2.P1, Tbl1.V1 = tbl2.V1; How does it work? The trick itself lies in the RIGHT JOIN. RIGHT JOIN means, include all records (exactly one) from the table on the right and those fields from the lefthand table where the fields are equal. If we would only do a SELECT then we would either see one record with data in all fields (the UPDATE situation) or we see only data from the dummy table and no data BUT EMPTY FIELDS from the target table (INSERT situation). If we now do an UPDATE on this RIGHT JOIN, in the case of empty fields, the RIGHT JOIN writes back a new record. In the other case the RIGHT JOIN just generates an UPDATE. For use with our RDBMS Interface, we need to split the problem into more than one query UPDATE of dummy table; UPDATE .... RIGHT JOIN...; This is no problem because the RDBMS Interface supports multiple statements in one SQL file. Limitations and future enhancements Due to the wide range of RDBMSs and the complexity of this Interface, functionality is not fixed. Also ODBC is still improved from Microsoft which can be seen looking at frequent updates of ODBC Driver Manager, ODBC API and ODBC library. During development we found a number of limitations which could not be solved in this version: The Interface requires ODBC Driver Manager 3.x since we had to use more enhanced functions for error detection and robustness (RDBMS reconnect). The ODBC Driver Manager update comes free with a number Microsoft products or can be downloaded from the Microsoft Web Page. Version 1.28 of the RDBMSPI Interface (available on request from TechSupport) can still be used for ODBC 2.x Driver Manager. PI point changes will only be recorded during interface operation. Information about a PI point, which is modified during interface down-time, will get lost. Enhancements planned for future versions: Automate login configuration via connection dialog Overcome 80 char limit of Extended Descriptor Support all pointclass attributes for placeholder AT.ATTRIBUTE Tag configuration and ODBC testtool Scan based output Output of aggregate data (piar_calculation instead of sourcetag) Revision History DateAuthorComments24-Jan-97 BB, MF50 % draft20-Mar-97BB, MFPreliminary Manual10-Dec-97BBRelease Manual Version 1.2118-Sep-98BBMore details added related to RDBMS Interface Version 1.2706-Nov-98BBRelease Manual Version 1.2829-Nov-98 MF50 % draft of Version 201-Feb-99BB, MF25-Feb-99MH,MFExamples tested and corrected04-Jun-99BBRelease Version 2.0824-Mar-00MFTestplan 2.14 (SQL Server 7.0,Oracle8, DB2 Ver.5)16-May-00BBManual Update for Release 2.1415-Sep-00BBManual Update for Release 2.1510-Jan-01BBManual Update for Release 2.16  SAVEDATE \* MERGEFORMAT 10/01/2001 2:26   PAGE ii  AUTHOR \* MERGEFORMAT OSI Software, Inc.  AUTHOR \* MERGEFORMAT OSI Software, Inc.  PAGE 78 January 10, 2001  PAGE iii  TITLE \* MERGEFORMAT PlantSuite RDBMS to PI  SUBJECT \* MERGEFORMAT Interface Documentation  PAGE 77  AUTHOR \* MERGEFORMAT OSI Software, Inc. &7cu # $ % & 5 6 X Y Z p q r s 2 3   45ӺөӺӎsffjh B*Uph jbh CJOJQJh CJOJQJmH sH !jh CJOJQJUh 0JB*ph!jh CJOJQJUjh CJOJQJUh :CJOJQJh CJOJQJh B*phh OJQJmH nH uh h mH nH u&cu{% bEkdd$$Ifl0*p 6$F4 laEkd$$Ifl0*p 6$F4 la$If$If@& 7% & 5 r s 2 gEkd$$Ifl0*p 6$F4 la$If$IfEkd$$Ifl0*p 6$F4 la2 3 8   J GTRNJXkd$$IflF*p 46$F      4 la$If$IfEkdF$$Ifl0*p 6$F4 la5EFGHa"#$%&'XYstuvwº¯ºº¤º›|k jh UmHnHu jh UmHnHujh UmHnHuh mHnHujh Uj$h Ujh Uh h B*mHphsH jh B*phh B*phjh B*Uphh B*mHnHphu*'x2i"fTNd6@&,-.012HIcdeghz{ !̹u jh UmHnHu j h UmHnHu jh UmHnHu jh UmHnHujh Ujh Uh h B*ph jh UmHnHuh mHnHujh UmHnHu.!EF`abdef(234NOPRSk{̻} j h UmHnHu j} h UmHnHu j h UmHnHuh >*mHnHu j h UmHnHuh mHnHsHu j h UmHnHujh UmHnHuh mHnHu.-.HIJLM{|CD^_`ضإؔ؃r jeh UmHnHu j h UmHnHu jk h UmHnHu j h UmHnHu jq h UmHnHu j h UmHnHuh mHnHujh UmHnHu jw h UmHnHu,`bcuv01245z{˸ˋˀjSh Ujh U jYh UmHnHu jh UmHnHuj_h Ujh Uh h B*ph jh UmHnHujh UmHnHuh mHnHu2O{3f2c `1^Ap-./IJKMNOZ[uvwyz-./1׸קזׅt jAh UmHnHu jh UmHnHu jGh UmHnHu jh UmHnHu jMh UmHnHujh UmHnHuh mHnHujh Uh B*phh jh U-12EF`abdexy,-.012ABC]^_abco鿻j/h Ujh Uj5h Ujh Ujh Uh h B*ph j;h UmHnHu jh UmHnHuh mHnHujh UmHnHu5opq   ?@Z[\^_+ jh UmHnHu j#h UmHnHu jh UmHnHujh UmHnHuh mHnHuj)h Ujh Uh B*phh 5\mHnHsH jh Uh 1+,-/0=>XYZ\]^fgh !;<=?@OPjؿjh Ujh Ujh Ujh Ujh Uh h B*ph jh UmHnHuh mHnHujh UmHnHu jh UmHnHu0jklnopO P q r E!F!g!h!!!"""$$''~)-90:0O0訠蛑 h h h <CJjh 5U h 5h B*phjh B*Uphjh U jh UmHnHujh UmHnHuh mHnHuh jh Uj h U2WU !"""""$$If\kd$$Ifl4404 la f4$$If" ##,#R#okd $$Ifl40H  04 la f4$$IfR#S#l#p#$$Ifokd$$Ifl40H  04 la f4p#q####$$IfokdC $$Ifl40H  04 la f4####$$Ifokd $$Ifl40H  04 la f4###$$$Ifokd}!$$Ifl40H  04 la f4$$$$$$Ifokd"$$Ifl40H  04 la f4$$%$($$$Ifokd"$$Ifl40H  04 la f4($)$/$I$$$IfokdT#$$Ifl40H  04 la f4I$J$S$_$$$Ifokd#$$Ifl40H  04 la f4_$`$n$r$$$Ifokd$$$Ifl40H  04 la f4r$s$$$$$Ifokd+%$$Ifl40H  04 la f4$$$$$$Ifokd%$$Ifl40H  04 la f4$$$$$$Ifokde&$$Ifl40H  04 la f4$$$$$$Ifokd'$$Ifl40H  04 la f4$$$$$$Ifokd'$$Ifl40H  04 la f4$$$$$'.)~)))6*m**-++}}}}}}} & F h^okd<($$Ifl40H  04 la f4++++,r,,0-P-----....4.000)12222$$$1$If^a$ & F h^O0P0`0a00000)12222233335363S3T3]3^3g3h3q3r3{333333333333334M4N44(5)577777:8<8=8>8[8\8y8z888888888888ֿ۵ֿh B*hph h 6hh 5CJh h 5h h hh B*ph h >*jh Uh j(h UG223338\kd)$$IfF4$04 Faf4 $$1$If^\kdT)$$IfF4$04 Faf4335363J35( $$1$If^\kd+$$IfF4$04 Faf4$$$1$If^a$\kdt*$$IfF4$04 Faf4J3T3^3h3r3|3 $$1$If^|3}33333A4444 $$1$If^kd+$$IfF4ֈN $F04 Faf43333334kd,$$IfF4ֈN $F04 Faf4 $$1$If^3333334kd-$$IfF4ֈN $F04 Faf4 $$1$If^3333333 $$1$If^333333A4444 $$1$If^kd.$$IfF4ֈN $F04 Faf43333334kd/$$IfF4ֈN $F04 Faf4 $$1$If^3333334kd0$$IfF4ֈN $F04 Faf4 $$1$If^3333444 $$1$If^\kd1$$IfF4$04 Faf4$$$1$If^a$4474N4d444444gZZZZZZZZ $$1$If^kd02$$IfF4\ rz$,04 Faf4 444)55A669777geecccccckd3$$IfF4\ rz$,04 Faf4 777;8<8(\kdl4$$IfF4$04 Faf4 $$1$If^\kd3$$IfF4$04 Faf4$$$1$If^a$<8=8>8[8\85\kd5$$IfF4$04 Faf4\kd4$$IfF4$04 Faf4$$$1$If^a$\8p8z88888 $$1$If^888888A4444 $$1$If^kd6$$IfF4ֈN $F04 Faf48888884kd7$$IfF4ֈN $F04 Faf4 $$1$If^8888884kd 8$$IfF4ֈN $F04 Faf4 $$1$If^88888888/9_9`9 :!::A;Z;==>>>@>A>O>g>h>i>>>>>??+?,?@?A?K?L?`?a?u?|?}???????@ @@a@@@@@rAABBDD EE;EwEEEEEFFF Fh 5hmHsH h 6hh 5CJh h 5h B*phh h 5CJOJQJ h 5h h hJ8888888 $$1$If^888888A4444 $$1$If^kd"9$$IfF4ֈN $F04 Faf48888884kd$:$$IfF4ֈN $F04 Faf4 $$1$If^8888884kd&;$$IfF4ֈN $F04 Faf4 $$1$If^8 999$9.9 $$1$If^^kd(<$$IfF4$04 Faf4$$$1$If^a$.9/9I9`9999:zmmcmcm $If^ $$1$If^kd<$$IfF4F6$V V V 0    4 Faf4: :!:D:}:::@;A;Z;<zppnnnlf\n ^`^ ^`kd`=$$IfF4F6$V V V 0    4 Faf4 <>A>h>i>> $$1$If^\kd>$$IfF4$04 Faf4$$$1$If^a$>>>>?5\kd$?$$IfF4$04 Faf4$$$1$If^a$\kd>$$IfF4$04 Faf4???!?,?6?A?K?L?V?a?k?v? $$1$If^\kd?$$IfF4$04 Faf4 v?w?}????A4444 $$1$If^kdD@$$IfF4ֈ $nn#04 Faf4??????4kd8A$$IfF4ֈ $nn#04 Faf4 $$1$If^??????? $$1$If^??????A4444 $$1$If^kd,B$$IfF4ֈ $nn#04 Faf4?????@4kd C$$IfF4ֈ $nn#04 Faf4 $$1$If^@@@@@@4kdD$$IfF4ֈ $nn#04 Faf4 $$1$If^@ @ @ @ @ @@ $$1$If^@@`@A4 $$1$If^kdE$$IfF4ֈ $nn#04 Faf4`@a@n@x@@ $$1$If^^kdE$$IfF4$04 Faf4@@@@@AGAqAzmmcmcm $If^ $$1$If^kdF$$IfF4F6$V V V 0    4 Faf4qArAsAABCOD;EwEEzppnnnnk[$$$1$If^a$$ ^`kd4G$$IfF4F6$V V V 0    4 Faf4 EEFFF9)$$$1$If^a$\kdhH$$IfF4$04 Faf4 $$If^\kdG$$IfF4$04 Faf4F F&F'F;F5( $$1$If^\kdI$$IfF4$04 Faf4$$$1$If^a$\kdH$$IfF4$04 Faf4 F&F'F^F_FsFtF}F~FFFFFFFFFG0G1G>G?GEGGGGHJJ!J"J2J3JCJDJFJKKLL M&M'M(MMMMMMMMMMN N NNNNNNNN OO#O$O*O>OVOkOPPh 5hmHsH h 6hh 5CJh h 5jQh Ujh Uh  h h h 5hH;FIFTF_FiFtF~FFFFF $$1$If^ FFFFFFA4444 $$1$If^kdJ$$IfF4ֈ + $3nnnn04 Faf4FFFFFF4kdJ$$IfF4ֈ + $3nnnn04 Faf4 $$1$If^FFFFFFF $$1$If^FFFG GGA4444 $$1$If^kdK$$IfF4ֈ + $3nnnn04 Faf4GGGGGG4kdL$$IfF4ֈ + $3nnnn04 Faf4 $$1$If^G1G9G:G;GG?G@GAGBGA4444 $$1$If^kdM$$IfF4ֈ + $3nnnn04 Faf4BGCGDGEGG4kdN$$IfF4ֈ + $3nnnn04 Faf4 $$1$If^GGGGGG $$1$If^^kd|O$$IfF4$04 Faf4GGGGH:HfHHHgZZNZNZN $$If^ $$1$If^kdP$$IfF4\J $04 Faf4HHHHHIKLL[YYWYUR$kdP$$IfF4\J $04 Faf4 $$If^L'M(MMM)\kdR$$IfF4$04 Faf4 $$If^\kd?R$$IfF4$04 Faf4$$$1$If^a$MMMMMMN NN $$1$If^\kd_S$$IfF4$04 Faf4$$$1$If^a$NN8NZNNA555 $$If^kdS$$IfF4ֈfB $nnnnn04 Faf4NNNNNN $$1$If^NNNNNNA4444 $$1$If^kdT$$IfF4ֈfB $nnnnn04 Faf4NNNNNN4kdU$$IfF4ֈfB $nnnnn04 Faf4 $$1$If^NNNNNN $$1$If^NNOOO OA4444 $$1$If^kdMV$$IfF4ֈfB $nnnnn04 Faf4 O!O"O#O$O%O4kdW$$IfF4ֈfB $nnnnn04 Faf4 $$1$If^%O&O'O(O)O*O4kdW$$IfF4ֈfB $nnnnn04 Faf4 $$1$If^*O=O>OLOVOaOjO $$1$If^^kdX$$IfF4$04 Faf4$$$1$If^a$jOkOOOO P5PUPPg[[[N[[[ $$1$If^ $$If^kd?Y$$IfF4\J $04 Faf4PPPPP;SdSSSS[YWYYTTQ@&@&kdZ$$IfF4\J $04 Faf4 $$If^ PPQQQQQQ R]RqRRRTTYY Z Z#Z$Z4Z5ZeZfZZZZZF[N[[_i_x_y_s``````aaaad+ddddd`fsfhhRj`jEmbmemummnnnooqqh mH sH h mHsHh mHsHj\h U h 56jZh Ujh U h 6 h 5h h B*phDSSTTTp#.20    4 laf4$If ^````aayoo $If]$Ifkd\$$IflF>p#.20    4 laaa"aiajayyo $If]$IfkdH]$$IflF>p#.20    4 lajakaqaaayyo $If]$Ifkd]$$IflF>p#.20    4 laaaa*c+cyyo $If]$Ifkd^$$IflF>p#.20    4 la+c,c2c@cAcyyy$IfkdO_$$IflF>p#.20    4 laAcBcJcccyyy$Ifkd_$$IflF>p#.20    4 lacccccyyy$Ifkd`$$IflF>p#.20    4 lacccddyyy$IfkdVa$$IflF>p#.20    4 laddd+dOdPdcdyyyyy$Ifkdb$$IflF>p#.20    4 lacdddtdddyyy$Ifkdb$$IflF>p#.20    4 ladddddyyy$Ifkd]c$$IflF>p#.20    4 ladddd eyyy$Ifkd d$$IflF>p#.20    4 la e ee;eNeyyy$Ifkdd$$IflF>p#.20    4 laNeOe\eeeyyy$Ifkdde$$IflF>p#.20    4 laeeeeeyyy$Ifkdf$$IflF>p#.20    4 laeeeffyyy$Ifkdf$$IflF>p#.20    4 lafff(f)fyyy$Ifkdkg$$IflF>p#.20    4 la)f*f=f^f_fyyy$Ifkdh$$IflF>p#.20    4 la_f`fsfffyyy$Ifkdh$$IflF>p#.20    4 lafffffyyy$Ifkdri$$IflF>p#.20    4 lafffggyyy$Ifkdj$$IflF>p#.20    4 lagg+gKg\gyyy$Ifkdj$$IflF>p#.20    4 la\g]gmgggyyy$Ifkdyk$$IflF>p#.20    4 lagggggyyy$Ifkd&l$$IflF>p#.20    4 lagggggyyy$Ifkdl$$IflF>p#.20    4 laggghhyyy$Ifkdm$$IflF>p#.20    4 lahh)hFhGhyyy$Ifkd-n$$IflF>p#.20    4 laGhHhYhxhyhyyy$Ifkdn$$IflF>p#.20    4 layhzhhhhyyy$Ifkdo$$IflF>p#.20    4 lahhhhhyyy$Ifkd4p$$IflF>p#.20    4 lahhhiiyyy$Ifkdp$$IflF>p#.20    4 laii iJiKiyyy$Ifkdq$$IflF>p#.20    4 laKiLi\i~iiyyy$Ifkd;r$$IflF>p#.20    4 laiiiiiyyy$Ifkdr$$IflF>p#.20    4 laiiiiiyyy$Ifkds$$IflF>p#.20    4 laiiijjyyy$IfkdBt$$IflF>p#.20    4 lajj'jPjQjyyy$Ifkdt$$IflF>p#.20    4 laQjRj`jjjyyy$Ifkdu$$IflF>p#.20    4 lajjjjjyyy$IfkdIv$$IflF>p#.20    4 lajjjjjyyy$Ifkdv$$IflF>p#.20    4 lajjk(k)kyyy$Ifkdw$$IflF>p#.20    4 la)k*k=k^k_kyyy$IfkdPx$$IflF>p#.20    4 la_k`kqkkkyyy$Ifkdx$$IflF>p#.20    4 lakkkkkyyy$Ifkdy$$IflF>p#.20    4 lakkkk lyyy$IfkdWz$$IflF>p#.20    4 la l llp#.20    4 la=l>lPlllmlyyy$Ifkd{$$IflF>p#.20    4 lamlnllllyyy$Ifkd^|$$IflF>p#.20    4 lalllllyyy$Ifkd }$$IflF>p#.20    4 lallm2mDmyyy$Ifkd}$$IflF>p#.20    4 laDmEmbmcmdmyyy$Ifkde~$$IflF>p#.20    4 ladmemummmyyy$Ifkd$$IflF>p#.20    4 lammmmmyyy$Ifkd$$IflF>p#.20    4 lammmmmyyy$Ifkdl$$IflF>p#.20    4 lammnnnyyy$Ifkd$$IflF>p#.20    4 lann#n.nAnyyy$IfkdƁ$$IflF>p#.20    4 laAnBnMnbnunyyy$Ifkds$$IflF>p#.20    4 launvnnnn}www$Ifkd $$IflF>p#.20    4 lannnnnyyy$Ifkdу$$IflF>p#.20    4 lannnnnyyy$Ifkd~$$IflF>p#.20    4 lannnnnyyy$Ifkd+$$IflF>p#.20    4 lann o7o@oyyy$Ifkd؅$$IflF>p#.20    4 la@oAoBoCooooopppprr}}{{{yyyy}{wkd$$IflF>p#.20    4 la q r rrr`raruuuuv34=>GHQR[׾޳޳޾޳h 5hmHsHh hmHsH h 6hh 5CJh h 5h h h h 5jh Uh jh UFKLMN(\kd$$IfF4$04 Faf4$$$1$If^a$\kd"$$IfF4$04 Faf4 $$1$If^Nkl $$1$If^\kdB$$IfF4$04 Faf4$$$1$If^a$ÊŊNJA4444 $$1$If^kdҙ$$IfF4ֈ $304 Faf4NJɊˊ̊͊Ί4kdԚ$$IfF4ֈ $304 Faf4 $$1$If^ΊϊЊъҊӊ4kd֛$$IfF4ֈ $304 Faf4 $$1$If^ӊ $$1$If^ A4444 $$1$If^kd؜$$IfF4ֈ $304 Faf4 4kdڝ$$IfF4ֈ $304 Faf4 $$1$If^4kdܞ$$IfF4ֈ $304 Faf4 $$1$If^'(5BP]ww $$If^ $$1$If^^kdޟ$$IfF4$04 Faf4$$$1$If^a$]^xڋ'UgZZNNNZN $$If^ $$1$If^kdr$$IfF4\J $04 Faf4U>?@ABZXOXXXX  & F^kdH$$IfF4\J $04 Faf4 $$1$If^Bv $$1$If^\kd$$IfF4$04 Faf4$$$1$If^a$$5\kd>$$IfF4$04 Faf4$$$1$If^a$\kd$$IfF4$04 Faf4*4>HR\ $$1$If^\kdΣ$$IfF4$04 Faf4\]kmoqA4444 $$1$If^kd^$$IfF4ֈ $304 Faf4[jkuvw|}89M%)21:ƕ>NĖҖ 23CDVWJwߝyΞϞО۶ۭۡh 5CJh jh mHnHuh 5mHsHjݰh Ujh Uh B*ph h >* h 5h h 5hmHsHh hmHsH h 5h h h*h  h 5h h h h 6hFHIfg{5( $$1$If^\kd $$IfF4$04 Faf4$$$1$If^a$\kdz$$IfF4$04 Faf4{ $$1$If^ßA7** $$1$If^ $If^kd$$IfF4ֈ C$304 Faf4ßşǟɟʟ˟4kdd$$IfF4ֈ C$304 Faf4 $$1$If^˟̟͟ΟϟП $$1$If^ПџߟA4444 $$1$If^kd.$$IfF4ֈ C$304 Faf44kd$$IfF4ֈ C$304 Faf4 $$1$If^ 4kd¶$$IfF4ֈ C$304 Faf4 $$1$If^  $$1$If^#A1$$$1$If^a$kd$$IfF4ֈ C$304 Faf4#$.:CM $If^ $$1$If^^kdV$$IfF4$04 Faf4MNhڠ +YgZZPZPPPP $If^ $$1$If^kd$$IfF4\J $04 Faf4 ۢ-Ӥ5Sg^\^^^ZX^^  & F^kd$$IfF4\J $04 Faf4 S!%4HR\d  & F$If  & F^ dep}B88888  & F$Ifkd $$Ifl44ֈ~ xd#F04 laf4"#1<kd$$Iflֈ~ xd#F04 la  & F$If1N|}~<3  & F^kdؼ$$Iflֈ~ xd#F04 la  & F$If~YZի̭֫'wk $$If^\kd$$IfF4$04 Faf4$$$1$If^a$$  & F^  & F^ '(EFZ5( $$1$If^\kdپ$$IfF4$04 Faf4$$$1$If^a$\kdI$$IfF4$04 Faf4(EFefpq¯ȯ߯=>noñWgxARʶӶKL_0 z1L^_αررh >*B*CJphh OJQJhh mHsHh B*hphh B*ph h >*h h 5hmHsH h h h 5hFZefpq{| $$If^ $$1$If^A5(( $$1$If^ $$If^kdi$$IfF4ֈ C$304 Faf4 $$1$If^ $$If^¯ïįůA4444 $$1$If^kd3$$IfF4ֈ C$304 Faf4ůƯǯȯ֯4kd$$IfF4ֈ C$304 Faf4 $$1$If^4kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$1$If^A4444 $$1$If^kd$$IfF4ֈ C$304 Faf44$$$$1$If^a$kd[$$IfF4ֈ C$304 Faf4 $$1$If^(2= $$If^ $$1$If^^kd%$$IfF4$04 Faf4=>Xo$_zmmamaa $$If^ $$1$If^kd$$IfF4F6$V V V 0    4 Faf4_`a>?@xzxxxvqqomdd  & F^ & Fkd]$$IfF4F6$V V V 0    4 Faf4 ˴Դմ"INOLP_s}  & F$If  & F^  & F^  & F@&^B88888  & F$Ifkd$$Ifl44ֈ P<"na04 laf4ȷɷʷط<kd$$Iflֈ P<"na04 la  & F$Ifط<kd$$Iflֈ P<"na04 la  & F$If 0<:8kd$$Iflֈ P<"na04 la  & F$If01 01_GͽϽ.~TU$$$1$If^a$  & F^ͽ.DJTNPQRopx/0&'()FGfgqr{|"#+,57Bgu h 6hh 5CJh h 5h B*phh  h 5h h hSOPQ;+$$$1$If^a$\kdV$$IfF4$04 Faf4 $If^\kd$$IfF4$04 Faf4QRop5( $$1$If^\kdv$$IfF4$04 Faf4$$$1$If^a$\kd$$IfF4$04 Faf4 $If^ $$1$If^ -/A77* $$1$If^ $If^kd$$IfF4ֈ/ C $Qmnn04 Faf4/2PTsuw $$1$If^$$$1$If^a$wxA4444 $$1$If^kd$$IfF4ֈ/ C $Qmnn04 Faf44kd$$IfF4ֈ/ C $Qmnn04 Faf4 $$1$If^ $$1$If^ $If^ A4444 $$1$If^kd$$IfF4ֈ/ C $Qmnn04 Faf44$$$$1$If^a$kd$$IfF4ֈ/ C $Qmnn04 Faf4 $$1$If^"(/ $If^^kd$$IfF4$04 Faf4/0d&Ug]]]P]]]] $$1$If^ $If^kd^$$IfF4\J $04 Faf4 <ge`eeeP$$$1$If^a$ & Fkd4$$IfF4\J $04 Faf4&'(;+$$$1$If^a$\kd$$IfF4$04 Faf4 $If^\kd $$IfF4$04 Faf4()FG[5( $$1$If^\kd$$IfF4$04 Faf4$$$1$If^a$\kd*$$IfF4$04 Faf4[fgqr| $$1$If^A7** $$1$If^ $If^kdJ$$IfF4ֈ C$304 Faf44kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$1$If^A4444 $$1$If^kd$$IfF4ֈ C$304 Faf44* $If^kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$1$If^A4444 $$1$If^kdr$$IfF4ֈ C$304 Faf44$$$$1$If^a$kd<$$IfF4ֈ C$304 Faf4 $$1$If^#,6 $If^ $$1$If^^kd$$IfF4$04 Faf467s#bzpppcpp $$1$If^ $If^kd$$IfF4F6$V V V 0    4 Faf4 Bgzqoqjq]Z$  & F-^`- & F  & F^kd>$$IfF4F6$V V V 0    4 Faf4g $$If^\kd$$IfF4$04 Faf4$$$1$If^a$67VWabkluv #/089BD4BCZ\w$%/09:CDM T'IWrsth 5CJh h 5 h 6h  h 6h h h h 5hT65\kd$$IfF4$04 Faf4$$$1$If^a$\kdr$$IfF4$04 Faf467KVWablv $$1$If^\kd$$IfF4$04 Faf4 A5(( $$1$If^ $$If^kd"$$IfF4ֈ C$304 Faf44kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$1$If^A4444 $$1$If^kd$$IfF4ֈ C$304 Faf44( $$If^kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$1$If^ $$If^ A4444 $$1$If^kdJ$$IfF4ֈ C$304 Faf4 "4$$$$1$If^a$kd$$IfF4ֈ C$304 Faf4 $$1$If^"#09C $$If^ $$1$If^^kd$$IfF4$04 Faf4CD-mznnnnnn $$If^kdr$$IfF4F6$V V V 0    4 Faf4 o4zqlqqqqqjqg$ & F  & F^kd$$IfF4F6$V V V 0    4 Faf4 4BC[\)\kdJ$$IfF4$04 Faf4 $$If^\kd$$IfF4$04 Faf4$$$1$If^a$\xy $$If^\kd$$IfF4$04 Faf4$$$1$If^a$5\kd$$IfF4$04 Faf4$$$1$If^a$\kdj$$IfF4$04 Faf4$%/0:DN $$1$If^\kd$$IfF4$04 Faf4 NOA4444 $$1$If^kd$$IfF4ֈ C$304 Faf44kd$$IfF4ֈ C$304 Faf4 $$1$If^4kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$1$If^A55( $$1$If^ $$If^kdx$$IfF4ֈ C$304 Faf44kdB$$IfF4ֈ C$304 Faf4 $$1$If^w $$If^ $$1$If^^kd $$IfF4$04 Faf4$$$1$If^a$ #9Sznnn $$If^kd$$IfF4F6$V V V 0    4 Faf4STUV&'IszqlgqqdT$$$1$If^a$$ & F & F  & F^kdD$$IfF4F6$V V V 0    4 Faf4st9)$$$1$If^a$\kdx$$IfF4$04 Faf4 $$If^\kd$$IfF4$04 Faf4t#%Zqrxdw1EINpESmno&'02h 5CJh h 6 h 5jh Uh h hmH sH  h 5h h h h 6hJ5( $$1$If^\kd$$IfF4$04 Faf4$$$1$If^a$\kd$$IfF4$04 Faf4$ $$1$If^$%Z\^A5(( $$1$If^ $$If^kd($$IfF4ֈ C$304 Faf4^`npqr4kd$$IfF4ֈ C$304 Faf4 $$1$If^rstuvw $$1$If^wxA4444 $$1$If^kd$$IfF4ֈ C$304 Faf44( $$If^kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$1$If^ $$If^A4444 $$1$If^kdP$$IfF4ֈ C$304 Faf44$$$$1$If^a$kd$$IfF4ֈ C$304 Faf4 $$1$If^ $$If^ $$1$If^^kd$$IfF4$04 Faf4:s1cznnnnnn $$If^kdx$$IfF4F6$V V V 0    4 Faf4cdezqomqqkii^ $ & F$If  & F^kd$$IfF4F6$V V V 0    4 Faf4 0GIN]RRRR $ & F$Ifkd$$Ifl44\ $i04 laf4 $ & F$IfNOolaaaa $ & F$Ifkd$$Ifl\ $i04 laEnljhjjX$$$1$If^a$kdO$$Ifl\ $i04 lano;+$$$1$If^a$\kd$$IfF4$04 Faf4 $If^\kd$$IfF4$04 Faf45( $$1$If^\kd$$IfF4$04 Faf4$$$1$If^a$\kd2$$IfF4$04 Faf4'1 $$1$If^12A7** $$1$If^ $If^kdR$$IfF4ֈJ >$04 Faf42  !,-;<;@DIcwxyV[_ins /0=>HIRS\]fhl45 h 6hh 5CJhjFh Ujh U h 5 h 6h  h 5h h hh hmHsHI4kd*$$IfF4ֈJ >$04 Faf4 $$1$If^ $$1$If^A4444 $$1$If^kd$$IfF4ֈJ >$04 Faf44* $If^kd$$IfF4ֈJ >$04 Faf4 $$1$If^ $$1$If^ $If^A4444 $$1$If^kd$$IfF4ֈJ >$04 Faf4 4$$$$1$If^a$kd$$IfF4ֈJ >$04 Faf4 $$1$If^ !-; $If^ $$1$If^^kdb$$IfF4$04 Faf4;<o9]g]]]]]]]] $If^kd$$IfF4\J $04 Faf4 .g^\ZPPPP  & F$If  & F^kd$$IfF4\J $04 Faf4./:BDIh^^^^  & F$Ifkd$$Ifl44\ P"04 laf4IJX`bylbbbb  & F$Ifkdn$$Ifl\ P"04 layz{BCDElljhjjjfjj[ $ & F$Ifkd1$$Ifl\ P"04 la )ABUlns]RRRR $ & F$Ifkd$$Ifl44\ P"04 laf4 $ & F$Ifstlaaaa $ & F$Ifkd$$Ifl\ P"04 ladefwlcacc\cY$ & F  & F^kd$$Ifl\ P"04 la)\kdY$$IfF4$04 Faf4 $$If^\kd$$IfF4$04 Faf4$$$1$If^a$5\kdy $$IfF4$04 Faf4\kd$$IfF4$04 Faf4$$$1$If^a$2=>HIS]g $$1$If^gh)A555 $$If^kd $$IfF4ֈ bw $N04 Faf4)+-/13 $$1$If^345678A4444 $$1$If^kd $$IfF4ֈ bw $N04 Faf489:;IS4kd $$IfF4ֈ bw $N04 Faf4 $$1$If^5;RST{|`ab#$ghy+4>KIn; B N O h i y z    0 J ʽʲʽʽʭʭʣʖţʣji!h 5Ujh 5U h 6jdh Ujh U h 5h h B*phh hmH sH h 5hmHsHh hmHsH h 5h h h;STUVWX4kd $$IfF4ֈ bw $N04 Faf4 $$1$If^Xpvwxyz $$1$If^ $$If^z{|}~A4444 $$1$If^kd $$IfF4ֈ bw $N04 Faf44$$$$1$If^a$kd$$IfF4ֈ bw $N04 Faf4 $$1$If^ $$If^^kd$$IfF4$04 Faf4>p/_g[[[[[[[[ $$If^kdU$$IfF4\ $N304 Faf4 _`agX$$$If^a$kd+$$IfF4\ $N304 Faf4ab2& $$If^^kd$$IfF4$04 Faf4$$$If^a$^kd$$IfF4$04 Faf4t $$If^^kd)$$IfF4$04 Faf4 ,ikd$$IfFF #n 0    4 Fa $$If^$$If,-5]psss $$If^kdw$$IfFF #n 0    4 Fapqr|whhhh$$$If^a$$$Ifkd-$$IfFF #n 0    4 Fa6NTH@@HHH$$If $$If^kd$$IfF4r:@#. 04 Faf45--$$Ifkd$$IfF4ֈ :@#`n04 Faf4 $$If^Ag5kd$$IfF4ֈ :@# 04 Faf4 $$If^] $$If^$$IfiA55 $$If^kd$$IfF4ֈ :@# 04 Faf4ijkGH{hiqkd$$IfF40 #n04 Faf4ijklm,\7?CM\ $ & F$If$  ^ `\]deUJJJJJJ $ & F$Ifkd$$Ifl44r V !Z[[[04 laf4VKKKKK $ & F$Ifkd_$$Ifl4r V !`Z[[[04 laf4VKKKKK $ & F$Ifkd'$$Ifl4r V ! Z[[[04 laf4$%&*+5VKKKKKK $ & F$Ifkd$$Ifl4r V ! Z[[[04 laf45678<=oVKKKKK $ & F$Ifkd$$Ifl4r V !`Z[[[04 laf4opqstuVKKKKK $ & F$Ifkdo$$Ifl4r V ! Z[[[04 laf4VKKKKK $ & F$Ifkd/$$Ifl4r V ! Z[[[04 laf4YNNNNN $ & F$Ifkd$$Iflr V !Z[[[04 la  In   YWTRWPWWP@&kd $$Iflr V !Z[[[04 la  0 J p q   $If^\kd!$$IfF4$04 Faf4$$$1$If^a$J X o p q       5 6 @ A J K T U ^ bci .FGH)BC\_`yz׾׳׾j85h Ujh Uh B*phh hmH sH h h hmHsH h 6h h hh 5CJh h 5hF     5\kd #$$IfF4$04 Faf4$$$1$If^a$\kd|"$$IfF4$04 Faf4  * 5 6 @ A K U _  $$1$If^\kd#$$IfF4$04 Faf4 _ ` ~     A77777 $If^kd,$$$IfF4ֈfB $nnnnn04 Faf4       _a $$1$If^ $If^abcdefA4444 $$1$If^kd$$$IfF4ֈfB $nnnnn04 Faf4fghiw4kd%$$IfF4ֈfB $nnnnn04 Faf4 $$1$If^4kd&$$IfF4ֈfB $nnnnn04 Faf4 $$1$If^ $$1$If^ $If^A1$$$1$If^a$kdT'$$IfF4ֈfB $nnnnn04 Faf41' $If^^kd($$IfF4$04 Faf4$$$1$If^a$^kd($$IfF4$04 Faf4Cs]kdF)$$IfF4\J $04 Faf4 $If^ 2deq}]kd*$$IfF4\J $04 Faf4 $If^}~ $If^tkd*$$IfF40J 04 Faf4 Gp$$$1$If^a$  & F^tkd+$$IfF40J 04 Faf4GH9)$$$1$If^a$^kd,$$IfF4 $04 Faf4 $If^\kdP,$$IfF4$04 Faf45( $$1$If^\kd.$$IfF4$04 Faf4$$$1$If^a$\kdt-$$IfF4$04 Faf4 $$1$If^ /0nA7777 $If^kd.$$IfF4ֈE: $j QRQRR04 Faf4nprt $If^ $$1$If^A4444 $$1$If^kd/$$IfF4ֈE: $j QRQRR04 Faf44* $If^kd|0$$IfF4ֈE: $j QRQRR04 Faf4 $$1$If^ $$1$If^ $If^A1$$$1$If^a$kdp1$$IfF4ֈE: $j QRQRR04 Faf4()1' $If^^kd2$$IfF4$04 Faf4$$$1$If^a$^kdd2$$IfF4$04 Faf4Cu]kd3$$IfF4\J $04 Faf4 $If^ ABC\]TRPP  & F^kdb4$$IfF4\J $04 Faf4 $If^GIJKhi#$128K!!!1!#'#&"&F(M(((W,i,$-*---..//U0_000000011)101113376N6s8 h 5h B*ph h 6hh 5CJh h 5h h hjh Uh PHI(\kdK6$$IfF4$04 Faf4 $$1$If^\kd5$$IfF4$04 Faf4$$$1$If^a$IJKhi5\kdk7$$IfF4$04 Faf4\kd6$$IfF4$04 Faf4$$$1$If^a$i} $$1$If^A4444 $$1$If^kd7$$IfF4ֈN $F04 Faf44kd8$$IfF4ֈN $F04 Faf4 $$1$If^4kd9$$IfF4ֈN $F04 Faf4 $$1$If^ $$1$If^$,-.A4444 $$1$If^kd;$$IfF4ֈN $F04 Faf4./01234kd<$$IfF4ֈN $F04 Faf4 $$1$If^3456784kd=$$IfF4ֈN $F04 Faf4 $$1$If^8KL $If^\kd>$$IfF4$04 Faf4$$$1$If^a$ k  !v $$1$If^ $If^qkd>$$IfF40 $04 Faf4!!!!1!###'#p$%%&&&"&qkd3?$$IfF40 $04 Faf4"&&.'S'T'a''(:(;(F(M(((((("*m,,#-$-*-----..@&...////'0B0C0U0_0111)10111111h333334Q55576N68s8~8&9:99 :(:0:7:  & F$If  & F^  & F^ & F s8~8&9:999999999G;Z;t==I?U?AABBBB_CsCaEkEFFFFI"I2L=LMMMNVNYNPPQQQQRRR RNR[RSSWX^XiXYY-Y>Y[[<^=^Y_z_dddeceeee h 6h mHsHjwMh U h 5j?h Ujh Uh h B*phL7:8:?:::{qqq  & F$IfkdR@$$Ifl44F P$\j 0    4 laf4:::;;}sss  & F$IfkdA$$IflFF P$\j 0    4 la;;;;<}sss  & F$IfkdA$$IflFF P$\j 0    4 la<<<<F=}sss  & F$IfkdjB$$IflFF P$\j 0    4 laF=G=H=s=t==h>?H?I?}tit`ttWU  & F^  & F^  & F@&^  & F^kdC$$IflGF P$\j 0    4 la I?U???????6@lbb  & F$IfqkdC$$Ifl440 $\04 laf4  & F$If^  & F^  & F^6@7@=@`@  & F$IfnkdlD$$IflF0 $\04 la`@a@g@@  & F$IfnkdE$$IflF0 $\04 la@@@@  & F$IfnkdE$$IflF0 $\04 la@@@A  & F$Ifnkd=F$$IflG0 $\04 laAAAEA  & F$IfnkdF$$IflG0 $\04 laEAFAMAzA  & F$IfnkdsG$$IflG0 $\04 lazA{AAA  & F$IfnkdH$$IflG0 $\04 laAAAABBBuC`EaEkEFFFHyyyyyyyy  & F^  & F^ & FnkdH$$IflG0 $\04 laHlHII"IIJKKK7K  & F$If  & F^ & F&dP^  & F^ 7K8K:KK  & F$IfqkdDI$$Ifl440 !04 laf4KKKK  & F$IflkdI$$Ifl0 !04 laKKK1L2L=LLLLMwnndd  & F$If  & F^  & F^  & F^  & F^lkd{J$$Ifl0 !04 la MMM&M  & F$IfqkdK$$Ifl440 !04 laf4&M'M+MlM  & F$IflkdK$$Ifl0 !04 lalMmMqMM  & F$IflkdIL$$Ifl0 !04 laMMMMMMNwNNO(PpPPuh  & F^`  & F@&^  & F^  & F^lkdL$$Ifl0 !04 la PP[R\RfRyRzRRRvll  & F$IfqkdM$$Ifl440\ !k04 laf4  & F$If & F  & F^RRRS  & F$IflkdN$$Ifl0\ !k04 laSSSTS  & F$Iflkd1O$$Ifl0\ !k04 laTSUSXSS  & F$IflkdO$$Ifl0\ !k04 laSSSSSSSSyoo  & F$If  & F@&^  & F^ & Flkd_P$$Ifl0\ !k04 laSSSU  & F$IfqkdP$$Ifl440\ !k04 laf4UUUW  & F$IflkdQ$$Ifl0\ !k04 laWWWWWXWWWWX]X^XiXXyppyp  & F^  & F^  & F^ & Flkd-R$$Ifl0\ !k04 la XXXXYYYYYYYcYSZ[[[[v]]0^ & F h^ & F'dQ^  & F^` & F  & F^ & F & F  & F^0^<^=^__Y_z__ECCCYkdES$$Ifl8n 04 la6 YkdR$$Ifl8n 04 la6 $If__/ccdddceeeeeeeee?kdS$$If0# a  & F h$If  & F^`  & F^ & F & F h^eeeeeeeeeffff/fNOSiFf֕ߕ h 5h B*mH phsH jnh Uh B*mHphsHjjh Ujh Uh mHsH h 6h mHsHh B*ph h 5\h >v!wVwWwXwawzwwwx x xxFxPxXx$If & FXxYx_xlx$IfqkdZ$$Ifl440!H 04 laf4lxmxsxx$IflkdZ$$Ifl0!H 04 laxxxx$IflkdQ[$$Ifl0!H 04 laxxxxxy$Iflkd[$$Ifl0!H 04 layyy%y$Iflkd\$$Ifl0!H 04 la%y&yFycyzz$Iflkd]$$Ifl0!H 04 lazzzz$Iflkd]$$Ifl0!H 04 lazzz{$IflkdD^$$Ifl0!H 04 la{ {{;{$Iflkd^$$Ifl0!H 04 la;{<{U{{$Iflkdr_$$Ifl0!H 04 la{{{{$Iflkd `$$Ifl0!H 04 la{{{{$Iflkd`$$Ifl0!H 04 la{{|>|$Iflkd7a$$Ifl0!H 04 la>|?|Y||$Iflkda$$Ifl0!H 04 la||||$Iflkdeb$$Ifl0!H 04 la||| }$Iflkdb$$Ifl0!H 04 la } }}V}$Iflkdc$$Ifl0!H 04 laV}W}^}j}$Iflkd*d$$Ifl0!H 04 laj}k}v}}$Iflkdd$$Ifl0!H 04 la}}}4~$IflkdXe$$Ifl0!H 04 la4~5~?~~$Iflkde$$Ifl0!H 04 la~~~~$Iflkdf$$Ifl0!H 04 la~~?$Iflkdg$$Ifl0!H 04 la?@[>$Iflkdg$$Ifl0!H 04 la>?Fk$IflkdKh$$Ifl0!H 04 laklz$Iflkdh$$Ifl0!H 04 la:B-Dlkdyi$$Ifl0!H 04 la>цȈ݉\$If 4T^4`T&$Ifqkdj$$Ifl440 !n04 laf4&')Z$Iflkd-k$$Ifl0 !n04 la\$Iflkdk$$Ifl0 !n04 la\]_$Iflkd[l$$Ifl0 !n04 la$Iflkdl$$Ifl0 !n04 la܎$Iflkdm$$Ifl0 !n04 la Si<mEF ^`lkd n$$Ifl0 !n04 laFfNʘ^ךؚМۜ\i <K ^`^͜Мۜ!$(/ JRVaߢ<KhqףqŤ $,0;   +,OPQbXb¨QYw ëU[ h 6h B*mHphsHjh U h 5h B*ph h hh RK֣ףk|lkd.o$$IfF0 %04 Fa $If^ ^`kloޥ $If^lkdo$$IfF0 %04 Faޥߥ5 $If^lkdnp$$IfF0 %04 Fa568QbXbT`ë ^`lkdq$$IfF0 %04 FaëU[!s4m67VUVtC@& ^`!5mv)4:RtвCT")+.4;<?ɴK[_n~̷ݷ}lw%-EOҽڽ0Aq3Oh OJQJ h 0J h 0J h 5 h 6h mHsHh h B*phQCTnҶӶM89K}պ[\hƼ+ƽͽν ++,ǿ)=[\KL3, & FOWdwit4{w\]jk~O%016@BLCu2Dh 5mHsHh CJmHsH h CJh mHsHh mH sH h B*ph h 5h  h 6L{*+ $If^ & F & F  & F^` & FIJ+lkd5r$$Ifl0 04 la  $If^\kdq$$Ifl404 la f4JUjknlkdr$$Ifl0 04 la  $If^ $If^lkdcs$$Ifl0 04 la 'N $If^lkds$$Ifl0  04 la NOa $If^lkdt$$Ifl0  04 la  $If^lkd(u$$Ifl0  04 la 4 $If^lkdu$$Ifl0  04 la 45Pv $If^lkdVv$$Ifl0  04 la vwxyz $If^lkdv$$Ifl0  04 la +lkd x$$Ifl0 04 la  $If^\kdw$$Ifl404 la f4569Oqlkdx$$Ifl0 04 la  $If^qrvw} $If^lkd9y$$Ifl0 04 la  $If^lkdy$$Ifl0  04 la  $If^lkdgz$$Ifl0  04 la *[\ $If^lkdz$$Ifl0  04 la \]s~ $If^lkd{$$Ifl0  04 la ~ $If^^lkd,|$$Ifl0  04 la +lkdJ}$$Ifl0 04 la  $If^\kd|$$Ifl404 la f4'@ADZilkd}$$Ifl0 04 la  $If^ijkq} $If^lkdx~$$Ifl0 04 la }~ $If^lkd$$Ifl0  04 la  $If^lkd$$Ifl0  04 la  $If^lkd=$$Ifl0  04 la :;O $If^lkdԀ$$Ifl0  04 la OPa+lkd$$Ifl0 04 la  $If^\kdk$$Ifl404 la f4lkd$$Ifl0 04 la  $If^ $If^lkd $$Ifl0 04 la  $If^lkd$$Ifl0  04 la 0 $If^lkdN$$Ifl0  04 la 01BM $If^lkd$$Ifl0  04 la MNO]^oCu[z2Dlkd|$$Ifl0  04 la Swxu>qZ[lqx$If & F h^D>r !"45678PQcdeflmop hB0J' h 0J'jh 0J'Uh B*phjh B*UphhBjh Uh mH sH h mH sH h mHsHh mHsHh  h h>~xxx$Ifkd$$Ifl4FT@ ,!0    4 layyy$Ifkd$$IflFT@ ,!0    4 layyy$IfkdT$$IflFT@ ,!0    4 la<yyy$Ifkd$$IflFT@ ,!0    4 la<=GJfyyy$Ifkd$$IflFT@ ,!0    4 lafgwzyyy$Ifkd1$$IflFT@ ,!0    4 layyy$IfkdЉ$$IflFT@ ,!0    4 layyy$Ifkdo$$IflFT@ ,!0    4 layyy$Ifkd$$IflFT@ ,!0    4 la7yyy$Ifkd$$IflFT@ ,!0    4 la78BEdyyy$IfkdL$$IflFT@ ,!0    4 ladeoryyy$Ifkd$$IflFT@ ,!0    4 layyy$Ifkd$$IflFT@ ,!0    4 layyy$Ifkd)$$IflFT@ ,!0    4 layyy$IfkdȎ$$IflFT@ ,!0    4 la67qr}}{y{s{q{y{y"! k&kdg$$IflFT@ ,!0    4 la 5678!  !3478h mH sH hBh jh U7 0 00008&P P. A!"#$%4 0000 &P P. A!"#$%# 0&P . A!"#$%b$$If!vh5F5#vF#v:V l5F54ab$$If!vh5F5#vF#v:V l5F54aDyK techsupport@osisoft.comyK >mailto:techsupport@osisoft.comb$$If!vh5F5#vF#v:V l5F54aDyK http://www.osisoft.comyK 0http://www.osisoft.com/b$$If!vh5F5#vF#v:V l5F54ab$$If!vh5F5#vF#v:V l5F54ax$$If!vh5F5 5 #vF#v #v :V l5F5 5 4a}DyK _Toc453142370}DyK _Toc453142371}DyK _Toc453142372}DyK _Toc453142373}DyK _Toc453142374}DyK _Toc453142375}DyK _Toc453142376}DyK _Toc453142377}DyK _Toc453142378}DyK _Toc453142379}DyK _Toc453142380}DyK _Toc453142381}DyK _Toc453142382}DyK _Toc453142383}DyK _Toc453142384}DyK _Toc453142385}DyK _Toc453142386}DyK _Toc453142387}DyK _Toc453142388}DyK _Toc453142389}DyK _Toc453142390}DyK _Toc453142391}DyK _Toc453142392}DyK _Toc453142393}DyK _Toc453142394}DyK _Toc453142395}DyK _Toc453142396}DyK _Toc453142397}DyK _Toc453142398}DyK _Toc453142399}DyK _Toc453142400}DyK _Toc453142401}DyK _Toc453142402}DyK _Toc453142403}DyK _Toc453142404}DyK _Toc453142405}DyK _Toc453142406}DyK _Toc453142407}DyK _Toc453142408}DyK _Toc453142409}DyK _Toc453142411}DyK _Toc453142412}DyK _Toc453142413}DyK _Toc453142414}DyK _Toc453142415}DyK _Toc453142416}DyK _Toc453142417}DyK _Toc453142418}DyK _Toc453142419}DyK _Toc453142420}DyK _Toc453142421}DyK _Toc453142422}DyK _Toc453142423}DyK _Toc453142424$$If !vh54#v4:V l40544a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4$$If !vh5 5 #v #v :V l405 5 4a f4{DyK  bkmkTagGroup$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5,555#v,#v#v#v:V F405,55544 Faf4$$If!vh5,555#v,#v#v#v:V F405,55544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55n5n5#55#v#vn#v##v#v:V F4055n5#5544 Faf4$$If!vh55n5n5#55#v#vn#v##v#v:V F4055n5#5544 Faf4$$If!vh55n5n5#55#v#vn#v##v#v:V F4055n5#5544 Faf4$$If!vh55n5n5#55#v#vn#v##v#v:V F4055n5#5544 Faf4$$If!vh55n5n5#55#v#vn#v##v#v:V F4055n5#5544 Faf4$$If!vh55n5n5#55#v#vn#v##v#v:V F4055n5#5544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh535n5n55n5n#v3#vn#v#vn:V F40535n55n44 Faf4$$If!vh535n5n55n5n#v3#vn#v#vn:V F40535n55n44 Faf4$$If!vh535n5n55n5n#v3#vn#v#vn:V F40535n55n44 Faf4$$If!vh535n5n55n5n#v3#vn#v#vn:V F40535n55n44 Faf4$$If!vh535n5n55n5n#v3#vn#v#vn:V F40535n55n44 Faf4$$If!vh535n5n55n5n#v3#vn#v#vn:V F40535n55n44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4DyK bkmkPlaceholders$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4}DyK _Ref438394023$$If!vh55.52#v#v.#v2:V l44055.524af4$$If!vh55.52#v#v.#v2:V l055.524a}DyK _Ref438396779$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a$$If!vh55.52#v#v.#v2:V l055.524a}DyK _Ref438177675$$If!vh55#v#v:V l440554af4$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l440554af4$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a{DyK  bkmkStrategy$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5355555#v3#v#v#v#v#v:V F40535555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh55}#v#v}:V l44055}4af4$$If!vh55}#v#v}:V l055}4a$$If!vh55}#v#v}:V l055}4a$$If!vh55}#v#v}:V l44055}4af4$$If!vh55}#v#v}:V l055}4a$$If!vh55}#v#v}:V l055}4a$$If!vh55}#v#v}:V l055}4a}DyK _Ref438394620$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4wDyK  bkmkSingle$$If!vh5555F55#v#v#v#vF#v:V l4405555F54af4$$If!vh5555F55#v#v#v#vF#v:V l05555F54a$$If!vh5555F55#v#v#v#vF#v:V l05555F54a$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh555n5a55#v#v#vn#va#v#v:V l440555n5a554af4$$If!vh555n5a55#v#v#vn#va#v#v:V l0555n5a554a$$If!vh555n5a55#v#v#vn#va#v#v:V l0555n5a554a$$If!vh555n5a55#v#v#vn#va#v#v:V l0555n5a554a$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55Q55m5n5n#v#vQ#v#vm#vn:V F4055Q55m5n44 Faf4$$If!vh55Q55m5n5n#v#vQ#v#vm#vn:V F4055Q55m5n44 Faf4$$If!vh55Q55m5n5n#v#vQ#v#vm#vn:V F4055Q55m5n44 Faf4$$If!vh55Q55m5n5n#v#vQ#v#vm#vn:V F4055Q55m5n44 Faf4$$If!vh55Q55m5n5n#v#vQ#v#vm#vn:V F4055Q55m5n44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5355555#v3#v:V F4053544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh5V 5V 5V #vV :V F405V 44 Faf4$$If!vh55i55#v#vi#v#v:V l44055i554af4$$If!vh55i55#v#vi#v#v:V l055i554a$$If!vh55i55#v#vi#v#v:V l055i554a$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh555555#v#v#v:V F4055544 Faf4$$If!vh555555#v#v#v:V F4055544 Faf4$$If!vh555555#v#v#v:V F4055544 Faf4$$If!vh555555#v#v#v:V F4055544 Faf4$$If!vh555555#v#v#v:V F4055544 Faf4$$If!vh555555#v#v#v:V F4055544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V l44055554af4$$If!vh5555#v#v#v#v:V l055554a$$If!vh5555#v#v#v#v:V l055554a$$If!vh5555#v#v#v#v:V l44055554af4$$If!vh5555#v#v#v#v:V l055554a$$If!vh5555#v#v#v#v:V l055554aDyK bkmkPlaceholders$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5N55555#vN#v#v#v#v:V F405N555544 Faf4$$If!vh5N55555#vN#v#v#v#v:V F405N555544 Faf4$$If!vh5N55555#vN#v#v#v#v:V F405N555544 Faf4$$If!vh5N55555#vN#v#v#v#v:V F405N555544 Faf4$$If!vh5N55555#vN#v#v#v#v:V F405N555544 Faf4$$If!vh5N55555#vN#v#v#v#v:V F405N555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5N5355#vN#v3#v#v:V F405N535544 Faf4$$If!vh5N5355#vN#v3#v#v:V F405N535544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5n55 #vn#v#v :V F05n55 44 Fa$$If!vh5n55 #vn#v#v :V F05n55 44 Fa$$If!vh5n55 #vn#v#v :V F05n55 44 Fa$$If!vh5. 5555#v. #v#v:V F405. 5544 Faf4$$If!vh5n55555#vn#v#v#v:V F40+5n55544 Faf4$$If!vh5n55555#vn#v#v#v:V F40+55544 Faf4$$If!vh5n55555#vn#v#v#v:V F40+55544 Faf4}DyK _Ref438362272$$If!vh5n5#vn#v:V F405n5/ 44 Faf4$$If!vh55Z5[5[5[#v#vZ#v[:V l44055Z5[4af4$$If!vh55Z5[5[5[#v#vZ#v[:V l40+55Z5[4af4$$If!vh55Z5[5[5[#v#vZ#v[:V l40+5Z5[4af4$$If!vh55Z5[5[5[#v#vZ#v[:V l40+5Z5[4af4$$If!vh55Z5[5[5[#v#vZ#v[:V l40+55Z5[4af4$$If!vh55Z5[5[5[#v#vZ#v[:V l40+5Z5[4af4$$If!vh55Z5[5[5[#v#vZ#v[:V l40+5Z5[4af4$$If!vh55Z5[5[5[#v#vZ#v[:V l055Z5[4a$$If!vh55Z5[5[5[#v#vZ#v[:V l055Z5[4aDyK bkmkPlaceholders$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh55n5n5n5n5n#v#vn:V F4055n44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh55#v#v:V F405544 Faf4$$If!vh55#v#v:V F405544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F4 0544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5j 5Q5R5Q5R5R#vj #vQ#vR#vQ#vR:V F405j 5Q5R5Q5R44 Faf4$$If!vh5j 5Q5R5Q5R5R#vj #vQ#vR#vQ#vR:V F405j 5Q5R5Q5R44 Faf4$$If!vh5j 5Q5R5Q5R5R#vj #vQ#vR#vQ#vR:V F405j 5Q5R5Q5R44 Faf4$$If!vh5j 5Q5R5Q5R5R#vj #vQ#vR#vQ#vR:V F405j 5Q5R5Q5R44 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4$$If!vh5555#v#v#v#v:V F40555544 Faf4DyK bkmkPlaceholders$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh55F5555#v#vF#v#v#v#v:V F4055F555544 Faf4$$If!vh5#v:V F40544 Faf4$$If!vh55#v:V F40544 Faf4$$If!vh55#v:V F40544 Faf4DyK bkmkPlaceholders$$If!vh5\5j5 #v\#vj#v :V l4405\5j5 4af4$$If!vh5\5j5 #v\#vj#v :V lF05\5j5 4a$$If!vh5\5j5 #v\#vj#v :V lF05\5j5 4a$$If!vh5\5j5 #v\#vj#v :V lF05\5j5 4a$$If!vh5\5j5 #v\#vj#v :V lG05\5j5 4a$$If!vh5\5#v\#v:V l4405\54af4$$If!vh5\5#v\#v:V lF05\54a$$If!vh5\5#v\#v:V lF05\54a$$If!vh5\5#v\#v:V lF05\54a$$If!vh5\5#v\#v:V lG05\54a$$If!vh5\5#v\#v:V lG05\54a$$If!vh5\5#v\#v:V lG05\54a$$If!vh5\5#v\#v:V lG05\54a$$If!vh5\5#v\#v:V lG05\54a$$If!vh55#v#v:V l440554af4$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l440554af4$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554a$$If!vh55#v#v:V l0554aDyK bkmkPlaceholders$$If!vh55k#v#vk:V l44055k4af4$$If!vh55k#v#vk:V l055k4a$$If!vh55k#v#vk:V l055k4a$$If!vh55k#v#vk:V l055k4a$$If!vh55k#v#vk:V l055k4a$$If!vh55k#v#vk:V l44055k4af4$$If!vh55k#v#vk:V l055k4a$$If!vh55k#v#vk:V l055k4a$$If6 !vh5n #vn :V l05n 4a6 $$If6 !vh5n #vn :V l05n 4a6 ^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a^$$If!vh5 5#v #v:V 5 54a$$If!vh555 555#v#v#v #v#v:V F0555 5544 Fa$$If!vh555 555#v#v#v #v#v:V F0555 5544 Fa$$If!vh5H 5#vH #v:V l4405H 54af4$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a$$If!vh5H 5#vH #v:V l05H 54a}DyK _Ref441852290$$If!vh5n5#vn#v:V l4405n54af4$$If!vh5n5#vn#v:V l05n54a$$If!vh5n5#vn#v:V l05n54a$$If!vh5n5#vn#v:V l05n54a$$If!vh5n5#vn#v:V l05n54a$$If!vh5n5#vn#v:V l05n54a$$If!vh5n5#vn#v:V l05n54awDyK  bkmkGlobal$$If!vh55#v#v:V F05544 Fa$$If!vh55#v#v:V F05544 Fa$$If!vh55#v#v:V F05544 Fa$$If!vh55#v#v:V F05544 Fa$$If !vh5#v:V l4054a f4$$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5#v:V l4054a f4$$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5#v:V l4054a f4$$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5#v:V l4054a f4$$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh55#v#v:V l0554a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If !vh5 5 #v #v :V l05 5 4a $$If!vh555#v#v:V l40554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a$$If!vh555#v#v:V l0554a.8@8 Normal_HmH sH tH `@` Heading 1$$1$@&5B*CJ0OJQJmH sH uV@V Heading 2$xx@&5CJOJQJmH sH uZ@Z Heading 4$xx@&56CJOJQJmHnHuh@h Heading 5$dxx@&^5B*CJOJQJmH sH uZ@Z Heading 6$$@&5CJ0OJQJmH sH uDA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k@(No List HOH BodyText<<^ mH sH u0U@0 Hyperlink>*B*hOhTitleDoc$$8a$)56CJ<OJQJ_HmHnHsH tH uNON TOCHeading $h(h@& ^h`POP TableHead $<<5OJQJmH sH uNOBN TableText $<<OJQJmH sH u\OR\ Copyright$dxa$B*CJOJQJmH sH u@OQb@ CopyrightAddressCJV@VTOC 1dxx "" B*CJOJQJmHnHu>@q> TOC 2^ mH sH uR@R TOC 4 "" dx^B*CJmH sH u0O0 Note$d&d>'> Comment ReferenceCJT @TFooter K%%%]%^%OJQJmHnHufOfCompTxt$$ h<1$^`5B*OJQJmHnHuO ListBulletp & F>Th^`HOH File name6CJOJQJkHmHnHuTOT CompTxtInline!5B*CJOJQJkHmHnHu\@\ Header! K%%dx^%B*CJOJQJmH sH u@O"@ TitleFooter"$a$5CJ0T2T  Comment Text#dxB*CJmH sH u6B6  Footnote Text$@&Q@ Footnote ReferenceH*@Yb@  Document Map&-D OJ QJ .)@q. Page Number.. TOC 3 (^.. TOC 5 ) ^ .. TOC 6 *^.. TOC 7 +^.. TOC 8 ,x^x.. TOC 9 -@^@89ocu{%&5rs238JG'x2i" f T  N  d 6 O{3f2c `1^ApWU ,RSlpq%()/IJS_`nrs.!~!!!6"m""-#####$r$$0%P%%%%%&&&&4&((())*****++++5+6+J+T+^+h+r+|+}+++++++++++++++++++++++++++++++++++++++,,,,7,N,d,,,,,,,,)--A..9/////;0<0=0>0[0\0p0z00000000000000000000000000000000000000000 111$1.1/1I1`11112 2!2D2}222@3A3Z346A6h6i66666777!7,767A7K7L7V7a7k7v7w7}777777777777777777777777888888 8 8 8 8 888`8a8n8x8888889G9q9r9s99:;O<;=w===>>> >&>'>;>I>T>_>i>t>~>>>>>>>>>>>>>>>>>>>>>>>? ???????1?9?:?;????@?A?B?C?D?E??????????@:@f@@@@@@@ACDD'E(EEEEEEEEF FFF8FZFFFFFFFFFFFFFFFFFFFFFFFGGG G!G"G#G$G%G&G'G(G)G*G=G>GLGVGaGjGkGGGG H5HUHHHHHH;KdKKKKKLLLdPdldmdnddddddddde2eDeEebecedeeeueeeeeeeeeeeeffff#f.fAfBfMfbfufvfffffffffffffffff g7g@gAgBgCggggghhhhjjjllmmmmm*mHmIm]m~mmmmmmmmmnn&n2n3n]nknlnnnnIoUoVovpppppqq1q2q3q;qLqXqYqjqxqyqzqrr|sss)t1t;t?@ABv*4>HR\]kmoqsuvwxyz{|}ц҆߆"9jć LMNe23=IJLklnxyTU_yz|236Ҏ ZґIJ0wEFxyϖЖFGHIfg{×ŗǗɗʗ˗̗͗ΗϗЗїߗ #$.:CMNhژ +Yۚ-Ӝ5S!%4HR\dep}"#1N|}~YZգ֣̥'(EFZefpq{|§çħŧƧǧȧ֧(2=>Xo$_`a>?@xˬԬլ"INOLP_s}ȯɯʯد 01 01_G͵ϵ.~TUOPQRopŸϸڸ۸-/2PTsuwxɹֹ"(/0d&U˻<&'()FG[fgqr|;׾ؾپھ۾ܾ#,67s#b Bg67KVWablv "#09CD-m o4BC[\xy$%/0:DNO #9STUV&'Ist$%Z\^`npqrstuvwx:s1cde0GINOoEno'12 !-;<o9]./:BDIJX`byz{BCDEl)ABUlnstdefw2=>HIS]gh)+-/13456789:;ISTUVWXpvwxyz{|}~>p/_`abt ,-5]pqr|6NAg]ijkGH{hijklm,\7?CM\]de$%&*+5678<=opqstu In0Jpq*56@AKU_`~_abcdefghiwCs2deq}~     G H                 / 0 nprt()CuABC\HIJKhi}$,-./012345678KLk1'p".STa : ; F M      ""m$$#%$%*%%%%%&&&&'''''(B(C(U(_()))))0))))))h+++++,Q--7.N.0s0~0&1:11 2(2027282?22222333334444F5G5H5s5t55h67H7I7U77777776878=8`8a8g8888888999E9F9M9z9{999999:::u;`=a=k=>>>@l@AA"AABCCC7C8C:CCCCCCC1D2D=DDDDEEE&E'E+ElEmEqEEEEEEEFwFFG(HpHHH[J\JfJyJzJJJJJKKKTKUKXKKKKKKKKKKKMMMOOOWOXOOOOP]P^PiPPPPPQQQQQQQcQSRSSSSvUU0Vt?tYttttttt u uuVuWu^ujukuvuuuu4v5v?vvvvvvw?w@w[ww>x?xFxkxlxzxxxxxxx:yByyy-zDzzzz{{{>|~Ȁ݁\&')Z\]_܆ Si<mEFfNʐ^גؒД۔\i <K֛כkloޝߝ568QbXbT`ãU[!s4m67VUVtCTnҮӮM89K}ղ[\hƴ+Ƶ͵ε +,Ƿ)=[\KLۺܺ3ռ,߽¿{*+IJUjkn'NOa45Pvwxyz569Oqrvw}*[\]s~'@ADZijkq}~:;OPa01BMNO]^oCu[z2DSwxu>qZ[lqx<=GJfgwz78BEdeor67qr59000c 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000000000000000000!0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 000000 0 0 0 0 0 0 0 0 0 0  0  0  0  0  0 0 0 00000000&0&80&H0(0(0(0(0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0( 0(0( 0(0( 0(0( 0(0( 0( H0(H0(0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,0, 0,0, 0, 0,0,0,0,0,0,0,H0(0A30A30A30A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A30A3 0A30A3 0A30A3 0A30A3 0A30A3 0A3 0A3 0A3 0A3 0A30A30A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A3 0A30A3 0A30A3 0A30A3 0A3 H0(H0(0s90s90s90s90s90s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s90s9 0s90s9 0s90s9 0s9 0s90s9 0s90s9 0s9 0s90s9 0s9 0s9 0s90s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s90s9 0s90s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s9 0s90s9 0s90s9 0s90s9 0s90s9 0s9 0s90s900@0@0@0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@0@0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@0@ 0@0@ 0@0@ 0@0@ 0@ 0@00H0H0000K00K0K0L0L0000N0N0N0N0N000P0P0P0P0P0P0P0P0P0S0S0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S0S 0S 0S0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S 0S0S0S0S0S0S0S0S0S0S0S0P0P0j0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j 0j0j 0j 0j 0j 0j 0j 0j 0j 0j0j 0j 0j 0j 0j 0j 0j0j 0P 0r 0 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s 0|s000{0{0{0{0{0}0} 0} 0} 0} 0} 0} 0} 0}0}0}0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0}0} 0}0} 0}0} 0}0} 0} 0} 0}0}0}0}0}0}0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0}0} 0}0} 0}0} 0}0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0}0} 0} 0}0{ 0y 0y 0y 0y 0y 0y 0y 0y 0y 0y 0y 0y 0y 0y 0y0{H0 0Ҏ 000 0 0000 00H0 0J 0J 0J 0J 0J 0J0J0J0J0J0J0J 0J 0J 0J 0J 0J 0J 0J 0J 0J0J 0J0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J 0J0J 0J0J 0J0J 0J0J 0J 0J0 0 0 00H0 0 0 0 0 0H0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00H0H0 0֣0֣0֣0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣0֣ 0֣0֣ 0֣0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣0֣0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣ 0֣0֣ 0֣0֣ 0֣0֣ 0֣ 0֣0֣0֣0֣ 0֣ 0֣0H0@ 0x 0x 0 0 0 0 0լ 0լ 0լ 0լ 0լ 0լ0լH0լ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00000H0լ 0 0H0լ01010101H0լ000 0H0լ 0 0 00000 0 0 0 0 0 0 0 0 00 00 00 00 00 0 00 0 00 00 0 0 0 0 0 0 0 0 0 0 0 00000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 00 00 00 0 0 0լ0000 0 0 0 0 0 0 0 0 00 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 00 00 0 00 0 0լ 0 000 0 00 0 0 0 0 0 0 00 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 00 00 0 0 0լ 0 0 0 0 00 000 0 0 0 0 0 00 0 0 0 0 0 0 00 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0լ 0V 0V0V0V 0V 0V 0V 0V 0V 0V 0V 0V 0V0V 0V0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V 0V0V 0V0V 0V0V 0V 0V0V0V 0V 0V0լ00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00000 0 0 0 0 0 0 0 0 00 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 00 00 00 0 00լ0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 000000լ0E0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E0E 0E 0E 0լ 0f0f0f 0f 0f 0f 0f 0f 0f 0f 0f 0f0f 0f0f 0f 0f 0f 0f 0f0f0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f0f0f0f 0f 0f 0f 0f 0f0f 0f0f 0f0f 0f0f 0f 0f 0f 0f 0f 0f 0f 000000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00000000000000000000m0m0m0m0m0m0m0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m ,0m 0m 0m 0m 0m 0m ,0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m ,0m 0m 0m 0m 0m 0m ,0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m 0m000IH0I00H0I0000 0 0 0 0 0 0 0 0 00 00 0 0 0 0 00000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 00 00 00 0 0 0 0 00 00 0 0000 0 0 0 0 0 0 0 0 00 00 0 0 0 0 0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 00 00 00 00 0 000C0C0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C0C 0C0C 0C H0C00000H0000000H0000000T0T0T0T0TH0; 0F 0F 0F 0TH0 0 0 0 0 0 H0 0$%0$%0$%H0 0%0%0TH0&0&0&0&H0&0'0'0'0TH0C(0U(0U(0U(0TH0)0))0))0))0TH0)0)0)0)0TH0+0+0+0+0+ 0 07. 07.H 07. 0s0H 07. 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0&1 0 0H5H 0H5 0t5 0t5 0t50t5H 0H5 0I70I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7 0I7H 0H5 09 09H 0H5 0: 0: 0:H 0H5 0a= 0a=H 0H5 0> 0> 0>0>H 0H5 0A 0A0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0AH 0H5 02D 02D 02D 02D 02D 02D 02D 02D 02D 02D 02D 02D 02D 02D H 0H5H 0H5 0E 0 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0EH 0E 0 0K 0K 0K 0K 0K 0K 0K 0K 0K 0K 0K 0K0K 0K0K0KH 0K 0O 0OH 0K 0^P 0^P 0^P 0^P 0 ^P 0^P 0^P 0^P 0^P0^P 0 0Q 0Q 0Q 0Q 0Q00S0S 0S0S 0S 0S 0S 0S0S0S0S 0S 0S 0S0S 0 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 00`0`0`0`0`0` 0 0^f 0^f 0^f 0^f 0^f0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0^f 0 ^f 0 ^f 0 ^f 0 ^f 0^f 0^f0^f0^f0^f0^f0^f0^f0^f 0^f0^f00k0k0k0k0k0k0k 0k0k0k 0k 0k 0k 0k0k0k0k0k0k0k 0k0k0k00 p0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p0p0p 0p 0p 0p 0p 0p 0p0p 0p0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p 0p0p 0p 0p 0p 0p 0p 0p 0p 0p0p0 pH0x0xH0x0:yH0x0yH0x0-z0-z0-z0-z0-z0-z0-z0-z0-z0-z0-z0-z0-z0-z0-zH0x000 0 0 0 00 0 0 00 0 0 00 0 0 0 0 0 0 0 0 00 0 0H0x00H0x0H0x0SH0x00000H0x0F0F0FH0x0H0x0000000H0x0H0x0Д0Д0Д0Д0Д0ДH0x0H0x0<0<0<0< 0< 0< 0< 0< 0< 0< 0< 0< 0< 0< 0< 0<0<H0x0QH0x0H0x0X0X0X0X0X0XH0x0H0x0H0x0H0x0UH0x0H00H00000040404040707070704H0V0t0t0tH0V0000000H0V0909090909090904040\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\040K0K00ܺ0ܺ0ܺ00ռ 0ռ 0ռ\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0 \>0 \>0 \>0 \>0 \>0 \>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\~0@\~0@\~04@0\~04@0\~0@!0\~0@!0\~0 @0H %&rs23 RSpq()IJ_`rs**++++5+6+|+}+++++++++++++,,,,//;0<0=0>0[0\0000000000000 11.1/12 2h6i6666677v7w77777778888`8a888q9r9==>>> >&>'>>>>>>>??=?>?D?E?????@@'E(EEEEEFFFFFFFF"G#G)G*G=G>GjGkGHHrXsXXXYYjYkYYY+[,[A[B[[[[[\\c\d\\\\\ ] ]N]O]]]]]^^)^*^_^`^^^^^__\_]_______``G`H`y`z`````aaKaLaaaaaaabbQbRbbbbbbb)c*c_c`ccccc d d=d>dmdndddddDeEedeeeeeeeeeffAfBfufvfffffffff@gAgmmmmHmIm~mmmmmmnn2n3nknlnnnUoVoppqq2q3qXqYqxqyq;t_` OPQRopڸ۸wx/0&'()FG۾ܾ6767"#CDBC[\xyNO STst$%pqwxcdNOno12 ;<./IJyzABstgh34:;WXz{_`ab,-pqij\]56op pq_`abhide}~  G H         ()ABHIJKhi0178KL7282223344F5G5776878`8a8888899E9F9z9{9997C8CCCCCEE&E'ElEmEEEyJzJJJKKTKUKKKKKMMOOt?ttttt u uVuWujukuuu4v5vvvvv?w@w>x?xkxlxxx&'\]klޝߝ56IJjkNO45vw56qr\]~@Aij}~OP01MN<=fg78de9\>0@\>0\>0x\>0\>0\>0\>0\>0\>0 \>0\>0 \>0\>0 &\>0\>0p\>0\>0\>0\>0(\>0\>0L(\>0\>0(\>0\>0\>0\>0<\>0\>0t\>0\>0̮\>0\>0 \>0\>0"<\>0\>0$#\>0\>0&#\>0\>0($\>0\>0*H$\>0\>0,$\>0\>0.`\>0\>00\>0\>02Ю\>0\>04\>0\>06@\>0\>08l\>0\>0:\>0\>0<\>0\>0>\>0\>0@L\>0\>0B\>0\>0D\>0\>0F8\>0\>0Hp\>0\>0J\>0\>0L\>0\>0N\>0\>0PP\>0\>0R\>0\>0T\>0\>0V\>0\>0X\>0\>0Z\>0\>0\(\>0\>0^`\>0\>0`\>0\>0b\>0\>0d\>0\>0f@\>0\>0hx\>0\>0j\>0\>0l\>0\>0n`\>0\>0pa\>0\>0r@a\>0\>0txa\>0\>0va\>0\>0xa\>0\>0z b\>0\>0|Xb\>0\>0~b\>0\>0b\>0\>0c\>0\>08c\>0\>0pc\>0\>0c\>0\>0X\>0\>0\>0\>0ȹ\>0\>0\>0\>08\>0\>0p\>0\>0\>0\>0\>0\>0\>0\>0P\>0\>0\>0\>0\>0\>0\>0\>00\>0\>0h\>0\>0\>0\>0ؼ\>0\>0\>0\>0\>0\>00\>0\>0h\>0\>0\>0\>0\>0\>0\>0\>0H\>0\>0\>0\>0\>0\>0\>0\>0(\>0\>0`\>0\>0\>0\>0\>0\>0\>0\>0@\>0\>0x\>0\>0\>0\>0\>0\>0 \>0\>0X\>0\>0 \>0\>0D\>0\>0|\>0\>0\>0\>0\>0\>0$\>0\>0\\>0\>0\>0\>0\>0\>0\>0\>0<\>0\>0t\>0\>0\>0\>0\>0\>0\>0\>0T\>0\>0\>0\>0\>0\>0\>0\>04 \>0\>0l \>0\>0 \>0\>0 \>0\>0!\>0\>0L!\>0\>0 !\>0\>0 !\>0\>0#\>0\>0<#\>0\>0t#\>0\>0#\>0\>0#\>0\>0$\>0\>0T$\>0\>0$\>0\>0$\>0\>0 $\>0\>0"4%\>0\>0$l%\>0\>0&%\>0\>0(%\>0\>0*&\>0\>0,L&\>0\>0.&\>0\>00&\>0\>02&\>0\>04,'\>0\>06d'\>0\>08'\>0\>0:'\>0\>0< (\>0\>0>D(\>0\>0@|(\>0\>0B(\>0\>0D(\>0\>0F$)\>0\>0H\)\>0\>0J)\>0\>0L)\>0\>0N*\>0\>0P<*\>0\>0R+\>0\>0T,\>0\>0V8,\>0\>0Xp,\>0\>0Z,\>0\>0\,\>0\>0^-\>0\>0`P-\>0\>0b-\>0\>0d-\>0\>0f-\>0\>0h0.\>0\>0jh.\>0\>0l.\>0\>0n.\>0\>0p/\>0\>0rH/\>0\>0t/\>0\>0v/\>0\>0x/\>0\>0z(0\>0\>0|`0\>0\>0~0\>0\>00\>0\>01\>0\>0@1\>0\>0x1\>0\>01\>0\>01\>0\>0 2\>0\>0X2\>0\>02\>0\>02\>0\>03\>0\>083\>0\>0p3\>0\>03\>0\>03\>0\>04\>0\>0P4\>0\>04\>0\>04\>0\>04\>0\>06\>0\>07\>0\>0H7\>0\>07\>0\>07\>0\>07\>0\>0(8\>0\>0`8\>0\>08\>0\>08\>0\>09\>0\>0@9\>0\>0x9\>0\>09\>0\>09\>0\>0 :\>0\>0X:\>0\>0:\>0\>0:\>0\>0;\>0\>08;\>0\>0p;\>0\>0;\>0\>0;\>0\>0<\>0\>0P<\>0\>0<\>0\>0<\>0\>0<\>0\>00=\>0\>0h=\>0\>0=\>0\>0=\>0\>0>\>0\>0H>\>0\>0>\>0\>0>\>0\>0>\>0\>0(?\>0\>0`?\>0\>0?\>0\>0?\>0\>0@\>0\>0@@\>0\>0x@\>0\>0@\>0\>0@\>0\>0 A\>0\>0XA\>0\>0 A\>0\>0 A\>0\>0B\>0\>08B\>0\>0D\>0\>0D\>0\>0D\>0\>0(E\>0\>0`E\>0\>0E\>0\>0E\>0\>0 F\>0\>0"@F\>0\>0$xF\>0\>0&F\>0\>0(F\>0\>0* G\>0\>0,XG\>0\>0.G\>0\>00G\>0\>02H\>0\>048H\>0\>06pH\>0\>08H\>0\>0:H\>0\>0<I\>0\>0>PI\>0\>0@I\>0\>0BI\>0\>0DI\>0\>0F0J\>0\>0HhJ\>0\>0JJ\>0\>0LJ\>0\>0NK\>0\>0PHK\>0\>0RK\>0\>0TK\>0\>0VK\>0\>0X(L\>0\>0Z`L\>0\>0\L\>0\>0^L\>0\>0`M\>0\>0b@M\>0\>0dxM\>0\>0fM\>0\>0hM\>0\>0j N\>0\>0lXN\>0\>0nN\>0\>0pN\>0\>0rO\>0\>0t8O\>0\>0vpO\>0\>0xO\>0\>0zO\>0\>0|P\>0\>0~PP\>0\>0P\>0\>0P\>0\>0P\>0\>00Q\>0\>0hQ\>0\>0Q\>0\>0Q\>0\>0R\>0\>0HR\>0\>0R\>0\>0R\>0\>0U\>0\>0U\>0\>0U\>0\>0,V\>0\>0dV\>0\>0V\>0\>0V\>0\>0 W\>0\>0DW\>0\>0|W\>0\>0W\>0\>0W\>0\>0$X\>0\>0\X\>0\>0X\>0\>0X\>0\>0Y\>0\>00\>0tY\>0\>0Y\>0\>0Y\>0\>0Z\>0\>0TZ\>0\>0Z\>0\>0Z\>0\>0Z\>0\>04[\>0\>0l[\>0\>0[\>0\>0[\>0\>0\\>0\>0L\\>0\>0\\>0\>0\\>0\>0\\>0\>0,]\>0\>0d]\>0\>0]\>0\>0]\>0\>0 ^\>0\>0D^\>0\>0|^\>0\>0^\>0\>0^\>0\>0$_\>0\>0\_\>0\>0_\>0\>0_\>0\>0`\>0\>0<`\>0\>0t`\>0\>0`\>0\>0`\>0\>0a\>0\>0Ta\>0\>0a\>0\>0a\>0\>0a\>0\>0 4b\>0\>0 lb\>0\>0b\>0\>0b\>0\>0c\>0\>0Lc\>0\>0c\>0\>0c\>0\>0c\>0\>0,d\>0\>0dd\>0\>0 d\>0\>0"d\>0\>0$ e\>0\>0&De\>0\>0(|e\>0\>0*e\>0\>0,e\>0\>0.$f\>0\>00\f\>0\>02f\>0\>04f\>0\>06g\>0\>080\>0:j\>0\>0<j\>0\>0> k\>0\>0@Xk\>0\>0Bk\>0\>0Dk\>0\>0Fl\>0\>0H8l\>0\>0Jpl\>0\>0Ll\>0\>0Nl\>0\>0Pm\>0\>0RPm\>0\>0Tm\>0\>0Vm\>0\>0Xm\>0\>0Z0n\>0\>0\hn\>0\>0^n\>0\>0`n\>0\>0bo\>0\>0dHo\>0\>0fo\>0\>0ho\>0\>0jo\>0\>0l(p\>0\>0n`p\>0\>0pp\>0\>0rp\>0\>0tq\>0\>0v@q\>0\>0xxq\>0\>0zq\>0\>0|q\>0\>0~ r\>0\>0Xr\>0\>0r\>0\>0r\>0\>0s\>0\>08s\>0\>0ps\>0\>0s\>0\>0s\>0\>0t\>0\>0Pt\>0\>0t\>0\>0t\>0\>0t\>0\>00u\>0\>0hu\>0\>0u\>0\>0u\>0\>0v\>0\>0Hv\>0\>0v\>0\>0v\>0\>0v\>0\>0(w\>0\>0`w\>0\>0w\>0\>0w\>0\>0x\>0\>0@x\>0\>0xx\>0\>0x\>0\>0x\>0\>0 y\>0\>0Xy\>0\>0y\>0\>0y\>0\>0z\>0\>08z\>0\>0pz\>0\>0z\>0\>0z\>0\>0{\>0\>0P{\>0\>0{\>0\>0{\>0\>0{\>0\>00|\>0\>0h|\>0\>0|\>0\>0|\>0\>0}\>0\>0H}\>0\>0}\>0\>0}\>0\>0}\>0\>0(~\>0\>0`~\>0\>0~\>0\>0~\>0\>0\>0\>0@\>0\>0x\>0\>0\>0\>0\>0\>0 \>0\>0X\>0\>0\>0\>0Ȁ\>0\>0\>0\>08\>0\>0 x\>0\>0 \>0\>0腶\>0\>0 \>0\>0X\>0\>0\>0\>0Ȇ\>0\>0\>0\>08\>0\>0p\>0\>0\>0\>0 \>0\>0"\>0\>0$P\>0\>0&\>0\>0(\>0\>0*\>0\>0,0\>0\>0.h\>0\>0;>mmm/11lllo5!`1o+jO08 FPq[О(t25J s8etOD8,D^$@Um 5G% 2 "R#p###$$($I$_$r$$$$$$+23J3|33333333447<8\888888888.9:<>?v?????@@@`@@qAEF;FFFFFGG=GBGGGHLMNNNNNN O%O*OjOPS_`ajaa+cAcccdcddd eNeeef)f_fffg\gggghGhyhhhiKiiiijQjjjj)k_kkk l=lmlllDmdmmmmnAnunnnnn@oruHu~uuuv2vkvvUwxy2yXyxy;|D|}^~~),6kNNJΊӊ ]UB\qx} 3ky2ϞH{ß˟П #MSd1~'Zů=_ط0Q/w/([6g6 "C4\NSs$^rwcNn1 ;.Iysg)38SXz_a,pii\5o   _  af}GnIi.38!"&.57::;<F=I?6@`@@@AEAzAAH7KKKM&MlMMPRSTSSSUWX0^_efxffggLpkpppvXxlxxxy%yzz{;{{{{>||| }V}j}}4~~~?>k&\FKkޥ5ëC+JN4vq\~i}O0M<f7d8      !"#$%&'()*+-./0123456789:;<=>?@ABCEFGHIJKLMNOPQRSTUVWXYZ[\]_`abcdefghijklmnopqrstuvwxyz{|}~      !"#%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTVWXYZ[\]^_`abcdefghijklnopqrstuvwxyz{|}~     !"#$%&'()*+,-./012346789:;<=>?@ABCDEF7 #5Yp4E#%Xtv-0Hdgz  E a d 3 O R   - I L {   C _ b u  1 4 z .JMZvy.1Eadx-0B^ap ?[^,/=Y\g <?OknOqEg9(`((B2BCB R4ReRXYYij`j~~~CV2W/#gNy_111IJJhhhiiiiii jj$jyz)z=N +O8XX t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%ttTt,.58>Wjm+18;=Vio!!!! _Toc372095446 _Toc373116082 bkmkStart _Toc306695088 _Toc306695181 _Ref307134182 _Ref307134260 _Toc307301483 _Toc319482416 _Toc319482520 _Toc319832625 _Toc335816074 _Toc335816484 _Toc335816939 _Toc335817188 _Toc339792494 _Toc339794239 _Toc342463582 _Toc342463607 _Toc453142370 _Toc306695089 _Toc306695182 _Ref307134328 _Toc307301484 _Toc319482417 _Toc319482521 _Toc319832626 _Toc335816075 _Toc335816485 _Toc335816940 _Toc335817189 _Toc339792495 _Toc339794240 _Toc342463583 _Toc342463608 _Toc453142371 _Toc453142372 _Toc453142373 _Toc453142374 _Toc399555506 _Toc453142375 _Toc453142376bkmkPlaceholders _Toc453142377bkmkPlaceholderMapping _Toc434996022 _Toc453142378 _Ref438396779 _Toc453142379 bkmkInput _Toc453142380 bkmkStrategy _Toc453142381 bkmkSingle _Toc453142382 bkmkTagGroup _Toc453142383 _Toc453142384 bkmkMulti _Toc453142385 _Toc453142386 _Toc453142387 bkmkOutput _Toc453142388 _Toc453142389 _Toc453142390 _Toc453142391 bkmkGlobal _Toc453142392 bkmkSpecifics _Toc453142393 _Toc434996023 _Toc453142394 _Ref438177675 _Ref438179474 _Ref438362272 _Toc453142395 _Toc453142396 _Toc453142397 _Ref438394620 _Toc453142398 _Toc453142399 _Toc453142400 _Toc453142401 bkmkTop10 _Toc453142402 _Toc453142403 _Toc453142404 _Toc453142405 _Toc453142406 _Toc453142407 _Toc434665377 _Toc434996052 _Ref441852290 _Toc453142408 _Toc307301486 _Toc319482420 _Toc319482524 _Toc319832629 _Toc335816077 _Toc335816487 _Toc335816942 _Toc335817191 _Toc339792497 _Toc339794243 _Toc342463586 _Toc342463611 _Toc453142409 _Toc373044747 _Toc307301488 _Toc319482422 _Toc319482526 _Toc319832631 _Toc335816079 _Toc335816489 _Toc335816944 _Toc335817193 _Toc339792499 _Toc339794245 _Toc342463588 _Toc342463613 _Toc453142411 _Toc307301489 _Toc319482423 _Toc319482527 _Toc319832632 _Toc335816080 _Toc335816490 _Toc335816945 _Toc335817194 _Toc339792500 _Toc339794246 _Toc342463589 _Toc342463614 _Toc453142412 bkmkStartup _Toc373044752 _Toc453142413 _Ref438394023 _Toc453142414 _Toc453142415 _Toc453142416 _Toc434996061 _Toc453142417 _Toc307301490 _Toc319482424 _Toc319482528 _Toc319832633 _Toc335816081 _Toc335816491 _Toc335816946 _Toc335817195 _Toc339792501 _Toc339794247 _Toc342463590 _Toc342463615 _Toc453142418 _Toc307301492 _Toc319482426 _Toc319482530 _Toc319832635 _Toc335816083 _Toc335816492 _Toc335816947 _Toc335817196 _Toc339792502 _Toc339794248 _Toc342463591 _Toc342463616 _Toc453142419 _Toc453142420 _Toc453142421 bkmkTestEnvbkmkMore _Toc453142422 _Toc453142423 bkmkLimits _Toc453142424cc&(@HHLSSjjjrr}}yy@VVEffmmmmIC; F  &C()7.QSSSS\\\\\\\\\\\\\hkkkkkkkkkkkkk p p p p p p p p p p p p p pppxx7V\\ܺܺܺܺܺܺܺܺܺܺܺܺܺռռռռռռռռռռռռռOO^xx9 JKLMNOPQRSTUVWX !"#$%&'()*,+-./012345A6789:;<=>?@BCDEFGHIYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~tt3&(AHHLSSjjjrr}}ююwʻkvvm[001E L  &T(()M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.QSSSS\\\\\\\\\\\\\BjlllllllllllllppppppppppppppEpEpxxUsgg\\n9ab@AFLM&Xw1Hhz ! E e 3 S  - M {  C c u  5 z .NZz2Eex1Bbp ?_0=]g @OoOE9((BDB RfRXYiaj~~W20hN_11I Jhhiiii j%jwjxjjjekfknnnnsotoy*zO P567depqqry{|~4569ep95a&Xw1Hhz ! E e 3 S  - M {  C c u  5 z .NZz2Eex1Bbp ?_0=]g @OoOE9((BDB RfRXYiaj~~W20hN_11I Jhhiiii j%jy*zO P57dr469mI'6 'Qa d ipf|q| @ 56B*CJ OJQJo( Chapter @ OJQJo(B*CJ*@ ^`OJQJo(hh^h`CJOJQJo(qhh^h`CJOJQJo(qhh^h`.@^`.hh^h`. Hi'Qadq|mI'6tT @ ^`OJQJo( @h ^`OJQJo( @ ^`OJQJo(` @CJ OJQJo("   Bcu{%&5rs238 ,RSlpq%()/IJS_`nrs(*****++++5+6+J+T+^+h+r+|+}+++++++++++++++++++++++++++++++++++++++,,,,N,,,,,////;0<0=0>0[0\0p0z00000000000000000000000000000000000000000 111$1.1/1`112 26A6h6i66666777,7A7L7a7v7w7}7777777777777777777777888888 8 8 8 8 888`8a8n8x88889q9r9;=w===>>> >&>'>I>_>t>~>>>>>>>>>>>>>>>>>>???????1?9?:?;????@?A?B?C?D?E?????????:@@@@DD'E(EEEEEEEEF FFFFFFFFFFFFFFFFFFFFFFFFGGG G!G"G#G$G%G&G'G(G)G*G=G>GLGVGaGjGkGG HUHHHWXGXkXrXsXXXXXXYYY"YiYjYkYqYYYYY*[+[,[2[@[A[B[J[[[[[[[[[\\\+\O\c\d\t\\\\\\\\\\ ] ]];]N]O]\]]]]]]]]]^^^^(^)^*^=^^^_^`^s^^^^^^^^^___+_K_\_]_m_____________```)`F`G`H`Y`x`y`z``````````aaa aJaKaLa\a~aaaaaaaaaaaabbb'bPbQbRb`bbbbbbbbbbbbc(c)c*c=c^c_c`cqcccccccccc d dddPdldmdnddddddddde2eDeEebecedeeeueeeeeeeeeeeeffff#f.fAfBfMfbfufvfffffffffffffffff g7g@gAgjllmmmmm*mHmIm]m~mmmmmmmmmnn&n2n3n]nknlnnnnIoUoVovppppqq1q2q3qLqXqYqjqxqyqs)t1t;tHR\]kmoqsuvwxyz{|}ц҆߆9LM23=IJLklnTU_yz|236yϖЖFGHIfg{×ŗǗɗʗ˗̗͗ΗϗЗїߗ #$.:CMNژ+!%4HR\dep}"#1N|}̥'(EFZfq|§çħŧƧǧȧ֧(2=>o_`LP_s}ȯɯʯد UOPQRopŸڸ۸-/Psuwx"(/0U&'()FG[gr|;׾ؾپھ۾ܾ#,67#Bg67KWblv "#09CD-4BC[\xy%0:DNO #9ST'Ist$%Z\^`npqrstuvwxscd0GINOoEno'12 !-;<]./:BDIJX`byz)ABUlnst2>IS]gh)+-/13456789:;ISTUVWXpvwxyz{|}~>_`ab ,-5]pqr|6NAg]ij7?CM\]e%&*+5678<=opqstu 0Jpq*6AKU_`_abcdefghiwCdeq}~    G H              nprt()CABHIJKhi}$,-./012345678KLk1 2(2027282?22222333334444F5G57777776878=8`8a8g8888888999E9F9M9z9{9999CCC7C8C:CCCCCCDDDEEE&E'E+ElEmEqEEE[J\JfJyJzJJJJJKKKTKUKXKKKKKKKKKMMMOOU0Vt?tYttttttt u uuVuWu^ujukuvuuuu4v5v?vvvvvvw?w@w[w>x?xFxkxlxzxxx&')\]_֛כkloޝߝ56IJUjkn'NOa45Pvw569qrvw}\]s~'@ADijkq}~:;OPa01BMN[lqx<=GJfgwz78BEdeor9@8@@Unknown Gz Times New Roman5Symbol3& z Arial1" Helv;Wingdings7Tms Rmn?5 z Courier NewA& Arial Narrow;& z Helvetica5& z!Tahoma#1SQfzzI G.fG.fA4d2H?FBPlantSuite RDBMS to PIInterface DocumentationOSI Software, Inc. Administrator,        Oh+'00D \h    PlantSuite RDBMS to PIInterface DocumentationOSI Software, Inc.tSI for Version 2.16 or greater  Normal.dot Administrator164miMicrosoft Word 10.0@vA@<"<@$GK{@QG.Properties ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrtuvwxyz}~{Root Entry F@ /Data I1Table4WordDocumentSummaryInformation(sDocumentSummaryInformation8|CompObjjMsoDataStore0/@ /  !  FMicrosoft Word Document MSWordDocWord.Document.89qDocumentLibraryFormDocumentLibraryFormDocumentLibraryForm This value indicates the number of saves or revisions. The application is responsible for updating this value after each revision. cumentation> This value indicates the number of saves or rens:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml"/>h revision. ns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml"/>w> as.microsoft.com/office/2006/metadata/longProperties"/>