Logging before and after a trigger or event
-
Hi,
I would like to know how to (if at all possible) to poll a data source as often as 100 times per second and for a particular point, only log values after a trigger, but also just before that trigger.Example:
Data source is a PLC being polled every 10ms
Pressure Sensor providing readings every 10ms
Trigger is when over say 500 Kpa
Begin logging until for 30 seconds then stop logging.
Also however log the values of the previous 30 seconds before the trigger happened.I thought about logging all values then purging every few minutes so that the memory doesn’t fill up but not sure about how to only catch that information I need, before and after the trigger. I have someone that might be able to set something up in a PLC but he is not sure he can do yet.
Any suggestions would be appreciated.
-
Hi Pikey4,
Interesting request! My first inclination would be to try....
- Create a high limit event detector on the point that may read over 500, set the limit to 500.
- Create a scripting data source with three points, "State triggered" (binary, log value changes, varName 'trigger'), "Last state trigger logging" (binary, log all data, varName 'lastLogged'), "High value window data" (Numeric, all data, varName 'windowData') (of course you can change the names or varNames, but we'll be using the in a moment....). Scripting data source would be on cron "0/1 * * * * ?" . Add the 10ms point the the context, varName "dataIn"
- Create a "Set point" event handler from the high limit detector to the "State triggered" point, set it to a static value, true. On the inactive action, set it to false.
- Adjust the settings of your 10ms data point to "Do not log" for the logging, set the default cache size to 3500 (10ms is 100/s so 3500 values is 35s of data. This will be kept in RAM)
- Scripting data source body:
var dataWindowSize = 30000; /* 30s */ if(trigger.value) { var dataSinceTime; /* check if this is the second trigger in the window or if we're still in that state*/ if(trigger.time - lastLogged.time < dataWindowSize) dataSinceTime = lastLogged.time; else dataSinceTime = trigger.time - dataWindowSize; lastLogged.set(true); var newData = dataIn.pointValuesSince( dataSinceTime ); for( var k = 0; k < newData.length; k+=1 ) { windowData.set( newData[k].value, newData[k].time ); } } else if( lastLogged.time - trigger.time < dataWindowSize ) { var newData = dataIn.pointValuesSince( lastLogged.time ); lastLogged.set(false); /* update our timestamp */ for( var k = 0; k < newData.length; k+=1 ) { windowData.set( newData[k].value, newData[k].time ); } }
And that should do it! I didn't really test it, though, so let me know how it goes.
-
Thinking about it a little more, I messed up the logic a little. It should be the state detector's set point handler's inactive action that sets the trigger point to false. I will modify the suggested script to reflect this...
-
Thanks Phillip i'll give this a shot if and when the install goes ahead but at least i know its possible. I agree it is a strange request from my clients