Jump to content

John Cox

Seeq Team
  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by John Cox

  1. Hi Chase, Teddy has a great suggestion above on using Seeq's OData export. I also wanted to mention another option for your consideration: creating an Add-on tool in Seeq Workbench that has a button the operators click to pull the data. Seeq Add-ons use the Seeq Python Library module (SPy) with Seeq Data Lab. Add-ons can easily pull data into the Data Lab environment and create custom visualizations, calculations, charts, etc. using any Python library functionality, and all of this can be accessed from Seeq Workbench. This may or may not be a way to address your current need, but even if not, it may be a good solution for other applications in the future. There is a Seeq Add-on Gallery here: https://seeq12.github.io/gallery/ The following links provide additional information on how to create your own add-ons or install the open source add-ons: https://seeq.atlassian.net/wiki/spaces/KB/pages/2254536724/Add-ons
  2. Hi, Currently you can add a capsule property to a condition type table without using the New Metric, by using the Row or Column buttons. But, while you do have filtering and sorting capabilities on these capsule properties in the table, this doesn't give you the ability to color code the table cells for that property (New Metric with thresholds is needed for that). So yes, currently you would need to convert the capsule property to a signal first. There is a new feature request in our development system to do exactly what you want, so this may be added in the future. John
  3. The details and approach will vary depending on exactly where you are starting from, but here is one approach that will show some of the key things you may need. When you say you have 3 capsules active at any given time, I assume you mean 3 separate conditions. Assuming that is the case, you can create a "combined condition" out of all 9 conditions using Seeq Formula: // Assign meaningful text to a new capsule property // named TableDesription $c1 = $condition1.setProperty('TableDescription','High Temperature') $c2 = $condition2.setProperty('TableDescription','Low Pressure') and so forth... $c9 = $condition9.setProperty('TableDescription','Low Flow') // Create a capsule that starts 5 minutes from the current time $NowCapsule = past().inverse().move(-5min) // Combine and keep only the currently active capsules (touching "now") combineWith($c1,$c2,...,$c9).touches($NowCapsule) You can then go to Table View, and click the Condition table type. Select your "combined condition" in the Details Pane and add a capsule property (TableDescription) using the Column or Row button at the top of the display. You can then set your display time range to include the current time, and you should see the currently active capsules with the TableDescription text that you assigned in the Formula. You of course will want to vary the "-5min" value and the 'TableDescription' values per what is best for you. Your approach may be a little different depending on where you are starting from, but I think that creating capsule properties (text you want to see in your final table), combining into one condition, and using .touches($NowCapsule), may all be things you will need in your approach. Here are some screenshots from an example I put together, where I used "Stage" for the capsule property name:
  4. Hello Siang, Currently, simple type scorecard metrics can't be used in Seeq Formula. We have recently added some functionality for using condition type scorecard metrics in Formula, but that will not help you in this use case. Your request to get a display range capsule is a good one and is already on our feature request list for our development team. For now, your best method is to create a Manual Condition, and add a capsule to the Manual Condition that is your current display range, to create a Display Range Condition. You can then use the Display Range Condition with Signal from Condition to calculate a signal representing the average (or other desired statistics) over the display range. That signal can be used in additional Formulas and calculations. When you want to change your analysis to a new display range, you will of course need to take one extra step to edit the Manual Condition and update it to match the current display range. John
  5. Hi Bayden, I would try something like this in Seeq Formula, on the signals that change infrequently: $signal.validValues().toStep(30d) In place of the "30d" you would enter the maximum time that you want to connect data points and to see the lines drawn. Given you are working with setpoints, I would recommend converting them to step interpolation using .toStep(). If that doesn't get you to the final result that you want, you can add one further function: $signal.validValues().toStep(30d).resample(1d) The resample will add more frequent data values at the period you specify (change the "1d" to whatever works best for you). You do need to be careful that you aren't adding any incorrect or misleading values with this approach, based on your knowledge of the signals. Let us know if this helps. I believe you can get a solution you are happy with. John
  6. Hello Filip, When you want to add data to an already existing signal, you will want to find your original imported file in the Seeq Data tab, and click the edit button (circled in red below): You will then be able to drag a new file for import, and you will notice that you now have Replace and Append options (see an example I did below): You can choose to replace or append. I think this will solve your problem. If it does not, please let me know. Some additional information on adding new data to an existing imported signal can be found here in our Knowledge Base: Knowledge Base: CSV Import Replace and Append John
  7. Hi Brian, In more recent versions of Seeq, the max function used in that way (that specific syntax or form) only works with scalars. For your case, try $p53h2.max($p53h3).max($p53h4) That is the form needed with signals. Hope this helps! John
  8. Hi Robin, 1) To answer your earlier question, to avoid the time weighted standard deviation, all you need to do is change the signal to a discrete signal and then apply the same formula: $CanWeightSignal.toDiscrete() .aggregate(stdDev(), // std deviation statistic periods(10min,1min).inside($CanProductionCapsules), // do the calc over 10 min rolling window every minute // but only for 10 minute capsules fully inside CanProduction capsules endKey() // place the calculation result at the end of the 10 minute window , 0s) // max interpolation between data points, use 0s if you want discrete result 2) To answer your most recent question, to convert your current result to a stepped signal rather than the discrete results you now have on the trend, you can use a Formula function named .toStep(). Inside the parentheses, you enter the maximum amount of interpolation, the maximum amount of time you want to draw a line connecting your calculated results. For example, the function below sets a maximum interpolation between data points of 8 hours. .toStep(8hr) Hope this helps! John
  9. Hello Mohammed, The answer depends on exactly what you want to remove from the signal. In some cases, you may want to do a Value Search to find the peaks you want to remove, then use the .remove() function in Seeq Formula to create the new signal with the peaks removed. In some cases, all you may need is to apply a smoothing filter (for example, agileFilter() in Seeq Formula or one of the Signal Smoothing options under the Cleanse Tools), or perhaps use removeOutliers() in Seeq Formula. The documentation below provides a great summary of the many data cleansing tools in Seeq. I hope this information is what you are looking for!
  10. I do not have access to your original signal for testing, so my solution not handle all the unusual characteristics that may occur. But I believe the approach below will help you get going on this calculation. 1. I would first recommend you create a clean weight signal that uses the remove() function to eliminate small decreases in the weight signal due to measurement noise and equipment variation. (This first step makes step 2 work accurately, because in step 2 we will be looking for the weight to go above 2000, 3000, 4000, etc., and we don't want noise variation from say 3002 lb to 2999 lb at the next sample, to appear to be a step decrease.) Create a clean weight signal using the formula below. This should result in a weight signal that only increases during the normal rampups, but still resets to 0 when the next rampup processing begins. Note that the 1hr inside of toStep() is the maximum interpolation between data values; set this based on your preferences. 2. Create the Step Counting Signal by dividing the clean weight (step 1 result) by 1000 and using the floor function to generate an integer result. 3. For an example signal that I tested with, you can see the Step Counting Signal incrementing as each 1000 lb increment is exceeded. Depending on your final analysis goals, further calculations could of course be done to calculate/report the number of steps completed for each of your original purple capsules or to do other types of statistics.
  11. Hi Robin, I would use a Seeq formula similar to the one below, with the Can Weight signal and your existing Can Production capsules as inputs. The key functions used are aggregate(), periods(), and inside(). Note that you could also do the std deviation calculation using Signal from Condition, using a condition created in Formula with: periods(10min,1min).inside($CanProductionCapsules). $CanWeightSignal .aggregate(stdDev(), // std deviation statistic periods(10min,1min).inside($CanProductionCapsules), // do the calc over 10 min rolling window every minute // but only for 10 minute capsules fully inside CanProduction capsules endKey() // place the calculation result at the end of the 10 minute window , 0s) // max interpolation between data points, use 0s if you want discrete result Hope this helps! John
  12. Hi Sivaji, While this isn't easy to do in the current Seeq scatter plot view, below are two related forum posts that I would suggest you read. These may help with workarounds. Please note that your request (scatter plots with signals from multiple assets) is already a feature request in our system, and it will be added to the software at some point in the future.
  13. Hi Clinton, I would suggest you come to one of Seeq's open Office Hours and discuss this with one of our Analytics Engineers. They can likely get you started or make suggestions on how to approach this analysis. There are Office Hour slots available each day of the week. Please read more at this link: Seeq Office Hours
  14. Hi Muhammad, I would suggest that you start by searching for "steam" in the Seeq Formula documentation inside of Workbench. Please see the screenshot below. There are many Formula functions for doing steam table calculations.
  15. As another variation, in some cases the user may want to see the number of overlapping capsules at any point in time. In this case, the .fragment() Formula function may be helpful: $EventCondition.fragment() The .fragment() function creates a non-overlapping condition representing all the boundaries of capsules in an overlapping condition. You can see a comparison of the conditions generated using .merge() and .fragment() below. Where there are overlapping capsules, the .fragment() function creates a series of capsules touching each other. For example, note that there are 5 green capsules in the Event Condition (fragment) shown on the far right of the trend.
  16. FAQ: How do I identify time periods where I have overlapping capsules within the same condition? I may want to keep only the capsules (time periods) where capsules overlap. I may also want to keep the times where a certain number (2, 3, or more) of capsules overlap. In this example, we will find time periods where there are at least 2 overlapping capsules which make up the Event Condition. In the screenshot below, you can see there are 3 separate time periods where the Event condition capsules overlap: Step 1: Merge any overlapping capsules together using the merge() function in Formula: Now, we have a time period basis (Event Condition (merged)) over which we can count the total number of overlapping capsules. Step 2: Count the number of overlapping capsules using the count of the original Event Condition capsules over each Event Condition (merged) capsule: This creates a new signal as shown in the trend below. We can see that the new signal values (where > 1) correctly identify the 3 time periods where there are overlapping capsules in the original Event Condition. Step 3: We use Formula to find where the Event Condition (merged) capsules touch a time period where the Number of Overlapping Events signal (created in Step 2) is > 1. Note that we could test for varying number of overlapping capsules (> 2, > 3, etc.) depending on the goals of our analysis. We could also break Step 3 into 2 steps (a Value Search to find where the Number of Overlapping Events is > 1, followed by a Composite Condition to do the touches logic). This generates the final results where the Overlapping Events condition correctly identifies our time periods of interest:
  17. Hi Steve, As a follow-up to your "ability to do a first order filter in Seeq" question from earlier this year, I wanted to mention that the latest version of Seeq (R50) now includes an exponentialFilter() function in the Formula tool. This new function does the first order filter (or first order lag response) that you are interested in. You can see an example below where 3 first order filters were created with different tau values, to filter the raw signal. If you need any help testing this out, don't hesitate to let us know!
  18. A common analytics need is to calculate changes in a signal's value over different time periods (such as hourly or daily). One example is calculating the change in a tank level signal as a way to infer flow rates, production, amount transferred, etc. While the Seeq Formula derivative() function is often useful in these situations, in some cases the user may want to simply calculate the signal change over a specified time period (perhaps once/hour). While there are many ways to do this in Seeq, two efficient ways are: 1) using the Delta statistic in Signal from Condition and 2) using $signal-$signal.delay() in Formula. Here is an example to illustrate: We have a tank level signal shown in lane 1 and we have calculated the hourly change in the tank level by two different methods (the results are shown in lane 2): The first method to calculate the level change per hour uses an Hourly condition (created using the Periodic Condition tool to generate the green capsules). Then, Signal from Condition is used to generate the Hourly Level Change (Signal from Condition) in lane 2, by selecting the Delta statistic over the Hourly bounding condition: The second method uses the delay() function in Formula, subtracting the one hour delayed level from the current value of the level signal. This generates the Hourly Level Change (Formula Delay Function) in lane 2 Note that this approach creates an hourly level difference for each sample point, where the first approach generates a level difference result once per hour. Also note that the user could choose to filter (smooth) the level signal and then apply the level difference calculations, if they desire a more smoothed calculation result. There are several filtering options in Seeq. The agileFilter() function would work well for the level signal in the example.
  19. Beginning in the R21 release of Seeq, administrators can modify scorecard threshold colors, names, and levels (priorities) using the Seeq API Reference. The screenshot below shows an example of the parameters that can be customized: Please contact Seeq support for further details if you are interested in doing this.
  20. In some cases you may want to do a calculation (such as an average) for a specific capsule within a condition. In Seeq Formula, the toGroup() function can be used to get a group of capsules from a condition (over a user-specified time period). The pick() function can then be used to select a specific capsule from the group. The Formula example below illustrates calculating an average temperature for a specific capsule in a high temperature condition. // Calculate the average temperature during a user selected capsule of a high temperature // condition. (The high temperature condition ($HighT) was created using the Value Search tool.) // // To prevent an unbounded search for the capsules, must define the search start/end to use in toGroup(). // Here, $capsule simply defines a search time period and does not refer to any specific capsules in the $HighT condition. $capsule = capsule('2019-06-19T09:00Z','2019-07-07T12:00Z') // Pick the 3rd capsule of the $HighT condition during the $capsule time period. // We must specify capsule boundary behavior (Intersect, EnclosedBy, etc.) to // define which $HighTcapsules are used and what their boundaries are (see // CapsuleBoundary documentation within the Formula tool for more information). $SelectedCapsule = $HighT.toGroup($capsule,CapsuleBoundary.EnclosedBy).pick(3) // Calculate the temperature average during the selected capsule. $Temperature.average($SelectedCapsule)
  21. I have created a daily condition in Seeq using the Periodic Condition tool. Why don't the capsules start at midnight? For example, in the screenshot below the "Daily" capsules start at 11:00PM (see the Capsules pane) instead of midnight (12:00AM). This results when the user interface (UI) time zone does not match that of the Seeq Server. In this example the Seeq Server time zone is US/Eastern but the UI time zone is US/Central. To make the UI time zone match, the user can click on the UI time zone link (noted by the red box in the screenshot: trend display, x-axis, right of timestamp): The user can then set the "Always use:" option to US/Eastern (in this example the Seeq Server is on US/Eastern) as shown here: The daily capsules now start at midnight:
  22. There are various methods to do this. The easiest method is by using the max() or min() functions in the Formula Tool, which are available beginning in Seeq release R21.0.40.05. Here is an example for creating a new signal which is the maximum of 4 other signals: $a.max($b).max($c).max($d) You can also see additional information in this related forum post.
  23. A common analytics need is to create a signal with numerical values that are based on an existing condition. Users often want to translate a condition (on/off, good data/bad data, running/down, etc.) to a numerical value to be used in calculations. For example, a user may want to multiply a process signal by a 0/1 value based on when the process is down/running. This technique can also be used to replicate "if" logic or "if / else" logic, where different values are returned depending on if the condition is true/false. Converting a condition to a signal value can be easily accomplished in Seeq using the Formula Tool and the splice function. Here is an example where we convert a condition to a signal of 0s and 1s: 1. Use the Value Search Tool to create a HOT condition for time periods when the Temperature signal is > 90 degrees F: 2. Use the Formula Tool to convert the HOT condition to a 1 (when condition is true) and a 0 (when condition is false): 3. View the results in the trend. The new signal in lane 2 has a value of 1 when the HOT condition is true. Otherwise the signal is 0. Additional Information Using Conditions and the Splice Function to Replace If Statements
  24. Hi Ted, The answer is yes, there are! One of the easiest ways uses the Seeq Formula editor. The runningDelta() and interval() functions provide methods for calculating changes in sample values (and the actual sample time) from one sample to the next. For example, the change in a tank level can be calculated using this approach: Giving this result: This next example demonstrates the interval() function for calculating the actual sample time for each sample in a signal. The sample time interpolation and units are modified to improve visualization: With the results displayed for a process sample that is collected intermittently: I hope this covers all the bases for your question, Ted! Please let me know if you have any follow-up questions. John
  25. Hi Ted, In the Seeq Formula editor, the transform() and filter() functions provide ways to loop over all the samples in a signal as well as all the capsules in a condition. For example, a 2 sample running average of a signal can be calculated as shown here, by looping over each sample in the Temperature signal: Giving this result: As an example of looping over all the capsules in a condition, high temperature capsules lasting longer than 4 hours can be identified with this formula: As shown in the trend view, only the temperature excursions longer than 4 hours are included in the “Extended High T Periods” condition: I hope these examples are helpful! Please let me know if you have further questions. John
  • Create New...