{"id":100149,"date":"2026-02-15T20:21:08","date_gmt":"2026-02-15T20:21:08","guid":{"rendered":"https:\/\/vibromera.eu\/?post_type=calculator&#038;p=100149"},"modified":"2026-07-12T19:39:02","modified_gmt":"2026-07-12T19:39:02","slug":"maintenance-schedule-calculator","status":"publish","type":"calculator","link":"https:\/\/vibromera.eu\/zh\/calculators\/maintenance-schedule-calculator\/","title":{"rendered":"Maintenance Due Forecast Worksheet"},"content":{"rendered":"\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"WebApplication\",\"name\":\"Maintenance Due Forecast Worksheet\",\"description\":\"Forecast an hour-meter maintenance threshold from readings recorded at defined dates,with an optional calendar limit and explicit planning assumptions.\",\"url\":\"https:\/\/vibromera.eu\/calculators\/maintenance-schedule-calculator\/\",\"applicationCategory\":\"Engineering Reference\",\"operatingSystem\":\"Any\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"EUR\"},\"creator\":{\"@type\":\"Organization\",\"name\":\"Vibromera\",\"url\":\"https:\/\/vibromera.eu\/\"},\"dateModified\":\"2026-07-13\",\"inLanguage\":\"en\",\"isAccessibleForFree\":true}<\/script>\n<style>:root{--ms:#356a54;--msl:#eaf5ef;--ink:#181817;--sec:#595750;--mut:#817e76;--b:#d8d4cc;--bl:#e9e5dd;--alt:#f8f6f1;--red:#b42318;--yel:#fff8df;--amb:#8a6500;--font:'DM Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.msw-wrap{font-family:var(--font);color:var(--ink);max-width:1060px;margin:0 auto;border:1px solid var(--bl);border-radius:16px;overflow:hidden;background:#fff}.msw-wrap *,.msw-wrap *:before,.msw-wrap *:after{box-sizing:border-box}.msw-hero{padding:34px 38px 26px;background:linear-gradient(135deg,#f8fbf9,#edf6f1)}.msw-kicker{text-transform:uppercase;letter-spacing:.1em;font-size:12px;font-weight:800;color:var(--ms)}.msw-hero h1{font-size:clamp(28px,4vw,44px);line-height:1.08;margin:8px 0 12px}.msw-lead{font-size:17px;line-height:1.65;color:var(--sec);max-width:920px}.msw-badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}.msw-badge{padding:6px 10px;border-radius:99px;background:#fff;border:1px solid var(--b);font-size:12px;font-weight:700}.msw-main{padding:30px 38px}.msw-panel{border:1px solid var(--b);border-radius:14px;padding:24px}.msw-panel h2{font-size:22px;margin:0 0 8px}.msw-note{font-size:14px;line-height:1.55;color:var(--sec)}.msw-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:20px}.msw-field{display:flex;flex-direction:column;gap:7px}.msw-wide{grid-column:1\/-1}.msw-label{font-size:13px;font-weight:800}.msw-help{font-size:12px;line-height:1.4;color:var(--mut)}.msw-input,.msw-textarea{font:inherit;width:100%;border:1px solid #bcb8af;border-radius:9px;padding:11px 12px;background:#fff;color:var(--ink)}.msw-textarea{min-height:92px;resize:vertical}.msw-input:focus,.msw-textarea:focus{outline:3px solid rgba(53,106,84,.17);border-color:var(--ms)}.msw-error{min-height:22px;color:var(--red);font-size:14px;font-weight:800;margin:14px 0 0}.msw-results{margin-top:20px;border:1px solid var(--b);border-radius:12px;overflow:hidden}.msw-results[hidden]{display:none}.msw-rhead{background:var(--msl);padding:18px 20px}.msw-rtitle{font-size:20px;font-weight:900;color:var(--ms)}.msw-rsub{font-size:13px;color:var(--sec);margin-top:4px}.msw-rgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--bl)}.msw-card{background:#fff;padding:18px}.msw-card h3{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);margin:0 0 8px}.msw-val{font-size:20px;font-weight:900;overflow-wrap:anywhere}.msw-unit{font-size:12px;color:var(--mut);margin-top:4px}.msw-alert{border-left:4px solid var(--amb);background:var(--yel);padding:14px 16px;margin-top:18px;font-size:14px;line-height:1.55}.msw-section{border-top:1px solid var(--bl);padding:28px 38px}.msw-section h2{font-size:24px;margin:0 0 10px}.msw-section h3{font-size:18px;margin:22px 0 8px}.msw-section p,.msw-section li{font-size:14px;line-height:1.65;color:var(--sec)}.msw-table-wrap{overflow-x:auto;border:1px solid var(--b);border-radius:10px}.msw-table{width:100%;border-collapse:collapse;min-width:760px}.msw-table th,.msw-table td{padding:12px 13px;text-align:left;vertical-align:top;border-bottom:1px solid var(--bl);font-size:13px;line-height:1.45}.msw-table th{background:var(--alt);font-weight:900}.msw-table tr:last-child td{border-bottom:0}.msw-code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.msw-footer{padding:20px 38px;background:var(--alt);font-size:12px;color:var(--mut)}.msw-footer a,.msw-section a{color:var(--ms)}@media(max-width:700px){.msw-hero,.msw-main,.msw-section{padding-left:20px;padding-right:20px}.msw-grid,.msw-rgrid{grid-template-columns:1fr}.msw-wide{grid-column:auto}.msw-panel{padding:18px}.msw-table{min-width:680px}}<\/style>\n<div class=\"msw-wrap\"><header class=\"msw-hero\"><div class=\"msw-kicker\">Hour-meter forecast \u00b7 optional calendar limit<\/div><h1>Maintenance Due Forecast Worksheet<\/h1><p class=\"msw-lead\">Forecast when a documented hour-meter threshold will be reached. Tie every meter reading to its date,retain the meter value from the last completed service,and optionally apply a calendar due date from the same maintenance plan.<\/p><div class=\"msw-badges\"><span class=\"msw-badge\">No generic service intervals<\/span><span class=\"msw-badge\">Hours and calendar kept separate<\/span><span class=\"msw-badge\">Overdue cases supported<\/span><span class=\"msw-badge\">Planning estimate\u2014not an ISO formula<\/span><\/div><\/header>\n<main class=\"msw-main\"><section class=\"msw-panel\"><h2>Document one maintenance task<\/h2><p class=\"msw-note\">Use the exact task and interval from the asset-specific OEM manual,approved maintenance programme or work order. Do not infer the last-service meter from a rounded interval multiple.<\/p><form id=\"msw-form\" novalidate><div class=\"msw-grid\"><div class=\"msw-field\"><label class=\"msw-label\" for=\"msw-asof\">Meter reading as-of date<\/label><input class=\"msw-input\" type=\"date\" id=\"msw-asof\"><span class=\"msw-help\">The date on which the current meter reading was recorded.<\/span><\/div><div class=\"msw-field\"><label class=\"msw-label\" for=\"msw-lastdate\">Last completed service date<\/label><input class=\"msw-input\" type=\"date\" id=\"msw-lastdate\"><\/div><div class=\"msw-field\"><label class=\"msw-label\" for=\"msw-lastmeter\">Meter at last completed service (h)<\/label><input class=\"msw-input\" id=\"msw-lastmeter\" inputmode=\"decimal\" autocomplete=\"off\"><span class=\"msw-help\">Use the actual recorded counter\u2014not zero and not a guessed interval boundary unless that is the record.<\/span><\/div><div class=\"msw-field\"><label class=\"msw-label\" for=\"msw-currentmeter\">Current meter on the as-of date (h)<\/label><input class=\"msw-input\" id=\"msw-currentmeter\" inputmode=\"decimal\" autocomplete=\"off\"><\/div><div class=\"msw-field\"><label class=\"msw-label\" for=\"msw-interval\">Task interval from the source (h)<\/label><input class=\"msw-input\" id=\"msw-interval\" inputmode=\"decimal\" autocomplete=\"off\"><span class=\"msw-help\">This worksheet does not supply or recommend an interval.<\/span><\/div><div class=\"msw-field\"><label class=\"msw-label\" for=\"msw-daily\">Planned average operation (h\/calendar day)<\/label><input class=\"msw-input\" id=\"msw-daily\" inputmode=\"decimal\" autocomplete=\"off\"><span class=\"msw-help\">A forecast assumption in the range greater than0 through24.<\/span><\/div><div class=\"msw-field msw-wide\"><label class=\"msw-label\" for=\"msw-caldate\">Calendar due date from the maintenance plan (optional)<\/label><input class=\"msw-input\" type=\"date\" id=\"msw-caldate\"><span class=\"msw-help\">Enter an explicit date only when the task also has a calendar limit. The earlier hour-based forecast or calendar limit governs.<\/span><\/div><div class=\"msw-field msw-wide\"><label class=\"msw-label\" for=\"msw-source\">Task and source record<\/label><textarea class=\"msw-textarea\" id=\"msw-source\" maxlength=\"1800\" placeholder=\"Asset\/model\/serial range;maintenance task;manual or approved plan identifier and revision;hour interval;calendar rule;meter\/date records;duty or environmental assumptions\"><\/textarea><\/div><\/div><p class=\"msw-error\" id=\"msw-error\" role=\"alert\"><\/p><\/form>\n<section class=\"msw-results\" id=\"msw-results\" hidden data-json=\"\"><div class=\"msw-rhead\"><div class=\"msw-rtitle\" id=\"msw-r-status\">Maintenance forecast<\/div><div class=\"msw-rsub\" id=\"msw-summary\">\u2014<\/div><\/div><div class=\"msw-rgrid\"><article class=\"msw-card\"><h3>Effective planning due date<\/h3><div class=\"msw-val\" id=\"msw-r-effective\">\u2014<\/div><div class=\"msw-unit\" id=\"msw-r-governor\">\u2014<\/div><\/article><article class=\"msw-card\"><h3>Target meter<\/h3><div class=\"msw-val\" id=\"msw-r-target\">\u2014<\/div><div class=\"msw-unit\">last-service meter + interval<\/div><\/article><article class=\"msw-card\"><h3>Hours remaining<\/h3><div class=\"msw-val\" id=\"msw-r-remaining\">\u2014<\/div><div class=\"msw-unit\">negative means hour threshold passed<\/div><\/article><article class=\"msw-card\"><h3>Hour-based forecast date<\/h3><div class=\"msw-val\" id=\"msw-r-hourdate\">\u2014<\/div><div class=\"msw-unit\">average-use estimate from the as-of date<\/div><\/article><article class=\"msw-card\"><h3>Hour-based days remaining<\/h3><div class=\"msw-val\" id=\"msw-r-days\">\u2014<\/div><div class=\"msw-unit\">hours remaining \/ planned h\/day<\/div><\/article><article class=\"msw-card\"><h3>Hours since last service<\/h3><div class=\"msw-val\" id=\"msw-r-used\">\u2014<\/div><div class=\"msw-unit\">current meter \u2212 last-service meter<\/div><\/article><\/div><\/section>\n<div class=\"msw-alert\"><strong>Decision boundary:<\/strong> the forecast is not a maintenance recommendation,condition assessment or release-to-service decision. Follow the applicable manual and approved programme;some tasks use hours,calendar time,distance,starts,cycles,condition or an earlier-of rule. Adverse duty can require shorter intervals. Record actual completion in the responsible maintenance system.<\/div><\/section><\/main>\n<section class=\"msw-section\"><h2>Equations and time points<\/h2><div class=\"msw-table-wrap\"><table class=\"msw-table\"><thead><tr><th>Quantity<\/th><th>Equation<\/th><th>Required interpretation<\/th><\/tr><\/thead><tbody><tr><td>Hour-meter target<\/td><td class=\"msw-code\">H<sub>target<\/sub>=H<sub>last service<\/sub>+I<\/td><td>Both meter readings refer to the same non-reset counter and I is the documented interval for this task.<\/td><\/tr><tr><td>Hours remaining<\/td><td class=\"msw-code\">R=H<sub>target<\/sub>\u2212H<sub>as-of<\/sub><\/td><td>R=0 means due now;R&lt;0 means the hour threshold has passed.<\/td><\/tr><tr><td>Hour-based calendar estimate<\/td><td class=\"msw-code\">d=R\/u; D<sub>hour<\/sub>=D<sub>as-of<\/sub>+d<\/td><td>u is planned average operating hours per calendar day. This is a forecast,not a reconstruction of actual use.<\/td><\/tr><tr><td>Earlier-of rule<\/td><td class=\"msw-code\">D<sub>effective<\/sub>=min(D<sub>hour<\/sub>,D<sub>calendar<\/sub>)<\/td><td>Applied only when an explicit calendar due date from the same task source is entered.<\/td><\/tr><\/tbody><\/table><\/div><p>Date arithmetic uses date-only UTC values to avoid local daylight-saving shifts. Fractional forecast days are retained for the numerical result;the displayed ISO date is the calendar date containing the estimated threshold.<\/p><\/section>\n<section class=\"msw-section\"><h2>What was corrected<\/h2><p>The former calculator derived hours remaining from the current meter but added those days to the last-service date. Those quantities belong to different time points. For example,if the current reading is recorded long after the last service,the reported date is shifted backwards by that elapsed calendar time. The replacement adds forecast days to the meter reading&#8217;s as-of date.<\/p><p>The former code also rounded the current meter up to an interval multiple. That silently assumed service occurred at a zero-based multiple and discarded the recorded meter at the last completed task. The target is now the recorded last-service meter plus the documented task interval. Empty fields,negative readings,numeric prefixes,calendar reversals and more than24 average operating hours\/day are rejected;pre-filled examples and generic interval presets were removed.<\/p><\/section>\n<section class=\"msw-section\"><h2>Primary-source boundary<\/h2><p><a href=\"https:\/\/www.cummins.com\/sites\/default\/files\/2024-10\/0981-0149-i12-hdkag-ops-manual.pdf\" target=\"_blank\" rel=\"noopener\">Cummins Operation Manual 0981-0149,Issue12 (2024),Maintenance Schedule<\/a> instructs the user to perform each procedure at the stated time period or operating hours,whichever comes first,and notes that severe conditions can require more frequent maintenance. This supports the optional earlier-of calendar limit;it does not supply a universal interval.<\/p><p><a href=\"https:\/\/www.perkins.com\/en_GB\/aftermarket\/maintenance\/preventive-maintenance\/scheduled-maintenance.html\" target=\"_blank\" rel=\"noopener\">Perkins scheduled-maintenance guidance<\/a> states that no two schedules are exactly the same and directs users to the Operation and Maintenance Manual for the particular engine. <a href=\"https:\/\/www.cat.com\/en_US\/articles\/for-owners\/small-wheel-loaders\/small-wheel-loader-preventative-maintenance.html\" target=\"_blank\" rel=\"noopener\">Caterpillar&#8217;s 926M example<\/a> reports that84h on the meter leaves416h to a500h service threshold;that published arithmetic is included in the independent tests.<\/p><p>The equations on this page are transparent planning arithmetic,not a formula established by ISO. The task interval,scope,environmental modifiers and authority must come from the applicable equipment documentation or approved maintenance programme.<\/p><h3>Do not use this worksheet without adjustment when<\/h3><ul><li>the hour meter was reset,replaced,rolled over or does not measure the same operating state as the maintenance rule;<\/li><li>the task is governed by starts,cycles,distance,energy,condition monitoring or a combination other than hours\/calendar;<\/li><li>future operation varies materially from the entered average or shutdown periods are scheduled;<\/li><li>the manual defines initial-service,seasonal,severe-duty or serial-number-specific rules;<\/li><li>an approved CMMS\/EAM work order or regulatory requirement gives a different due rule.<\/li><\/ul><\/section>\n<footer class=\"msw-footer\">\u00a92024\u20132026 <a href=\"https:\/\/vibromera.eu\/\">Vibromera<\/a> \u00b7 Scientific review July2026<\/footer><\/div>\n<script>(function(){'use strict';function $(id){return document.getElementById(id)}var DAY=86400000;function num(s){s=String(s).trim();if(!s||s.includes('.')&&s.includes(',')||!\/^[+]?(?:\\d+(?:[.,]\\d*)?|[.,]\\d+)(?:[eE][+-]?\\d+)?$\/.test(s))return NaN;var n=Number(s.replace(',','.'));return Number.isFinite(n)&&n<=1e12?n:NaN}function date(s){if(!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(s))return null;var d=new Date(s+'T00:00:00Z');return Number.isFinite(d.getTime())&&d.toISOString().slice(0,10)===s?d:null}function out(x,d){return x.toLocaleString('en-US',{minimumFractionDigits:d,maximumFractionDigits:d})}function iso(ms){var d=new Date(ms);return Number.isFinite(d.getTime())?d.toISOString().slice(0,10):''}function clear(){['msw-r-effective','msw-r-target','msw-r-remaining','msw-r-hourdate','msw-r-days','msw-r-used','msw-summary','msw-r-governor'].forEach(function(id){$(id).textContent='\u2014'});$('msw-r-status').textContent='Maintenance forecast';$('msw-results').hidden=true;$('msw-results').dataset.json=''}function fail(m){clear();$('msw-error').textContent=m}function calc(){var raw={asof:$('msw-asof').value,lastdate:$('msw-lastdate').value,lastmeter:$('msw-lastmeter').value,currentmeter:$('msw-currentmeter').value,interval:$('msw-interval').value,daily:$('msw-daily').value,caldate:$('msw-caldate').value,source:$('msw-source').value.trim()};var started=Object.keys(raw).some(function(k){return raw[k]});if(!started){$('msw-error').textContent='';clear();return}var asof=date(raw.asof),lastdate=date(raw.lastdate),caldate=raw.caldate?date(raw.caldate):null,lastmeter=num(raw.lastmeter),current=num(raw.currentmeter),interval=num(raw.interval),daily=num(raw.daily);if(!asof||!lastdate||raw.caldate&&!caldate||!raw.source){fail('Enter valid as-of and last-service dates,and document the task,manual or approved plan and meter records.');return}if(![lastmeter,current,interval,daily].every(Number.isFinite)){fail('Enter every hour value as one complete finite non-negative number;use decimal point or decimal comma,not both.');return}if(!(lastmeter>=0&&current>=lastmeter&&interval>0&&interval<=1e9&&daily>0&&daily<=24)){fail('Required bounds:current meter not below last-service meter,positive interval no greater than1,000,000,000h,and planned use greater than0 through24h\/day.');return}if(lastdate.getTime()>asof.getTime()){fail('The last completed service date cannot be after the current meter as-of date.');return}if(caldate&&caldate.getTime()<lastdate.getTime()){fail('The calendar due date cannot be before the recorded last completed service date.');return}var target=lastmeter+interval,remaining=target-current,used=current-lastmeter,days=remaining\/daily,hourMs=asof.getTime()+days*DAY,hourDate=iso(hourMs);if(!Number.isFinite(target)||!Number.isFinite(remaining)||!Number.isFinite(days)||!hourDate){fail('The forecast is outside the supported numerical or calendar range.');return}var calMs=caldate?caldate.getTime():null,governor='hour-meter forecast',effectiveMs=hourMs;if(caldate){if(Math.abs(calMs-hourMs)<1){governor='hour and calendar limits together';effectiveMs=calMs}else if(calMs<hourMs){governor='calendar limit';effectiveMs=calMs}}var effectiveDate=iso(effectiveMs),status=effectiveMs<asof.getTime()?'OVERDUE':Math.abs(effectiveMs-asof.getTime())<1?'DUE NOW':'FORECAST';$('msw-error').textContent='';$('msw-r-status').textContent=status;$('msw-summary').textContent='As of '+raw.asof+';governing basis:'+governor+'.';$('msw-r-effective').textContent=effectiveDate;$('msw-r-governor').textContent=governor;$('msw-r-target').textContent=out(target,3)+' h';$('msw-r-remaining').textContent=out(remaining,3)+' h';$('msw-r-hourdate').textContent=hourDate;$('msw-r-days').textContent=out(days,6)+' days';$('msw-r-used').textContent=out(used,3)+' h';$('msw-results').dataset.json=JSON.stringify({as_of_date:raw.asof,last_service_date:raw.lastdate,last_service_meter_h:lastmeter,current_meter_h:current,interval_h:interval,target_meter_h:target,hours_since_last_service:used,hours_remaining:remaining,planned_hours_per_day:daily,days_remaining:days,estimated_hour_due_date:hourDate,calendar_due_date:raw.caldate||null,effective_due_date:effectiveDate,governing_limit:governor,status:status});$('msw-results').hidden=false}$('msw-form').addEventListener('input',calc);$('msw-form').addEventListener('change',calc);calc()})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>\u6839\u636e\u4e0a\u6b21\u7ef4\u62a4\u670d\u52a1\u3001\u95f4\u9694\u5c0f\u65f6\u6570\u548c\u6bcf\u65e5\u8fd0\u884c\u5c0f\u65f6\u6570\u8ba1\u7b97\u4e0b\u6b21\u7ef4\u62a4\u670d\u52a1\u65e5\u671f\u3002.<\/p>","protected":false},"featured_media":0,"template":"","meta":{"ai_generated_summary":"","footnotes":""},"categories":[],"tags":[],"class_list":["post-100149","calculator","type-calculator","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/calculator\/100149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/calculator"}],"about":[{"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/types\/calculator"}],"version-history":[{"count":3,"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/calculator\/100149\/revisions"}],"predecessor-version":[{"id":102486,"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/calculator\/100149\/revisions\/102486"}],"wp:attachment":[{"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/media?parent=100149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/categories?post=100149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vibromera.eu\/zh\/wp-json\/wp\/v2\/tags?post=100149"}],"curies":[{"name":"\u53ef\u6e7f\u6027\u7c89\u5242","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}