Threshold exceedances across desktops

229 views
Skip to first unread message

Jose Rodriguez

unread,
Dec 19, 2024, 11:22:04 AM12/19/24
to IADS

Would like to have the ability to see if thresholds are exceeded across all desktops/analysis windows even if some may not be plotted.  Is it possible to get a real time log of these exceedances for all parameters that have thresholds defined in the config table ?  If not , can you recommend a path to use python/visual basic to program this capability ?

Thank you,

Jose Rodriguez

Chant, Adam

unread,
Dec 19, 2024, 1:40:55 PM12/19/24
to ia...@googlegroups.com

Jose,

Thresholds are handled at the IADS Client level (When the Threshold button is set to Enabled) and only trigger/log for the logged in Desktop’s Analysis Windows that are actively being displayed or have their “RunWhileMinimized” property set to true.

Because this behavior is handeled at the IADS Client it would likely be impractical to have Analysis Window(s) with every threshold parameter in the Configuration displayed on a single Desktop.


Thank you,

Adam Chant
Project Engineer, IADS

Curtiss-Wright
190 Sierra Court A-3 Palmdale, CA 93550
T: 661.273.7003 x 2210
ach...@curtisswright.com

iads-s...@curtisswright.com

 

From: ia...@googlegroups.com <ia...@googlegroups.com> On Behalf Of Jose Rodriguez
Sent: Thursday, December 19, 2024 8:19 AM
To: IADS <ia...@googlegroups.com>
Subject: [IADS] Threshold exceedances across desktops [EXTERNAL]

 

WARNING: This message came from an external source. Please exercise caution and proper judgment when opening any attachments, clicking links or responding to this message.


 

 

Would like to have the ability to see if thresholds are exceeded across all desktops/analysis windows even if some may not be plotted.  Is it possible to get a real time log of these exceedances for all parameters that have thresholds defined in the config table ?  If not , can you recommend a path to use python/visual basic to program this capability ?

 

Thank you,

 

Jose Rodriguez

--
You received this message because you are subscribed to the Google Groups "IADS" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iads+uns...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/iads/790babe5-6943-4c8d-901f-852e784661cbn%40googlegroups.com.


This e-mail and any files transmitted with it are proprietary and intended solely for the use of the individual or entity to whom they are addressed. If you have reason to believe that you have received this e-mail in error, please notify the sender and destroy this e-mail and any attached files. Please note that any views or opinions presented in this e-mail are solely those of the author and do not necessarily represent those of the Curtiss-Wright Corporation or any of its subsidiaries. Documents attached hereto may contain technology subject to government export regulations. Recipient is solely responsible for ensuring that any re-export, transfer or disclosure of this information is in accordance with applicable government export regulations. The recipient should check this e-mail and any attachments for the presence of viruses. Curtiss-Wright Corporation and its subsidiaries accept no liability for any damage caused by any virus transmitted by this e-mail.

For information about how we process personal data and monitor communications, please visit https://www.curtisswright.com/privacy-notice/default.aspx

Jose Rodriguez

unread,
Dec 19, 2024, 2:58:23 PM12/19/24
to IADS
Thank you Adam.  The idea is to have a workstation that allows real time monitoring/review of every exceedance to a telemetered parameter with a defined threshold.  I'm thinking of a table where the user can click and investigate the exceedances.  It sounds like the only way to do that with the current IADS capabilities would be to create analysis window(s) plotting all the parameters , which like you said could be impractical. Perhaps running minimized and then having the capability to find that display for review might work.

Thanks,

Jose Rodriguez

Chant, Adam

unread,
Dec 19, 2024, 3:36:45 PM12/19/24
to ia...@googlegroups.com

Jose,

All of that data must reach the IADS Client to be evaluated and if that’s hundreds to thousands of parameters then it’s going to overwhelm most hardware and possibly even the network. 

This type of Exceedance notification and reporting is better suited for processing directly on the IADS Server.

 

Practically it would require a IADS Custom Function to be written that is run as an Order Arrival IAP on the IADS Server. The return from the Custom Function could be a blob of one or two bits per parameter that flips true if the threshold or alarm is activated. Then on the IADS Client side it would require running the ICAW control with all of the bits defined in the ICAW Definitions Table. Under that scenario if any thresholds are exceeded then it would trigger the corresponding ICAW.

John Bretz

unread,
Jan 6, 2025, 7:49:37 PMJan 6
to IADS
Hi Adam and Jose - Post Test Explorer could tackle this one fairly easily. Can the detection wait until after the test is over?

John

Jose Rodriguez

unread,
Jan 15, 2025, 10:51:41 AMJan 15
to IADS
Thank you John, that might also be useful but we were looking for something in TM first.  Perhaps we go the IAP route but focus mainly on the analog measurements.  

Thank you,

Jose Rodriguez

Jose Rodriguez

unread,
Jan 16, 2025, 2:18:44 PMJan 16
to IADS
add on question.   Is there a way to link the ICAW output to a function that allows viewing of the time history that triggered the ICAW ?

Chant, Adam

unread,
Jan 16, 2025, 2:46:34 PMJan 16
to ia...@googlegroups.com

Jose,
There is no mechanism within the ICAW control to do what you are describing. Selecting rows on the ICAW control only highlights the row and right click only allows for the reloading and resizing of columns.  Historically the user (instrumentation engineer) would use the Page Number Column to reference an external document that could then be used to troubleshoot matters further. In most cases only a subset of all possible ICAWS were displayed in the ICAW control and as part of the Desktop all associated parameters would be available on other Analysis Windows. In the rare occasion that a specific parameter was not already part of an existing Analysis Window, a new ‘scratch’ Analysis Window could be quickly created to display.

Thank you,

Adam Chant
Project Engineer, IADS

Curtiss-Wright
190 Sierra Court A-3 Palmdale, CA 93550
T: 661.273.7003 x 2210
ach...@curtisswright.com

iads-s...@curtisswright.com

 

From: ia...@googlegroups.com <ia...@googlegroups.com> On Behalf Of Jose Rodriguez
Sent: Thursday, January 16, 2025 11:17 AM
To: IADS <ia...@googlegroups.com>
Subject: [IADS] Re: Threshold exceedances across desktops [EXTERNAL]

 

WARNING: This message came from an external source. Please exercise caution and proper judgment when opening any attachments, clicking links or responding to this message.


 

add on question.   Is there a way to link the ICAW output to a function that allows viewing of the time history that triggered the ICAW ?

--

You received this message because you are subscribed to the Google Groups "IADS" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iads+uns...@googlegroups.com.

Jose Rodriguez

unread,
Jan 16, 2025, 5:08:12 PMJan 16
to IADS
Thank you for that clarification Adam.  If parameter in question is not part of an existing analysis window,  the exceedance might not have been recorded if it was a momentary loads blossom (for example).   So in that case, we would not be able to go back in time to review the data - right ?     

Chant, Adam

unread,
Jan 16, 2025, 5:31:53 PMJan 16
to ia...@googlegroups.com

Jose,
The IADS Real Time System is a group of Server and Client applications all running together to perform the various tasks of acquiring, processing, analyzing, displaying and archiving the data being fed to it. The archiving and distribution of data is handled by the IADS Server. All of the data for a given test is available to all IADS Clients at all times. If a given parameter is not specifically displayed when an event occurs it can still be accessed by adding that parameter to a display object and then using the main Scroll Bar, Event Marker or Test Point Log to seek the Analysis Window to the IRIG time that corresponds to the desired event. The IADS Client only requests the specific data for the parameters that are required to update its displays as a matter of bandwidth and processing efficiency.

In the ICAW example: a bit would signal that a parameter requires additional observation. The user could then immediately drag and drop that parameter to a stripchart for additional analysis. If the event was momentary then hitting F3 or the Stop light on the Analysis Window would stop the data from scrolling (for that Analysis window) and then the user would use the scrollbar to scroll back in time to the event for futher review. Once everything has been reviewed then pressing F3 or the Stop Light again would allow that Analysis Window to rrturn to displaying real time data. None of the data from when the Analysis Window was stopped and returned to real time would be lost as it’s being archived by the IADS Server and not the IADS Clinet.

Thank you,

Adam Chant
Project Engineer, IADS

Curtiss-Wright
190 Sierra Court A-3 Palmdale, CA 93550
T: 661.273.7003 x 2210
ach...@curtisswright.com

iads-s...@curtisswright.com

 

From: ia...@googlegroups.com <ia...@googlegroups.com> On Behalf Of Jose Rodriguez

Sent: Thursday, January 16, 2025 2:07 PM
To: IADS <ia...@googlegroups.com>

Jose Rodriguez

unread,
Jan 16, 2025, 6:09:46 PMJan 16
to IADS
Excellent, thank you for that clarification

- Jose Rodriguez

Jose Rodriguez

unread,
Jan 23, 2025, 10:24:08 AMJan 23
to IADS
Adam,

I was able to make a custom function and program the ICAW table to trigger excursions to thresholds; however, I only did it for one parameter.  I would have to enter individual rows for each instance: " function( parameter, threshold)  ".  Is  there a way to make the function read a .CSV file or a list of parameters and thresholds somehow ?  I could then map the bit numbers to different parameters in the ICAW definitions table.   Thank you.

Jose Rodriguez

Chant, Adam

unread,
Jan 23, 2025, 11:43:21 AMJan 23
to ia...@googlegroups.com

Jose,

There are a number of methods you could use to pass all of the parameter and threshold information to your custom function.

  1. Create a csv file path and pass that as the only input argument to your function.
    1. Within your cutom function in the initilize section you would load the .csv list to then be processed by your function.
  2. Create a DataGroup of the parameters you want to use and pass the DataGroup as the argument to your function.
    1. Within your code you would need to use the Configuration API or IadsDataInterfaces API to make generic queries to the DataGroup table to return the list of Parameters.
    2. Additionally if you don’t already have pre-defined thresholds assigned to the parameter defaults table then they could be populated and also queried similarlly.
  3. Just add all parametes to your arguments and parce them as such in your function; parm1, threshold1, parm2, threshold2, etc. Ouch, not recommended unless it’s only a handful.

Jose Rodriguez

unread,
Jan 31, 2025, 11:39:29 AMJan 31
to IADS
Thanks Adam.  Option one seems more efficient but I'm not sure what method is available for functions to read a CSV file and be able to use that information to pull the parameter values from IADS.   I only have what is in the tutorials, which is expecting the data values in the form of the option 3 you listed.

        #region IIadsFunction Members
        public void Compute(ref object dataIn, ref object dataOut)
        {
            Array dataInArray = (Array)dataIn;
            Double arg1 = Convert.ToDouble(dataInArray.GetValue(0));
            Double arg2 = Convert.ToDouble(dataInArray.GetValue(1));


Do you have an example of option 1 that you can provide as guidance ?


Thank you for all your help,

Jose

Chant, Adam

unread,
Jan 31, 2025, 4:32:58 PMJan 31
to ia...@googlegroups.com

Jose,
Apologies, but we’re not as well versed with C# as everything in IADS is written in C++.

For the CSV you can either pass it directly as an argument in the function or create a derived parameter that is type ascii and set the path to the CSV as the DataSourceArguement. Then you can pass that derived parameter as one of the arguments to your function. Additionally you’ll probably want to pass Current Time as one of the arguments so make a derived parameter with the DataSourceArguement of CurrentTimeOfYear() as one of the arguments going to your custom function.

 

I will have one of our developers review this and provide additional directions.

 

How many actual parameters do you plan to monitor and at what sample rate(s)?  

James Bretz

unread,
Feb 3, 2025, 1:59:05 PMFeb 3
to IADS
Jose,

If you want to monitor every data parameter from your telemetry source, it's going to be a bit complex. I don't think the custom function route would be the easiest choice honestly.

I think you have two options here:

One, you could run an external (C# or otherwise) program that uses the 'iadsread' interface, query for all the parameters, acquire the data in realtime, and check for any threshold breaks. One issue with this approach is whether the process you build has enough performance to acquire and process the data. Please do consider the depth of the task in that if you are checking thresholds, you would need to acquire every data point from every parameter (the sum of all the sample rates from every parameter), and check each point individually. Having said that, I have a C# test program running on my laptop that is acquiring 5000 parameter with a combined 800 thousand samples/sec without checking any threshold values. This setup has a quite a few high rate parameters so to perform this reliably (in C#), I needed to increase the realtime latency to 1 second. Since the exe is external to Iads, there's a issue with informing the user of a threshold break. One thought on that is that you could update the threshold log and mark threshold exceedance, but that information wouldn't boil up to a display (other than the threshold log). After considering this option more closely, I don't feel this is the right approach either.

Two, you could build a custom "Threshold" display. This display could theoretically process all the parameters, check for threshold breaks, and display those breaks in the appropriate manner to the user. I'm not honestly sure that C# would be fast enough for this task, but that completely depends on how many parameters you would need to process. So the task here would be to build a C# display and perhaps create a thread to perform the processing as mentioned above. When a threshold is exceeded, you could then inform the user either in the display with a table/ICAW format or otherwise. I left out quite a few details and issues to consider, but I think this might be the best path to success.

Here's my test code to help you get started. You can start by building a C# exe to get familiar with the iadsread interface and check the performance. Afterwards, you can try to fold this code into a custom display. Don't forget to add a reference to the "IadsDataInterfaces" library which contains the iadsread object. You can do this from C# by selecting "Project->Add Reference->COM-> select IadsDataInterfaces Type Library 1.0"

Hope this helps and see below,
Jim

...
...
using System.Diagnostics;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            IADSDATAINTERFACESLib.iadsread IadsReader = new IADSDATAINTERFACESLib.iadsread();
            Stopwatch stopwatch = new Stopwatch();
            String sOption = "ReturnTimeVector,1,WaitForData,0,DisableThreads,1,ShowProgress,1,LatencyAllowance,1.00"; //,ReturnDataAtSameSR,0";
            int MaxNumParams = 5000; // Parameters above 6400 have no data
            double totalSr = 0.0;

            // Obtain the parameter list from the server
            //Array ParameterList = (Array)IadsReader.iadsread("localhost$58000", "", "", "?");
            Array ParameterList = (Array)IadsReader.iadsread("localhost$58000", "", "", "? select Parameter from ParameterDefaults");
            String pList = (String)ParameterList.GetValue(1, 0);
            int available = ParameterList.GetLength(0);
            for (int i = 2; i < available && i < MaxNumParams; i++) // 3000
            {
                String p = (String)ParameterList.GetValue(i, 0);
                pList = pList + "," + p;
                String q = "? " + p;
                Array pInfo = (Array)IadsReader.iadsread("localhost$58000", "", "", q);
                totalSr += (double)pInfo.GetValue(1,12);
            }

            bool bReadData = true;
            int messageCounter = 1;
            int messageSubsample = 1;
            Array data;
            while (bReadData)
            {
                // Call iadsread to obtain data
                stopwatch.Reset();
                stopwatch.Start();
                Object d = IadsReader.iadsread("localhost$58000", "", 5, pList, sOption);
                data = (Array)d;
                stopwatch.Stop();

                // Compute the amount of time in the returned data and output a status message
                int rows = data.GetLength(0);
                int columns = data.GetLength(1);
                double totalTime = (double)data.GetValue(rows - 1, 0) - (double)data.GetValue(0, 0);
                messageCounter++;
                if (messageCounter > messageSubsample)
                {
                    long elapsedNanoseconds = stopwatch.ElapsedTicks * (1000000000L / Stopwatch.Frequency);
                    Console.WriteLine("Elapsed time: {0:F6} seconds for {1} points or {2:F6} seconds of data from {3} parameters. Total SR={4:F6}", (double)elapsedNanoseconds / 1000000000.0, rows, totalTime, columns, totalSr );
                    messageCounter = 0;
                }

                // I'm running out of memory. This is the best I could do to ensure Array memory release (short of pinging the garbage collection)
                Array.Clear(data, 0, data.Length);
                data = null;
            }
        }
    }
}
Reply all
Reply to author
Forward
0 new messages