DerivativeOperator Class
(Automation::DerivativeOperator)The Derivative operator calculates the mathematical derivative (ie. rate of change per second) of the input value. More...
Header: | #include <DerivativeOperator.h> |
Inherits: | CDPOperator<T> |
Public Functions
DerivativeOperator(const CDPPropertyBase &in) |
Reimplemented Public Functions
virtual void | Create(const char *shortName, CDPBaseObject *parent) override |
virtual void | FillNodeChildren(CDP::StudioAPI::NodeStream &stream) const override |
virtual unsigned int | Process() override |
- 18 public functions inherited from CDPOperator
- 17 public functions inherited from CDPOperatorBase
- 46 public functions inherited from CDPBaseObject
- 26 public functions inherited from CDP::StudioAPI::CDPNode
- 22 public functions inherited from CDP::StudioAPI::ICDPNode
Protected Functions
- 1 protected function inherited from CDP::StudioAPI::CDPNode
Additional Inherited Members
- 1 public variable inherited from CDPOperatorBase
- 1 static public member inherited from CDPBaseObject
- 8 protected variables inherited from CDPOperator
- 5 protected variables inherited from CDPOperatorBase
- 11 protected variables inherited from CDPBaseObject
Detailed Description
The Derivative operator calculates the mathematical derivative (ie. rate of change per second) of the input value.
Arguments and Properties
Name | Description |
---|---|
In | The default input value. |
Out | The default output value (the derivative of the input). |
CalculationCycles | Number of preceding processing cycles to average for derivative calculation (default is 1 cycle) |
The Derivative operator calculates the derivative based on the previous processing cycle input values. Therefore, when the value is not updated during CalculationCycles time, then the derivative calculates to 0 on that processing cycle. So you must take care that the operator source value update frequency is at least the same (or even better 2 or more times higher) than the frequency of the DerivativeOperator. Alternatively you can compensate the processing frequency difference by increasing the CalculationCycles property to match formula.
`\text{CalculationCycles}=\text{frequency of the derivative operator}/\text{frequency of the source value}`
You can also use CalculationCycles higher than 1 while calculating derivatives of different sensors to reduce the false derivatives caused by sensors noise.
Note: When the Derivative operator is added on top of the Derivative operator then the mathematical second derivative (ie. rate of change of rate of change) can be calculated.
When operator is used inside a signal its default input is automatically tied to signal's InternalValue or previous operator's output. Its default output is automatically tied to next operator's input or to signal's Value. See also CDP Operator Usage In CDP Signals.
Note: This operator can't be used in I/O Servers / CDPChannels because it requires to be run with a constant period. I/O Servers can't always guarantee periodic running since they may be in Offline state, or they can send/receive on change.
Example
Below is an example plot with a Sine signal (cyan) and the same signal with a Derivative operator applied (orange) plus the same signal with second Derivative operator applied (yellow):
Actual Processing Code of the DerivativeOperator
unsigned int DerivativeOperator<T>::Process() { auto calculationCycles = static_cast<unsigned char>(m_calculationCycles); if (calculationCycles == 0) { m_calculationCycles = 1; calculationCycles = 1; } auto prevAverage = GetCalculationCyclesAverage(); m_prevValueHistory.push_back(static_cast<T>(m_input)); while (m_prevValueHistory.size() > calculationCycles) m_prevValueHistory.pop_front(); m_output = (GetCalculationCyclesAverage() - prevAverage) / CDPOperator<T>::GetOperatorPeriod(); return STATUS_OK; }
See also Argument.
Member Function Documentation
DerivativeOperator::DerivativeOperator(const CDPPropertyBase &in)
Default constructs an instance of DerivativeOperator.
[override virtual]
void DerivativeOperator::Create(const char *shortName, CDPBaseObject *parent)
[override virtual]
void DerivativeOperator::FillNodeChildren(CDP::StudioAPI::NodeStream &stream) const
[protected]
T DerivativeOperator::GetCalculationCyclesAverage()
[override virtual]
unsigned int DerivativeOperator::Process()
Get started with CDP Studio today
Let us help you take your great ideas and turn them into the products your customer will love.