用 ConSciR 與 SaltsR
做預防性保存決策
兩個套件、四個情境、一條決策鏈:從溫濕度紀錄與離子層析數據出發, 算出黴菌、化學劣化、鹽結晶與能耗四種風險,最後收斂成一個可以寫進管理計畫的設定點。 每個情境都有可執行的 R、即時互動實驗與情境測驗。
0. 為什麼把 ConSciR 和 SaltsR 放在一起教
預防性保存(preventive conservation)的核心工作不是修復單一件文物,而是管理讓文物劣化的環境。 在實務上,這件事會分裂成兩套看起來不相干的資料:
溫濕度記錄器的時間序列
每 15 分鐘一筆的 T 與 RH,一年三萬多筆。要回答的是:會不會長黴?紙會不會加速黃化?木頭會不會開裂?空調要花多少電? → 這是 ConSciR 的地盤。
牆體取樣的離子層析數據
幾毫克的粉末、七個離子濃度。要回答的是:牆裡有哪些鹽?在哪一個相對濕度會結晶、把磚推爆? → 這是 SaltsR 的地盤。
這兩條線平常各自寫報告、各自開會,但它們最後會撞在同一個數字上:相對濕度的設定值。 黴菌希望 RH 低、化學劣化希望 RH 低、鹽害希望 RH 穩定(而且要避開結晶點)、 會計希望空調電費低——四個目標會給出四個不同的 RH,而館方只能設一個。
0.1 兩個套件在做什麼
| 面向 | ConSciR | SaltsR |
|---|---|---|
| 作者 | Bhavesh Shah | Bhavesh Shah、Sebastiaan Godts、Amber Orr |
| 輸入資料 | T / RH 時間序列(Meaco、Hanwell 等記錄器) | 離子層析(IC)七離子濃度、樣品乾重、萃取水量 |
| 核心問題 | 這個環境對物件有多友善? | 牆裡的鹽在哪個 RH 會結晶? |
| 代表函式 | calcDP、calcAH、calcMould_VTT、calcMould_Zeng、calcPI、calcLM、calcEMC_wood、calcCoolingPower | fun_salt_balance、tidyRunsalt、graph_salt_balance |
| 是否自己算熱力學 | 是(經驗式與動力學模型) | 否——它只負責把 IC 數據整理成 ECOS/RUNSALT 吃得下的輸入,再把 RUNSALT 的輸出畫成圖 |
| 輸出 | 加在資料框上的風險欄位、圖表、Shiny app | ECOS 輸入檔、平衡診斷、結晶曲線圖、Shiny app |
0.2 這份教材用到的資料
教材刻意混用兩種資料,因為它們的教學功能不同:
(一)套件內建資料集——用來確認「我有沒有把函式用對」
| 資料 | 來源 | 內容 | 本教材用途 |
|---|---|---|---|
ConSciR::mydata | ConSciR | 倫敦某室內空間 2024 全年、15 分鐘一筆,35,136 筆,欄位 Site / Sensor / Date / Temp / RH | 溫帶對照組;示範各 calc 函式 |
ConSciR::TRHdata | ConSciR | 同上 | 見下方提醒 |
SaltsR::salt_test | SaltsR | 單一測試樣品的七離子濃度 | 驗證 fun_salt_balance 的輸出 |
SaltsR::mol_wts、salt_charges_z | SaltsR | 七離子的分子量與絕對電荷 | 手算驗算式 1、式 2 |
SaltsR::ECOS_Phases | SaltsR | 75 種 ECOS 鹽相的代號與名稱對照 | 讀 RUNSALT 輸出時查表 |
mydata 與 TRHdata 寫成兩個示範資料集,但實際上
identical(as.data.frame(mydata), as.data.frame(TRHdata)) 回傳 TRUE——
兩者是同一份資料,都只有一個站點(London)、一個感測器(Room 1)。
這不影響學習,但它是本教材反覆要求你養成的習慣:先看資料,再相信文件。
(二)模擬資料集——用來製造「內建資料裡沒有的情境」
倫敦的資料很乾淨:全年 RH 中位數 45.4%、最高 76%、氣溫 16–26 °C,一年下來幾乎不會長黴。 拿它當台灣南部的教材會得到錯誤的安全感。因此本教材另外模擬了一組亞熱帶資料:
| 模擬資料 | 規模 | 設計意圖 |
|---|---|---|
| 南部沿海外氣(2025 全年逐時) | 8,760 筆 | 年均 24.4 °C、夏季 RH 常態 80% 以上,含降雨事件 |
| 情境 1:展廳 + 展櫃逐時 | 2,928 筆(6–9 月) | 週一休館停機、夜間停機、8 月連續 7 天冰水機故障;展櫃以一階遞延模擬調濕劑緩衝 |
| 情境 2:離子層析 8 樣品 | 8 筆 | 刻意涵蓋 Pathway 1/2、石膏由 Ca 或 SO₄ 限制、以及同一均質樣以 10 mL 與 100 mL 兩種萃取比 |
| 情境 3:紙質庫房四種控制策略 | 4 × 8,760 筆 | 恆溫恆濕/只除濕/只降溫/無空調 |
| 情境 4:設定點網格 | 21 × 36 = 756 組 | T 18–28 °C × RH 40–75%,每組算全年冷卻能耗與四項風險 |
0.3 怎麼用這份教材
- 先看情境背景,再看資料。每一章都從「館方問了什麼問題」開始,而不是從函式開始。
- 跑 R 區塊。每個 R 區塊都可以直接改參數重跑;瀏覽器內建 R(webR)會在你第一次按「執行」時載入(約 10–30 秒)。 若無法連網,區塊下方一律附有預先算好的輸出,內容與 R 執行結果相同,不影響閱讀。
- 玩互動實驗室。拉動滑桿觀察四項風險怎麼互相打架,這是本教材最重要的部分。
- 做測驗。先做前測(10 題,只是診斷不計成績),每章結束做情境測,最後做後測並看能力雷達圖。
後測結束時會依這四個維度畫出能力雷達圖,並指出應該回去複習哪一節。
前測:你現在在哪裡?
10 題,約 5 分鐘。不計成績,目的是讓你(和老師)知道哪些概念已經有了、哪些還沒有。 作答後會立刻顯示解析,並標出對應章節。後測結束時會把前後測放在一起比較。
1. 三個函式家族,一次看懂
ConSciR 的四十多個函式其實只有三群,SaltsR 只有一條流程。先把地圖畫出來,後面四個情境就只是在這張地圖上挑路走。
1.1 濕度家族:把一組 (T, RH) 翻譯成六種語言
同一團空氣,量測到的是溫度與相對濕度,但不同的劣化機制關心的是不同的量:
| 函式 | 回傳 | 單位 | 什麼時候真正需要它 |
|---|---|---|---|
calcPws(T) | 飽和水氣壓 | hPa | 所有其他式子的基礎;預設 Buck 式,另有 IAPWS/Magnus/VAISALA |
calcPw(T, RH) | 實際水氣壓 | hPa | 判斷水分擴散驅動力(牆體乾燥、封裝內外) |
calcDP(T, RH) | 露點 | °C | 冷凝風險:外牆內表面、玻璃展櫃、冷藏庫、運輸箱開箱 |
calcAH(T, RH) | 絕對濕度 | g/m³ | 判斷「RH 上升是因為加濕還是因為降溫」——AH 不變就是降溫造成的 |
calcMR/calcSH | 混合比/比濕 | g/kg | 做空氣質量平衡、換氣量計算 |
calcEnthalpy(T, RH) | 焓 | kJ/kg | 算空調要移除多少能量(第 5 章的能耗全靠它) |
calcAH 一算就會發現 AH 完全沒變(實驗室 1 的預設值就是這一組)——問題出在空調停機造成的降溫,
對策是穩定溫度而不是加除濕機。這個判斷每年可以幫館方省下不少誤買的設備。
R 練習 1:一次算完整張表
1.2 風險家族:四個指標,四種劣化機制
calcMould_Zeng(T, RH)
回傳「在這個溫度下,開始長黴所需的最低 RH(%)」。是一條門檻線,不是累積量。
用法:RH > calcMould_Zeng(T, RH) 為真 → 此刻具備長黴條件。
加 LIM = 1 可改成「每天長 1 mm」的門檻。
calcMould_VTT(T, RH, M_prev)
芬蘭 VTT 黴菌指數 M(0–6)。是累積量:0 = 無菌絲、1 = 顯微可見、3 = 肉眼可見、6 = 全面覆蓋。
必須把上一時刻的 M 餵回 M_prev 才會累積(見 1.4 節的陷阱)。
calcPI(T, RH)
Preservation Index(IPI):以醋酸纖維片基的降解動力學推估「還可以撐幾年」。 20 °C/50% 約 41.8 年。用途是把環境換算成「年」這個管理者聽得懂的單位。
calcLM(T, RH)
Lifetime Multiplier(Michalski):相對於 20 °C/50% 的壽命倍數。 1 = 一樣、2 = 壽命加倍、0.5 = 只剩一半。本教材主要用它做策略比較——但要先修正(見 1.4 節)。
calcEMC_wood(T, RH)
木材平衡含水率(%)。真正造成木器、油畫基底、家具開裂的不是 EMC 的絕對值, 而是 EMC 的擺幅。看這個欄位的 max − min,比看 RH 的 max − min 更貼近材料實際受力。
calcCoolingPower(T₁,T₂,RH₁,RH₂,V̇)
把體積流量 V̇(m³/s)的空氣從狀態 1 調到狀態 2 所需的冷卻功率(kW), 用焓差乘以質量流量。第 5 章用它把「設定點」翻譯成「電費」。
calcMould_Zeng 問「此刻有沒有條件」;calcMould_VTT 問「累積到什麼程度」;
calcPI/calcLM 問「長期還能撐多久」。
一份報告若只寫「RH 曾達 82%」,三個問題一個都沒回答。
R 練習 2:把風險欄位加到資料上
1.3 SaltsR 的一條流程:從 IC 數據到 ECOS 輸入
fun_salt_balance() 看起來是一個巨大的函式,但它就是論文(Godts et al. 2022, Scientific Data)裡的 11 條式子按順序做完:
- 式 1 濃度 → 重量分率。
w = (c × V) / (m_s × 10⁶)。輸入是 ppm(mg/L)、萃取水量(mL)、樣品乾重(g)。 - 式 2 重量分率 → 毫當量。
e = w × z / M × 10⁶。換成當量才能比較電荷,這是整條流程的關鍵一步。 - 式 3 電荷平衡診斷。算陰離子總當量 eani 與陽離子總當量 ecat 的差 Δe,決定走哪一條校正路徑。
Pathway 1:Δe ≤ 最大值的 2%,或陰離子過剩 → 兩邊各自等比例縮放到中點。 Pathway 2:陽離子過剩且 Δe > 2% → 依「最不可溶者優先」順序 Ca → Mg → Na → K 逐一扣除,直到平衡。 - 式 6–7 扣除石膏。ECOS 模型不含 CaSO₄,所以要先把 min(SO₄, Ca) 這麼多的當量拿掉。
- 式 8 轉成莫耳分率——這就是 ECOS 輸入檔的七個數字。
- 式 9–11 診斷指標。校正幅度佔原始陽離子總量的比例、石膏含量、以及石膏在該水/樣比下的飽和度 S。
R 練習 3:跑套件內建的 salt_test
1.4 誠實的極限:五個「文件與程式碼不一致」的地方
這一節不是要批評套件——ConSciR 與 SaltsR 都是免費、開源、且填補了保存科學長期沒有工具的空缺。 但如果你要拿計算結果去支持一個要花錢的決策,就必須先確認函式真的在算它宣稱的東西。 以下五點都可以在下面的 R 區塊裡自己驗證。
① calcLM():溫度項幾乎失效,而且方向相反
說明文件寫的式子是
LM = (50 / RH)1.3 · exp[ (Ea/R) · (1/TK − 1/293) ]
程式碼寫的是 (50/RH)^(1/3) * exp((-EA/8.314) * (1/TempK - 1/293.15)),且預設 EA = 100(單位標為 J/mol)。
三處差異:指數 1.3 變成 1/3、指數項符號相反、活化能少了三個數量級(Michalski 用的是約 100 kJ/mol)。後果:
| 條件 | ConSciR calcLM | 文件式子(Ea=100 kJ/mol) | 對不對得上 Michalski 的口訣 |
|---|---|---|---|
| 20 °C / 50%(基準) | 1.0000 | 1.0000 | ✓ 兩者皆為 1 |
| 15 °C / 50%(降 5 °C) | 0.9993 | 2.0380 | 「每降 5 °C 壽命加倍」→ 只有右欄對 |
| 25 °C / 50%(升 5 °C) | 1.0007 | 0.5025 | 升溫應變短,左欄卻略微變長 |
| 20 °C / 25%(RH 減半) | 1.2599 | 2.4623 | 「RH 減半壽命增加超過一倍」→ 只有右欄對 |
怎麼辦:本教材第 4、5 章一律使用下面這個依文件重寫的版本,並在圖表上標示 LM*。
# 依 ConSciR 說明文件與 Michalski (2002) 重寫 calcLM_fix <- function(Temp, RH, EA = 100000) { # EA 單位 J/mol (50 / RH)^1.3 * exp((EA / 8.314) * (1 / (Temp + 273.15) - 1 / 293.15)) }
② calcMould_VTT():臨界濕度式的一次項符號相反
VTT 模型的臨界相對濕度(低於它就不會長黴)在 T ≤ 20 °C 時為
RHcrit = −0.00267·T³ + 0.160·T² − 3.13·T + 100,
這個式子在 T = 20 °C 剛好接上 T > 20 °C 時的常數 80%。ConSciR 的程式碼寫成 + 3.13 * temp,
於是臨界濕度變成一個大於 100% 的數,低溫時「永遠達不到門檻」的保護就消失了:
| 溫度 | ConSciR 的 RHcrit | 公開式的 RHcrit | 30 天恆定條件下 ConSciR 累積的 M | 模型應有的答案 |
|---|---|---|---|---|
| 19 °C / 60% RH | 198.9 | 80.0 | 0.147 | 0(未達門檻) |
| 18 °C / 70% RH | 192.6 | 79.9 | 0.999 | 0 |
| 15 °C / 75% RH | 173.9 | 80.0 | 2.082 | 0 |
| 12 °C / 78% RH | 156.0 | 80.9 | 2.885 | 0 |
15 °C/75% 的冷藏庫在模型裡本來完全不會長黴,ConSciR 卻在一個月後給出 M ≈ 2(=肉眼可見)。 對低溫庫房而言,這是會產生假警報的錯誤;相對地 T > 20 °C 的分支使用常數 80%,行為正確—— 這也是為什麼在亞熱帶夏季情境裡不容易被發現。
③ calcMould_VTT():整欄丟進去不會累積
函式最後是 mapply(calc_mould, Temp, RH, M_prev)。你若照文件範例把一整欄溫濕度丟進去,
M_prev 會被回收成同一個值(預設 0),所以每一列都是「從 M = 0 開始長一個時間步」的增量,不是黴菌指數。
# 240 小時都是 25 °C / 85% RH Temp <- rep(25, 240); RH <- rep(85, 240) tail(calcMould_VTT(Temp, RH), 1) #> 0.01838 <- 不會累積 m <- 0 for (i in 1:240) m <- calcMould_VTT(25, 85, M_prev = m) m #> 2.6187 <- 這才是黴菌指數
add_conservation_calcs() 產生的 Mould_index 欄位就是前者,不是累積黴菌指數。這一點在解讀報表時務必注意。
另外兩個技術性問題:k1 的分支條件用的是 M_max < 1 而非目前的 M,且括號寫成 2/(t_v/(t_m-1))
(Hukka & Viitanen 的原式為 2/(t_v/t_m − 1));以及此實作沒有衰退項——
原模型在條件不利時 dM/dt 為 −0.032/日(前 6 小時)、0(6–24 小時)、−0.016/日(24 小時之後),
ConSciR 則讓 M 只會持平不會下降,因此對「白天開空調、晚上停機」這種間歇環境會系統性高估累積風險。
本教材所有模擬使用補上正確 RHcrit 與衰退項的版本,圖表一律標示為 M*。
④ calcSensibleHeatRatio():位置引數對錯位
calcSensibleHeating 的形參順序是 (Temp1, Temp2, RH, volumeFlowRate),
calcTotalHeating 是 (Temp1, Temp2, RH1, RH2, volumeFlowRate);
但 calcSensibleHeatRatio 內部呼叫時把流量放到了 RH 的位置。實測:
T1<-30; T2<-22; RH1<-75; RH2<-55; V<-0.5 calcTotalHeating(T1, T2, RH1, RH2, V) #> -21.08 (正確:這是冷卻,負值) calcTotalHeating(T1, T2, V, RH1, RH2) #> 1482.09 (SHR 內部實際送出的引數)
此外 calcSensibleHeating 用了 pmax(..., 0),在冷卻工況(T₂ < T₁)一律回傳 0,
所以 calcSensibleHeatRatio 在冷卻時恆為 0。本教材第 5 章因此不使用 SHR,直接用焓差自己算。
⑤ SaltsR 的 total_ion_content 欄位名稱會誤導
它的計算式是 (total_wt − total_wt_adj) − gypsum_content,也就是「校正過程中被移除的量再扣掉石膏」,
不是樣品的總離子含量。以本教材的 FT-01 為例:
| 欄位 | 數值 (wt%) | 真正的意思 |
|---|---|---|
total_wt | 1.1920 | 七離子實測總量 ← 這才是總離子含量 |
total_wt_adj | 1.1176 | 校正並扣除石膏後、要送進 ECOS 的量 |
gypsum_content | 0.0744 | 推估的石膏含量 |
total_ion_content | 0.0001 | 前三者的殘差,不是總離子含量 |
寫報告時請直接引用 total_wt,並在方法段說明來源。
R 練習 3b:自己把這五點驗證一遍
👉 換你做:再找一個可以自我驗證的極端案例
calcPI(20, 50) 應該回傳約 41.8 年。IPI 的另一個常被引用的數字是「溫度每降 5 °C,PI 約增為 1.8–2 倍」。
上面的區塊最後一行已經算出 calcPI(15, 50) / calcPI(20, 50) = 1.902——PI 通過了檢驗。
(提示:PI 的溫度項寫在 Arrhenius 式的分母,方向與 calcLM 不同——這也是為什麼 calcLM 的錯誤特別容易被忽略。)
2. 展廳與展櫃:夏季黴菌風險
南部某地方文化館,一樓展廳陳列紙質與木質民俗文物。空調只在開館時間(週二至週日 09:00–17:00)運轉, 設定 24 °C / 55%。館方在 8 月接到通報:冰水機故障,連續七天停機。維修完成後, 典藏組在幾件展櫃外的木匾背面發現白色黴斑,但展櫃內的紙本文書看起來沒事。
館長問三個問題:(1) 這七天到底發生了什麼?(2) 為什麼櫃內櫃外差這麼多?(3) 下次停機幾天以內是安全的?
2.1 先看資料,不要先看結論
模擬資料涵蓋 6/1–9/30 共 2,928 小時,記錄外氣、展廳、展櫃三處的 T 與 RH。下圖先只畫 RH:
光看 RH 曲線只能說「展廳比較抖」。要回答「有沒有長黴」,需要把 RH 和溫度合起來看,這就是 calcMould_Zeng 的工作:
它會告訴你在當下的溫度,開始長黴需要多高的 RH。
2.2 展櫃為什麼有效:緩衝就是買時間
展櫃不是密封盒,它是一個低通濾波器。調濕劑(矽膠、Art-Sorb、Prosorb)提供的水分緩衝容量決定了時間常數 τ: 外界 RH 階躍變化後,櫃內大約需要 τ 小時才走完 63% 的變化。本模擬取 τ ≈ 90 小時。
👉 換你做:三個值得試的組合
- τ = 90、停機 3 天與τ = 90、停機 10 天:找出展櫃 M* 開始明顯上升的天數門檻。這就是館長要的「安全停機天數」。
- τ = 10(等於沒有調濕劑):展櫃曲線會幾乎貼上展廳。這說明密閉性本身不提供保護,緩衝容量才提供保護。
- 敏感度切到 very:同樣的環境,未處理木材的 M* 會高出一截。所以「這個展廳安全嗎」這個問題不能脫離材料回答。
2.3 從數字到措施
| 觀察到的現象 | 用什麼函式確認 | 對應的預防性措施 | 不建議的做法 |
|---|---|---|---|
| 夜間/休館日 RH 上衝,但 AH 幾乎不變 | calcAH 前後比較 | 維持空調連續運轉(可提高設定溫度省電),或加裝夜間循環風扇 | 買除濕機——問題是溫度不是水分 |
| 停機期間 RH 與 AH 同步上升 | calcAH、calcDP | 獨立除濕迴路,不隨主機停;控制外氣導入 | 只把空調設定溫度調低 |
| 展廳 M* 上升但展櫃平穩 | calcMould_VTT(需自行累積) | 把最敏感的物件移入有調濕劑的展櫃;建立調濕劑再生排程 | 假設「展櫃=安全」而停止監測櫃內 |
| 牆面/角落溫度低於室內露點 | calcDP 對比表面溫度 | 改善外牆保溫、拉開展櫃與外牆距離、加強角落氣流 | 只調整室內 RH 設定值 |
| 黴斑已出現 | — | 先降 RH 使 M 停止上升、隔離物件、由修復人員清除;清除後 M 不會自己歸零,孢子仍在 | 直接噴灑殺菌劑於文物表面 |
R 練習 4:重現展廳與展櫃的黴菌指數
2.4 對照組:同樣的函式跑倫敦資料
把完全相同的程式碼跑在 ConSciR 內建的 mydata(倫敦,2024 全年)上:
3. 海岸砲台與地下室:鹽害診斷
兩處古蹟同時出現粉化與剝落:(A) 海岸砲台的紅磚外牆,離地 0.3 m 處磚面成片酥鬆,愈往上愈輕微; (B) 內陸古厝地下室北牆與地坪,表面析出白色結晶,灰泥層鼓起。 兩處都取了粉末樣品做離子層析。承辦人問:「這是同一種病嗎?要不要用同一種方法處理?」
3.1 八個樣品,兩種鹽的身世
模擬的離子層析結果(單位 mg/L,萃取液濃度):
3.2 式 1 與式 2:為什麼一定要換成當量
ppm 不能直接相加比較,因為每個離子的分子量與電荷不同。SaltsR 的式 1、式 2 就是在做這個換算:
# 式 1:濃度 -> 重量分率 (kg/kg) w <- (c_ppm * (V_ml / 1000)) / (m_dry_g * 1000) # 式 2:重量分率 -> 毫當量 (mEq/kg) e <- (w * z) / (M / 1000) * 1000 # z 與 M 直接來自套件內建資料 SaltsR::salt_charges_z #> Cl 1 NO3 1 SO4 2 Na 1 K 1 Ca 2 Mg 2 SaltsR::mol_wts #> Cl 35.453 NO3 62.0049 SO4 96.064 ...
fun_salt_balance() 其實沒有使用套件內建的 mol_wts 與 salt_charges_z——
它在函式內部又寫了一份自己的表(chloride = 35.4527、sodium = 22.989768),
與資料集的 35.453、22.98977 略有差異。數值上無關緊要,但它提醒你:看得到的資料集不一定是程式實際用的那一份。SO₄²⁻ 帶兩個電荷,所以同樣的毫克數對電荷平衡的貢獻是 Cl⁻ 的兩倍多。這正是為什麼地下室樣品用 ppm 看「陰陽離子差不多」, 換成當量後卻可能大幅偏一邊。
3.3 Pathway 1 還是 Pathway 2:判斷規則的兩個陷阱
程式碼裡的判斷式是:
Pathway1 <- (Δe <= max(e_cat, e_ani) * 0.02) | (e_ani > e_cat) Pathway2 <- (Δe > e_cat * 0.02) & (e_cat > e_ani)
兩個常見誤解:
- 「Δe 大就是 Pathway 2」——錯。本教材的 BS-06 樣品 Δe 高達 18.9%,卻走 Pathway 1, 因為它是陰離子過剩。陰離子過剩通常代表分析漏掉了某個陽離子(例如 NH₄⁺),模型的處理是兩邊等比例拉到中點,而不是扣誰。
- 「Pathway 2 只扣鈣」——錯。它是一條瀑布:Ca 扣完不夠就扣 Mg,再不夠扣 Na,最後扣 K。 本教材的 FT-04 就是扣到 Mg 的例子,而它的鈣被扣到 0,因此石膏含量變成 0——這不是「樣品沒有石膏」,是模型假設的結果。
3.4 石膏飽和度 S:同一面牆,兩個答案
BS-07 與 BS-08 是同一份均質化樣品,只是萃取條件不同:BS-07 用 10 mL 水,BS-08 用 100 mL。
兩者的 total_wt、gypsum_content 完全相同(3.654% 與 2.982%),
但 SaltsR 的石膏飽和度差了十倍:
| 樣品 | 萃取水量 | total_wt (%) | 石膏 (%) | 飽和度 S | 套件警告 |
|---|---|---|---|---|---|
| BS-07 | 10 mL | 3.654 | 2.982 | 1.387 | 觸發:稀釋不足 |
| BS-08 | 100 mL | 3.654 | 2.982 | 0.139 | 無警告 |
S 的定義是「推估石膏量 ÷ 該水/樣比下石膏的溶解上限(以 20 °C 時 2.14 g/L 計)」。S > 1 表示 你的萃取液根本溶不下這麼多石膏,IC 量到的硫酸根一定偏低,因此真實石膏含量只會更高。
fun_salt_balance() 也不會拒絕你,它會安安靜靜給你一個錯的答案。
3.5 送進 ECOS/RUNSALT,然後讀曲線
式 8 算出的七個莫耳分率就是 ECOS 輸入檔的內容。格式如下(可在實驗室 3 按「產生 ECOS 輸入檔」取得任一樣品的版本):
把這個檔案丟給 RUNSALT,它會在你指定的 RH 範圍內逐點解熱力學平衡,輸出「每個鹽相在每個 RH 下的莫耳數」。
回到 R,用 tidyRunsalt() 整理,再用 graph_salt_balance() 畫圖。
判讀曲線的四個問題
- 某條線從 0 開始爬升的那個 RH 是什麼?那是該鹽相的結晶濕度。RH 由高往低掃,跨過它就開始析出固體。
- 水(water)那條線在哪裡歸零?那是這組混合鹽的共同潮解濕度(MDRH)。低於它,牆裡完全沒有液態水,鹽也不再移動。
- 環境 RH 會不會反覆穿越某條結晶濕度?每穿越一次就是一次溶解—結晶循環,破壞是循環次數的函數,不是 RH 高低的函數。
- 最危險的鹽是哪一個?不是量最多的,而是結晶濕度落在你的環境 RH 正中央的那一個。
3.6 從數字到措施
| 診斷結果 | 措施 | 理由 |
|---|---|---|
| NaCl 主導、結晶濕度約 70–75%,環境 RH 在 60–85% 之間擺盪 | 把 RH 穩定在明顯低於結晶濕度處(例如 55%),或明顯高於(不建議,會促進其他劣化) | 破壞來自循環;停留在單側比追求「低 RH」更重要 |
| MDRH 很低(例如 35%),環境不可能降到那麼乾 | 放棄「讓鹽完全結晶乾燥」的目標,改為穩定 + 降低鹽的補充來源 | 把 RH 壓到 MDRH 以下在亞熱帶不現實,且會傷害有機質文物 |
| 離地愈近鹽愈多(FT-01 > FT-02 > FT-03) | 先處理水源:地面排水、防潮層、外牆導水;再考慮除鹽敷貼(poultice) | 不斷水就會不斷補鹽,除鹽只是治標 |
| 硫酸鹽 + 鈣為主,石膏含量高 | 避免高 RH 波動;檢討水泥砂漿修補(會持續供應硫酸根);不要用含硫酸鹽的清潔劑 | 石膏在 ECOS 模型外,但它是真實的體積膨脹來源 |
| 硝酸鹽偏高 | 調查歷史使用(廄舍、廁所、鳥糞)並移除污染源;注意硝酸鹽吸濕性強,會讓牆長期潮濕 | 硝酸鹽的潮解濕度低,是「牆一直乾不了」的常見原因 |
| S > 1 的樣品 | 重做萃取(加大水量),不要拿現有數據下結論 | 方法學問題,不是材料問題 |
R 練習 5:一次跑完八個樣品
4. 紙質檔案庫:化學劣化與四種控制策略
某校校史館要把日治時期的學籍簿、照片與少量醋酸片基底片移入新庫房。 預算只夠選一種空調策略,總務處提出四個方案:
A 恆溫恆濕 20 °C / 50% | B 只除濕,溫度隨室溫 26 °C / 50% | C 只降溫,不控濕 20 °C / 65% | D 不裝空調,只做通風除塵
直覺上大家覺得 B「至少濕度顧到了」比 C 好。這一章就用 calcLM/calcPI 檢驗這個直覺。
4.1 溫度與濕度,哪一個比較要緊?
Michalski(2002)那句被引用最多的話是:「每降 5 °C,壽命加倍;每把相對濕度減半,壽命增加超過一倍」。
把這句話寫成式子就是 1.4 節裡的 calcLM_fix。用它跑一年的模擬資料:
但這個結論有一個必要條件:C 的 RH 65% 已經很接近長黴門檻,模擬中出現 19 小時超標。 如果庫房位在亞熱帶且氣密性差,C 隨時會變成黴菌事件。所以正確的說法不是「溫度比濕度重要」,而是:
👉 換你做:把「降 1 °C」換算成「減幾 %RH」
固定 RH = 50%,把溫度從 24 降到 23,記下 LM* 的變化倍數;再固定 T = 24,把 RH 往下調到 LM* 出現同樣的倍數, 看需要減幾個百分點。R 練習 6 已經幫你算好:在 24 °C/50% 附近,降 1 °C 大約等於把 RH 減 5 個百分點(壽命倍數同為 1.147 倍)。 這個換算率是跟總務處談判時最有用的一個數字:它讓「保存效益」和「機電成本」可以放在同一張表上比較。
4.2 別忘了機械劣化:看 EMC 的擺幅,不是 RH 的擺幅
紙、皮革、木材都會隨 EMC 變化而膨脹收縮。當一件物件由多種材料組合(畫布 + 木框 + 顏料層、書皮 + 書頁 + 膠), 各層的膨脹係數不同,EMC 擺幅就直接轉成層間應力。因此:
- 年擺幅決定季節性的翹曲與裂縫張合;
- 日擺幅決定表層(顏料、上漆)的疲勞;
- 對已經有裂縫的物件,穩定比數值好看更重要——一個穩定的 60% 常常勝過在 45–60% 之間來回的「平均 52%」。
R 練習 6:四種策略的年度指標
5. 節能減碳與保存風險的正面衝突
同一間校史館收到上級的節能指標:三年內用電量減 20%。 機電廠商建議「把庫房設定點從 20 °C / 50% 放寬到 24 °C / 55%,一年可省下四成空調電」。 典藏組直覺反對,但講不出具體代價。這一章的任務是把代價算成數字。
5.1 設定點怎麼變成電費
把外氣調到設定狀態所需的冷卻功率,就是焓差乘上質量流量:
rho <- calcAD(T_out, RH_out) # 空氣密度 kg/m3 h1 <- calcEnthalpy(T_out, RH_out) # 外氣焓 kJ/kg h2 <- calcEnthalpy(T_set, RH_set) # 設定點焓 kJ/kg kW <- q * rho * pmax(h1 - h2, 0) # q = 體積流量 m3/s kWh_year <- sum(kW) # 逐時資料直接加總
本教材用 900 m³ 的庫房、每小時 0.4 次換氣(滲透 + 新鮮外氣)計算,模擬外氣為南部沿海全年逐時資料。 這是空氣處理的理論負荷,不含機組效率、內部發熱與圍護結構傳熱,因此絕對值會低於實際電費, 但用來做設定點之間的相對比較是有效的。
5.2 廠商建議的真實代價
5.3 真正該優先做的節能措施
| 措施 | 對能耗 | 對保存風險 | 優先度 |
|---|---|---|---|
| 降低換氣量與滲透(氣密、門斗、減少不必要新鮮外氣) | ↓↓ 大幅下降 | ↓ 波動變小,風險同時下降 | 最優先——雙贏 |
| 加強圍護結構保溫與遮陽 | ↓↓ | ↓ 表面溫度上升,冷凝風險下降 | 優先 |
| 放寬溫度設定(例如 20 → 22 °C) | ↓ | ↑ 化學劣化加快 | 需計算,逐案評估 |
| 放寬濕度設定(例如 50 → 55%) | ↓ | ↑ 接近黴菌門檻、可能穿越鹽結晶點 | 慎用,且必須檢查鹽害 |
| 季節性浮動設定(跟隨外氣緩慢漂移) | ↓↓ | → 若漂移速率夠慢,機械風險不增 | 推薦,但需要連續監測支持 |
| 夜間/休館日停機 | ↓ | ↑↑ 見第 2 章:這正是黴菌事件的成因 | 不建議 |
6. 四條風險,一根 RH 軸
前面四章各自得到一個「應該把 RH 設在哪裡」的答案,而且互相矛盾。這一章把它們畫在同一張圖上。 情境是最難的那一種:一棟位在海岸、有鹽害、同時收藏紙質與木質文物、而且要節能的館舍。
6.1 四條曲線各自要什麼
| 風險 | 指標 | 它偏好的 RH | 它真正在意的事 |
|---|---|---|---|
| 黴菌 | calcMould_Zeng 門檻、VTT 指數 | 愈低愈好;Zeng 門檻在 14–30 °C 約為 74–76%,扣安全裕度後實務上限常落在 65–70% | 是否跨過門檻——這是硬約束 |
| 化學劣化 | calcLM*、calcPI | 愈低愈好,且愈冷愈好 | 累積曝露——可以用時間交換 |
| 鹽結晶 | RUNSALT 結晶濕度、MDRH | 沒有「愈低愈好」;要遠離結晶濕度並保持穩定 | 穿越次數——不是高低 |
| 機械劣化 | calcEMC_wood 擺幅 | 沒有偏好值;要穩定 | 變化幅度與速率 |
| 能耗 | calcEnthalpy 積分 | 愈高愈好(愈接近外氣愈省) | 與前四項全部反向 |
6.2 一條可以照著走的決策流程
- 先確認硬約束。把
calcMould_Zeng的門檻算出來(它隨溫度變動),減去 5% 當安全裕度,得到 RH 上限。 這一條不能拿來交換。 - 再確認鹽的禁區。若牆體有鹽,把 RUNSALT 給的每個結晶濕度各畫一條 ±(控制帶寬)的禁帶。 設定點加上帶寬後不可以壓在任何一條禁帶上。沒有鹽害紀錄的館舍可跳過,但海岸與地下空間請務必先取樣。
- 在剩下的區間裡,往低 RH、低溫方向找。每往下一格用
calcLM_fix記下壽命增益, 用能耗網格記下成本,算出「每 kWh 買到多少壽命」。 - 檢查機械風險。用
calcEMC_wood算出設定點 ± 帶寬對應的 EMC 擺幅,控制在 2% 以內通常安全。 - 寫成規範。三個數字缺一不可:目標值、允許帶寬、允許變化速率(例如「55%,±5%,每小時不超過 2%」)。
- 設定監測與複核。至少一支感測器放在最不利點(外牆角落、地板附近、展櫃內),而不是只放在門口。
6.3 把結果寫成管理文件
環境控制建議(範本)
適用範圍:◯◯館一樓庫房(紙質、木質為主;外牆檢出氯化鈉為主之可溶鹽)
控制目標:溫度 22 ± 1.5 °C;相對濕度 55 ± 5%,每小時變化不超過 2%。
依據: (1) 黴菌:以 Zeng 模型於 22 °C 之門檻約 ◯◯%,扣除安全裕度後上限 ◯◯%; (2) 鹽害:本案 RUNSALT 顯示主要鹽相結晶濕度約 ◯◯%,55 ± 5% 未穿越; (3) 化學劣化:相對 20 °C/50% 之壽命倍數 LM* = ◯.◯◯; (4) 機械:對應木材 EMC 擺幅 ◯.◯%,低於 2% 之管理值; (5) 能耗:相較 20 °C/50% 節省 ◯◯%。
監測:庫房中央、外牆角落、展櫃內各一點,15 分鐘取樣,每季以 ConSciR 產生報表。
複核條件:連續 24 小時超出帶寬、單次 RH 變化超過 5%/h、或牆面出現新析出物時,重新評估。
資料與模型限制:本建議所用之壽命倍數依 Michalski (2002) 之式重算; 黴菌指數採補上衰退項之 VTT 模型;鹽相平衡由 ECOS/RUNSALT 計算,該模型不含碳酸鹽、石膏與動力學,僅適用 20 °C 附近。
後測與能力雷達圖
12 題綜合題,涵蓋四個情境與工具層。作答完成後會自動計分, 依數據判讀 / 風險診斷 / 措施決策 / 工具操作四個維度畫出雷達圖,並列出建議複習的章節。
目前作答進度
附錄 A:教學使用建議
三小時工作坊
| 0:00–0:15 | 前測 + 第 0 章 |
| 0:15–0:50 | 第 1 章工具層 + 實驗室 1 |
| 0:50–1:10 | 1.4 節誠實的極限(建議由學生分組各驗證一項) |
| 1:10–1:50 | 第 2 章黴菌 + 實驗室 2 + 情境測 |
| 2:00–2:35 | 第 3 章鹽害 + 實驗室 3、4 + 情境測 |
| 2:35–3:00 | 第 6 章整合 + 實驗室 7 + 後測與雷達圖 |
第 4、5 章留作課後自學。
一學期(16 週)配置
- W1–2 保存科學導論、R 與資料框基礎、第 0 章
- W3–5 第 1 章工具層;作業:用自己館舍/實驗室的記錄器資料重跑一次
- W6 1.4 節;作業:再找出一個套件與文件不符之處並寫成 issue
- W7–8 第 2 章;期中:以實測資料做一份黴菌風險報告
- W9–11 第 3 章;含 IC 實驗、ECOS 輸入檔製作
- W12–13 第 4、5 章
- W14–16 第 6 章整合;期末:為一處指定古蹟撰寫環境控制建議書
常見迷思與對應章節
| 學生常說的話 | 問題在哪 | 回到哪一節 |
|---|---|---|
| 「RH 越低越好」 | 忽略鹽結晶的穿越效應與有機質乾裂 | 3.5、6.1 |
| 「這個展櫃是密封的,所以安全」 | 密封 ≠ 緩衝;沒有調濕劑的密封櫃只是延後而非削弱 | 2.2 |
| 「函式跑出來就是答案」 | 沒有驗證函式是否算它宣稱的東西 | 1.4 |
| 「Mould_index 欄位是黴菌指數」 | 那是單步增量,不是累積指數 | 1.4 ③ |
| 「樣品不含鈣」 | 把 Pathway 2 的模型假設當成量測結果 | 1.3、3.3 |
| 「石膏飽和度大代表牆很危險」 | S 是萃取方法的指標,不是材料的指標 | 3.4 |
| 「省電就是把設定點放寬」 | 忽略了減少負荷這一類雙贏措施 | 5.3 |
| 「國外的 50 ± 5% 規範照抄就好」 | 門檻隨氣候、材料、鹽組成而變 | 2.4、6.2 |
附錄 B:資料與可重現性
本教材所有數值皆由下列流程產生,可完整重現:
- 從 GitHub 取得 ConSciR 與 SaltsR 原始碼,
直接載入其
R/目錄下的函式定義(兩者的計算函式皆為 base R,不需安裝套件即可執行)。 fun_salt_balance()唯一的修改是把tibble::tibble(換成data.frame(並移除結尾多餘的逗號;所有算式未更動。- 亞熱帶外氣以季節項 + 日夜項 + AR(1) 天氣雜訊 + 降雨事件合成,隨機種子
set.seed(20260810)。 - 離子層析數值為設計值,用意是涵蓋 Pathway 1/2、石膏由 Ca 或 SO₄ 限制、以及飽和度警告三種狀況。
- 第 3 章的結晶曲線為依文獻潮解濕度建構的示意曲線,非 ECOS 輸出。
下載資料與腳本
以下連結在部署到伺服器(含 GitHub Pages)後才有效;
單獨用 file:// 開啟本檔時會找不到檔案。
資料集(CSV)
- builtin_london_daily.csv ConSciR 內建
mydata日均 + 風險欄位 - outdoor_daily.csv 模擬南部沿海外氣
- s1_gallery_case.csv 情境一 展廳/展櫃逐時
- s2_salt_samples.csv 情境二 八樣品與平衡結果
- s2_runsalt_illustrative.csv 示意結晶曲線
- s3_strategies_summary.csv/…_daily.csv 情境三 四策略
- s4_setpoint_grid.csv 情境四 設定點網格
R 腳本與 ECOS 輸入檔
- prelude.R 教材內 webR 載入的完整函式定義(可直接在自己的 R 裡
source()) - gen.R 產生全部模擬資料(
set.seed(20260810)) - blocks.R 七個 R 練習區塊的原始碼
- ECOS_input_FT-01.txt … BS-08 八個可直接餵給 RUNSALT 的輸入檔
參考文獻
- Hukka, A., & Viitanen, H. (1999). A mathematical model of mould growth on wooden material. Wood Science and Technology, 33(6), 475–485. doi:10.1007/s002260050131 — VTT 黴菌指數模型原始文獻
- Zeng, L., Chen, Y., Ma, M., Du, B., Gao, J., Cao, G., & Li, J. (2023). Prediction of mould growth rate within building envelopes: development and validation of an improved model. Building Services Engineering Research and Technology. doi:10.1177/01436244221137846 —
calcMould_Zeng的來源 - Michalski, S. (2002). Double the life for each five-degree drop, more than double the life for each halving of relative humidity. In Preprints of the 13th ICOM-CC Triennial Meeting, Rio de Janeiro, Vol. I, 66–72. James & James. — 壽命倍數 LM
- Reilly, J. M. (1995). New Tools for Preservation: Assessing Long-Term Environmental Effects on Library and Archives Collections. Commission on Preservation and Access. — Preservation Index
- Godts, S., Steiger, M., Orr, S. A., De Kock, T., Desarnaud, J., De Clercq, H., & Cnudde, V. (2022). Charge balance calculations for mixed salt systems applied to a large dataset from the built environment. Scientific Data, 9, 324. doi:10.1038/s41597-022-01445-9 — SaltsR 的 11 條式子
- Godts, S., Steiger, M., Orr, S. A., Stahlbuhk, A., Desarnaud, J., De Clercq, H., Cnudde, V., & De Kock, T. (2022). Modeling salt behavior with ECOS/RUNSALT: terminology, methodology, limitations, and solutions. Heritage, 5(4), 3648–3663. doi:10.3390/heritage5040190 — ECOS 模型的六離子上限、不含碳酸鹽與石膏、無動力學
- Godts, S., Orr, S. A., Steiger, M., Stahlbuhk, A., De Kock, T., Desarnaud, J., De Clercq, H., & Cnudde, V. (2023). Salt mixtures in stone weathering. Scientific Reports, 13, 13306. doi:10.1038/s41598-023-40590-y — 由 11,412 個樣品歸納出的典型混合鹽組成
- Godts, S., Steiger, M., Stahlbuhk, A., Orr, S. A., Desarnaud, J., De Clercq, H., Cnudde, V., & De Kock, T. (2024). Modeled versus experimental salt mixture behavior under variable humidity. ACS Omega, 9(18), 20454–20466. doi:10.1021/acsomega.4c01486 — 實測結晶濕度比模型預測低 9–28%;RH 變化愈慢愈接近模型
- Rörig-Dalgaard, I. (2021). Direct measurements of the deliquescence relative humidity in salt mixtures including the contribution from metastable phases. ACS Omega, 6(25), 16297–16306. doi:10.1021/acsomega.1c00538 — 混合鹽的潮解濕度必低於任一單鹽
- Price, C. A. (Ed.) (2000). An Expert Chemical Model for Determining the Environmental Conditions Needed to Prevent Salt Damage in Porous Materials (Protection and Conservation of European Cultural Heritage Research Report No. 11). Archetype. — ECOS 模型
- Bionda, D. (2005). RUNSALT — a graphical user interface to the ECOS thermodynamic model for the prediction of the behaviour of salt mixtures under changing climate conditions. — RUNSALT 軟體
- Buck, A. L. (1981). New equations for computing vapor pressure and enhancement factor. Journal of Applied Meteorology, 20(12), 1527–1532. —
calcPws預設方法 - Shah, B. (2024–). ConSciR: Tools for Conservation Science. R package. github.com/BhavShah01/ConSciR/說明文件
- Shah, B., Godts, S., & Orr, A. (2024–). SaltsR: Tools for the Analysis of Salt Formation Data. R package. github.com/BhavShah01/SaltsR/說明文件
本教材對 ConSciR 與 SaltsR 提出的五處程式碼/文件差異,均為對照公開原始碼與其引用文獻後的觀察, 且皆可在本頁的 R 區塊中重現。兩個套件均為 GPL-3 授權的開源專案,發現問題的正確做法是到其 GitHub 開 issue—— 這也是本教材建議指派給學生的作業之一。以上觀察基於 2026 年 8 月取得的原始碼版本,套件更新後可能已修正。