Advertisement
adfox83

Change Running Timer

Feb 15th, 2024 (edited)
1,096
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SCL 4.46 KB | None | 0 0
  1. TYPE "udtRunningTimer"
  2. VERSION : 0.1
  3.    STRUCT
  4.       udiSetDays : UDInt := 1;   // Timer set day count
  5.       usSetHours : USInt := 10;   // Timer set hours count
  6.       usSetMinutes : USInt := 25;   // Timer set minutes count
  7.       usSetSeconds : USInt := 13;   // Timer set seconds count
  8.       udiDaysLeft : USInt;
  9.       usHoursLeft : USInt;
  10.       usMinutesLeft : USInt;
  11.       usSecondsLeft : USInt;
  12.       bSetTimer : BOOL;   // Activate new timer PT
  13.       bStartTimer : BOOL;   // Start timer
  14.       timUser : TIME;   // Calculated time offset
  15.       timLeft : TIME;   // Left time
  16.    END_STRUCT;
  17.  
  18. END_TYPE
  19.  
  20. FUNCTION "fcConvParamToLTime" : VOID
  21. { S7_Optimized_Access := 'TRUE' }
  22. VERSION : 0.1
  23.    VAR_INPUT
  24.       udiDays : UDInt;   // Days left
  25.       usHours : USInt;   // Hours left
  26.       usMins : USInt;   // Minutes left
  27.       usSecs : USInt;   // Seconds left
  28.    END_VAR
  29.  
  30.    VAR_OUTPUT
  31.       outTIME_LTIME : Variant;   // Output is TIME or LTIME
  32.    END_VAR
  33.  
  34.    VAR_TEMP
  35.       ltimTotal : LTime;
  36.    END_VAR
  37.  
  38.  
  39. BEGIN
  40.     (*
  41.         fcConvParamToLTime
  42.         adfox@horsefucker.org      
  43.         Convert parameters to LTime
  44.        
  45.     *)
  46.    
  47.     #ltimTotal := LT#0ms;
  48.     #ltimTotal := INT_TO_LTIME(USINT_TO_INT(#usSecs) * 1000);
  49.     #ltimTotal := #ltimTotal + DINT_TO_LTIME(USINT_TO_DINT(#usMins) * 60000);
  50.     #ltimTotal := #ltimTotal + DINT_TO_LTIME(USINT_TO_DINT(#usHours) * 3600000);
  51.     #ltimTotal := #ltimTotal + LINT_TO_LTIME(UDINT_TO_LINT(#udiDays) * (24 * 3600000));
  52.     #ltimTotal := #ltimTotal * 1000000;
  53.    
  54.     IF TypeOf(#outTIME_LTIME) = LTime THEN
  55.        
  56.         // -- LTIME
  57.         //
  58.         VariantPut(SRC := #ltimTotal,
  59.                    DST := #outTIME_LTIME);
  60.        
  61.     ELSIF TypeOf(#outTIME_LTIME) = TIME THEN
  62.        
  63.         // -- TIME
  64.         //
  65.         IF #ltimTotal > T#24D THEN
  66.             #ltimTotal := T#24D;
  67.         END_IF;
  68.            
  69.         VariantPut(SRC := LTIME_TO_TIME(#ltimTotal),
  70.                    DST := #outTIME_LTIME);
  71.     ELSE
  72.         // -- Error
  73.         //
  74.         #ltimTotal := T#0ms;
  75.         VariantPut(SRC := #ltimTotal,
  76.                    DST := #outTIME_LTIME);
  77.        
  78.         ENO := FALSE;
  79.     END_IF;
  80. END_FUNCTION
  81.  
  82. FUNCTION "fcConvTimeToDHMS" : VOID
  83. { S7_Optimized_Access := 'TRUE' }
  84. VERSION : 0.1
  85.    VAR_INPUT
  86.       timInput : TIME;   // Input time
  87.    END_VAR
  88.  
  89.    VAR_OUTPUT
  90.       usDays : USInt;   // Days left
  91.       usHours : USInt;   // Hours left
  92.       usMins : USInt;   // Minutes left
  93.       usSecs : USInt;   // Seconds left
  94.    END_VAR
  95.  
  96.    VAR_TEMP
  97.       udiDiffSec : UDInt;   // Time difference in seconds
  98.    END_VAR
  99.  
  100.  
  101. BEGIN
  102.     (*
  103.         fcTimerRemainL
  104.         adfox@horsefucker.org
  105.        
  106.         This function is used to convert TIME into
  107.         days, hours, minutes and seconds.
  108.        
  109.     *)
  110.    
  111.     #udiDiffSec := TIME_TO_UDINT(#timInput) / 1000;                 // -- Get total seconds
  112.     #usDays     := UDINT_TO_USINT(#udiDiffSec / 86400);             // -- Get days left
  113.     #usHours    := UDINT_TO_USINT((#udiDiffSec MOD 86400) / 3600);  // -- Get hours left
  114.     #usMins     := UDINT_TO_USINT((#udiDiffSec MOD 3600) / 60);     // -- Minutes
  115.     #usSecs     := UDINT_TO_USINT(#udiDiffSec MOD 60);              // -- Seconds
  116.    
  117.    
  118. END_FUNCTION
  119.  
  120. FUNCTION_BLOCK "fbTestTimer"
  121. { S7_Optimized_Access := 'TRUE' }
  122. VERSION : 0.1
  123.    VAR_IN_OUT
  124.       udtTimer : "udtRunningTimer";   // HMI Struct
  125.    END_VAR
  126.  
  127.    VAR
  128.       "Timer" {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;   // TON Timer
  129.    END_VAR
  130.  
  131.  
  132. BEGIN
  133.    
  134.     // -- Convert D/H/M/S To time or Ltime
  135.     //
  136.     "fcConvParamToLTime"(udiDays := #udtTimer.udiSetDays,
  137.                          usHours := #udtTimer.usSetHours,
  138.                          usMins := #udtTimer.usSetMinutes,
  139.                          usSecs := #udtTimer.usSetSeconds,
  140.                          outTIME_LTIME => #udtTimer.timUser);
  141.    
  142.     // -- Increment comamnd
  143.     //
  144.     IF #udtTimer.bSetTimer
  145.     THEN
  146.         PRESET_TIMER(PT := #udtTimer.timUser,               // -- Set timer value
  147.                      TIMER := #Timer);
  148.         #udtTimer.bSetTimer := FALSE;
  149.     END_IF;
  150.    
  151.    
  152.     // -- Start Timer
  153.     //
  154.     #Timer(IN:=#udtTimer.bStartTimer,
  155.            PT:=#udtTimer.timUser
  156.     );
  157.    
  158.     //-- Calculate left time
  159.     #udtTimer.timLeft := #Timer.PT - #Timer.ET;
  160.    
  161.     // -- Running timer left time
  162.     //
  163.     "fcConvTimeToDHMS"(timInput:=#udtTimer.timLeft,
  164.                        usDays=>#udtTimer.udiDaysLeft,
  165.                        usHours=>#udtTimer.usHoursLeft,
  166.                        usMins=>#udtTimer.usMinutesLeft,
  167.                        usSecs=>#udtTimer.usSecondsLeft);
  168.    
  169.    
  170. END_FUNCTION_BLOCK
  171.  
  172.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement