Friday, December 3, 2010

$IDLE_TIME is the Blue Devils Playground

Overall Equipment Effectiveness (OEE) is a hot topic these days, and again shows the interactions going on between levels 0, 1, 2 and level 3 of the S95 model.  Folks are exploiting the features and functions of DCS platforms to provide intelligence towards the calculation of OEE.  Bob Engel of Informetric Systems Inc, has got an excellent white paper on calculating portions of OEE by using their InfoBatch product to mine data from DCS batch historians, like the one in DeltaV.  Batch analysis and batch to batch comparisons are the key outputs.

There is a missing component from batch historians, and that’s information between batches.  One of the three components of an OEE calculation is Availability, and being able to account for a Unit’s time not making batches can be as important as recipe run time.

One of the new features in Version 10 of DeltaV was Dynamic Unit Allocation.  This had been a long awaited feature (I’ve wanted something like this since my PROVOX days working on resins projects for Monsanto).  In grossly over-simplified terms, Dynamic Unit Allocation is the programmatic selection of what units a recipe should run on.

As part of Dynamic Unit Allocation, Emerson developed the concept of the Unit Selection Policy.  You configure your Selection Policies to provide the logic to the batch engine for determining which unit or units to use while the recipe is running.  They provide a couple of default selection policies, one of which is the DEFAULT_LEAST_RECENTLY_USED:

So how does DeltaV know which unit is least recently used?  Ah ha, they’ve added a new, default unit parameter named $IDLE_TIME.  So if I have a choice of three dryer units to transfer to, and I want the one that hasn’t been used in the longest time, I can use the DEFAULT_LEAST_RECENTLY_USED policy, which in turn will somehow look at the $IDLE_TIME parameter of each dryer and pick the one with the largest value.

So this got me thinking, how could I exploit (I’m famous for this, right?) this $IDLE_TIME parameter for use in OEE calculations?  How can it help me know what I don’t know – the time between batches on a unit?

My first crash and burn was to try and create an external reference parameter in a module that pointed to $IDLE_TIME of a particular unit.  You can’t do, because you can’t see it when you browse, and you get an error when you try and just type the path in – SF_100/$IDLE_TIME.CV

A little voice in my head suggested I build up a dynamic reference string, but I’ve seen so many good configurations go bad with the over-utilization of dynamic referencing, I dismissed it.  But since I had the expression editor open anyway, I thought I’d just try typing in the path (remember, can’t browse) to the parameter – success!

At this point, there are endless possibilities on how to use it.  I decided I’d push a message to the Event Chronicle (which can then feed into the Batch Historian) the first time my unit wasn’t idle, and report how long it had been idle just prior to its use:

If your batch cycle times are measured in minutes or hours, perhaps you’d want to report a daily idle time per unit.  If your cycle times are measured in days, a weekly or monthly report would be more appropriate.

Now, go be more effective.