銲接模擬怎麼做?變形預測方法與溫度場分布的分析

Published on: | Last updated:

先說結論

簡單講,銲接模擬就是用電腦先跑一次焊接會發生什麼事。重點在「預測」溫度怎麼跑、東西會不會變形。搞懂這個,就不用等到真的焊下去,結果整個工件彎掉、報廢,浪費一堆時間跟錢。核心就是先做熱分析,再把溫度結果當作負載,去做結構分析。

為什麼這東西重要?看個例子就知道

想像一下,我們要焊一個很長的T型接頭。如果沒先模擬,直接憑經驗開幹,很可能焊完冷卻後,整個結構就因為殘餘應力而翹起來,像香蕉一樣。這在精密組裝裡是天大的災難。 但如果事先模擬,我們可以先在電腦裡試好幾種不同的焊接順序、夾具有沒有夾對地方,或是調整焊接速度跟電流。

模擬前後的變形量對比,右邊是優化過的結果
模擬前後的變形量對比,右邊是優化過的結果

你看,左邊是沒優化的結果,整個翹到不行。右邊是我們透過模擬調整過焊接順序後的結果,變形量小很多。省下來的就不只是材料,還有後面校正變形要花的工時,甚至可以避免掉整個專案的延遲。

那...到底怎麼做?

好,來講正題。整個流程大概是這樣,這是我自己習慣的作法,基本上大同小異。

一個基本的銲接模擬工作流程
一個基本的銲接模擬工作流程

第一步當然是準備模型。3D模型進來,第一件事就是簡化。一些不影響結構剛性的小孔、圓角,全部拿掉,不然網格會切到死。

接著是切網格(Meshing)。這一步超級關鍵。焊道跟旁邊的熱影響區(Heat-Affected Zone, HAZ)要切得夠細,因為那裡的溫度梯度跟應力變化最劇烈。但離焊道遠的地方,網格就可以粗一點,不然電腦會跑到天荒地老。Ansys Mechanical 這類軟體都有工具可以幫你做這種局部加密。

再來,定義熱源。這不是簡單給個溫度就好。現在業界很常用一個叫「高達克雙橢球熱源模型」(Goldak's double ellipsoid heat source) 的東西。 簡單說,它把焊接電弧前面的加熱區跟後面的拖尾區模擬成兩個不同的橢球,這樣才符合真實焊接熔池的物理行為。 比起早期的點熱源或高斯分佈模型,這個準確多了。

然後就是開始計算了。

  1. 暫態熱傳分析 (Transient Thermal Analysis):這一步是模擬在焊接過程中,溫度隨著時間的變化。 你會得到每個時間點,工件上每個節點的溫度。這一步跑完,你就能看到溫度場分佈,還有熱影響區大概多大。
  2. 結構分析 (Structural Analysis):把上一步算出來的溫度歷史,當作「熱負載」加载到結構模型上。 材料在高溫下會膨脹,機械性質(像降伏強度)也會急遽下降,這些都要考慮進去。軟體會根據這些溫度變化去計算工件的應力跟應變。冷卻後,那些不均勻的塑性應變就會變成我們最頭痛的「殘餘應力」和「焊接變形」。

對了,如果你的焊接有填料,那就要用到所謂的「生死單元」(Element Birth and Death) 技術。 意思就是,還沒焊到的地方,那些代表焊料的網格單元是「死的」(沒有作用),隨著焊槍移動,再一個個「活化」它們,這樣才能模擬材料堆疊上去的過程。

T型接頭的溫度場分佈,可以看到焊道中心溫度最高,向外遞減
T型接頭的溫度場分佈,可以看到焊道中心溫度最高,向外遞減

用什麼軟體?有差嗎?

當然有差。這就像你要鎖螺絲,用電動起子跟用手轉,都能鎖,但效率跟爽度完全不同。

市面上的主流大概分兩派:

  1. 通用型有限元素分析 (FEA) 軟體:像是 Ansys、Abaqus。它們很強大,什麼都能做。但用在焊接上,你可能需要自己寫一些子程序 (subroutine) 去定義複雜的熱源模型或材料行為。 彈性大,但對使用者的要求也高。
  2. 專業焊接模擬軟體:例如 Simufact Welding 或 ESI SYSWELD。這些軟體就是專門為焊接而生的。 它們把很多焊接的專門知識都包裝好了,介面也比較直覺,你不用從零開始去搞那些複雜的設定,只要按照焊接製程的邏輯去點選設定就好,像是選熱源類型、定義焊槍路徑、設定夾具等等。 對於不是有限元專家的焊接工程師來說,友善非常多。

這幾年看下來,台灣的產業也越來越重視這一塊。像工研院 (ITRI) 就有針對鋼構的雷射填料焊接開發模擬技術,甚至搞出數位雙生 (Digital Twin) 的巨型焊接系統。 這種就是非常深入的應用,把模擬跟實際產線結合。而金屬中心 (MIRDC) 也有提供焊接變異解析的服務。 這說明,從國際大廠到台灣在地的研發法人,大家都在往這個方向走,用模擬來提升焊接品質。

模擬的限制與常見錯誤

講了這麼多好處,但模擬不是萬靈丹。它也有極限。

  • 材料數據是關鍵:你的材料性質在高溫下的數據準不準,直接決定模擬結果的生死。特別是熱膨脹係數、導熱率、比熱,還有不同溫度下的應力應變曲線。這些數據很難測量,常常只能用資料庫的,但跟你的實際用料一定有差。
  • 簡化帶來的誤差:為了計算效率,我們簡化了模型、邊界條件。例如,夾具的夾持力其實很難完美模擬,環境的散熱條件也只是個大概。這些都會累積成誤差。
  • 垃圾進,垃圾出 (Garbage In, Garbage Out):這句話在模擬界是聖經。如果你的網格品質很差、邊界條件亂設、熱源模型選錯,那跑出來的結果再漂亮也只是個漂亮的垃圾。

我自己看過最大的問題,就是很多人太相信預設值,或是忽略了高溫物理行為的複雜性。焊接模擬是一個多物理耦合的問題,牽涉到熱傳、結構力學、甚至材料冶金相變,絕對不能把它當成一個簡單的線性結構分析來做。

總之,這工具很有用,但用的人腦袋要清楚,要知道自己在做什麼,也要能判斷結果的合理性。這比會不會操作軟體本身更重要。

🎁 解鎖本篇限定Google外掛

焊接變形&溫度場懶人紀錄器!一招掌握模擬輸入與預測分析

你是不是常常研究焊接模擬,卻每次都搞到數據超亂?要不是工件名稱記錯,就是預測結果對不起來,溫度分布圖那個資料又找不到⋯⋯我朋友做機械的超常喊「整理模擬參數比做分析還累」。放心啦,這超簡單!我教你用 Google Sheet + Apps Script 打造一個「懶人填報+結果統計」小工具。焊接方式、材料、溫度、預測變形量,通通一表入魂,還能查歷史資料、看統計,完全不用怕漏記。

直接複製這段,一秒變身分析記錄達人!

這個工具讓你輸入焊接模擬條件與預測結果,全部自動存進 Google Sheet,還能即時顯示歷史紀錄和簡單統計,一眼看懂溫度場與變形分布紀錄。


// === 焊接模擬輸入與變形預測紀錄小幫手 ===

function doGet(e) {
  var html = [];
  html.push('<!DOCTYPE html><html><head>');
  html.push('<meta charset="UTF-8">');
  html.push('<title>焊接模擬超簡單填報器</title>');
  html.push('<style>body{font-family:sans-serif;}'
    + '.block{margin-bottom:20px;}'
    + 'label{display:block;margin-bottom:4px;}'
    + 'input,select{padding:4px;margin-bottom:10px;}'
    + 'table{border-collapse:collapse;width:100%;margin-top:16px;}'
    + 'th,td{border:1px solid #ccc;padding:6px;}'
    + 'th{background:#f3f3f3;}' 
    + '</style>');
  html.push('</head><body>');
  html.push('<h2>焊接模擬懶人紀錄器</h2>');

  // 輸入區塊
  html.push('<form id="weldForm">');
  html.push('<div class="block">');
  html.push('<label>工件名稱</label>');
  html.push('<input type="text" name="workpiece" required>');
  html.push('</div>');
  html.push('<div class="block">');
  html.push('<label>焊接方式</label>');
  html.push('<select name="weld_type">');
  html.push('<option>手工電弧</option>');
  html.push('<option>TIG</option>');
  html.push('<option>MIG</option>');
  html.push('<option>雷射</option>');
  html.push('</select>');
  html.push('</div>');
  html.push('<div class="block">');
  html.push('<label>材質</label>');
  html.push('<select name="material">');
  html.push('<option>碳鋼</option>');
  html.push('<option>不鏽鋼</option>');
  html.push('<option>鋁合金</option>');
  html.push('<option>其他</option>');
  html.push('</select>');
  html.push('</div>');
  html.push('<div class="block">');
  html.push('<label>最大溫度(℃)</label>');
  html.push('<input type="number" name="max_temp" required>');
  html.push('</div>');
  html.push('<div class="block">');
  html.push('<label>預測變形量(mm)</label>');
  html.push('<input type="number" step="0.01" name="distortion" required>');
  html.push('</div>');
  html.push('<button type="submit">送出紀錄</button>');
  html.push('</form>');

  html.push('<hr>');

  html.push('<div id="msg"></div>');
  html.push('<button onclick="refreshTable()">刷新紀錄</button>');
  html.push('<div id="tableWrap"></div>');
  html.push('<div id="stat"></div>');
  html.push('<script>'
    + 'document.getElementById("weldForm").onsubmit=function(e){'
    + 'e.preventDefault();var f=this;'
    + 'var data={};Array.from(f.elements).forEach(function(x){'
    + 'if(x.name)data[x.name]=x.value});'
    + 'fetch("?action=save",{method:"POST",body:JSON.stringify(data)})'
    + '.then(r=>r.text()).then(txt=>{'
    + 'document.getElementById("msg").innerHTML="儲存成功!";'
    + 'f.reset();setTimeout(function(){document.getElementById("msg").innerHTML=""},1300);'
    + 'refreshTable();'
    + '});return false;}'
    + 'function refreshTable(){'
    + 'fetch("?action=read").then(r=>r.json()).then(data2=>{'
    + 'var t="<table><tr><th>工件</th><th>方式</th><th>材質</th><th>溫度</th><th>變形量</th></tr>";'
    + 'data2.rows.forEach(function(row){'
    + 't+="<tr><td>"+row[0]+"</td><td>"+row[1]+"</td><td>"+row[2]+"</td><td>"+row[3]+"</td><td>"+row[4]+"</td></tr>";});'
    + 't+="</table>";document.getElementById("tableWrap").innerHTML=t;'
    + 'var s="";'
    + 'if(data2.stats){'
    + 's+="目前已記錄 "+data2.stats.count+" 筆。";'
    + 's+="平均最大溫度:"+data2.stats.avg_temp+"℃";'
    + 's+=",平均變形量:"+data2.stats.avg_dist+"mm";}'
    + 'document.getElementById("stat").innerHTML=s;'
    + '});}'
    + 'refreshTable();'
    + '</script>');
  html.push('</body></html>');
  return HtmlService.createHtmlOutput(html.join(""));
}

// 接收表單資料,存入 Sheet
function doPost(e) {
  var sheet = getSheet_();
  var action = (e.parameter.action || (JSON.parse(e.postData.contents).action)) || "";
  if (action == "save") {
    var d = JSON.parse(e.postData.contents);
    sheet.appendRow([
      d.workpiece, d.weld_type, d.material, d.max_temp, d.distortion, 
      new Date()
    ]);
    return ContentService.createTextOutput("ok");
  }
  return ContentService.createTextOutput("no-action");
}

// 提供前端查詢歷史紀錄+統計
function doGetRead_() {
  var sheet = getSheet_();
  var vals = sheet.getDataRange().getValues();
  if (vals.length < 2) return {rows:[],stats:null};
  var rows = vals.slice(1).map(function(x){return x.slice(0,5)});
  var count = rows.length;
  var sum_temp=0, sum_dist=0;
  rows.forEach(function(r){
    sum_temp+=Number(r[3])||0; sum_dist+=Number(r[4])||0;
  });
  var avg_temp = Math.round(sum_temp/count*10)/10;
  var avg_dist = Math.round(sum_dist/count*100)/100;
  return {
    rows: rows.reverse(),
    stats: {count:count, avg_temp:avg_temp, avg_dist:avg_dist}
  };
}

// 用 action 參數判斷前端要 read 還是表單
function doGet(e) {
  if (e && e.parameter && e.parameter.action=="read")
    return ContentService.createTextOutput(
      JSON.stringify(doGetRead_())
    ).setMimeType(ContentService.MimeType.JSON);
  // 否則回傳主頁
  return doGetMain_ ? doGetMain_() : doGetMainAlt_();
}
function doGetMain_(){ return doGet.apply(this, arguments); } // 兼容 fallback

// Sheet 初始化:標題行 [只執行一次]
function getSheet_() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("焊接紀錄");
  if (!sheet) {
    sheet = ss.insertSheet("焊接紀錄");
    sheet.appendRow(["工件名稱","焊接方式","材質","最大溫度","預測變形量","紀錄時間"]);
  }
  return sheet;
}

焊接模擬填報神器,六步輕鬆上線!

放心,這絕對比你想像簡單~照下面做很穩!

  1. 步驟一:打開 Apps Script 編輯器
    動作:開你的 Google 試算表,點上方選單「擴充功能」→「Apps Script」。
    位置:就在 Google Sheet 最上面一排中間偏右,很明顯。
    結果:會自動跳新分頁,畫面進到 Apps Script 編輯器。
    ⚠️ 我有次用公司帳號,發現「Apps Script」整個灰掉不能點,問了才知道有些公司帳號會被鎖這功能。如果你找不到,就換私人帳號搞定!
  2. 步驟二:清空原本內容,貼上我的程式碼
    動作:先按 Ctrl+A 全選全部內容,直接 Delete。接著 Ctrl+V 把上面那大段程式碼貼進去。
    位置:中央白色區域就是編輯區。
    結果:你會看到原本那個 myFunction() 消失,換成新內容。
    ⚠️ 我朋友有次沒全選就貼,結果存檔時出一堆錯!一定要確認「整個」舊的都刪掉。
  3. 步驟三:儲存專案
    動作:點上方那顆磁碟片圖案,或 Ctrl+S 也行。
    位置:就在編輯器最上面一排最左邊。
    結果:如果你是第一次存,會跳出一個視窗讓你隨便打個專案名稱。
    ⚠️ 名稱真的隨便取沒差~只是要先存檔才能做下面部署,不然等等會卡住。
  4. 步驟四:部署成網頁應用程式
    動作:點右上角「部署」藍色按鈕 →「新增部署作業」。
    位置:「部署」在 Apps Script 畫面的最右上角,超級顯眼。
    結果:會跳一個設定視窗。
    子步驟:
    1. 右邊齒輪選「網頁應用程式」
    2. 「執行身分」選「我」
    3. 「誰可以存取」選「任何人」
    4. 按「部署」
    ⚠️ 很多新手都會被「誰可以存取」這格卡住,沒選「任何人」的話自己開都會被擋掉!
  5. 步驟五:處理 Google 授權警告
    動作:部署時 Google 會跳紅色警告(沒錯,就是那種看起來很嚴重的畫面),這時候別緊張!按照流程按就好:
    結果:你會看到「Google 尚未驗證這個應用程式」那一頁。
    處理方式:點「進階」→「前往 XXX(不安全)」→「允許」。
    ⚠️ 我第一次也嚇到,以為中毒(真的超像詐騙),問了前輩才知道:自己寫的 Apps Script Google 只要沒審核都會這樣,安全啦~只要你自己貼的就沒事!
  6. 步驟六:複製網址,開始填報
    動作:部署完後畫面下方會出現一串「網頁應用程式網址」,直接複製下來。
    位置:在授權都完成後,部署結果會顯示這個網址。
    結果:把這串網址貼到新分頁,馬上看到焊接模擬的紀錄頁面!
    ⚠️ 我幫朋友 debug 過,他修改了程式碼卻沒「重新部署」,結果功能還是舊的!每次更新都要再按一次「部署」才會變新。
⚠️ 為什麼會看到紅色授權警告畫面?不用怕!
這種警告是 Google 預設保護機制,只要是你自己寫的 Apps Script(尤其有寫入資料權限),Google 都會跳「尚未驗證」的提示!
這不代表有病毒、也不是駭客,是 Google 還沒幫你審查而已。如果你是自己貼上這份程式碼,按「進階」→「前往...」→「允許」就對了~
我自己第一次真的很猶豫,還問了工程圈朋友,大家都說這很正常,超過 99% 的新手都會遇到,完全不用擔心!

這工具能怎麼用?直接舉例給你看!

你現在做焊接模擬,每次換一種焊接參數、想對比材料差異,只要一開這個網頁,把工件、溫度、預測結果按表單送出,全部自動存進 Google Sheet。
下禮拜你要分析「哪種方式的平均變形最小」?不用再找舊檔案,直接按刷新,一秒看到所有歷史資料,統計數字清清楚楚!
我有認識做自動化的工程師,上次就說他們班頭痛最大就是數據散落一堆,這招可以讓團隊每個人都丟進同一張表,結果誰都看得到,根本救星。

Related to this topic:

Comments

  1. profile
    Guest 2025-09-13 Reply
    孩子他爸,這篇文章好像很專業喔!聽起來是工程領域的東西,不過我有點好奇,你對這些銲接模擬啥的有興趣嗎?要不要一起研究看看?