guide Boundaries based on mode of operation

Recommended Posts

• Seeq Team

Use Case Background

Commonly, engineers are interested in calculating limits on a signal based upon the average and standard deviation.  Additionally, there may be different modes of operation during which the performance - and limits - is different.  This post describes how to develop mode based boundaries for a process signal to identify deviations from the normal or expected behavior.

Mode Conditions

In this example, I am interested in calculating boundaries on a Compressor Power signal based upon the mode of operation in a Compressor Stage Signal.  (Note: These signals are from Example>Cooling Tower 1> Area A of the Example data shipped with each Seeq installation.)  The first step is to identify the 3 stages of operation (Off, Running 1 Compressor, Running 2 Compressors) by performing a Value Search on the Compressor Stage signal:

Average Compressor Power using Formula

Next, I can use the Formula tool to calculate an Average Compressor Power signal, using the following variables and syntax:

Variables

Name
Item
Type
\$Series Compressor Power Signal
\$High Compressor High Condition
\$Low Compressor Low Condition
\$Off Compressor Off Condition

Formula

 // Identify a reference capsule over which the statistic is calculated. You can think of this as the golden batch period or the period in time that we know that the system was operating properly.                                                                                                                                                       `\$refPeriod` `= capsule(``"2016-04-01T00:00:00Z"``,``"2016-05-01T00:00:00Z"``)  `   `//`Cut the single continuous time series signal (Compressor Power) into sections which correspond to the different modes of operation. This gives us three intermediate time series signals which only contain data for the three distinct modes of operation. `\$highSeries` `= ``\$series``.within(``\$high``) ` `\$lowSeries` `= ``\$series``.within(``\$low``)` `\$offSeries` `= ``\$series``.within(``\$off``)  `     // Create three intermediate time series signals, one for each mode of operation.  Find the average value of the time series signal during the reference time period for each mode of operation, and then turn that scalar into a time series signal which only exists in the appropriate mode of operation `\$highAve` `= ``\$highSeries``.average(``\$refPeriod``).tosignal().within(``\$high``)` `\$lowAve` `= ``\$lowSeries``.average(``\$refPeriod``).tosignal().within(``\$low``)` `\$offAve` `= ``\$offSeries``.average(``\$refPeriod``).tosignal().within(``\$off``)`   // Splice together the three time series signals into a single signal and step interpolate the \$finalSeries `\$finalSeries` `= ``\$highAve``.splice(``\$lowAve``,``\$low``,false).splice(``\$offAve``,``\$off``,false).toStep()` `return` `\$finalSeries`

Boundaries Using Formula

To start, let's calculate the upper boundary as the average + 3 std dev.  I can use the Formula tool to calculate this upper boundary using the following variables and syntax.

Variables

Name
Item
Type
\$Series Compressor Power Signal
\$High Compressor High Condition
\$Low Compressor Low Condition
\$Off Compressor Off Condition

Formula

 `\$refPeriod` `= capsule(``"2016-04-01T00:00:00Z"``,``"2016-05-01T00:00:00Z"``)`   `\$highSeries` `= ``\$series``.within(``\$high``)` `\$lowSeries` `= ``\$series``.within(``\$low``)` `\$offSeries` `= ``\$series``.within(``\$off``)`   `\$highAve` `= ``\$highSeries``.average(``\$refPeriod``).tosignal().within(``\$high``)` `\$highStdDev` `= ``\$highSeries``.standarddeviation(``\$refPeriod``).tosignal().within(``\$high``)` `\$highBoundary` `= ``\$highAve` `+ ``\$highStdDev``*3`   `\$lowAve` `= ``\$lowSeries``.average(``\$refPeriod``).tosignal().within(``\$low``)` `\$lowStdDev` `= ``\$lowSeries``.standarddeviation(``\$refPeriod``).tosignal().within(``\$low``)` `\$lowBoundary` `= ``\$lowAve` `+ ``\$lowStdDev``*3`   `\$offAve` `= ``\$offSeries``.average(``\$refPeriod``).tosignal().within(``\$off``)` `\$offStdDev` `= ``\$offSeries``.standarddeviation(``\$refPeriod``).tosignal().within(``\$off``)` `\$offBoundary` `= ``\$offAve` `+ ``\$offStdDev``*3`   `\$finalSeries` `= ``\$highBoundary``.splice(``\$lowBoundary``,``\$low``,false).splice(``\$offBoundary``,``\$off``,false).toStep()` `return` `\$finalSeries`

Similarly, I can calculate the lower boundary as average - 3 std dev using the following variables and Formula syntax.

Variables

Name
Item
Type
\$Series Compressor Power Signal
\$High Compressor High Condition
\$Low Compressor Low Condition
\$Off Compressor Off Condition

Formula

 `\$refPeriod` `= capsule(``"2016-04-01T00:00:00Z"``,``"2016-05-01T00:00:00Z"``)`   `\$highSeries` `= ``\$series``.within(``\$high``)` `\$lowSeries` `= ``\$series``.within(``\$low``)` `\$offSeries` `= ``\$series``.within(``\$off``)`   `\$highAve` `= ``\$highSeries``.average(``\$refPeriod``).tosignal().within(``\$high``)` `\$highStdDev` `= ``\$highSeries``.standarddeviation(``\$refPeriod``).tosignal().within(``\$high``)` `\$highBoundary` `= ``\$highAve` `- ``\$highStdDev``*3`   `\$lowAve` `= ``\$lowSeries``.average(``\$refPeriod``).tosignal().within(``\$low``)` `\$lowStdDev` `= ``\$lowSeries``.standarddeviation(``\$refPeriod``).tosignal().within(``\$low``)` `\$lowBoundary` `= ``\$lowAve` `- ``\$lowStdDev``*3`   `\$offAve` `= ``\$offSeries``.average(``\$refPeriod``).tosignal().within(``\$off``)` `\$offStdDev` `= ``\$offSeries``.standarddeviation(``\$refPeriod``).tosignal().within(``\$off``)` `\$offBoundary` `= ``\$offAve` `- ``\$offStdDev``*3`   `\$finalSeries` `= ``\$highBoundary``.splice(``\$lowBoundary``,``\$low``,false).splice(``\$offBoundary``,``\$off``,false).toStep()` `return` `\$finalSeries`

Final Results

Executing these 3 formulas results in 3 new time series signals: Average Compressor Power, Compressor Power +3sd and Compressor Power -3sd.  The Customize menu in the Details Pane can be used to adjust how these signals are visualized on the screen:

Content Verified DEC2023

Edited by Chris Harp
Content Verified DEC2023