Академический Документы
Профессиональный Документы
Культура Документы
Users’ Guide
Version 2014.0.0.2.1
Released: 12/15/2014
Table of Contents
Introduction .................................................................................................................................................. 4
History ....................................................................................................................................................... 4
Audience ....................................................................................................................................................... 5
Architecture Fundamentals .......................................................................................................................... 5
Automatic I/O Binding .......................................................................................................................... 5
Preconfigured Model ............................................................................................................................ 5
Model Exposure .................................................................................................................................... 5
Self-Referencing Attribute Data ............................................................................................................ 6
Retentive Values Capability .................................................................................................................. 6
BTL Use – Core Guideline(s) .......................................................................................................................... 6
Getting Started.............................................................................................................................................. 7
Acquiring ................................................................................................................................................... 7
Installing .................................................................................................................................................... 7
New Solutions/Galaxies or Upgrading ...................................................................................................... 8
What NOT To Do ....................................................................................................................................... 9
BTL Versioning......................................................................................................................................... 10
BTL Version Examples: ........................................................................................................................ 10
Versioning of the Custom Script Function Library .............................................................................. 12
Version History .................................................................................................................................... 12
Why a Custom Script Function Library? .................................................................................................. 12
Special Upgrade Considerations ............................................................................................................. 13
Architectural Recommendations ................................................................................................................ 14
Template Derivation ............................................................................................................................... 14
Runtime Model Architectures................................................................................................................. 16
Deployment View Architectural Recommendations .......................................................................... 17
Model View Architectural Recommendations .................................................................................... 17
Device Integration Architectural Recommendations.......................................................................... 19
BTL Features Detail ..................................................................................................................................... 22
Automatic I/O Binding ............................................................................................................................ 22
I/O Binding Overview .......................................................................................................................... 22
I/O Binding Options............................................................................................................................. 23
History
In 2003, Wonderware introduced Application Server to the manufacturing and service oriented
industries. With this introduction, and through its subsequent releases, many system designers have
realized the numerous benefits Application Server has to offer, such as its ability to create templates of
functionality and reuse those templates to decrease the overall engineering effort; it’s ability to derive
templates from templates to add incremental functionality and to simplify system maintenance; it’s
ability to execute the system as a whole on a single node, or across multiple nodes through simple drag-
and-drop operations; and much, much more.
And while these many benefits provided system designers and users with many new and powerful
capabilities that enabled them to improve their processes and more easily maintain their supervisory
systems, its object oriented architecture was something that was entirely new to many in the market...IS
something that continues to be new to many in the market.
As with all new technologies and new technological architectures, a learning curve presented itself.
That is, there is some amount of time that must be invested in understanding these new technologies in
order to realize the possible benefits. With Application Server this came in the form of not only
understanding numerous new terms—like Areas, Platforms, Engines, Objects, derivation, and many
more—but also understanding the execution environment—where objects execute under engines and
engines are hosted by Platforms, but all these things can be organized under areas, depending on how
you looked at the system.
Obviously, training is a critical piece to minimizing this learning curve. However, the goal of training is to
educate the system designer so that they are aware of the components of the system and how they
work together. And while extremely important, training alone cannot provide the system designer with
the other critical element: experience. Where training provides users with the knowledge of what can
be done, experience enables them to understand when and where those things should and should not
be done.
In an effort to minimize the amount of time system designers needed to invest in gaining experience
with Application Server, and to ensure systems utilized the best possible architectures, the BTL (Base
Template Library) was created. The intent was to provide system designers with preconfigured
functionality that is commonly needed, and to deliver that functionality in the best possible way; using
the best practices that have been developed through the experience of experts. In other words, the BTL
was created as a stepping stone to greater experience. It enables system designers to design and deploy
systems more quickly and easily, and to make use of best practices that have been discovered through
This document details the features and functionality contained within the BTL, and is intended to guide
system designers in the use of its many components.
Audience
This document is intended for use by galaxy designers already familiar with the core concepts and terms
associated with the Application Server. As such, this document does not provide basic concept details
(such as the purpose for an Area, the definition of a WinPlatform , etc).
Architecture Fundamentals
The BTL delivers key functionality often times needed during the design and configuration of Application
Server solutions. It does this through the use of preconfigured object. The key to these capabilities are
the Master template objects found within the BTL galaxy, which deliver specific functionality, but do so
in a generic way that can be applied to virtually any environment. These master templates deliver
functional capabilities as follows:
Preconfigured Model
A preconfigured collection of objects have been organized for you in order to demonstrate the
appropriate configuration and organization of configuration related objects. From this most
basic model, organizations and system designer can then extend the model to properly
represent their operating environments. Why provide this…what value is there? Most
inexperienced system designers (and even several experienced ones’) don’t know how to
organize these components and thus cannot realize the benefits of an intentional architecture.
Model Exposure
The components of every App Server galaxy are organized into a logical, hierarchical model, to
make it easier for users to locate the information they need. This model can provide significant
value in not only data analysis, but also in the logic and execution of the App Server objects
Additional Components
The BTL also provides a handful of additional object templates to help with some of the more
common needs found within galaxies. These elements, like the Database Connection Setup
template, are detailed in the Additional Components section.
These capabilities are delivered through the implementation of preconfigured Application Server
objects—developed using best practices for consistent and efficient execution. The BTL also
demonstrates various best practices in regard to template derivation, model instantiation, and more.
Master level templates of the Base Template Library are not to be modified by system designers
and/or users of Application Server. These templates are created and maintained by Wonderware
personnel (App Server ninjas). Master templates can be identified by their template name. Any
template that contains an “m” at the beginning of their name is a master level template. For
example, $mWinPlatform or $mUserDefined. Please do not modify these, or any other master
level templates.
Starting with the 2014 release of Application Server and the BTL, the master level templates are
provided “protected”; which means they are read only anyway, and the above bold type should be
unnecessary. However, just in case you thought it was only a suggestion, it is not. Please do not modify
Obviously, the intent behind the BTL is to provide built-in functionality that has been tested for both
execution and optimal performance. In order to make use of these preconfigured templates, simply
derive you own “User Level” template from the masters, and then add whatever additional functionality
you desire.
Getting Started
Acquiring
The BTL, along with this manual, can be downloaded from the WDN (Wonderware Developer Network)
website (wdn.wonderware.com), in the Demo Application Download section.
Installing
The BTL can easily be available for use within new or existing galaxies through two simple steps. The
steps for accomplishing this are:
First, a custom script function library is needed for the BTL to function properly. This library doesn’t do
anything fancy or super-secret. All it does is more quickly iterate through large lists of string values and
provide more efficient parsing needed by the BTL for its automatic I/O reference assignments and model
building tasks. So the first step is to import this library into your galaxy. This is accomplished by
selecting the Galaxy menu from within the IDE and selecting Import Script Function Library. In the list
of files types to import, select the “aaSLIB” type/option. Next, navigate to the location where you
downloaded the BTL, and select the file: ww.nasc.btl.modeling.aaSLIB.
Second, you need to decide which ArchestrA Object Package you need to import. The BTL is made
available in numerous packages so that you only import the elements you need. The following table
identifies the import packages available, and describes their intended use:
For any of the above questions, the answer to doing it right is relatively simple:
1) Read (or re-read) this “Getting Started” section from the beginning, and through to the end
BEFORE doing anything. Understand all the things related to getting started—like what version
That really is it. Well, except for the following section that explains what NOT to do…it’s important too.
What NOT To Do
The BTL does not provide a magical world where everything is configured for your environment out of
the box. What it does provide is the ability to more quickly, easily, efficiently, and SUCCESSFULLY design
Application Server solutions. So you will need to utilize the BTL appropriately in order to gain any
benefit or value from it. In order to do that, you should obviously read this manual…but there are a
handful of specific things you should NOT do:
1) You should not jump in and “play” around with the BTL without first reading through this
manual. It may seem ridiculous to say so (here in this manual)…but we literally created this
manual because people first tried playing around ended up with questions. So…now you can
came back to the documentation to understand it, rather than doing the inefficient trial-and-
error methodology. Reading through this manual will help provide you with information
necessary to be more successful.
2) As is stated in the BTL Use – Core Guideline(s) section, Master level templates are not to be
modified by galaxy system designers and/or users of App Server. See that section for details.
3) Never perform an “Upload Runtime Changes” within a BTL galaxy, as this will cause the BTL to
not function properly. Doing so will overwrite attributes of the BTL that are utilized to control
script execution order, automatic I/O assignment, modeling data, and much more. Executing an
“Update Runtime Changes” will break the BTL and result in an inconsistent execution
environment for your galaxy as well as dramatically increasing the resource needs of the system
(dramatically decreasing the efficiency). If you find yourself trying to recover from a scenario
where someone did perform an upload runtime changes, simply read the BTL Troubleshooting
Guide, which contains details about the default values for the various attributes and working to
return things to “normal”.
The BTL version (posted online with downloads, and included in any documentation, package files, etc),
is comprised of 5 sets of numbers that are separated by a period. Those 5 number sets are:
Example 1: 1.2.300.4.5
In this example, the first number set is 1; which indicates that this BTL version works with Application
Server version 1
The second number set is 2 (two). It indicates that this BTL version was tested against the “R2” release
of version 1, but not with any later releases (not R3, R4, etc.)
The third number set is a 300. This indicates that this version of the BTL was designed, developed,
and/or tested and is supported with the Service Pack 3 (for Application Server 1 R2)
While all the previous number sets helped us pick the right version for importing into an Application
Server galaxy, the last two numeric sets are used to help everyone know if the right templates were (and
still are) in use within an Application Server solution. In other words, how do you or anyone else know if
the right version really was imported into the galaxy? The answer is that we document that with the
fourth and fifth number sets. The fourth number set, which in this case is a 4, represents the thousands
place of all Master templates’ “ConfigVersion” (more on that shortly). The fifth number set, which in
this case is a 5, represents the hundreds place of all Master templates’ “ConfigVersion”. In other words,
if you were to look at the properties of ANY of the MASTER templates of the galaxy, and you click on the
“Attributes” tab, you would find the value of 4500 in the “ConfigVersion” attribute.
Example 2: 2014.0.0.2.0
This BTL Version should be downloaded and used in solutions making use of Application Server 2014
(not R2, but the initial release because the second number set is a 0), with no Service Packs (because the
third number set is a 0); and if you were to look at the “ConfigVersion” of any of the Master Templates
you imported from these BTL packages, they will have a “ConfigVersion” of 2000; as you can see in the
following example:
LogMessage(ww.nasc.btl.modeling.aaObject.GetLibraryVersion());
This will write a message to the logger (when you deploy the object) that specifies the version; like this:
To know what full BTL version that was associated with, simply look on WDN for the BTL downloads, and
match it to the version ending it “1.9”. One and only one version will end in 1.9; and in this case, it’s
2014.0.0.1.9.
Version History
For a listing of the changes that have been made from version to version, the BTL also provides an object
template named, “$BTLVersionInfoDummyObject” (found within the _BTLVersionInfo template toolset).
To view the version change information, simply open this object template and click on the “?” icon in
the upper right-hand area of the object editor. This object (and its parent) should never be instantiated
or modified by system designers. It is provided simply as a means of documenting (within any BTL
solution) the change history of the BTL.
1) Because a complied DLL is faster at it than native Application Server scripting. Lots faster?
No…but if a galaxy is going to assign 2,000,000 I/O addresses, and each one takes a nanosecond,
then it will take more than 2 minutes to assign all the I/O addresses. By using a precompiled
library (the script function library), we were able to reduce the time by about 50% (or more).
That kind of efficiency gain was worth using the custom library for our customers with very large
galaxy solutions
2) The scripting within the BTL is simplified considerably when using a DLL/library to do some of
the heavy lifting. In other words, the same effective scripting is possible within Application
Server, but requires considerably more lines of code (no recursive calls or calling of quick
functions).
So…we found a way to make the BTL faster and simplify some of its scripting; but we also found that the
addition of the custom script function library made a few people uneasy. Why? Many system designers
are still not 100% familiar with (or comfortable with) the creation of their own DLL’s, libraries, or
trusting what other put in a library. In order to deal with these concerns, we include the original raw C#
code in all BTL downloads. This enables individuals that desire to do so, the ability to better understand
what functions are provided by the custom script function library.
This will ensure the latest BTL objects are imported successfully. As always (anytime you perform an
import of objects into a galaxy), please make sure you read the import log shown to verify the proper
objects were updated—which in the case of a BTL Upgrade, should be all the Master level templates.
Architectural Recommendations
Providing architectural recommendations can be a double-edged sword. On one side, it can significantly
help reduce the design time and help to ensure both galaxy designers and users have the best possible
experience. On the other side, it can add confusion to individuals with little experience. This section
provides recommendations for a variety of architectures that can be used in an Application Server
implementation, but does not represent every possible best practice and/or design strategy that can be
successful.
Template Derivation
One of App Server’s most powerful features is the ability to create templates of functionality. While a
single template can contain all the attributes, logic, and capabilities necessary to be all things to all
people, this type of design results in a complex objects that suffer from execution inefficiencies, are
difficult to maintain due to their complexity, and are prone to user configuration errors. To minimize
complexity and the potential for configuration error, and to produce objects that execute efficiently,
objects should be designed with concise functionality in mind. However, as with all things, there is a
balance that must be established between too little and too much functionality within a single object.
Objects that provide too little functionality result in a galaxy that contains so many objects that system
designers have difficulties locating objects; and produce galaxies with overly complex derivation and/or
The best possible scenario for objects that fulfill more than one function is to incrementally add
functionality. This is accomplished through template derivation. Derivation is the function of creating a
new template object from an existing one; thus establishing a parent-child relationship between objects
(where children inherit the capabilities of their parent, while also introducing new capabilities within
themselves).
It is has been identified that certain architectures of derivation are more productive than others. In the
BTL, a minimum of three levels of derivation are always employed. The base object templates that are a
part of all Application Server galaxies are the first level. It is not possible to modify these templates.
The second level—used by the BTL—are the “Master” or “m” level templates. All templates at this level
start with the letter “m”. For example, “$mWinPlatform”, “$mAppEngine”, and “$mUserDefined” just
to name a few.
These Master templates provide all the BTL functionality and should NOT be modified by persons
making use of the BTL. If the templates provided by the BTL provide value and system designers wish to
use them in their galaxies, they should derive new templates from the masters. Templates derived from
the BTL Master Templates are identified in this document as User Level Templates. It is customary for
system designers to prefix these templates with a character sequence that identifies them as unique to
the organization using them. For example, the Wonderbrew Corporation might derive a new template
from $mUserDefined, and name it “$wbUserDefined” (where the “wb” references “Wonderbrew”). This
is the third level of derivation, and is the minimum level where system designers should begin
implementing their own customizations within templates (and for eventual instantiation of runtime
objects).
One measure that can be employed to ensure objects do not become overly complex is to count the
number of field attributes and user defined attributes. Field attributes, which are unique to the User
Defined objects, are powerful attributes that contain numerous attributes themselves (ie: How to access
external data, a description for the attributes, the engineering units, and much more). When possible, it
is recommended that the number of field attributes be limited to a maximum of between 40 and 60.
While objects support a higher number, this recommendation helps to ensure the total number of
attributes in an object remains low enough to ensure efficient object execution in runtime. User defined
attributes, while not as complex as field attributes, should also be limited to a reasonable number as
well; typically less than seventy-five to 100. Again, the objects can support many more attributes than
this, but these recommendations provide a good first-glance estimate to how “busy” and “complex” an
object may be.
The balance, therefore, is up to the system designer. All architectures should be tested for design-time
and runtime execution efficiency; benchmarking various designs and selecting the model that provides
the best balance and performance.
The Deployment View identifies the node (or computer) where each object is executing. This “view”
enables system designers to distribute the work of the objects across one or more machines quickly and
easily; to fully utilize the computing resources available within a facility.
The Model View identifies the logical organization of a process; oftentimes implemented in a hierarchy
that enables users to most easily locate information. The Model View has nothing to do with WHERE
the objects are executing, but instead, provide users with the ability to look for information from a
logical standpoint. The following image provides example of both views
In the example image, the galaxy is currently deployed to two different nodes (GR_Platform and
INFO_Platform). Each of these nodes has multiple “objects” executing, providing all the capabilities of
the system as a whole. The model view, however, identifies the components of the system from a
logical standpoint; organized into a hierarchy. This hierarchy separates the system elements from the
process elements (in the “SystemObjects” area and the “WonderbrewCorp” area). Within each of these
areas, additional areas further differentiate the function of the objects they contain. This enables, for
example, users to most easily locate information relating to the roaster; as they are able to drill down
through The Galaxy, to the Wonderbrew Corporation, and finally to the Roasting area. To locate the
same information in the Deployment View, the user would have to know the node (or computer) where
the object is current executing. Both views provide significant value, depending on the role of the
All the objects contained within a single Application Engine execute on a scheduled period; specifically
defined as the Scan Time of the Application Engine. The architectures of the computing resources
available today often times provide nodes with considerable horsepower. That is, these resources often
times contain multiple processors (or cores), large memory reserves (RAM), as well as storage capacity
(hard disk space). App Server can take advantage of these resources most effectively when
implemented properly.
The most effective architecture that makes use of these resources is one that uses multiple Application
Engines under each Windows Platform object. Each Application Engine represents a process on the
computer (aaEngine.exe); and the objects owned by that engine execute under this process. Therefore,
by creating multiple Application Engines, the multiple processors (or cores) of a system are most
effectively utilized. The memory allocated to each process is also protected; ensuring that if problems
encountered, they can be isolated to a limited number of objects.
In the example image provided earlier, all Device Integration objects are executing under a single
Application Engine. Further performance increases may be realized by segmenting the execution of the
Device Integration objects into yet another Application Engine. The optimal configuration can be
attained through further testing. Initially, deploying all objects into a single engine can provide a
mechanism for benchmarking the performance of all objects when run together. The architecture can
then be modified to split the object execution between two engines. Again, the performance of each
engine should be monitored. Once observed, additional engines can be created and the objects split
further between them; again measuring the performance (CPU utilization, RAM usage, etc). At some
point, the benefit of splitting these objects between more and more engines will degrade, and this
information can be used to identify the optimal execution configuration (or number of engines across
which the objects should be “split”).
Additional factors can influence how many platforms and engines are used—like I/O or Engine
redundancy configurations—however, it is recommended that system designers utilize multiple engines
within each platform, and test their configurations to identify where they can achieve the greatest
performance.
The BTL is delivered pre-configured with a number of area and object instances organized into a logical
model. As it is not possible to pre-configure the BTL to satisfy every possible manufacturing
environment or service delivery model, the BTL’s pre-configured instances only focus on the
components that are common to all systems. The following image provides an example of these Areas
and their object instances.
The SystemObjects area, and its contained areas, are provided to enable the separation of computer
and configuration elements and their execution from the process-related objects. Platforms, Engines,
View Applications ,etc, are able to be organized within this preconfigured model in a way that not only
enables them to be most easily located, but also in a way that enables alarming conditions that may be
encountered with these elements to be better filtered for display to interested parties. For example, IT
(Information Technology) specialists may not be responsible for the supervisory system, but they are
often times responsible for the computing equipment used in supervisory systems. Under the BTL
model, they are able to focus their attention on alarms pertaining to the platforms and engines, thus
exposing only the information that is relevant to their areas of expertise.
System designers making use of the BTL only need to add a new Area for their organization under the
existing model (specifically under the “theGalaxy” area) to continue making use of this model. The
following image provides an example of how this might be implemented for a company called
Wonderbrew with multiple manufacturing sites.
While an almost limitless number of models can be created and implemented, the above example has
proven valuable to many App Server and System Platform users. Before starting a new App Server
project, it is strongly recommended that both the deployment (execution) model and the logical models
be considered before doing any development work.
Instantiation Architectures
All too often, system designers try to accomplish too much in too few objects; and this is especially true
when it comes to DI Objects. While it is possible to funnel all galaxy communications related to a
specific controller through a single device integration object, there are a number of drawbacks to this
type of architecture. First there is the issue of what is called the “advise list”; which contains a listing of
all the points the DI object needs to collect from a controller (or from a piece of software that provides
Another disadvantage of utilizing only a single DI object per controller relates to how galaxy data is
gathered by the objects within the galaxy. Each externally referencing attribute in the galaxy must be
told what DI object provides the desired information, the name of the appropriate scan group, and the
name of the data point to retrieve from the controller. By using only a single DI object, which will
execute on a single machine (or platform), all galaxy communications are dependent on that node being
available and it’s engine function efficiently.
A more efficient and reliable architecture can be attained through the use of numerous DI objects,
spread across multiple nodes, each focusing on the gathering of controller data specific to a given
process or area. This results in smaller advise lists, enabling the DI object to execute more efficiently.
Another benefit of this architecture is that system maintenance activities that require redeployment do
not kill communications for every point in the galaxy while a single DI Object is being redeployed. In this
case, only the data points related to the DI object being redeployed will be unavailable; and the time
required for those points to again become available is lower due to the limited number of data points
flowing through it. Finally, by spreading the DI objects across several nodes, more reliable
communication architectures can be realized. DI Objects can take advantage of not only the automatic
redundancy capabilities built-in to the Galaxy (through the redundant DI object), but also the inherent
availability advantages of distributing the load across more than one node.
One common and practical design recommendation is simply to place one DI object per area. Systems
that make use of the Model View to create hierarchical structures will realize significant benefits from
placing only a single DI Object per area, and having all the objects within that area reference that DI
object. Obviously, this is only valid if the galaxy is modeled correctly. For example, if a galaxy only has a
single area, and all galaxy objects are placed in this area, then there is no benefit to having a single DI
object. However, in a galaxy that has a solid, well thought-out model architecture, this will not only
simplify communications, it will also provide better communications stability throughout the galaxy. In
this architecture, changes to a DI object that require redeployment will only affect the object within that
area; enabling the other “areas” to continue functioning uninterrupted.
The following image provides an example of this architecture implemented within the Wonderbrew
Corporation. In this example, the entire plant is run from a single controller (or at least, a single
controller acting as a data concentrator for all the controllers in the plant). Even though there is only
one controller that is being accessed, each area has its own dedicated DI object that focuses on the data
relevant to its specific functional role (like roasting, bottling, etc).
While each DI Object can contain multiple Scan Groups, it is important to define these groups properly.
Multiple scan groups should be used when they are needed. This may be to separate important data
that must be updated more frequently than less important data. For example, if gathering the
production count from a controller in a low-speed process, it may make sense to only request the
information once every minute. However, pressure readings from that same process may be more
critical, and thus may need evaluated more frequently. In this situation, two scan groups may provide
the optimal communication performance. Additionally, DI Objects do have a maximum number of data
points that can be gathered within a single scan group. While this number is fairly high (32,767),
performance of the DI Object does decrease as the number of items within a scan group grows.
Object Name
The object name tells the attribute what object in the galaxy will be providing the data. This applies to
all references (internal or external).
Scan Group
The scan group is unique to those references that are going to external registers (like PLC registers), and
is a part of all communication objects. These communication objects are called Device Integration
objects, and they all contain one or more of these scan groups. The system designer creates the Scan
Groups (sometimes called topics, or Block Read or Block Write groups). Scan groups are used to break
communications up into logical groups (for control over how quickly the data in that group is
requested/written, or to simply segment the data into easy to understand segments).
Item Name
Finally, the Item Name represents the specific piece of data this attribute should be gathering. If an
object attribute is simply pointing to another object attribute in the galaxy, then this is the name of the
attribute in the destination object. However, if the attribute is referencing a PLC register, it is the name
of the register specific to the external device.
The BTL provides a way of automatically (in runtime) determining these three pieces; the Object Name,
the Scan Group, and the Item name that should be used by every input/output extended attribute. How
does it do this?
This automatic IO reference assignment capability is delivered through a handful of scripts that evaluate
numerous configuration options. In the end, the reference created for each IO attribute is based on the
following:
The following subsections provide additional details regarding the automatic IO binding configuration
options :
Object Name: The object name represents the name of the object providing the desired data, and is a
required component. It is most commonly the name of a specific DI Object, but can alternatively be any
other object within the galaxy. The configuration options that impact how the Object Name component
is assigned include: DIO.BindLevel, DIO.Name, and DIO.Name.MeConstant. For more details, see the
section on DIO.BindLevel
Item Separator: The item separator simply tells App Server the character that should be used to
separate the final register name from the other elements found in the reference. By default, the value
of the item separator is a period (“.”); but it can be changed to whatever is needed. The only
configuration option that applies to the Item Separator is the UDA named: DIO.ItemSeparator.
Scan Group: The Scan Group element is specific to those cases where the external data is being acquired
through a DI Object (which is the most common situation). As a DI Object can contain multiple Scan
Groups, it is important to define which Scan Group should be used. This assignment is made by
modifying the DIO.ScanGroupIndex UDA of the object. For more information, see the section on the
Bind Level configuration attribute.
Attribute: The Attribute keyword enables App Server to more accurately parse the register name. This
is necessary due to the variety of register name structures required by the controller manufacturers in
the market. For example, an older Allen-Bradley controller—such as a PLC 5—might require an address
Item Prefix: Some controllers require a character or characters to be added to the beginning of the
register name in order to return the proper data. This configurable UDA enables the system designer to
specify one if it is needed.
Register Name: The Register Name element identifies the specific data that is wanted from the
controller (or the attribute name if looking to another App Server object). There are numerous ways the
reference can be built, and these options are controlled by the configuration of the
“DIO.ItemNameOption” attribute. For more information, see the DIO.ItemNameOption section of this
document.
Of the six (6) options that are utilized in the construction of the external reference, three warrant
further review. The following sections detail these user configurable options.
DIO.BindLevel Attribute
The DIO.BindLevel attribute is used to tell an object where to go to get the name of the DI object being
used to provide communication(s). More specifically, the DIO.BindLevel attribute is an integer; and that
integer represents 8 choices for discovering the name of the object providing communications. These
options and their details are listed in the following table:
The containing object must be a BTL extended application object for this
option to be valid. The containing object has an attribute called
“DIO.Name”, which is populated based on its DIO.BindLevel. In other
words, this object will use the same DIO.Name as the object that
owns/contains it.
6 Me Setting the DIO.BindLevel to “6” forces the object to populate its
DIO.Name based on the value of another attribute on this object named
“DIO.Name.MeConstant”.
This option differs from the previous (6) ONLY in that this option looks to
the initial value of the “DIO.Name” rather than the
“DIO.Name.MeConstant”.
8 Link to App Setting the DIO.BindLevel to “8” is the only option that allows this object
Object to “bind” to something other than a DI object. This option was created
to enable binding to other objects for testing/simulation type of
scenarios. In otherwords, if a system designer wants to test
functionality, they can configure their objects to use a DIO.BindLevel of
8, and bind to special objects designed to simulate the desired process.
Any values entered for the Bind Level that are not listed above are invalid; and the behavior of the
object will be unpredictable.
Because each object has only a single “DIO.BindLevel”, this means that all attributes of any give object
can only connect and receive their automatic I/O assignments from a single object (DI or application).
If the configured value of an object’s DIO.BindLevel results in the DIO.Name NOT being populated, the
BTL scripts that automatically assign I/O references will run continuously. This can have significant
performance and resource implications and should be avoided. To determine if this is happening, it is
recommended that the system designer monitor the value of the _BTL.IORefSet.ExecutionCnt. If this
value contentiously increases, a configuration error exists and should be resolved by the system
designer.
The DIO.BindLevel can only be set at configuration time. Changes to the BindLevel in runtime do not
cause the I/O references to be rebuilt/redefined. As such, if an architectural change needs to be
implemented—related to WHERE the objects retrieve the name of the object providing
communications—requires the objects to be undeployed and redeployed to take effect.
DIO.ScanGroupIndex (DIO.BlockReadIndex/DIO.BlockWriteIndex)
The DIO.ScanGroupIndex (or BlockRead/BlockWrite index of the ReadWrite object(s)) identifies which
ScanGroup (or topic) the object should use. This setting/attribute value is used when the DIO.BindLevel
is configured to interact with DI (Device Integration) objects. If, for example, the DIO.BindLevel is
configured with a value of 8, that object is not looking at IO, but at another application object and thus
the DIO.ScanGroupIndex is invalid. This setting is used to determine which scan group to use on DI
objects. The default, 1, indicates that the object should use the first scan group in the DI objects scan
group list. A value of 2 would indicate that the object should bind to the second scan group. If the value
of the DIO.ScanGroupIndex results in an invalid reference, then the scripts related to the automatic I/O
reference assignments will run continuously. For example, if the DIO.ScanGroupIndex is configured with
a value of 2, but the DI object only contains a single ScanGroup, then the reference is invalid.
DIO.ItemNameOption
The DIO.ItemNameOption identifies how to structure the name of the item. There are 14 distinct item
name options. The number of options available are so high because of the diversity of controllers (like
PLC’s) and how they require items to be requested. All of the item name options of the BTL are based
on variations of the object and its location within the area hierarchy.
In order to select the appropriate Item Name option, the system designer must understand the various
names objects in the galaxy can have. The following image provides an example of a galaxy with just a
handful of objects, and then defines the various names that the objects can have; specifically the malt
auger found under Roaster022.
The options available for the Item Name Option and the details of each option are listed in the following
table:
Thus, all I/O attributes will begin with the name of the
container, and “Power”, followed by the actual element
name. When the DIO.BindLevel is set to 8, all ScanGroup
settings are ignored.
Many more configuration combination could be shown—nearly limited combinations; however the
above examples should provide system designers with the information necessary to utilize the available
options to meet their IO binding needs.
The most important thing to do when deciding on an architecture to utilize for automatic I/O binding is
to TEST YOUR ARCHITECTURE BEFORE GOING INTO PRODUCTION! Once you have created an
architecture that consistently follows a methodology, then system designers can follow those design
methodologies repeatedly to maintain a consistent system that operates effectively, and efficiently.
Custom Bindings
In the event that the configuration options presented earlier in this section cannot provide the needed
reference structures to successfully communicate with the desired controllers, the BTL provides one
remaining option to help. After the auto binding scripts finish executing, a customizable script executes.
This customizable script allows system designers to add their own logic for building custom references.
This script, named _BindAttrs, contains additional documentation (within the body of the script) to help
system designers complete this task.
For example, an attribute named “Temperature.PV”, found in an object named “Reactor001” might get
an automatically assigned reference of,
“ReactorController.FastData.Attribute(Reactor001.Temperature.PV)”. However, the controller might
require the reference to actually be “F8:47”. In such cases, the system designer can continue using the
automatic I/O reference building capability of the BTL, in combination with the alias table feature of DI
objects.
While alias table references can be manually entered, one reference at a time, it is also possible to
import the references from a script. The BTL helps to simplify this process by enabling the system
designer to export a list of all the I/O attributes associated with any given object. To export the list, the
system designer simply needs to instantiate and deploy the object, and then set the
Model.CreateAliasTableCmd attribute of the object. When set, the BTL will create a file (named the
same as the object) in the directory specified in the object’s Model.AliasTableDir attribute. Setting the
command bit writes a file to the specified directory, and the file contains all CSV file with all the I/O
items within the object. The System Designer can then modify this table using their preferred CSV
editor, or import it “as-is” into the appropriate DI Object and modify the controller references directly
within the DI Object alias table.
There are two things that a system designer must be aware of when working with this feature of the
BTL. First, DI Objects only support the importing of up to 5,000 aliases per Scan Group. However, since
the BTL creates individual files for each object, and objects should not contain that many attributes, it
should not be an issue. Secondly, this feature of the BTL exports a single entry for every
internal/external attribute reference. And while this meets the needs of nearly all users, there are cases
where the input and output references differ for a single attribute. In this situation, it is necessary to
either use the _bindAttrs script to manually define the different addresses for the attribute’s inputs and
outputs, or use the BlockReadWrite object(s) provided by the BTL.
While these relative references provide excellent abstraction capabilities, additional model information
can be useful when creating logic and scripting, to allow objects to interact with one another. The BTL
delivers this through a number of UDA arrays: MyAreas, MyContainedObjects, and MyContainers. A
slight variation on these can be found in the $mArea template; MyAppObjects, MyAreas,
MyContainedAppObjects, and MyDIObjects. Each application and area object of the BTL contains these
UDA arrays.
To understand their use, the following sections provide more detailed information regarding each of
these UDA’s as well as examples (where applicable) of the values populated into these fields (relating to
the previous example image):
Application Objects
MyAreas
The MyAreas attribute array contains a listing of all the Area objects that contain the object. In the case
of the previous example image, the PowerMonitor_002.MyAreas array would contain two elements, the
first would have a value of “theGalaxy”, and the second would contain a value of
“theGalaxy.RoastingCN”.
MyContainers
This attribute array works in the opposite direction of the previous example; by providing a listing of
what object or objects own (or are parents to) this object. Taking the previous example image, the
PowerMonitor_002.MyContainers array would contain the following values (in the order shown):
Roaster022, Roaster022.MaltAuger, and Roaster022.MaltAuger.PowerMonitor. This array enables
system designers to programmatically access information from parent objects in runtime; for either
supervisory functionality or display within a user interface application.
Area Objects
Because Area objects provide functionality distinctly different from application objects, the Area object
contains a different list of attributes for helping system designers programmatically navigate the
namespace model. These attributes are:
MyAppObjects
This attribute array contains the name of every object executing under this area, and includes any
objects contained within the area’s application objects. Said another way, all application objects
executing directly under the area, or contained within application objects executing within this area, will
be included in this array. For example, in the previous example image, the “Roasting” area’s
MyAppObjects array will contain 12 elements; one for each of the objects that are found in that area.
This array will not, however, contain values for any Device Integration objects or other areas contained
under the area providing the value.
MyAreas
The MyAreas attribute array contains a listing of all the Area objects that contain this area. In the case
of the previous example image, the “Roasting” area would contain 2 elements; the first would have a
value of “theGalaxy”, and the second would contain a value of “theGalaxy.RoastingCN”.
MyContainedAppObjects
While this attribute is similar to the “MyAppObjects” attribute, it does have one distinct and important
difference. This attribute array will only contain elements for objects directly under the area. Looking
again to the previous example image, the Roasting area’s MyContainedAppObjects attribute would only
have two elements: Roaster011 and Roaster022. All other application objects are not directly under the
Roasting area, but instead are under other application objects.
The values contained within these UDA arrays are automatically populated when objects are deployed.
However, the system designer can also manually trigger a refresh of all these values by setting the
Model.CreateCmd Boolean UDA to true. The attribute will automatically reset itself back to false, and
cause all namespace model attributes to re-populate with the latest data it is aware of. If, however,
objects have been deployed in less time (seconds) than the hosting engine’s
“Model.DeployWaitTimeSeconds”, then those elements will not immediately be available to the model
attributes. They will become available after the Engine’s deploy wait time expires. Due to the
complexity of the script, populating these attributes is a resource intensive operation, and may require
significant CPU utilization as well as several seconds to complete.
Each application object template of the BTL contains these UDA arrays, and the values contained within
them are specific only to that object instance in runtime. The following sections provide details for each
attribute array (and examples where applicable).
MyAnalogAlarmedAttributes
This attribute is populated with a list of all analog field attributes for which alarm definition have been
created. Because any one analog field attribute can have multiple types of alarms (4 value based
alarms, 2 deviation alarms, and 2 rate-of-change alarms), an additional field can be used to better
understand what specific alarms have been configured for this attribute (see the next sub-section for
additional information).
Additionally, the Map is an Array that matches with the MyAnalogAlarmedAttributes attribute. For
example, if the first element of the MyAnalogAlarmedAttributes array contains a value of
“Temperature.PV”, and the first element of the MyAnalogAlarmedAttributesMap contains a value of 9,
then the specific alarms enabled for the “Temperature.PV” are the LoLo and HiHi value based alarms
(because decimal 9 equates to the binary equivalent of 00001001; which indicates bits 1 and 4 are
active).
The BTL also contains ArchestrA graphic elements that make use of this, enabling a visualization
application to present configurable alarm displays for users to interact with (to modify setpoints and/or
enable/disable alarms).
MyAnalogFieldAttributes
The MyAnalogFieldReferences array contains a list of all analog attributes for which data is gathered
from an external source (external to the attribute…or in other words, it is not simply a calculated value).
This attribute array enables a system designer to programmatically walk through a list of the analog
element of an object; from which they may present the user with a simple graphic that enables them to
select one of these attributes and interact with the selected one as desired.
MyDiscreteAlarmedAttributes
Much like the MyAnalogAlarmedAttributes, the MyDiscreteAlarmedAttributes contains an array listing
all the Discrete Field Attributes for which alarms have been defined. However, unlike Analog Field
Attributes, discrete attributes can only have one type of alarm; therefore, no discrete alarm map is
needed. The BTL contains ArchestrA graphic elements that make use of this, enabling a visualization
application to present configurable alarm displays for users to interact with (to modify setpoints and/or
enable/disable alarms).
MyDiscreteFieldAttributes
The MyDiscreteFieldReferences array contains a list of all discrete attributes for which data is gathered
from an external source (external to the attribute…or in other words, it is not simply a calculated value).
MyHistorizedAttributes
This attribute array contains a listing of all the analog and/or discrete field references which have been
configured for historization. Because multiple elements of an attribute may be stored (such as the value
and the value deadband), each element of an attribute that has been configured for storage within the
Historian will be available within this attribute array.
An example of access these can be: If the MaltAuger_002 object contains two analog field attributes and
three discrete field attributes, and the value of each of these attributes is configured to be historized,
the system designer could access the MyHistorizedAttributes UDA array to populate a trend control in a
runtime ArchestrA graphic. While it is possible to acquire the list of historized data points from the
object through scripting (which is exactly what the BTL does), it is a somewhat time consuming and
resource intensive operation. The BTL eliminates the need for system designers to figure out how to do
this, or to implement it in each graphic or script that needs access to this information. By populating
these UDA arrays, system designers do not have to implement the logic themselves or waste the time or
computational resources building this list each time a user wants to see a trend.
The following image and table provides another example of the values each of these attributes would
contain for an object configured with the following attributes (with the historized attributes marked
with a “*”)
The values contained within these UDA arrays are automatically populated when objects are deployed.
However, the system designer can also manually trigger a refresh of all these values by setting the
Model.CreateCmd Boolean UDA to true. The attribute will automatically reset itself back to false, and
cause all self referencing attributes to re-populate with the latest data. Due to the complexity of the
script, populating these attributes is a resource intensive operation, and may require significant CPU
utilization as well as several seconds to complete.
Retentive Values
One very popular feature of Wonderware’s InTouch HMI is the ability to retain the value of a defined
data point through an application restart. For example, if a data point called LastSystemUser were
defined within InTouch, and it was configured with an initial value of “Unknown”, this value would not
necessarily be accurate after the application had been run for several days. By enabling retentive
values, InTouch is able to store the last known good value when InTouch is shutdown. This way, when
the application is restarted, it can use the last known good value for display rather than the defined
initial value.
Because Application Server differs so significantly from an execution standpoint over that of traditional
HMI, retentive capabilities were not implemented as a part of the core product. However, this doesn’t
mean that this feature cannot be implemented. The BTL also provides “retentive” capabilities through
the configuration of three object attributes: State.LoadCmd, State.SaveCmd, and State.SaveDir.
This functionality is implemented within the BTL by saving all non-I/O attribute values to disk on the
node where the objects are executing—when the object is going off scan (stopping executing). Three
configuration UDAs are responsible in utilizing this functionality; which is disabled default.
The first UDA, State.SaveDir, defines where the attribute data should be stored. The second attribute
that must be configured is the setting of the State.SaveCmd. If this Boolean attribute is set (True) when
the object is going off scan, then the values of all attributes will be written to disk (if the Sate.SaveDir
contains a valid directory path specified). The third and final attribute that must be configured is the
State.LoadCmd attribute. If this bit is set (True), then the object will load the attribute values from file
when it is deployed (if the Sate.SaveDir contains a valid directory path specified, and a file exists from
the previous undeploy operation).
One critical element to keep in mind regarding this feature relates to Platform changes. If you undeploy
an application object from one platform, and deploy it on another, any save state data that may have
been written to disk will not go with the object. The system designer either has to plan for this in their
object design, or move the file manually (from the directory specified on the source node to the
destination node). Finally, it is (again) the responsibility of the system designer to enter a VALID and
already existing directory for the data to persisted to file (within the State.SaveDir UDA).
One topic that often comes up when considering this feature of the BTL relates to failover and reboot
scenarios. To be sure there is no confusion, the BTL related logic/scripting associated with objects will
not and do not run when rebooting a node executing objects, or in application engine redundancy
failover scenarios. In both cases, the values of all attributes are automatically populated from the last
checkpoint file created by the engine on which the object(s) were executing.
Additional Components
In addition to the already listed capabilities of the BTL, a handful of objects templates are delivered with
the BTL to address other common functionality desired within galaxies. This section details these
objects and the functionality they provide.
$mDatabaseConnectionSetup
Often times, system designers create components within the galaxy and/or the visualization application
which must interact with databases. In the spirit of true object oriented architectures, the BTL helps to
simplify the storage and accessibility of the database authentication information through the
$mDatabaseConnectionSetup template. This template adds several attributes which allow systems
designers to store the connection and authorization specific data in a single place. These attributes are
detailed in the table below:
Name Description
Name The name of the database within the
RDBMS (Relational Database
Management System)
Password The authenticating password that should
be used when accessing the database
when using RDBMS security
Server The name of the node/server providing
the RDBMS Services
User The authenticating user name that
should be used when accessing the
database using RDBMS security
SQLConnectionString A read-only register that contains the
connection string necessary to connect
Within the default BTL galaxy, this template has been further derived and even instantiated for
authentication to the most commonly needed databases within an App Server environment; the
Historian, Alarming database, and Production database.
* Anywhere the phrase “NONE” is used, it indicates the literal text, “NONE”. Empty string references
will be listed as blank cells. Cells containing “N/A” indicate a value is not applicable, needed, or relevant.
** Many of the BTL objects contain a “Debug” attribute. When set, it causes additional information to
be written to the logger in a custom log flag. To view these messages, enable the debug attribute in
runtime, and then open the SMC Logger and enable the viewing of those Global Log Flag (as is
demonstrated in the following image).
System Objects
$mWinPlatform
Attribute Details:
Attribute Details:
Attribute Default Value Valid Values Use
BTL.Debug False True|False Used to log general BTL activity to
the SMC logger. Intended for use in
troubleshooting only and is NOT
recommended for use in a
production galaxy.
BTL.Deploy.LastTime 10/31/2011 N/A Used in conjunction with the model
12:00:00.000 building scripts. Assists in the
AM delayed model building of objects
post deployment. NOT intended for
user writing.
BTL.Deploy.Seconds 0 N/A Attribute which indicates the
amount of time (in seconds) since
the last object was deployed under
this engine. This value is
automatically reset to zero
whenever a new object is deployed,
or when this value exceeds the
Model.DeployWaitTimeSeconds
attribute value.
DIO.Name NONE N/A Used with Automatic I/O Binding.
This value is populated either
manually by the system developers
or automatically by DI Objects
configured with a DIO.BindLevel of 3.
Model.DeployWaitTimeSeconds 60 Any value Identifies the amount of time the
greater than engine (and all its contained objects)
0 should wait since the last object was
deployed before building the model
information. 60 seconds, the
default, is a good starting point, but
it is recommended that the system
designer test and tweak this number
to execute most efficiently within
the deployed architecture. For
application engines containing large
numbers of objects, this number
should probably be increased. For
small numbers, decreased.
Scripting Details:
Script Name User Editable Description
_BTL.DeployTimer No Used in modeling building and the delay that occurs
post-deployment.
_BTL.ResetDeployCount No Resets deploy time counter related to the model
building scripts executing and populating area and
object model data.
$mViewEngine
No enhancements of UDA exist within this template. It exists for consistency in the derivation best
practices detailed in this document
$mArea
Attribute Details:
Attribute Default Value Valid Values Use
BTL.Debug False True|False Used to log general BTL activity to
the SMC logger. Intended for use
in troubleshooting only and is NOT
recommended for use in a
production galaxy.
BTL.FirstScan True N/A Used by BTL scripting for first-time
logic execution. Should not be
modified by system designers
and/or users.
BTL.MyDIOs [Empty String] N/A Internal variable used to manage
lists of device integration objects
contained by this area object. This
attribute is not to be modified by
system designers.
BTL.ObjectType Area N/A Internal variable used to identify
the type of object (dynamically by
objects above and below it in a
hierarchy)
DIO.Name NONE N/A Used with Automatic I/O Binding.
This value is populated either
manually by the system developers
or automatically by DI Objects.
Scripting Details:
Script Name User Editable Description
_BTL.DetectDeploy No Associated with the identification of newly deployed
objects and model creation.
_BTL.ModelParentWatch No Triggers building of model data when its parent
(Application Engine) triggers a model build.
_BTL.ModelUpdate No Associated with the building of the model data
_BTL.ReceiveDIOs No Associated with the tracking of the device integration
objects associated with this area.
_BTL.RemoveDIOs No Associated with the maintaining the MyDIObjects UDA
array within this area.
Attribute Details:
Attribute Default Value Valid Values Use
BTL.Debug False True|False Used to log general BTL activity to the
SMC logger. Intended for use in
troubleshooting only and is NOT
recommended for use in a production
galaxy.
Scripting Details:
Script Name User Editable Description
_BTL.AreaConfirm No Coordinates the maintenance of this object’s owning
area’s DI Objects list.
_BTL.BindName No Populates appropriate BindLevel specified object’s
DIO.Name attribute
_BTL.DetectDeploy No Associated with the identification of newly deployed
objects and model creation.
_BTL.DIOBindLevelDCS No Enables runtime changes of the DIO.BindLevel to
immediately be implemented (rather than requiring a
redeploy operation)
Application Objects
The following application object templates share the below listed attributes and scripting/logic as a part
of the BTL implementation: $mAnalogDevice, $mDiscreteDevice, and $mUserDefined. Application
Object Templates that deviate from the below listed capabilities (such as the $mSequencer,
$mUserDefinedBlockReadWrite, etc) are detailed later in this section.
Scripting Details:
Script Name User Editable Description
_BindAttrs Yes Provides system designers with the ability to create a
(Execution custom automatic I/O reference assignments to attributes.
Script) This script is automatically executed after the normal
binding scripts execute, and can also be manually triggered
_BTL.AliasTableCreator No Associated with the creation of alias tables for I/O
extended attributes within the object. Responsible for
writing the alias table values to file when the create alias
table command is set (true).
_BTL.DetectDeploy No Associated with the identification of newly deployed
objects and model creation.
_BTL.DIOItemOptionDCS No Like the previous script, this identifies changes in the
binding. However, this script identifies changes to how the
item name is constructed and rebinds I/O extended
attributes in response.
_BTL.DIOName No Checks the validity of the named DI Object (assigned either
manually or through DI Object setting)
_BTL.IORefSet No Automatic I/O assignment script
While the above scripts and attributes apply to the listed application objects, a few remaining
application objects have been extended by the BTL as well, to add specific functionality. These objects
are defined below in the remaining subsections.
$mSequencer
Attribute Details:
Attribute Default Valid Use
Value Values
BTL.Debug False True|False Used to log general BTL activity to the
SMC logger. Intended for use in
troubleshooting only and is NOT
recommended for use in a production
galaxy.
BTL.FirstScan True N/A Used by BTL scripting for first-time
logic execution. Should not be
modified by system designers and/or
users.
Model.CreateCmd False N/A Bit used to trigger the assignment of
the model related attributes within
the object. For more information, see
Namespace Model and Self
Referencing Attributes sections of this
document.
MyAnalogAlarmedAttributes N/A N/A Array attribute populated by BTL
scripting which identifies all the
analog attributes of the object which
have been configured for alarming.
Scripting Details:
Script Name User Editable Description
_BTL.DetectDeploy No Associated with the identification of newly deployed
objects and model creation.
_BTL.ModelUpdate No Associated with the building of the model data
$mUserDefinedBlockReadWrite
The $mUserDefinedBlockReadWrite object is identical to the $mUserDefined object except that it was
designed to utilize different I/O registers for read and write extensions. In other words, the system
designer would utilize this object when the input address must differ than that of the output address for
a given data point. Because all functionality is the same, only the differing attributes will be
documented here:
Attribute Details:
Attribute Default Valid Use
Value Values
DIO.BlockRead NONE N/A Similar to the DIO.ScanGroup of the
other Application Objects, this
contains the name of the Block Read
Group within the associated DI/DA
object. This field is automatically
populated by the scripting/logic with
Bind Levels 1 – 6; but can be written
to with option 7.
DIO.BlockReadIndex 1 (ANY) Identifies the index of the block read
group to use. Used with Bind Levels 1
– 6.
DIO.BlockReadRefHeader N/A Internal (read-only) attribute used in
the building of attribute I/O
references related to block reads
DIO.BlockWrite NONE N/A Similar to the DIO.ScanGroup of the
other Application Objects, this
contains the name of the Block Write
Group within the associated DI/DA
object. This field is automatically
populated by the scripting/logic with
Bind Levels 1 – 6; but can be written
to with option 7.
DIO.BlockWriteIndex 1 (ANY) Identifies the index of the block read
group to use. Used with Bind Levels 1
– 6.
DIO.BlockWriteRefHeader N/A Internal (read-only) attribute used in
the building of attribute I/O
references related to block writes
$mBTLWriter
The BTL Writer object is provided as a mechanism for troubleshooting model and I/O assignment
configuration problems. It is NOT intended for use in a production system…period. Why? Because its
sole purpose is to write configuration and runtime attribute data to a file, every time one of the BTL
scripts run. Why? So that tech support personnel can identify possible configuration problems more
quickly. Simply stated, the BTL Writer creates a file with the same information available in the Object
Viewer, but more quickly, and sequentially keeping track of values over time. There is only a single
configurable attribute, and that defines the directory where the file is written. Wonderware Technical
Support engineers have access to the information necessary to utilize this text file, and will recommend
its use when appropriate.
Support
For assistance with problems experienced utilizing the BTL, please contact Wonderware’s award winning
technical support group. For clarity, technical support should be contacted when system designers
experience problems with the BTL that are exhibited differently than documented. For design and use
recommendations, please contact your regional distributor’s systems consultants for assistance.
What’s New…
From time to time, the BTL gets a proverbial face-lift; to improve performance, implement new best
practices, and add new features. This section identifies the changes that were implemented in the latest
release. It does not, however, maintain a listing of all changes that have been made across the BTL’s
lifetime. That can be found within the BTL Version Info Dummy Object. Just view the help file
associated with this object for a complete history.
2014.0.0.2.1
This release of the BTL is the fourth for the 2014 App Server components. The following represents the
list of changes reported by the BTL Version Info Object Help:
Version: 2014.0.0.2.1
Release Date: 2014.12.15
Changes:
All documentation was updated for this releases features and capabilities
The custom script function library was updated to exclude BTL attributes as well as attributes
ending in "._RefAttrId".
Removed "BTL.Version" attribute from all BTL objects, and updated documentation to identify
the proper way to get version info from any BTL provided object template—simply look at the
“ConfigVersion” attribute of any BTL Master object. Also included instructions for identifying
the version of the custom script function library in use.
Improved automatic I/O assignment logic (multiple scripts) to improve execution performance,
troubleshooting and status information, support for more containment models of differing
application object types (ie: containing a UserDefinedBlockReadWrite within a UserDefined
derived parent), and clarify error and warning messages.
Changed the category of numerous BTL provided UDA's to make them CalculatedRetentive
instead of Calculated (for persistence in loading from checkpoint scenarios like reboots or
redundant engine failovers).
Modified $mAppEngine and $mArea templates, removing a script that would reset the
DIO.Name to "NONE" if the associated DI object was no longer valid (ie: undeployed), to
better support recent functional additions to the BTL (specifically, DIO.BindLevels 7 and 8).
Removed unused declarations from multiple scripts (in declarations section of various scripts
and objects)
Modified the name of the template toolset that contains the BTLWriter object (previous toolset
was misspelled). Template is now held under BTL Troubleshooting toolset.
All BTL related scripts that ran under an execution type of “Data Change” were evaluated for
consistency. Some were updated to utilize a local variable while others make use of an object