Mag-XL tall tank monitoring system | Gilbarco Veeder-Root

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

Mag-XL

The Mag-XL range of flexible magnetostrictive probes provide a practical and cost effective solution for accurately monitoring above ground fuel storage tanks. Used together with any of the world-leading TLS Tank Gauge Consoles, all wet stock management and inventory control requirements can be automated, allowing efficient management both locally on site and at remote central office locations.

Mag-XL systems offer a high level of accuracy and functionality at an affordable price. They are ideal for fuel distribution depots, marine terminals, aviation fuelling installations and many other facilities where fuels are stored in bulk.

The Mag-XL is immune from the problems that other popular technologies can experience; it can reliably measure low dielectric petroleum products and reliably determine the product / water interface.

  • Digital magnetostrictive measurement technology
  • Consistently accurate fuel level monitoring
  • Temperature compensated volumes
  • Automatic delivery detection
  • User programmable in-tank alarms
  • Water detection option
  • Multi-point fuel temperature sensing
  • Flexible, lightweight construction for easy installation and transportation
  • Proven quality and reliability from Veeder-Root, the market leader in fuel level measurement systems
  • Simple to install and no stilling well or crane hire
  • Low cost transportation
  • Just one tank entry required for Level, Temperature & Water measurement, no need for additional sensor entry points
  • Avoids the Health and Safety risk associated with climbing tall tanks to manually dip
  • One monitoring systems for above and below ground tanks
  • Serial connectivity to other on-site devices for improved data management
  • Volt-free relay outputs allow control of external overfill alarms or other devices

Mag-XL Probe

Linearity +/- 0.01% of probe span
Operating Temperature -40 to +70°C (Mag-XL Probes), -25 to +55°C (XLi Converter)
Storage Temperature -40 to +60°C (XLi Converter)
Temperature Sensors 5, distributed over length of probe

 

TLS Tank Gauge Console System

Maximum measurable liquid height TLS 2: 9.9m; TLS-3xx & TLS-450: 16.6m
Maximum volume capability TLS 2 & TLS-3xx: 984,100 litres; TLS-450: 7 digit volume reporting
Probe maximum capacity per TLS Console  TLS 2: 6; TLS-300: 2, 4 or 8 depending on TLS-300 Console type; TLS-350R & TLS-350 Plus: 16; TLS-450: 32
Temperature Range - 40°C / +55°C
Meter C meter


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>