* Ethercat CIA402 node execution code
IEC_INT beremiz__IW%(location)s_0;
IEC_INT *__IW%(location)s_0 = &beremiz__IW%(location)s_0;
static IEC_UINT __InactiveMask = 0x4f;
static IEC_UINT __ActiveMask = 0x6f;
static IEC_UINT __PowerMask = 0x10;
static IEC_BOOL __FirstTick = 1;
static __CIA402Node __CIA402Node_%(location)s;
%(extern_located_variables_declaration)s
int __init_%(location)s()
*__IW%(location)s_0 = __MK_Alloc_AXIS_REF();
__CIA402Node_%(location)s.axis = __MK_GetPublic_AXIS_REF(*__IW%(location)s_0);
void __cleanup_%(location)s()
void __retrieve_%(location)s()
IEC_UINT statusword_inactive = *(__CIA402Node_%(location)s.StatusWord) & __InactiveMask;
IEC_UINT statusword_active = *(__CIA402Node_%(location)s.StatusWord) & __ActiveMask;
// CIA402 node state computation
__CIA402Node_%(location)s.state = __Unknown;
switch (statusword_inactive) {
__CIA402Node_%(location)s.state = __NotReadyToSwitchOn;
__CIA402Node_%(location)s.state = __SwitchOnDisabled;
__CIA402Node_%(location)s.state = __FaultReactionActive;
__CIA402Node_%(location)s.state = __Fault;
switch (statusword_active) {
__CIA402Node_%(location)s.state = __ReadyToSwitchOn;
__CIA402Node_%(location)s.state = __SwitchedOn;
__CIA402Node_%(location)s.state = __OperationEnabled;
__CIA402Node_%(location)s.state = __QuickStopActive;
if (__CIA402Node_%(location)s.state == __Unknown) {
__CIA402Node_%(location)s.axis->PowerFeedback = __CIA402Node_%(location)s.state == __OperationEnabled;
__CIA402Node_%(location)s.axis->ActualPosition = (IEC_REAL)(*(__CIA402Node_%(location)s.ActualPosition)) * __CIA402Node_%(location)s.axis->RatioDenominator / __CIA402Node_%(location)s.axis->RatioNumerator;
__MK_UpdateAxis(*__IW%(location)s_0);
void __publish_%(location)s()
__MK_ComputeAxis(*__IW%(location)s_0);
IEC_BOOL power = ((*(__CIA402Node_%(location)s.StatusWord) & __PowerMask) > 0) && __CIA402Node_%(location)s.axis->Power;
// CIA402 node state transition computation
switch (__CIA402Node_%(location)s.state) {
*(__CIA402Node_%(location)s.ControlWord) = (*(__CIA402Node_%(location)s.ControlWord) & ~0x87) | 0x06;
*(__CIA402Node_%(location)s.ControlWord) = (*(__CIA402Node_%(location)s.ControlWord) & ~0x8f) | 0x07;
*(__CIA402Node_%(location)s.ControlWord) = (*(__CIA402Node_%(location)s.ControlWord) & ~0x8f) | 0x0f;
*(__CIA402Node_%(location)s.ControlWord) = (*(__CIA402Node_%(location)s.ControlWord) & ~0x8f) | 0x80;
if (__CIA402Node_%(location)s.axis->CSP && *(__CIA402Node_%(location)s.ModesOfOperationDisplay) == 0x08) {
*(__CIA402Node_%(location)s.TargetPosition) = (IEC_DINT)(__CIA402Node_%(location)s.axis->PositionSetPoint * __CIA402Node_%(location)s.axis->RatioNumerator / __CIA402Node_%(location)s.axis->RatioDenominator);
*(__CIA402Node_%(location)s.TargetPosition) = *(__CIA402Node_%(location)s.ActualPosition);