Monitoring logic for a state machine, returns elapsed time [ms]
Version history
0.2.0
deGroot
Changes
Removed:
bOsrStateChangemoved intoMceStateMonitoringData
- Timing of resetting
nStateTime - Incorrect rounding in conversion from
µstoms
show full history
0.1.0
Rioual
Changes
Added:
- initial version
Overview
| kind | name | type | default | comment |
|---|---|---|---|---|
| input | nState | DINT | state of a state machine to monitor. | |
| input | bFreezeTimer | BOOL | stop the timer | |
| in_out | stateData | MceStateMonitoringData | data for state machine monitoring |
Details
nState
DINTState of a state machine to monitor.
bFreezeTimer
BOOLStop the timer
stateData
MceStateMonitoringDataData for state machine monitoring.
Source code
Declarations
(*Monitoring logic for a state machine, returns elapsed time [ms]*)
FUNCTION MceStateMonitoring : DINT
(*
* -----------------------------------------------------------------------------
* Name : MceStateMonitoring
* Version : 0.2.0
* Date : 2026-02-18
* Author : deGroot
* Family : YaskawaMce
* Organisation : github.com/YaskawaEurope/mlx-examples
*
* -----------------------------------------------------------------------------
* Monitoring logic for a state machine, returns elapsed time [ms]
* -----------------------------------------------------------------------------
*)
VAR_INPUT
nState : DINT; (*state of a state machine to monitor.*)
bFreezeTimer : BOOL; (*stop the timer*)
END_VAR
VAR_IN_OUT
stateData : MceStateMonitoringData; (*data for state machine monitoring*)
END_VAR
VAR
nTdiff : DINT; (*time since last call [µs]*)
tNow : LTIME; (*plc clock*)
END_VAR
Logic
// -----------------------------------------------------------------------------
// detect state change
// -----------------------------------------------------------------------------
IF nState <> stateData.nStateStored THEN
stateData.nStatePrevious := stateData.nStateStored ;
stateData.bOsrStateChange := TRUE;
stateData.nStateStored := nState;
ELSE
stateData.bOsrStateChange := FALSE;
END_IF;
// -----------------------------------------------------------------------------
// time state active
// -----------------------------------------------------------------------------
tNow := LTIME(); // system clock in ns resolution
IF (tNow > stateData.tStored) THEN
nTdiff := LTIME_TO_DINT(tNow - stateData.tStored) / 1000;
IF (nState <> 0) AND (nTdiff > 0) AND NOT bFreezeTimer THEN
stateData.nStateTimeUs := stateData.nStateTimeUs + nTdiff;
END_IF;
END_IF;
stateData.tStored := tNow;
stateData.nStateTime := LREAL_TO_DINT(DINT_TO_LREAL(stateData.nStateTimeUs) / 1000);
// store and reset timer at state change
IF stateData.bOsrStateChange THEN
stateData.nStateTimePrevious := stateData.nStateTime;
stateData.nStateTimeUs := 0;
stateData.nStateTime := 0;
END_IF;
MceStateMonitoring := stateData.nStateTime;
Implementation
Snippet of the function call:
dummy := MceStateMonitoring(
nState := ,
bFreezeTimer := ,
stateData := );