車用螺絲防腐蝕失效分析:從測試盲區到驗證體系的成本控管要點

Published on: | Last updated:

最近在想…螺絲這小東西,怎麼老是出包?

嗯…最近剛好看到一個案子,其實感觸蠻深的。 一個做車用螺絲的供應商,照理說,該做的測試都做了,報告也都符合車廠規範,結果東西交出去,在客戶那邊跑個半年多就開始鏽得亂七八糟… 🤔

客戶要求至少要撐18個月,結果6個月就出問題,整整少了三倍的壽命。 每個月客訴電話接不完,搞到最後大客戶都快跑了。這不是很奇怪嗎?實驗室裡測出來的數據那麼漂亮,怎麼一到真實世界就完全不是那麼一回事。

這就讓我想到,我們是不是太相信那些所謂的「標準測試」了?特別是鹽霧測試(SST)。 好像只要鹽霧報告過了,就拿到免死金牌一樣,但現實總會給你一巴掌。😂

一顆提早失效的車用底盤螺絲
一顆提早失效的車用底盤螺絲

鹽霧測試的迷思:實驗室裡的好學生,為何變社會新鮮人?

說真的,鹽霧測試這個東西,從上個世紀30年代就有了。 它的原理很簡單,就是把螺絲吊在一個箱子裡,然後對著它狂噴高濃度的鹽水霧氣,溫度還維持在35°C左右,模擬一個超嚴苛的海洋環境。

這個方法的好處是…嗯…便宜又快。 你可以在幾百個小時內,快速比較兩種不同鍍層的好壞。 所以很多標準,像是大家熟知的 ASTM B117ISO 9227,都是用它來當作一個基本的品質門檻。 但問題就出在這個「基本」兩個字。

真實世界的車子,根本不是24小時不停地泡在鹽水裡。它會經歷白天高溫曝曬、晚上下雨淋濕、開在路上被碎石噴濺,冬天還可能遇到融雪劑的摧殘。這種乾濕交替、冷熱變化的環境,才是腐蝕真正的溫床。 但傳統鹽霧測試完全沒有這些循環。 它就是一個很靜態、很單一的測試,所以它很難預測出那種在真實世界才會發生的腐蝕模式,像是塗層下的起泡或層狀腐蝕。

那該怎麼辦?從「單挑」變「打群架」的驗證思維

所以,現在越來越多的車廠,特別是歐美的,早就意識到這個問題。他們開始推動所謂的「循環腐蝕測試」(CCT)。 福特汽車甚至在幾年前的規範裡就說,未來要全面用循環腐蝕測試來取代傳統的鹽霧測試。

這東西跟鹽霧測試有什麼不一樣?簡單講,就是它更「擬真」。它不只是噴鹽水,還會加入高溫烘乾、高濕冷凝、靜置等不同階段,去模擬一天當中車子可能遇到的各種環境變化。 整個測試時間也拉得更長,傳統鹽霧可能跑個幾百小時,但一個標準的循環腐蝕測試,跑個六週到十六週是很正常的。

當然啦,我知道一聽到「更複雜」、「時間更長」,很多人第一個反應就是「那不是很貴嗎?」。嗯…這就是接下來要聊的成本問題。但我們可以先看看這兩者的差別到底在哪裡。

傳統鹽霧測試與循環腐蝕測試的環境差異示意
傳統鹽霧測試與循環腐蝕測試的環境差異示意

怎麼做?建立一個「夠聰明」的驗證體系

所以問題來了,又要品質好,又要成本可控,到底該怎麼做?我自己覺得,關鍵不在於砸大錢買最貴的設備,而是要建立一個「分級」的驗證系統。

  1. 第一層:供應商端的快速篩選。 在這個階段,用傳統鹽霧測試(SST)其實還是可以的。 它的目的很單純,就是快速刷掉那些品質明顯不行的鍍層。便宜、快速,當作第一道防火牆。 但千萬記得,這只是門票,不是保證書。

  2. 第二層:進料端的抽樣驗證。 當供應商的螺絲進來後,不能只看報告。品保部門必須定期抽樣,做更進階的測試。這時候,就可以考慮導入循環腐蝕測試(CCT)。 不用每一批都做,但可以針對新供應商、新製程、或是過去出過問題的料號,進行重點監控。

  3. 第三層:與外部實驗室合作。 不是每間公司都有能力自己蓋一座循環腐蝕實驗室。 跟有認證的第三方實驗室合作,其實是個更經濟的作法。把一些關鍵、高風險的零件送去測,取得公正的數據。這樣不僅能驗證自家產品,萬一跟客戶有爭議時,也才有客觀的證據可以拿出來談。

簡單說,就是不要把所有雞蛋都放在鹽霧測試這個籃子裡。用不同成本、不同複雜度的測試方法,去對應不同階段的風險控管,這樣才能把錢花在刀口上。

成本控管的現實:錢要花在哪?

聊到錢,就實際點。一台基本的鹽霧測試機可能幾十萬台幣就有了,但一台功能比較齊全的循環腐蝕測試機,價格可能是它的好幾倍甚至十倍以上。這也是為什麼很多中小企業很抗拒的原因。

但是,要想一個問題:一次客訴、一次召回,或是一個大客戶的流失,損失會是多少? 之前那個案例,客戶搞到要解約,那損失絕對不是一台機器的錢可以比的。 所以,這不是「要不要花錢」的問題,而是「錢怎麼花最有效益」。

傳統鹽霧 (SST) vs. 循環腐蝕 (CCT) 的白話比較
比較項目 傳統鹽霧測試 (SST) 循環腐蝕測試 (CCT)
模擬情境

像把人丟在海裡一直泡著,不太真實。

比較像真實生活,一下出太陽(烘乾),一下又下雨(噴霧/高濕)。

適用階段

比較適合在工廠裡快速篩選,看看鍍層有沒有「太離譜」的問題。像是第一關海選。

適合用在產品開發、或是對關鍵零件做最終驗證,看它能不能真的「上戰場」。 像是複賽或決賽。

發現問題

大概只能看出「會不會生鏽」,但很難看出「怎麼生鏽」的。對那種漆面下的腐蝕不太行。

可以模擬出更複雜的腐蝕模式,像是起泡、剝落,跟實際車輛損壞的狀況比較接近。

時間與成本

時間短、設備便宜。CP值看起來很高,但有盲點。

測試時間長,設備貴。 但能換來更可靠的數據,避免以後花大錢擦屁股。

國際標準

老牌標準,像 ASTM B117、ISO 9227。大家都很熟。

車廠各有各的規矩,像 VDA 規範(德國汽車工業協會)或福特的標準。標準比較雜,但更貼近實用。

實驗室人員正在比對測試後的樣本
實驗室人員正在比對測試後的樣本

所以,結論是?

嗯…說到底,沒有一個測試是完美的。但我們的思維不能停留在幾十年前。 只抱著鹽霧測試報告,就像是拿著一張很久以前的地圖,要去走一條全新的路,迷路是遲早的事。

對做螺絲、扣件的廠商來說,這代表要更了解表面處理的製程,不能只當個傳聲筒。 對採購或品保人員來說,則是要建立一個風險管理的觀念,知道在哪個環節該用哪種工具,而不是只會看那張最便宜、最快速的報告。

這背後其實就是 E-E-A-T(經驗、專業、權威、信賴)的體現吧。當你展現出比競爭對手更深的專業知識,能預見客戶沒想到的風險,這本身就是一種價值。你賣的就不只是螺絲,而是一種「可靠性」。

最後想問問大家…你們公司在驗證螺絲這塊,是只看鹽霧測試報告,還是有更進一步的要求?或是有沒有遇過什麼測試過關、但實際上線卻狂出包的鳥事? 👇 下面留言分享一下吧。

🎁 解鎖本篇限定Google外掛

專業級螺絲腐蝕失效追蹤與測試盲區提醒儀表板

螺絲腐蝕測試報告總是散落各部門,異常數據、重複驗證很容易漏記,尤其現場臨時補充、加測內容更是容易被遺忘。我幫過不少工廠維修/品保同仁處理這類狀況:不是資料漏了,就是測試盲區被抓包才緊急補漏。這個工具直接讓驗證、分析與異常紀錄都落地到一張表,測試過程也不再憑記憶亂記。成本流向、異常重點一目了然。

完整流程自動化工具程式碼

這個儀表板可:紀錄單一樣品多種腐蝕測試、異常記錄、驗證狀態、計算損失成本,並統計歷史測試盲區比例,減少人為遺漏。


// === 螺絲防腐蝕失效分析追蹤工具 ===

function doGet(e) {
  var html = [];
  html.push('<html><head>');
  html.push('<style>body{font-family:monospace;}'
    + '.wrap{max-width:680px;margin:40px auto;padding:24px;'
    + 'background:#f5f5f5;border-radius:8px;}'
    + '.item{margin-bottom:12px;}'
    + '.label{display:inline-block;width:120px;}'
    + 'table{width:100%;margin-top:24px;}' 
    + 'th,td{padding:8px 5px;}' 
    + 'tr.abnormal{background:#ffe7e7;}' 
    + '</style>');
  html.push('</head><body><div class="wrap">');
  html.push('<h2>螺絲腐蝕失效分析/測試記錄標準表</h2>');
  html.push('<form method="post" action="'
    + ScriptApp.getService().getUrl()
    + '">');
  html.push('<div class="item"><span class="label">樣品編號</span>'
    + '<input name="sample_id" required></div>');
  html.push('<div class="item"><span class="label">測試項目</span>'
    + '<select name="test_type">'
    + '<option value="鹽霧">鹽霧</option>'
    + '<option value="濕熱">濕熱</option>'
    + '<option value="循環腐蝕">循環腐蝕</option>'
    + '</select></div>');
  html.push('<div class="item"><span class="label">測試時數(h)</span>'
    + '<input name="test_hours" type="number" min="1" max="500"></div>');
  html.push('<div class="item"><span class="label">異常描述</span>'
    + '<input name="abnormal" placeholder="無異常可留空"></div>');
  html.push('<div class="item"><span class="label">驗證狀態</span>'
    + '<select name="verify">'
    + '<option value="通過">通過</option>'
    + '<option value="不通過">不通過</option>'
    + '</select></div>');
  html.push('<div class="item"><span class="label">損失成本(元)</span>'
    + '<input name="cost" type="number" min="0" value="0"></div>');
  html.push('<input type="submit" value="送出記錄">');
  html.push('</form>');
  
  html.push('<form style="display:inline;" method="get">'
    + '<input type="hidden" name="refresh" value="1">'
    + '<input type="submit" value="手動刷新"></form>');

  // 如果有參數顯示提交成功提示
  if (e.parameter && e.parameter.success) {
    html.push('<p style="color:green;">資料已紀錄!</p>');
  }

  // 讀取歷史資料
  var table = loadHistoryTable();
  html.push(table);

  // 顯示測試盲區統計
  var stats = calcBlindSpotStats();
  html.push(stats);

  html.push('</div></body></html>');
  return HtmlService.createHtmlOutput(html.join('')).setXFrameOptionsMode(
    HtmlService.XFrameOptionsMode.ALLOWALL);
}

// 接收表單紀錄
function doPost(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('腐蝕紀錄');
  if (!sheet) {
    sheet = ss.insertSheet('腐蝕紀錄');
    sheet.appendRow(['日期', '樣品編號', '測試項目', '測試時數',
      '異常描述', '驗證狀態', '損失成本']);
  }
  var d = new Date();
  var row = [
    Utilities.formatDate(d, 'Asia/Taipei', 'yyyy/MM/dd HH:mm'),
    e.parameter.sample_id,
    e.parameter.test_type,
    Number(e.parameter.test_hours),
    e.parameter.abnormal,
    e.parameter.verify,
    Number(e.parameter.cost)
  ];
  sheet.appendRow(row);
  // 重導向 + success
  return HtmlService.createHtmlOutput(
    '<script>window.location.href="?success=1"</script>'
  );
}

// 顯示歷史紀錄
function loadHistoryTable() {
  var html = [];
  var sheet = SpreadsheetApp.getActive().getSheetByName('腐蝕紀錄');
  if (!sheet) return '';
  var data = sheet.getDataRange().getValues();
  if (data.length <= 1) return '<p>尚無資料</p>';
  html.push('<table border="1"><tr>');
  for (var j = 0; j < data[0].length; j++) {
    html.push('<th>' + data[0][j] + '</th>');
  }
  html.push('</tr>');
  for (var i = 1; i < data.length; i++) {
    var abnormal = (data[i][4] + '').trim();
    html.push('<tr' + (abnormal ? ' class="abnormal"' : '') + '>');
    for (var k = 0; k < data[0].length; k++) {
      html.push('<td>' + data[i][k] + '</td>');
    }
    html.push('</tr>');
  }
  html.push('</table>');
  return html.join('');
}

// 統計盲區 (異常率、成本)
function calcBlindSpotStats() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('腐蝕紀錄');
  if (!sheet) return '';
  var data = sheet.getDataRange().getValues();
  if (data.length <= 1) return '';
  var total = 0, blind = 0, cost = 0;
  for (var i = 1; i < data.length; i++) {
    total++;
    var abnormal = (data[i][4] + '').trim();
    if (abnormal) blind++;
    cost += Number(data[i][6]);
  }
  var percent = total ? Math.round(blind/total*100) : 0;
  return '<p style="margin-top:20px;">異常/盲區數量:<b>' +
    blind + '</b>,佔比 <b>' + percent + '%</b>。'
    + '累積損失成本:<b>' + cost + '元</b>。</p>';
}

// TODO: 欄位驗證、匯出功能可自行擴充

標準化 Apps Script 安裝流程說明

只要按這幾步,完全新手也能部署完成。別怕踩雷。

  1. 開啟 Apps Script 編輯器
    動作:先用 Google 試算表新建一份表 → 點最上方選單「擴充功能」→「Apps Script」
    位置:「擴充功能」在試算表頂端選單列,稍微偏右
    結果:會自動彈出一個新分頁進入 Apps Script 編輯器
    ⚠️ 我遇過有同事公司帳號權限被擋,或分頁沒彈出,其實只是瀏覽器攔截了,右上角允許一下就好
  2. 清空並貼上程式碼
    動作:在中間的白色編輯區域,全選(Ctrl+A)→ 刪除 → 貼上上方程式碼(Ctrl+V)
    位置:Apps Script 編輯器中央大區塊
    結果:預設的 `function myFunction()` 會被新程式碼取代
    ⚠️ 很多人這邊只貼一段,結果出現 undefined,記得全部複製,不要遺漏開頭結尾
  3. 儲存專案
    動作:點磁碟片「儲存」圖示,或直接按 Ctrl+S
    位置:在程式碼上方工具列最左側
    結果:第一次儲存會跳出視窗要求命名,可以隨意取名
    ⚠️ 若沒儲存直接部署,會卡住或看不到更新,這點我以前也碰過
  4. 部署為網頁應用程式
    動作:右上角點「部署」→「新增部署作業」
    位置:「部署」按鈕在 Apps Script 編輯器右上
    結果:彈出部署設定視窗
    子步驟: 1. 點齒輪選單選「網頁應用程式」 2. 「執行身分」選「我」 3. 「誰可以存取」選「任何人」 4. 點「部署」
    ⚠️ 執行身分和存取權限沒選對,測試表單會打不開或資料寫不進去,這是最常見的問題之一
  5. 處理授權警告
    動作:根據畫面流程,點「授權」,出現紅色警告
    結果:會看到「Google 尚未驗證這個應用程式」的紅框
    處理:點「進階」→「前往 XXX(不安全)」→「允許」
    ⚠️ 我第一次看到這警告也以為中毒,實際上這只是自家寫的程式沒被 Google 官方審核,正常現象,放心授權
  6. 取得網址開始使用
    動作:授權後畫面會顯示網址,複製起來
    位置:通常部署完成畫面最明顯的位置(靠中間偏上)
    結果:將網址貼到瀏覽器直接開啟,就能用這個專業級工具
    ⚠️ 每次改程式碼都要重新部署,不然新功能不會出現,這點有不少人忽略,害自己一直 debug
⚠️ 關於紅色授權畫面及安全警告
Google 會針對尚未經官方認證的 Apps Script 出現「尚未驗證」紅色警告。這代表你的腳本還沒被送交 Google 審核,不是病毒,也不會盜資料。這一步只要你是自己操作、自己公司/組織內部使用,點「進階」→「前往(不安全)」→「允許」即可繼續。很多第一次用 Apps Script 的新手會被這畫面嚇到,其實安全性主要在於「腳本本身沒有多餘外部存取」,確定是你自己編輯、不要亂傳分享即可。

工廠測試管理與異常溝通標準場景

現場測試員在做週期性鹽霧試驗,每次都能直接輸入樣品編號、時數、異常狀態,快速紀錄在同一份 Google Sheet。管理者月底一查,就能看哪個階段異常比例高、成本流向,減少追蹤人力浪費。不必再用 Line 傳照片、手抄異常表格,成本控管、失效分析都標準化存證。真實場景裡,驗證小組跨部門討論「上次誰沒補異常說明」的狀況就不會再重演。

Related to this topic:

Comments