Skip to main content
Skip table of contents

Wonderware

.NET AGENT

Overview

The Wonderware connector enables Seeq to access data from Wonderware via their underlying Microsoft SQL Server Runtime databases and Wonderware Historian SDK.

Prerequisites

The connector is compatible with Wonderware versions 9.0 and higher. The Wonderware Historian SDK has been tested on version 11.5+.

Configuration

These are example configuration templates that are displayed in the Additional Configuration box that appears when you click Configure for an existing datasource (or if a new datasource is being created, in the Create new datasource connection modal that appears after clicking Add Datasource) on the Datasources administration page.

CODE
{
      "HistoryRequestRowsPerQuery": 10000,
      "Hostname": "historian-server.somecloud.server.com",
      "SdkUsername": "exampleUsername",
      "SdkPassword": "examplePassword",
      "SqlUsername": "aaUser",
      "SqlPassword": "pwUser",
      "SqlPort": 32568,
      "SeeqConnectionMode": "SQL",
      "CreateAssetsUsingHierarchicalNames": false,
      "ImportPublicGroups": false
}
Wonderware Additional Configuration

Property Name

Default Value

Data Type

Description

HistoryRequestRowsPerQuery

10,000

Integer

The limit (via TOP) for the number of records returned per query of the Wonderware History view.  As many queries as needed will be performed to return the full time range of the request. 

Hostname

null

String

The name or IP address of the machine that is hosting the Wonderware server's Microsoft SQL Server database.

SdkUsername

null

String

The local username for the Wonderware historian. This field is not required if connecting via SQL.

If connecting via SDK and both SdkUsername and SdkPassword are null, Seeq will try to connect to Wonderware with Windows authentication using the account running the .NET Agent.

SdkPassword

null

String/SecretFile

The password for the account specified in the SdkUsername field. It is recommended to leverage a Secrets File to store this information. This field is not required if connecting via SQL.

If connecting via SDK and both SdkUsername and SdkPassword are null, Seeq will try to connect to Wonderware with Windows authentication using the account running the .NET Agent.

SqlUsername

aaUser

String

The local username for the Microsoft SQL Server that has full read access to Wonderware's Runtime database. Typically there is a default "aaUser" (or "wwUser" for older versions of Wonderware) that has the appropriate access levels.

If connecting via SQL and both SqlUsername and SqlPassword are null, Seeq will try to connect to Wonderware with Windows authentication using the account running the .NET Agent.

SqlPassword

pwUser

String/SecretFile

The password for the account specified in the SqlUsername field. The default password for aaUser is usually pwUser and for wwUser the password is wwUser by default. It is recommended to leverage a Secrets File to store this information.

If connecting via SQL and both SqlUsername and SqlPassword are null, Seeq will try to connect to Wonderware with Windows authentication using the account running the .NET Agent.

SqlPort

32568

Integer

The server port used by Wonderware’s underlying Microsoft SQL Server.

SeeqConnectionMode

SDK

String

The connection mode (SDK or SQL) that Seeq will use to pull data from Wonderware. SDK mode is recommended for better performance (under conditions of low latency between the historian and Seeq server).

For a SDK connection, set to SDK. Note that in SDK mode, a SQL connection is still required for indexing, so a valid SqlUsername and SqlPassword (or Windows account authentication) must be provided.

Important: in SDK mode, whether using SdkUsername and SdkPassword or implicit Windows authentication, the user account must be a member of the aaUsers group on the Historian server host.

For a SQL connection, set to SQL for Wonderware 11.0+ and InSQL for previous versions. When connecting via SQL, SdkUsername and SdkPassword are not required.

CreateAssetsUsingHierarchicalNames

false

Boolean

Set to true if you use HierarchicalNames as your preferred method of viewing Tags hierarchically in Wonderware tools like the Trend tool. 

If the last section of the HierarchicalName does not match the TagName exactly, the TagName will be included in parentheses in the Signal name.  For example, if the configuration name is set to MyHistorian in step 1 above, for a Tag with TagName "Pump 3 Setpoint" and HierarchicalName "SIte12.Pump3.SPT", the asset tree will have assets for MyHistorian, Site12, and Pump3, and Pump3 will have a Signal named SPT (Pump 3 Setpoint).  This is to ensure that no Asset in Seeq has more than one child Signal with the exact same name (this is technically supported but is not good practice).  Since TagNames are unique in Wonderware, uniqueness of child Signal names for a given Asset is effected by including the TagName in the Signal name.

Note that only either CreateAssetsUsingHierarchicalNames or ImportPublicGroups can be set to true for a given Wonderware Historian.

ImportPublicGroups

false

Boolean

Set to true if you use the Public Groups folder as your preferred method of viewing Tags hierarchically in Wonderware tools like the Trend tool. 

The sync will create assets for things like All Analog Tags and All Discrete Tags, so you may find multiple signals with the same name when searching in the Data panel in Seeq Workbench.  In practice, which version of the signal you use won't matter; Seeq will access the data from Wonderware in the same way so that the same signal in different areas of an Asset Tree act as aliases for the underlying Wonderware Tag.  However, each signal will have a unique Seeq ID - so if you are using the Seeq REST API, you may need to account for multiple signals with different Seeq IDs.  Otherwise, feel free to choose any of the signals found through a global search, or navigate within an asset tree to find the signal in your Public Groups folder.

Note that only either CreateAssetsUsingHierarchicalNames or ImportPublicGroups can be set to true for a given Wonderware Historian.

Known Issues

  • Only analog, discrete, and string tag types in Wonderware can be converted into Seeq data types. Any other tag type is incompatible and will not be indexed.

Please report any other issues you find to our support portal.

Troubleshooting

Duplicate Signals

The Wonderware connector indexes the raw tags from Wonderware in all cases, and if either CreateAssetsUsingHierarchicalNames or ImportPublicGroups is true in the configuration, “jump tag” signals will be created in the tree as well. Since Seeq doesn’t have a concept of a “reference” item, these signals are independent items in Seeq - which means that users searching in the data pane without navigating within an asset tree will receive multiple signals with the same name in their search results. While it is always possible to limit search results to those in a given asset tree or subtree by navigating to the right asset before searching, you may want to remove duplicates outside the asset tree and/or within different branches of an asset tree. For example, users rarely need the distinct version of a signal found in the “All Analog Tags”, “All String Tags”, etc., folders within the Public Groups folder. In these cases, the items' Data IDs may be used in conjunction with one or more “Exclude From Indexing” transforms to skip indexing a subset of the Wonderware assets and signals. For example, to keep only the Fireworks Galaxy subfolder of the Public Groups folder, the following transforms list could be used:

CODE
[{
	"Inputs": [{
			"Property": "Data ID",
			"Value": "^.*?>>Public Groups>>((?!Fireworks Galaxy).)*$"
		}
	],
	"Outputs": [{
			"Property": "Exclude From Indexing",
			"Value": true
		}
	]
}, {
	"Inputs": [{
			"Property": "Data ID",
			"Value": "^((?!Public Groups).)*$"
		}, {
			"Property": "Type",
			"Value": "Signal"
		}
	],
	"Outputs": [{
			"Property": "Exclude From Indexing",
			"Value": true
		}
	]
}]

The first transform above matches any item (asset or signal) that includes the string >>Public Groups>> and does not include the string Fireworks Galaxy at any point after that (a negative lookahead, as designated by (?!StringNotToMatch). The second transform matches all of the signals that don’t include the string Public Groups, because none of the raw tags should include this string in their Data ID - the Data ID for a raw Wonderware tag is just the tag name. When writing your own transforms, use a regular expression tool like http://regextester.com or http://regex101.com to test your Data IDs with the regular expression intended to match them.

Timestamps

For modern Wonderware servers, all timestamps are stored in Coordinated Universal Time (UTC), but the time zone of the server's host is used for SQL queries in which the time zone is not specified.  Generally this will not lead to confusion, but it is important to be aware of this distinction if comparing the results of direct SQL queries through SQL Server Management Studio or similar and the trends shown in Seeq Workbench. Seeq requests the data from the Wonderware server in UTC and converts the displayed results to your specified time zone preference in Seeq Workbench.

Delta/Cyclic Storage

If your Wonderware Historian is using Delta or Cyclic Storage, it is possible for queries to return samples from the Historian's ActiveImage that are never stored.  This is possible for all Wonderware Tags where the AIRetrievalMode is set to 0.  To avoid caching these samples and causing consistency problems on subsequent requests that cover the same time range, it may be necessary to set a property transform to override Seeq's boundary between cacheable and uncacheable data (the "cursor").  A property transform that overrides the Uncertainty Override property to five minutes for all signals indexed by a Wonderware connector will likely be sufficient:

CODE
"Transforms": [
  {
    "Inputs": [
      {
        "Property": "Name",
        "Value": ".*"
      }
    ],
    "Outputs": [
      {
        "Property": "Uncertainty Override",
        "Value": 5,
        "UnitOfMeasure": "min"
      }
    ],
    "Enabled": true,
    "Log": false
  }
]

If you are running into other issues with connecting to or access data from Wonderware, view our guide for troubleshooting datasource issues.

Performance considerations

Configure the Wonderware connector to use SDK mode for better performance (while ensuring that there is low latency between the historian and Seeq server).

Additionally, view our guide on optimizing datasource performance for general guidance.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.