TLS-450 PLUS Automatic Tank Gauge

Proud to be Powered by Vontier. Sharing a united vision that is driven by innovation. Find out more

TLS-450 PLU

The TLS-450PLUS Automatic Tank Gauge and Environmental Protection System provides the most comprehensive fuel site data for advanced fuel asset management. Combining industry leading algorithms with enhanced security, real-time notification, and anywhere, anytime access, the TLS-450PLUS keeps your site running and profitable.

Proven Protection
Maintain control of your fuelling operations using the automated variance control, leak detection and site management solutions of the TLS-450PLUS to always know the status of your business.

Proven Precision
AccuChart™ industry leading automatic calibration ensures best possible data for accurate wet stock management. Third party approved leak detection gives peace of mind that tanks and lines are tight. Remote connectivity on the TLS-450PLUS allows access to information at all times, from anywhere.

Proven Profit
Operate at peak efficiency with the TLS-450PLUS monitoring system, managing risk, limiting liability and reducing inventory shortages and site downtime.

Proven Partner
Veeder-Root automatic tank gauges are the high quality wet stock management solutions with a long history of reliability and precision. Our products help achieve results that matter and the protection your business deserves.

  • Enhanced performance – significant improvement over the original TLS-450 with five times the processing power, six times more memory, and twice the storage space. The power you need to expand and add new features as your business grows
  • Ultimate expandability – combine with up to 3 TLS-XB Expansion Boxes to monitor large, complex sites with just 1 TLS console
  • Future Ready – together with the TLS4 and TLS4B, the TLS-4xx family is the next generation Tank Monitoring and Environmental Protection platform that fuel storage facility operators can rely on for many years to come
  • Web-enabled remote connectivity – monitor your site performance, receive real-time alerts, and access compliance data via web-enabled devices – anytime, anywhere
  • Faster problem resolution – diagnose and troubleshoot issues remotely to understand ongoing situations better and avoid unnecessary dispatch
  • Improve site staff efficiency – context-sensitive function accelerates operator user competence and staff training; pre-program Customised Alarm alerts to provide scenario-specific information to predetermined individuals.
  • Workflow Wizard – streamlines system setup and ensures nothing is overlooked for optimal system performance
  • Data protection – store up to 3 years of data and protect it from power outages, battery replacements or software upgrades
  • Security controls – switched Ethernet networks, customised user access, and Secure Socket Layer (SSL) web protection to keep your network safe
  • Remote software download – easy access to software updates without technician visits
  • Insite360 Ready – built in Data Logger functionality means you can easily maximise the value of your investment through Gilbarco Veeder-Root’s managed service portfolio
  • Maximum Tank Probes: Up to 32 Mag Plus or Mag-FLEX probes (can be mixed)
  • Intrinsically Safe Probe / Sensor Inputs: 64 per console or 256 total with TLS-XB
  • Pressure Line Leak Testing: Up to 16 Lines
  • Sensors: Up to 99 of any one type
  • Relays / External Inputs: 80 relays, 80 HV inputs, 64 LV inputs (max capacity, with TLS-XB)
  • SLD Static Tank Testing: Standard with Mag 1 / Mag 2 probes in underground tanks
  • CSLD Statistical Tank Testing: Optional with Mag 1 / Mag 2 probes in underground tanks
  • AccuChart™ Automatic Calibration with Advanced Diagnostics: Optional
  • BIR Business Inventory Reconciliation: Optional
  • Delivery Variance Reporting: Optional
  • HRM Hourly Reconciliation Monitoring: Optional
  • Data Storage & Available Reports: Up to 3 Years
  • Integral Printer: Optional
  • No Display Console Version: Optional
  • PLLD Electronic Line Leak detection: Optional
  • Email: Built-in
  • Data Logger Functionality (Insite360): Built-in
  • Remote Software Download: Yes (requires console registration)
  • Density Monitoring: Yes (requires Mag Plus Density Probes & Float Kits)
  • Phase Separation: Yes, with Phase-Two 4” floats
  • Storage Temperature Range: -40°C to 70°C
  • Operating Temperature Range: 0°C to 40°C
  • New features:
    • TSL Timed Sudden Loss detection: Optional
    • VR2 Vapour Recovery Alarm Monitoring: Optional
    • IFSF over TCP/IP
    • IFSF LON 



Request a Quote


<script>

// CONFIG: map UTM parameter names -> input selectors
const fieldMap = {
utm_source: 'input[name="1097612_221968pi_1097612_221968"]',
utm_medium: 'input[name="1097612_221965pi_1097612_221965"]',
utm_campaign: 'input[name="1097612_221959pi_1097612_221959"]',
utm_content: 'input[name="1097612_221962pi_1097612_221962"]'
};

// CONFIG: whether to save values read from the URL into sessionStorage
const saveUrlToSession = true;

function safeSessionGet(key) {
try {
return sessionStorage.getItem(key);
} catch (e) {
return null;
}
}

function safeSessionSet(key, value) {
if (!saveUrlToSession) return;
try {
sessionStorage.setItem(key, value);
} catch (e) {
// ignore storage write failures
}
}

function getUrlParam(paramName) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(paramName); // returns null if not present
}

function setFieldValue(el, value) {
if (!el) return;
el.value = value;
// trigger input/change events for libraries that listen for them
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
}

function populateKey(paramName, selector) {
const el = document.querySelector(selector);

// 1) Try sessionStorage first
const sessVal = safeSessionGet(paramName);
if (sessVal !== null && sessVal !== '') {
setFieldValue(el, sessVal);
return;
}

// 2) Fallback to URL param
const urlVal = getUrlParam(paramName);
if (urlVal !== null && urlVal !== '') {
setFieldValue(el, urlVal);
safeSessionSet(paramName, urlVal); // store for future pages if enabled
}
}

function populateHiddenFields() {
Object.keys(fieldMap).forEach(paramName => {
populateKey(paramName, fieldMap[paramName]);
});
}

if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', populateHiddenFields);
} else {
populateHiddenFields();
}

// Optional: allow manual calls from other scripts
window.populateHiddenFields = populateHiddenFields;

(function () {
// CONFIG
const fieldMap = {
utm_source: 'input[name="1097612_221968pi_1097612_221968"]',
utm_medium: 'input[name="1097612_221965pi_1097612_221965"]',
utm_campaign: 'input[name="1097612_221959pi_1097612_221959"]',
utm_content: 'input[name="1097612_221962pi_1097612_221962"]'
};
const saveUrlToSession = true;

// Safe session helpers
function safeSessionGet(key) {
try { return sessionStorage.getItem(key); } catch (e) { return null; }
}
function safeSessionSet(key, value) {
if (!saveUrlToSession) return;
try { sessionStorage.setItem(key, value); } catch (e) {}
}

// URL helper
function getUrlParam(paramName) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(paramName);
}

// DOM helper
function setFieldValue(el, value) {
if (!el) return;
el.value = value;
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
}

// Core: check session first, then URL
function populateKey(paramName, selector) {
const el = document.querySelector(selector);
const sessVal = safeSessionGet(paramName);
if (sessVal !== null && sessVal !== '') {
setFieldValue(el, sessVal);
return;
}
const urlVal = getUrlParam(paramName);
if (urlVal !== null && urlVal !== '') {
setFieldValue(el, urlVal);
safeSessionSet(paramName, urlVal);
}
}

// Populate all configured fields
function populateHiddenFields() {
Object.keys(fieldMap).forEach(paramName => {
populateKey(paramName, fieldMap[paramName]);
});
}

// Init
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', populateHiddenFields);
} else {
populateHiddenFields();
}
window.populateHiddenFields = populateHiddenFields;
})();
</script>

<script>
document.addEventListener('DOMContentLoaded', function() {
// Function to get URL parameters
function getUrlParam(paramName) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(paramName);
}

// Get the utm_source value
const utmSource = getUrlParam('utm_source');
const utmMedium = getUrlParam('utm_medium'); // Also get others
const utmCampaign = getUrlParam('utm_campaign');
const utmContent = getUrlParam('utm_content');

// --- Method 1: Direct Assignment (if form fields exist) ---
// Find your form fields by name/ID and set their value
const sourceField = document.querySelector('input[name="1097612_221968pi_1097612_221968"]'); // Adjust selector
if (sourceField && utmSource) {
sourceField.value = utmSource;
}
const mediumField = document.querySelector('input[name="1097612_221965pi_1097612_221965"]'); // Adjust selector
if (mediumField && utmMedium) {
mediumField.value = utmMedium;
}
const campaignField = document.querySelector('input[name="1097612_221959pi_1097612_221959"]'); // Adjust selector
if (campaignField && utmCampaign) {
campaignField.value = utmCampaign;
}
const contentField = document.querySelector('input[name="1097612_221962pi_1097612_221962"]'); // Adjust selector
if (contentField && utmContent) {
contentField.value = utmContent;
}
// Repeat for medium, campaign, etc.

// --- Method 2: Store in Session Storage (Recommended for multi-page) ---
// This keeps data across page views before form submission
if (utmSource) {
sessionStorage.setItem('utm_source', utmSource);
}
if (utmMedium) {
sessionStorage.setItem('utm_medium', utmMedium);
}
if (utmCampaign) {
sessionStorage.setItem('utm_campaign', utmCampaign);
}
if (utmContent) {
sessionStorage.setItem('utm_content', utmContent);
}
});

// Function to populate form on any page load (using session storage)
function populateHiddenFields() {
const utm_source = sessionStorage.getItem('utm_source');
const utm_medium = sessionStorage.getItem('utm_medium');
const utm_campaign = sessionStorage.getItem('utm_campaign');
const utm_content = sessionStorage.getItem('utm_content');

const sourceInput = document.querySelector('input[name="1097612_221968pi_1097612_221968"]');
if (sourceInput && utm_source) {
sourceInput.value = utm_source;
}
const mediumInput = document.querySelector('input[name="1097612_221965pi_1097612_221965"]');
if (mediumInput && utm_medium) {
mediumInput.value = utm_medium;
}
const campaignInput = document.querySelector('input[name="1097612_221959pi_1097612_221959"]');
if (campaignInput && utm_campaign) {
campaignInput.value = utm_campaign;
}
const contentInput = document.querySelector('input[name="1097612_221962pi_1097612_221962"]');
if (contentInput && utm_content) {
contentInput.value = utm_content;
}
}

// Run this when the form loads on the *final* page (e.g., the form page itself)
// Call populateHiddenFields(); when your form element is ready or on DOMContentLoaded again.
</script>