FB_CMA_Quantiles
Calculates the quantile of the input value distribution for single- and multi-channel real-valued signals.
The function block FB_CMA_Quantiles calculates p-quantiles of single or multi-channel real-valued input data. Each channel is considered independently.
The function block is initially based on the calculation of a frequency distribution, see FB_CMA_HistArray. The lower and upper limit values and the number of classes (also referred to as bins) of the frequency distribution are transferred for parameterization. The individual class limits are then distributed in identical intervals across the so defined total range, see Histogram. The cumulative frequency distribution is then calculated, and from this the configured quantile, see Statistical analysis. A further configuration parameter is the number of quantiles to be calculated for each channel.
The result is a two-dimensional array with real values. The first index is the channel number, the second index is the number of the respective quantile.
Values that are below the lower limit and values above the upper limit with regard to the classification are ignored for the quantile calculation. Within an interval the quantile values are interpolated. If the empirical cumulative frequency distribution is constant section by section, the smallest suitable value is used.
Memory properties
The sample quantity N, which is used to calculate the current result, automatically increases with each new incoming data set, i.e. the function block uses all input values since its instantiation. Resetting of the sample quantity to zero (deleting the internal memory of the FB) is provided by a ResetData()
method or, if the CallEx()
method is used, by the variable bResetData
.
Configuration
A two-dimensional array with values is transferred to the Configure()
method of the function block as configuration parameters. Each value represents the relative frequency for a channel and quantile to be calculated. The function block then calculates the quantiles for these frequencies for each channel, based on the input data. The set frequency is 0.5, which corresponds to the median. Alternatively, a one-dimensional array can be transferred with values for the quantile to be calculated, which are used for all channels.
NaN occurrence
If results are not yet available for a channel, the value NaN (not a number) is returned for this channel. Reasons may be that no input data have been transferred yet, all data transferred so far are outside the interval between fMin
Binned
and fMaxBinned
, or only NaNs were transferred as input values for individual channels.
If a set of input values contains the special constant NaN, no value is added to the statistics for this channel for this time step, i.e. it is treated as indicator for missing values.
Handling of NaN values If the situations described above, which lead to NaN values, cannot be ruled out or safely neglected, the application program must be able to handle these error values. |
Router memory
The quantile calculation is a statistical calculation based on histograms, which require a lot of memory. The memory usage depends on the parameters nChannels
, nBins
and nMaxQuantiles
. It is recommended to keep these parameters as small as possible.
Behavior when processing multi-channel input data
When processing several channels (nChannels > 1
), there is a possibility of each channel having different return values. In this case, return values can be queried separately on the function block. If the results from one or more channels are impermissible, but not all channels, the value on the function block corresponds to eCM_InfRTime_AmbiguousChannelResults
. If the results of all channels are impermissible, then the value on the function block corresponds to eCM_ErrRTime_ErrornousChannelResults
.
A list of return values of all channels can be queried using the method GetChannelErrors()
.
When processing several subchannels (nSubChannels > 0
), particular attention must be paid to the formatting of the input and output data. If the input data consist of a multi-channel result of an upstream function block, the value of nChannels
must be adopted; further configuration takes place in this case via the parameter nSubChannels
.
Sample: In the statistical consideration (e.g. by FB_CMA_Quantiles) of the frequency channels of a multi-channel spectrum (e.g. FB_CMA_MagnitudeSpectrum), the value of nChannels
must be identical to the number of input signals; the number of subchannels nSubChannels
corresponds to the length of the spectrum.
Sample implementation
A sample implementation is available under the following link: Condition Monitoring with frequency analysis.
Inputs and outputs
The input and output buffers correspond to the following definition (Shape). The variable parameters are part of the function block input stInitPars
.
Versions | Input buffer (MultiArray input stream) | Output buffer (MultiArray output stream) |
---|---|---|
Standard version |
|
|
Standard version for several data sets |
|
|
Multi-channel version |
|
|
Multi-channel version for several data sets |
|
|
*: The length of this dimension can be selected as desired and can thus adapt itself to the application or to the output buffer of the preceding algorithm.
VAR_INPUT
stInitPars : ST_CM_Quantiles_InitPars; // init parameter
nOwnID : UDINT; // ID for this FB instance
aDestIDs : ARRAY[1..cCMA_MaxDest] OF UDINT; // IDs of destinations for output
nResultBuffers : UDINT := 4; // number of MultiArrays which should be initialized for results (0 for no initialization)
tTransferTimeout : LTIME := LTIME#500US; // timeout checking off during access to inter-task FIFOs
END_VAR
Input parameters
The input parameters of this function block represent initialization parameters and must already be assigned in the declaration of the FB instance! (Alternatively: Init() method). They may only be assigned once. A change at runtime is not possible.
stInitPars
: Function-block-specific structure with initialization parameters of the type ST_CM_Quantiles_InitPars. The parameters must correlate to the above definition of the input and output buffers.nOwnID
: Identifies the function block instance with a unique ID. This must always be greater than zero. A proven approach is to define an enumeration for this purpose.aDestIDs
: Defines the destinations to which the results are to be forwarded by specifying the IDs of the destinations. The definition of the output buffer (as described above) must correlate to the definition of the input buffer of each selected destination.nResultBuffers
: The function block initializes a Transfer Tray Stream with the specified number of MultiArray buffers. The default value is four.tTransferTimeout
: Setting of the synchronous timeout for internal MultiArray forwardings. See section Parallel processing.
Output parameters
VAR_OUTPUT
bError : BOOL; // TRUE if an error occurs. Reset by next method call.
hrErrorCode : HRESULT; // '< 0' = error; '> 0' = info; '0' = no error/info
ipErrorMessage : I_TcMessage := fbErrorMessage; // Shows detailed information about occurred errors, warnings and more.
nCntResults : ULINT; // Counts outgoing results (MultiArrays were calculated and sent to transfer tray).
END_VAR
-
bError
: The output isTRUE
if an error occurs. -
hrErrorCode
: If an error occurs, a corresponding error code of the typeHRESULT
is output. Possible values are described in the List of error codes. -
ipErrorMessage
: Contains more detailed information on the current return value. Refer here to the section Error description and information. This special interface pointer is internally secured so that it is always valid/assigned.
Methods
Call():
The method is called each cycle in order to apply the algorithm to the current input data. The function block waits for input data if the method indicates neither new results nor an error. This is a regular behavior in the process of the analysis chain.
- Return value: If an error occurs, a corresponding error code of the type
HRESULT
is output. Possible values are described in the List of error codes.
METHOD Call : HRESULT
VAR_OUTPUT
bNewResult : BOOL; // TRUE every time when outgoing MultiArray was calculated and sent to transfer tray.
bError : BOOL; // TRUE if an error occurs.
hrErrorCode : HRESULT; // '< 0' = error; '> 0' = info; '0' = no error/info
END_VAR
bError
: The output isTRUE
if an error occurs.hrErrorCode
: If an error occurs, a corresponding error code of the typeHRESULT
is output. Possible values are described in the List of error codes. This output is identical to the return value of the method.
If a timeout occurs or no MultiArray buffer is available for the result, then neither the input data nor the result data are lost. They are forwarded on the next call. |
CallEx() :
The method is called in each cycle in order to calculate quantiles from the input signal. An alternative method is Call()
.
The quantile evaluation is generally significantly more computationally demanding than the registration of new input values. Therefore a use of the method Callex()
can considerably shorten the runtime, depending on the configured parameters, by only calculating statistic results when they are required.
The function block waits for input data if the method indicates neither new results nor an error. This is a regular behavior in the process of the analysis chain.
- Return value: If an error occurs, a corresponding error code of the type
HRESULT
is output. Possible values are described in the List of error codes.
METHOD CallEx : HRESULT
VAR_INPUT
nAppendData : UDINT; // count of data buffers which are appended until calculation (1= calculate always)
bResetData : BOOL; // automatic reset of dataset buffer after each calculation
END_VAR
VAR_OUTPUT
bNewResult : BOOL; // TRUE every time when outgoing MultiArray was calculated and sent to transfer tray.
bError : BOOL; // TRUE if an error occurs.
hrErrorCode : HRESULT; // '< 0' = error; '> 0' = info; '0' = no error/info
END_VAR
nAppendData
: Defines how many input data buffers are to be collected before a calculation is carried out, because several data blocks are preferably added in order to achieve a precise result.bResetData
: If set, the internal data buffer is completely deleted after calculation.bError
: The output isTRUE
if an error occurs.hrErrorCode
: If an error occurs, a corresponding error code of the typeHRESULT
is output. Possible values are described in the List of error codes. This output is identical to the return value of the method.
If a timeout occurs or no MultiArray buffer is available for the result, then neither the input data nor the result data are lost. They are forwarded on the next call. |
Configure() :
The quantile arguments must be configured at the beginning with the call of this method. The corresponding PLC array must be defined as follows. The Configure()
method can also be used for a new configuration with a different set of arguments.
- Return value: If an error occurs, a corresponding error code of the type
HRESULT
is output. Possible values are described in the List of error codes.
METHOD Configure : HRESULT
VAR_INPUT
pArg : POINTER TO LREAL; // pointer to 2-dimensional array (LREAL) of arguments
nArgSize : UDINT; // size of arguments buffer in bytes
END_VAR
The input buffers correspond to one of the following definitions (input shape). The variable parameters are part of the function block input stInitPars
.
Versions | Input buffer (MultiArray input stream) |
---|---|
Identical configuration of all channels and subchannels |
|
Channel-specific configuration |
|
Subchannel-specific configuration |
|
Channel and subchannel-specific configuration |
|
METHOD Init : HRESULT
VAR_INPUT
stInitPars : ST_CM_Quantiles_InitPars; // init parameter
nOwnID : UDINT; // ID for this FB instance
aDestIDs : ARRAY[1..cCMA_MaxDest] OF UDINT; // IDs of destinations for output
nResultBuffers : UDINT := 4; // number of MultiArrays which should be initialized for results (0 for no initialization)
END_VAR
Init():
This method is not usually necessary in a Condition Monitoring application. It offers an alternative to the function block initialization. The Init()
method may only be called during the initialization phase of the PLC. It cannot be used at runtime. You are referred to the use of an FB_init
method or the attribute 'call_after_init'
(see TwinCAT PLC reference). In addition, this facilitates the function block encapsulation.
The input parameters of the function block instance may not be assigned in the declaration if the initialization is to take place using the Init() method.
- Return value: If an error occurs, a corresponding error code of the type
HRESULT
is output. Possible values are described in the List of error codes.
stInitPars
: Function-block-specific structure with initialization parameters of the type ST_CM_Quantiles_InitPars. The parameters must correlate to the above definition of the input and output buffers.nOwnID
: Identifies the function block instance with a unique ID. This must always be greater than zero. A proven approach is to define an enumeration for this purpose.aDestIDs
: Defines the destinations to which the results are to be forwarded by specifying the IDs of the destinations. The definition of the output buffer (as described above) must correlate to the definition of the input buffer of each selected destination.nResultBuffers
: The function block initializes a Transfer Tray Stream with the specified number of MultiArray buffers. The default value is four.
ResetData():
The method deletes all data records that have already been added, see Memory property of the function block. If the Call()
method is called again after a ResetData()
, the internal memory must be replenished in order to calculate a valid result.
- Return value: If an error occurs, a corresponding error code of the type
HRESULT
is output. Possible values are described in the List of error codes.
METHOD ResetData : HRESULT
VAR_INPUT
END_VAR
Alternatively the automatic reset in the method CallEx()
can be used.
PassInputs():
As long as an FB_CMA_Source
instance is called and signal data are thus transferred to a target block, all further function blocks of the analysis chain have to be called cyclically as explained in the API PLC Reference.
Sometimes it is useful not to execute an algorithm for a certain time. For example, some algorithms should be executed only after prior training or configuration. The function block must be called cyclically, but it is sufficient for the data arriving at the function block to be forwarded in the communication ring. This is done using the PassInputs()
method in place of the Call()
method. The algorithm itself is not called here, and accordingly no result is calculated and no output buffer generated.
- Return value: If an error occurs, a corresponding error code of the type
HRESULT
is output. Possible values are described in the List of error codes.
METHOD PassInputs : HRESULT
VAR_INPUT
END_VAR
GetChannelErrors():
The method enables the querying of a list of the channel-specific return values when processing several channels (nChannels > 1
). A call is useful in the case that the return value of the function block corresponds to one of the values eCM_InfRTime_AmbiguousChannelResults
or eCM_ErrRTime_ErrornousChannelResults
.
-
Return value: Information on the reading process of the list of error codes. The value is set to
TRUE
if the query was successful, otherwise toFALSE
.
METHOD GetChannelErrors : BOOL
VAR_IN_OUT
aChannelErrors : ARRAY[*] OF HRESULT;
END_VAR
-
aChannelErrors
: Error list of the typeHRESULT
of the lengthnChannels
.
Similar function blocks
The FB_CMA_HistArray function block calculates the histograms of input value distributions.
The FB_CMA_MomentCoefficients function block calculates the statistical moment coefficients: average value, standard deviation, skew and kurtosis.
Requirements
Development environment | Target platform | PLC libraries to include |
---|---|---|
TwinCAT v3.1.4022.25 | PC or CX (x86, x64) | Tc3_CM, Tc3_CM_Base |
Limited functional scope already available with CM 3.1. See section Compatibility. |