1.6 KiB
1.6 KiB
- Temp:
- TimeFromRUN : DINT
- DeltaTime : DINT
- Static:
- TimeRecorded : DINT
#TimeFromRUN := TIME_TO_DINT(TIME_TCK());
IF #TimeFromRUN < #TimeRecorded THEN
#TimeRecorded := #TimeFromRUN;
END_IF;
// Time from last call
#DeltaTime := #TimeFromRUN - #TimeRecorded;
#TimeRecorded := #TimeFromRUN;
IF #DeltaTime = 0 THEN
RETURN;
END_IF;
This allow to calcolate a fix number related to the cicle of the PLC. If the cycle of the PLC is faster then then Smoothed Time
will be grater.
So then the Actual_Torque_Smoth
can be calculated independently of the speed of the PLC
// 500 ms of smooth
#"Smoothed Time" := (#"Smoothed Time" * 999.0 + (500 / #DeltaTime)) / 1000.0;
IF (#"Smoothed Time" > 0) THEN // not divide by 0
#Actual_Torque_Smoth := (#Actual_Torque_Smoth * REAL_TO_INT(#"Smoothed Time"-1) + INT_TO_REAL(#Motor.STATUS_VFD_ACT_Torque)) / REAL_TO_INT( #"Smoothed Time");
IF (#Actual_Torque_Smoth < 0.001) OR NOT (#Actual_Torque_Smoth < 0 OR #Actual_Torque_Smoth > 0) THEN // Nan Check
#Actual_Torque_Smoth :=0;
END_IF;
// 70 bot a 1000
#Actual_Speed_Smoth := (#Actual_Speed_Smoth * REAL_TO_INT(#"Smoothed Time"-1) + INT_TO_REAL(#Motor.STATUS_VFD_ACT_Speed_Hz)) / REAL_TO_INT( #"Smoothed Time");
IF (#Actual_Speed_Smoth < 0.001) OR NOT (#Actual_Speed_Smoth < 0 OR #Actual_Speed_Smoth > 0) THEN // Nan Check
#Actual_Speed_Smoth :=0;
END_IF;
END_IF;
The parameter 500 means aprox 500ms independently of the PLC cycle.
The check OR NOT (#Actual_Speed_Smoth < 0 OR #Actual_Speed_Smoth > 0)
is for the cases on NaN. So in this cases it reset the value to 0.