Retain Counter for Operating Hours for PLCnext Engineer

Hello, Friends of the PLCnext Technology.

A Customer asked me for a Retain Measurement of Operating Hours in the PLCnext Engineer.

Unfortunately there wasn't anything available.

So i created my own Function Block. Here is all the information you need to use it yourself.

It automatically creates a second impuls by using two TON FBs if the Measurement-Input (Verbraucher) is high.

Using this method it creates Seconds, Minutes, Hours and up to 32.000 Days.

It can be reseted manually or by a Cold Start. Warm Start or switching the Controller On/Off

will keep the Values. Be sure to set the Measurement Variables to Retain!

Variables:

Verbraucher - Bool - Input

xReset - Bool - Input

iCS - Integer - Output - Retain

iCM - Integer - Output - Retain

iCH - Integer - Output - Retain

iCD - Integer - Output - Retain

R_TRIG_UP - R_Trig, R_TRIG_RESET - R_Trig, TON1 - TON, TON2 - TON

Code:

TON1(IN := TON2.Q, PT := t#500ms, Q => , ET =>);
TON2(IN := (Verbraucher and not TON1.Q), PT := t#500ms, Q => , ET => );

R_TRIG_UP(CLK := TON2.Q);
R_TRIG_RESET(CLK := xReset);

If R_TRIG_UP.Q AND (iCS < 60) then iCS := iCS + INT#1;
Elsif R_TRIG_Reset.Q OR iCS = 60 then iCS := INT#0;
END_IF;

IF ICS = 60 then ICM := ICM + INT#1;
Elsif R_TRIG_Reset.Q OR iCM = 60 then iCM := INT#0;
END_IF;

IF ICM = 60 then ICH := ICH + INT#1;
Elsif R_TRIG_Reset.Q OR iCH = 24 then iCH := INT#0;
END_IF;

IF ICH = 24 then ICD := ICD + INT#1;
Elsif R_TRIG_Reset.Q OR iCD = 32000 then iCD := INT#0;
END_IF;