Jump to content

Lindsey.Wilcox

Seeq Team
  • Posts

    88
  • Joined

  • Last visited

  • Days Won

    22

Everything posted by Lindsey.Wilcox

  1. Hi Theresa- Glad you solved the issue. In previous versions of Seeq, the number of capsules displayed in Chain View was limited to 30. However, this limitation was lifted in Version 22.0.48. Thanks, Lindsey
  2. Christophe- This functionality was added in R22.0.48. Glad you were able to upgrade your Seeq installation and take advantage of the new feature! Lindsey
  3. Hi Omar- I recommend changing the signal to be step interpolated. This can be achieved through the Formula tool using the following syntax: $signal.toStep(1d) The maximum duration of '1d' indicates that Seeq should interpolate between data points spaced by 1 day or less. When you select a maximum duration, choose a duration that is large enough to interpolate between the gaps in your data, but not so large that it unnecessarily impacts that performance. Please let me know if you have any additional questions. Thanks, Lindsey
  4. Hi Adam- Here is a screenshot of the new home screen from a mobile device: I will note that there is currently a known issue when viewing the home screen in Safari (such as on an iPhone). This bug causes the list of folders under the Shared and All categories to appear jumbled. This may make navigation difficult when using Seeq on an iPhone. This bug is already logged as CRAB-20100. Please let me know if you would like to be linked to this item so that you will be notified of our progress towards correcting the issue. Thanks, Lindsey
  5. Hi Adam- More information about the new Home Screen can be found here: https://support.seeq.com/space/KB/1349779782/Home%20Screen As this article states, items that were public in previous versions of Seeq are now listed on the 'Shared' category. Thanks, Lindsey
  6. The following formula will calculate the average of your signals, even if one happens to go off-line. average($a,$b,$c) For those who are looking to have the calculation stop if one of the signals goes off-line, the following formula will help. ($a+$b+$c)/3 Content Verified DEC2023
  7. Seeq Version R22.0.46 introduces the .keep() Formula operator for filtering a condition based on capsule properties. In Step 3 of the original post, the following Formula was used to generate a new condition that only has capsules where the StartModeEndMode property is equal to '-TRANSITION--STAGE2-: Prior to R22.0.46: $condition.filter($capsule-> $capsule.getProperty('StartModeEndMode').isEqualTo('-TRANSITION--STAGE2-') With Seeq Version 22.0.46, the same result is achieved using the simpler keep() function syntax: Version R22.0.46 and later $condition.keep('StartModeEndMode', isEqualTo('-TRANSITION--STAGE2-'))
  8. Hi Chris- I think this can be achieved using a combination of the Value Search and Composite Condition tools. In the following screenshot, I have a signal (temperature) and a condition (Start Capsule). Let's say I'd like to create a new condition that starts at the start of each capsule in Start Capsule and ends when the temperature is 90. First, use the Value Search tool to identify when the temperature is 90 F. This results in several small capsules each time the temperature is 90 F. Next, combine these 2 conditions using the join operator in the Composite Condition tool: This results in a new condition (Start to Temp=90) where each capsule starts at the start the Start Capsule capsule and ends at the start of the Temp=90 capsule. Please let me know if you have any additional questions. Thanks, Lindsey
  9. Hi Sanjhosh- @Pauly Russ 's post is a great suggestion. Simply create a Custom Condition to identify the capsules to remove and then use the Minus logic in Composite Condition to remove these capsules from the original condition. I discussed this use case with other members of the team, and the following method was also suggested: 1. Clean & smooth the signal. This can be done using a combination of different operators in Formula. Try using the .agileFilter() operator to smooth the signal and remove high frequency noise. The .removeOutliers() function may be useful for removing the random spikes in the data. 2. Take the derivative of the signal Once the signal is cleansed, apply either the .derivative() or .runningDelta() function in formula. This will allow you to see when the large, downward spikes occur. Hopefully there is a clear different in the magnitude of the 'downtime' spikes relative to the magnitude of the 'mid-run' spikes. 3. Identify the downtime periods Use the Value Search on the derivative or running delta signal to identify the periods of downtime. With this method. some iteration will likely be required as you work to cleanse the signal and use the Value Search tool to identify downtime. Lindsey
  10. Hi Sanjhosh- Would you be able to provide additional information (and screenshots) on the condition you have created and the capsules you would like to exclude? I suspect that we may be able to edit the original condition to only include the desired capsules. However, I will also mention that the Custom Condition tool may be used to achieve the desired results. In this tool, you can select the capsules in your condition that you would like to retain, excluding the capsules that are not of interest: Thanks, Lindsey
  11. This method demonstrates how to apply time warping to a signal which can shorten the time between sample points while retaining the signal’s characteristic shape. This is useful for batch processes where batches may have different durations or for aligning data from multi-step processes with different durations. Note that this method is distinct from the more complex Dynamic Time Warping. The following example is based upon the Area A Compressor Power signal available in the Example Data. A single condition was created to capture each compressor run, as shown in the following image. Step 1: Specify a Time Normalization Factor The user uses the Formula tool to specifiy a time duration (scalar value), set to 4 hours for this example. The compressor power signal for each compressor run will be normalized to this time duration. There is no single correct value; the value needs to be shorter than the minimum time duration for all signals to be normalized. // User specified time duration (scalar value). 4 hours Step 2: Create the Normalized Condition Use Formula to create the normalized Compressor Run condition based on the user-specified time normalization factor. This condition will be used later when the calculated signal delay is used for normalization. $CompressorRuns.afterStart($nF) Step 3: Calculate the Run Duration Use the Signal from Condition tool to calculate the duration for each compressor run. This value will be used later for determining the calculated signal delay applied to each compressor run. Step 4: Calculate the Elapsed Time During Each Run Use the Formula tool to calculate the elapsed time during each compressor run. This value will be used later for determining the calculated signal delay applied to each compressor run. timeSince($CompressorRuns, 0.25min).convertUnits('h') Step 5: Calculate the Signal Delay Factor Needed for Time Warping Each sample (timestamp) for compressor power will be shifted to the left by a calculated amount to time warp the power signal from its original time period (Compressor Runs) to the normalized time period (Compressor Runs Normalized). The first sample point in each run will have no delay, and the last sample point will have the greatest delay. For example, if the original time period is 10 hours and we are normalizing to a time period of 4 hours, then the last sample point in the run will be shifted to the left by 6 hours (Delay Factor = -6 hrs). // This Formula first creates a signal with a value of 0 (default delay), then splice in the calculated delay during each compressor run. 0.toSignal(0.25min).convertUnits('hr').splice($ElapsedTime*($nF/$RunDuration-1),$CompressorRuns) At this point we zoom in to a single compressor run and use the Capsule Time view to better visualize the results of our intermediate calculations. For this compressor run lasting 10.9 hours, the Compressor Run Elapsed Time finishes at the correct value (10.9 hours) and the Delay Factor correctly decreases from 0 hours (beginning of run) to -6.9 hours (end of run). Step 6: Apply the Signal Delay to Time Warp the Signal Now that the appropriate delay factor is calculated for each sample point during the compressor runs, we apply it to the Area A Compressor Power signal using the delay() function in Formula. This generates the time warped signal called Compressor Power Normalized. $CompressorPower.delay($delayFactor,24h).within($CompressorRunsN) When applying the signal delay, we are required to specify a maximum delay. This is important for the Seeq calculations going on in the background, so that the queries know how far back and forward to go when requesting input data. The maximum delay also provides a convenient way for the user to limit the applied delay, if they have some reason to do so. In our case, we just want the chosen value to be longer than the longest expected compressor run duration. Results Now that the compressor power signal has been normalized, Capsule Time view gives a nice comparison of the power signal behavior across the 3 runs contained in the Display Range:
  12. Hi Marcie- In response to these 2 things: 1. Yes, we are aware that the "dimming" option does not work for histograms. This is logged in our system as CRAB-13860. In the meantime, before this item is addressed, I would recommend using Journal links; if you trend each histogram one at a time and add a link to Journal, in the future you will just be able to click through the Journal links to view the histograms. For more information on adding links to Journal, please refer to this Knowledge Base article: https://seeq12.atlassian.net/wiki/spaces/KB/pages/162201610/Inserting+Seeq+Links 2. Currently the values in a Histogram cannot be exported to Excel. However, this item is also logged in our system as CRAB-8959. If you would like to be linked to either of these items (CRAB-13860 and CRAB-8959) please email support@seeq.com; this will ensure that you are updated as we make progress towards their implementation. Thanks, Lindsey
  13. In Seeq Version R21.0.42, a .movingAverageFilter() operator was introduced in Formula. This operator smooths a signal by averaging values with their neighboring values. Its important to note that this operator is intended to smooth a signal. The aggregate operator should be used for computing averages on a periodic basis, such as hourly or daily moving averages. The following example uses the .movingAverageFilter() operator to resample the Temperature signal to 5 minutes and use a window size of 30 min.
  14. There are many cases where a moving average needs to be monitored. To create any statistic that is associated with a sliding time frame, first use the periods() function in Formula to create the periodic capsules. A few examples are listed below. Intent Seeq Formula 30 day average every 1 day periods(30d,1d) 24 hour average every 1 hour periods(1d,1h) 30 minute average every 5 minutes periods(30min,5min) Once the periodic condition is created, use Signal from Condition to calculate a moving average, max, min, or other statistic. The sliding capsules will appear overlapped in the capsules lane. Refer to the capsules pane to verify the capsules meet your expectation of start time and duration, then apply the desired "moving" aggregation (average, standard deviation, etc.) to any signal with the Signal from Condition tool. Below shows a moving 30 minute average sampled every 5 minutes on the Example Temperature data.
  15. Background In this Use Case, a user created a condition to identify when the compressor is running. During each Compressor Running capsule, the compressor operates in a variety of modes. The user would like a summary of the modes of operation for each capsule in the form of a new signal that reports all modes for each capsule (i.e. Transition;Stage 1;Transition;Stage 2;Transition, Stage 1;Transition). Method 1. The first step is to resample the string value to only have data points at the value changes. It's possible the signal is already sampled this way, but if it is not, use the following Formula syntax to create a "compressed" signal: $stringSignal.tocondition().setMaximumDuration(3d).transformToSamples($capsule -> sample($capsule.getStart(), $capsule.getProperty('Value')), 4d) 2. Now, you can create a signal that concatenates the string values during each capsule. This is achieved using the following Formula syntax: $compressorRunning.setmaximumduration(10d).transformToSamples($cap-> sample( $cap.getStart(), $compressedStringSignal.toGroup($cap).reduce("", ($s, $capsule) -> $s + $capsule.getvalue())), 7d).toStep()
  16. You can use the start and end times of capsules to create new capsules with an arbitrary time before or after. This is useful when the process expert knows that there is a time period of interest before or after a capsule start or end timestamp. Refer to the example below. Here we have a series for the Area A Compressor Power shown in blue. We have created capsules shown in green for when the compressor is running in the high state, above 30kW. In this example, we want to create a capsule series that starts when the compressor exits the high stage (goes below 30kW) and then ends at exactly 2 hours later (or any other arbitrary time specified by the user). All we need to use is the following Seeq Formula: This formula creates a new set of capsules that start at the end of the “Compressor Power > 30” capsules and end exactly 2 hours later. The functions afterStart(), beforeStart() and beforeEnd() can be used similarly. For example, to create a set of capsules that capture the two hours prior to our “compressor high” condition, we can simply modify the formula above by changing “afterEnd” to “beforeStart.”
  17. Earlier Versions (Before R21.0.42) Alternatively, all of the steps in this solution may be performed in a single Formula:
  18. Background In this Use Case, a condition was created to identify when a compressor is running. Let's say I'd like to extend each capsule in this condition so that instead of ending when the compressor turns off, it ends when the next compressor running capsule starts. Method The method used depends on the Seeq version. Seeq R21.0.42 and Later Version R21.0.42 introduced the .growEnd() operator; this operator grows capsules in in a condition by extending the end until the start of the next capsule. Earlier Versions (Before R21.0.42) 1. First, create a condition that is the inverse of the Compressor Running condition. This can be achieved using the .inverse() function in Formula 2. Next, extend each Compressor Running capsule so that they overlap with the Downtime capsules. This is achieved using the .move() function in Formula. 3. Finally, combine the Downtime and Compressor Running - Extended conditions use the union logic in the Composite Condition tool.
  19. Another option for creating conditions for seasons, would be to use the Custom Condition tool. The Custom Condition tool allows you to specify the start and end time of each capsule in a condition. Here I've used the Custom Condition tool to create a condition for seasons in 2019. This condition contains a capsule for each season:
  20. Update as of R21.0.41: As of the release of R21.0.41, the .toCapsules() operator has changed. As of this version, the operator may be used to create a condition that contains a capsule for every valid sample in an input signal (regardless of whether the value has changed). To create a condition that contains a capsule for every value change in an input signal (as done in the previous post), the toCondition() operator must be used.
  21. Update as of R21.0.41: As of the release of R21.0.41, the .toCapsules() operator has changed. As of this version, the operator may be used to create a condition that contains a capsule for every valid sample in an input signal (regardless of whether the value has changed). To create a condition that contains a capsule for every value change in an input signal (as done in the previous post), the toCondition() operator must be used.
  22. How can I find the duration of time between the two peaks of my signals? In this Use case, we have 2 signals: Signal 1 and Signal 2. We'd like to use Seeq to calculate the offset (in time) of the peaks in the two signals. The following steps can be used to perform this calculation.
  23. 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
  24. I have a report i need to generate that has multiple potentially overlapping time periods. How can i get these times into my table? In my case, i want to calculate some statistics in my table over multiple variable time periods such as "April 2019", "Quarter 1", and "Year to Date", etc. 1
×
×
  • Create New...