<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>ECG 心電圖小常識 - Bobo 的學思山丘</title><description>從設備系統設計的角度，分享心電圖的基礎知識與實務觀念</description><link>https://bobochen.dev/</link><item><title>HIS、PACS、AE Title 到底是什麼？醫院系統整合的名詞入門</title><link>https://bobochen.dev/blog/hospital-integration-glossary-ae-title-pacs-his/</link><guid isPermaLink="true">https://bobochen.dev/blog/hospital-integration-glossary-ae-title-pacs-his/</guid><description>醫院整合的信裡最常出現的三個縮寫：HIS 管文字、PACS 管圖、AE Title 是機器的名字。這篇用寄包裹的比喻，把它們加上 MWL、C-ECHO 一次講清楚。</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>## 名詞小教室：HIS、PACS、AE Title 一句話版

做醫院的系統整合，往來信件裡出現頻率最高的就是這三個縮寫：

- **HIS** —— 醫院的大腦，管文字（誰、什麼時候、做什麼、結果如何）
- **PACS** —— 影像倉庫，管圖（檢查做出來的東西存這裡）
- **AE Title** —— 機器在 DICOM 世界裡的名字

## HIS 管文字、PACS 管圖 —— 醫院系統的第一條分界線

**HIS（Hospital Information System，醫院資訊系統）** 是醫院的大腦。誰掛號、住哪一床、今天要做什麼檢查、報告寫了什麼——全部在這裡。它管的是**文字與流程**。

**PACS（Picture Archiving and Communication System，影像儲存與傳輸系統）** 是影像倉庫。X 光、超音波、CT、心電圖，所有「檢查做出來的東西」存在這裡，醫師要看的時候再調出來。它管的是**圖**。

規模小一點、只服務單一科別或單一院區的，習慣叫 **miniPACS**。功能上是同一件事，只是倉庫小一點。

搞清楚這條線，你才知道自己的系統要接哪一邊。以心電圖設備來說，答案通常是：**從 HIS 那邊拿到「要幫誰做檢查」，把做完的圖送進 PACS**。兩邊都要接，但接法完全不同。

&lt;figure style=&quot;margin:1.75em 0&quot;&gt;
&lt;svg viewBox=&quot;0 0 720 300&quot; role=&quot;img&quot; aria-label=&quot;左邊 HIS 管文字、右邊 PACS 管圖，下方的心電圖設備從 HIS 取得工單、把影像送進 PACS&quot; style=&quot;width:100%;height:auto;display:block;font-family:ui-sans-serif,system-ui,&apos;Noto Sans TC&apos;,sans-serif&quot;&gt;
&lt;defs&gt;&lt;marker id=&quot;d1a&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;7&quot; markerHeight=&quot;7&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; fill=&quot;#E0574A&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;
&lt;rect x=&quot;16&quot; y=&quot;16&quot; width=&quot;300&quot; height=&quot;150&quot; rx=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.03&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.25&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;text x=&quot;42&quot; y=&quot;58&quot; font-size=&quot;24&quot; font-weight=&quot;700&quot; fill=&quot;currentColor&quot;&gt;HIS&lt;/text&gt;
&lt;text x=&quot;42&quot; y=&quot;82&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;醫院資訊系統 · 管文字&lt;/text&gt;
&lt;g stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.22&quot; stroke-width=&quot;7&quot; stroke-linecap=&quot;round&quot;&gt;&lt;path d=&quot;M42,108 H250&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M42,130 H206&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M42,152 H236&quot;&gt;&lt;/path&gt;&lt;/g&gt;
&lt;rect x=&quot;404&quot; y=&quot;16&quot; width=&quot;300&quot; height=&quot;150&quot; rx=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.03&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.25&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;text x=&quot;430&quot; y=&quot;58&quot; font-size=&quot;24&quot; font-weight=&quot;700&quot; fill=&quot;currentColor&quot;&gt;PACS&lt;/text&gt;
&lt;text x=&quot;430&quot; y=&quot;82&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;影像儲存系統 · 管圖&lt;/text&gt;
&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.25&quot; stroke-width=&quot;1.5&quot;&gt;&lt;rect x=&quot;430&quot; y=&quot;100&quot; width=&quot;80&quot; height=&quot;52&quot; rx=&quot;6&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;520&quot; y=&quot;100&quot; width=&quot;80&quot; height=&quot;52&quot; rx=&quot;6&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;610&quot; y=&quot;100&quot; width=&quot;80&quot; height=&quot;52&quot; rx=&quot;6&quot;&gt;&lt;/rect&gt;&lt;/g&gt;
&lt;g fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.8&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M440,126 h14 l6,-14 l8,28 l6,-14 h26&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M530,126 h14 l6,-14 l8,28 l6,-14 h26&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M620,126 h14 l6,-14 l8,28 l6,-14 h26&quot;&gt;&lt;/path&gt;&lt;/g&gt;
&lt;rect x=&quot;250&quot; y=&quot;236&quot; width=&quot;220&quot; height=&quot;52&quot; rx=&quot;10&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;2&quot;&gt;&lt;/rect&gt;
&lt;text x=&quot;360&quot; y=&quot;268&quot; text-anchor=&quot;middle&quot; font-size=&quot;16&quot; font-weight=&quot;600&quot; fill=&quot;#E0574A&quot;&gt;心電圖設備&lt;/text&gt;
&lt;path d=&quot;M166,166 C166,220 200,262 240,262&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.8&quot; marker-end=&quot;url(#d1a)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M480,262 C520,262 554,220 554,166&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.8&quot; marker-end=&quot;url(#d1a)&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;186&quot; y=&quot;208&quot; font-size=&quot;13&quot; fill=&quot;#E0574A&quot;&gt;① 拿工單（誰要做）&lt;/text&gt;
&lt;text x=&quot;538&quot; y=&quot;208&quot; text-anchor=&quot;end&quot; font-size=&quot;13&quot; fill=&quot;#E0574A&quot;&gt;② 送影像（做完的圖）&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption style=&quot;font-size:0.85em;opacity:0.65;text-align:center;margin-top:0.5em&quot;&gt;HIS 管文字、PACS 管圖，設備夾在中間：左邊拿單、右邊送圖。&lt;/figcaption&gt;
&lt;/figure&gt;

## AE Title 不是設定值，是機器在 DICOM 世界的名字

醫療影像設備之間講的共同語言叫 **DICOM**。很多工程師第一次接觸會以為它是一種檔案格式，像 JPEG 那樣——這是最常見的誤會。DICOM 同時是一套**網路通訊協定**，規定兩台機器怎麼建立連線、怎麼問問題、怎麼傳檔案。

既然是機器對機器講話，就要有個叫法。這個叫法就是 **AE Title**（Application Entity Title，應用實體名稱）。

它的規則很樸素：

- 最多 **16 個字元**
- **大小寫有差**（`ECG-SERVER` 和 `ecg-server` 是兩個不同的東西）
- 慣例上用大寫英數字加連字號，看起來像 `ECG-SERVER`、`HOSP-IMGSRV`

重點是它的性質：**AE Title 是身分，不是設定**。PACS 那端有一份名單，上面記著「我允許哪些名字、從哪些 IP 連進來」。名字不在名單上，連線在握手階段就被拒絕，你連錯誤訊息都不一定看得到。

所以廠商問你的 AE Title，本質上是在問：**我要把你加進白名單，你叫什麼名字？**

&lt;figure style=&quot;margin:1.75em 0&quot;&gt;
&lt;svg viewBox=&quot;0 0 720 280&quot; role=&quot;img&quot; aria-label=&quot;兩台機器連線前先互報 AE Title，對方 PACS 比對白名單，名字不在名單上就在握手階段被拒絕&quot; style=&quot;width:100%;height:auto;display:block;font-family:ui-sans-serif,system-ui,&apos;Noto Sans TC&apos;,sans-serif&quot;&gt;
&lt;path d=&quot;M250,20 h220 a10,10 0 0 1 10,10 v34 a10,10 0 0 1 -10,10 h-96 l-16,16 v-16 h-108 a10,10 0 0 1 -10,-10 v-34 a10,10 0 0 1 10,-10 z&quot; fill=&quot;#E0574A&quot; fill-opacity=&quot;0.12&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;360&quot; y=&quot;52&quot; text-anchor=&quot;middle&quot; font-size=&quot;16&quot; fill=&quot;currentColor&quot;&gt;你是誰？我要不要理你？&lt;/text&gt;
&lt;rect x=&quot;16&quot; y=&quot;104&quot; width=&quot;250&quot; height=&quot;112&quot; rx=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.03&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.25&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;rect x=&quot;40&quot; y=&quot;126&quot; width=&quot;202&quot; height=&quot;36&quot; rx=&quot;6&quot; fill=&quot;#E0574A&quot;&gt;&lt;/rect&gt;
&lt;text x=&quot;141&quot; y=&quot;151&quot; text-anchor=&quot;middle&quot; font-size=&quot;15&quot; font-weight=&quot;600&quot; fill=&quot;#ffffff&quot; font-family=&quot;ui-monospace,SFMono-Regular,Menlo,monospace&quot;&gt;ECG-SERVER&lt;/text&gt;
&lt;text x=&quot;141&quot; y=&quot;186&quot; text-anchor=&quot;middle&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;我們的主機（送出的一端）&lt;/text&gt;
&lt;text x=&quot;141&quot; y=&quot;205&quot; text-anchor=&quot;middle&quot; font-size=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.45&quot; font-family=&quot;ui-monospace,SFMono-Regular,Menlo,monospace&quot;&gt;10.0.0.10&lt;/text&gt;
&lt;rect x=&quot;454&quot; y=&quot;104&quot; width=&quot;250&quot; height=&quot;112&quot; rx=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.03&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.25&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;rect x=&quot;478&quot; y=&quot;126&quot; width=&quot;202&quot; height=&quot;36&quot; rx=&quot;6&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.45&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;text x=&quot;579&quot; y=&quot;151&quot; text-anchor=&quot;middle&quot; font-size=&quot;15&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; font-family=&quot;ui-monospace,SFMono-Regular,Menlo,monospace&quot;&gt;HOSP-IMGSRV&lt;/text&gt;
&lt;text x=&quot;579&quot; y=&quot;186&quot; text-anchor=&quot;middle&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;醫院的 PACS（收的一端）&lt;/text&gt;
&lt;text x=&quot;579&quot; y=&quot;205&quot; text-anchor=&quot;middle&quot; font-size=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.45&quot; font-family=&quot;ui-monospace,SFMono-Regular,Menlo,monospace&quot;&gt;10.0.0.20 : 104&lt;/text&gt;
&lt;path d=&quot;M266,160 H454&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;2.5&quot; stroke-dasharray=&quot;9 8&quot;&gt;&lt;/path&gt;
&lt;circle cx=&quot;360&quot; cy=&quot;160&quot; r=&quot;4.5&quot; fill=&quot;#E0574A&quot;&gt;&lt;/circle&gt;
&lt;rect x=&quot;440&quot; y=&quot;230&quot; width=&quot;264&quot; height=&quot;36&quot; rx=&quot;6&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.04&quot;&gt;&lt;/rect&gt;
&lt;text x=&quot;456&quot; y=&quot;254&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;白名單：✓ ECG-SERVER · 10.0.0.10&lt;/text&gt;
&lt;text x=&quot;16&quot; y=&quot;254&quot; font-size=&quot;13&quot; fill=&quot;#E0574A&quot;&gt;名字對不上 → 握手階段就被拒絕&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption style=&quot;font-size:0.85em;opacity:0.65;text-align:center;margin-top:0.5em&quot;&gt;AE Title 是身分不是設定：對方的白名單認的是「名字 + 來源 IP」這一組。&lt;/figcaption&gt;
&lt;/figure&gt;

## 三個欄位合起來才是一個地址：住哪、哪扇門、叫什麼

新手最容易混的是 AE Title、IP、Port 這三個到底差在哪。用寄包裹想最快：

&lt;figure style=&quot;margin:1.75em 0&quot;&gt;
&lt;svg viewBox=&quot;0 0 720 200&quot; role=&quot;img&quot; aria-label=&quot;IP 是住哪裡、Port 是哪扇門、AE Title 是叫什麼名字，三個合起來才是一個完整的 DICOM 地址&quot; style=&quot;width:100%;height:auto;display:block;font-family:ui-sans-serif,system-ui,&apos;Noto Sans TC&apos;,sans-serif&quot;&gt;
&lt;rect x=&quot;1&quot; y=&quot;9&quot; width=&quot;718&quot; height=&quot;182&quot; rx=&quot;10&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.03&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.25&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;g stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.18&quot; stroke-width=&quot;1.5&quot;&gt;&lt;path d=&quot;M240,9 V191&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M480,9 V191&quot;&gt;&lt;/path&gt;&lt;/g&gt;
&lt;g font-family=&quot;ui-monospace,SFMono-Regular,Menlo,monospace&quot; font-size=&quot;12&quot; letter-spacing=&quot;1.6&quot; fill=&quot;#E0574A&quot;&gt;&lt;text x=&quot;26&quot; y=&quot;48&quot;&gt;IP&lt;/text&gt;&lt;text x=&quot;266&quot; y=&quot;48&quot;&gt;PORT&lt;/text&gt;&lt;text x=&quot;506&quot; y=&quot;48&quot;&gt;AE TITLE&lt;/text&gt;&lt;/g&gt;
&lt;g font-size=&quot;27&quot; font-weight=&quot;700&quot; fill=&quot;currentColor&quot;&gt;&lt;text x=&quot;26&quot; y=&quot;92&quot;&gt;住哪裡&lt;/text&gt;&lt;text x=&quot;266&quot; y=&quot;92&quot;&gt;哪扇門&lt;/text&gt;&lt;text x=&quot;506&quot; y=&quot;92&quot;&gt;叫什麼&lt;/text&gt;&lt;/g&gt;
&lt;g font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.62&quot;&gt;&lt;text x=&quot;26&quot; y=&quot;126&quot;&gt;在網路上的哪一台機器&lt;/text&gt;&lt;text x=&quot;266&quot; y=&quot;126&quot;&gt;同一台機器的哪個入口&lt;/text&gt;&lt;text x=&quot;506&quot; y=&quot;126&quot;&gt;收件人名字，寫錯退件&lt;/text&gt;&lt;/g&gt;
&lt;g font-family=&quot;ui-monospace,SFMono-Regular,Menlo,monospace&quot; font-size=&quot;14&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.5&quot;&gt;&lt;text x=&quot;26&quot; y=&quot;162&quot;&gt;10.0.0.10&lt;/text&gt;&lt;text x=&quot;266&quot; y=&quot;162&quot;&gt;8090&lt;/text&gt;&lt;text x=&quot;506&quot; y=&quot;162&quot;&gt;ECG-SERVER&lt;/text&gt;&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption style=&quot;font-size:0.85em;opacity:0.65;text-align:center;margin-top:0.5em&quot;&gt;地址對、門對，但名字寫錯——包裹一樣退件。&lt;/figcaption&gt;
&lt;/figure&gt;

三個都對，門才會開。少一個、錯一個，連線都不會成立。

順帶一提，`104` 是 DICOM 的公定 port，`11112` 是另一個常見的註冊 port。看到這兩個數字，你大概就知道那台是什麼東西。

## MWL：工單不是我們產生的，是醫院「發下來」的

還有一個名詞會在同一封信裡出現：**MWL（Modality Worklist，檢查工作清單）**。

它就是**今天的待辦清單**。醫師在 HIS 開了一張檢查單，這張單會流到 Worklist 服務上；設備（我們的平板、超音波機、X 光機）去問一句「今天有我的單嗎？」，Worklist 就回一份名單：誰、幾號單、做什麼檢查。

這解決了醫院最怕的事——**手打病歷號會錯**。護理師不用輸入病人資料，直接從清單上點，資料就跟著單子走。

搭配這幾個動作看，整套 DICOM 就清楚了：

- **C-ECHO** —— 敲門喊一聲「喂，聽得到嗎？」（只確認連線，不傳資料）
- **C-FIND** —— 查詢，例如去 Worklist 問今天的單
- **C-STORE** —— 送檔案，把做完的檢查推進 PACS

## 一張心電圖的旅程：共五個步驟

把上面全部串起來，一張心電圖從病人身上到醫師螢幕，是這樣走的（IP 與名稱都改成示意值）：

&lt;figure style=&quot;margin:1.75em 0&quot;&gt;
&lt;svg viewBox=&quot;0 0 900 250&quot; role=&quot;img&quot; aria-label=&quot;心電圖的五步旅程：HIS 開單、Worklist 發下工單、平板錄製、主機以 C-STORE 推進 PACS、報告回 HIS&quot; style=&quot;width:100%;height:auto;display:block;font-family:ui-sans-serif,system-ui,&apos;Noto Sans TC&apos;,sans-serif&quot;&gt;
&lt;defs&gt;&lt;marker id=&quot;d3a&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;7&quot; markerHeight=&quot;7&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.5&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;
&lt;path d=&quot;M60,120 H840&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.18&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M60,120 L150,120 L162,102 L176,138 L188,120 L320,120 L332,102 L346,138 L358,120 L560,120 L572,102 L586,138 L598,120 L840,120&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;2&quot; stroke-linejoin=&quot;round&quot; stroke-opacity=&quot;0.55&quot;&gt;&lt;/path&gt;
&lt;g text-anchor=&quot;middle&quot;&gt;&lt;circle cx=&quot;60&quot; cy=&quot;120&quot; r=&quot;30&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.04&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.35&quot; stroke-width=&quot;2&quot;&gt;&lt;/circle&gt;&lt;text x=&quot;60&quot; y=&quot;126&quot; font-size=&quot;15&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot;&gt;HIS&lt;/text&gt;&lt;text x=&quot;60&quot; y=&quot;66&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;① 開檢查單&lt;/text&gt;&lt;/g&gt;
&lt;g text-anchor=&quot;middle&quot;&gt;&lt;circle cx=&quot;255&quot; cy=&quot;120&quot; r=&quot;30&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.04&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.35&quot; stroke-width=&quot;2&quot;&gt;&lt;/circle&gt;&lt;text x=&quot;255&quot; y=&quot;126&quot; font-size=&quot;15&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot;&gt;MWL&lt;/text&gt;&lt;text x=&quot;255&quot; y=&quot;66&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;② 今天有誰要做&lt;/text&gt;&lt;/g&gt;
&lt;g text-anchor=&quot;middle&quot;&gt;&lt;circle cx=&quot;450&quot; cy=&quot;120&quot; r=&quot;32&quot; fill=&quot;#E0574A&quot;&gt;&lt;/circle&gt;&lt;text x=&quot;450&quot; y=&quot;126&quot; font-size=&quot;15&quot; font-weight=&quot;600&quot; fill=&quot;#ffffff&quot;&gt;平板&lt;/text&gt;&lt;text x=&quot;450&quot; y=&quot;64&quot; font-size=&quot;13&quot; fill=&quot;#E0574A&quot;&gt;③ 錄心電圖&lt;/text&gt;&lt;/g&gt;
&lt;g text-anchor=&quot;middle&quot;&gt;&lt;circle cx=&quot;645&quot; cy=&quot;120&quot; r=&quot;32&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.04&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;2&quot;&gt;&lt;/circle&gt;&lt;text x=&quot;645&quot; y=&quot;126&quot; font-size=&quot;14&quot; font-weight=&quot;600&quot; fill=&quot;#E0574A&quot;&gt;主機&lt;/text&gt;&lt;text x=&quot;645&quot; y=&quot;64&quot; font-size=&quot;13&quot; fill=&quot;#E0574A&quot;&gt;④ C-STORE 推送&lt;/text&gt;&lt;/g&gt;
&lt;g text-anchor=&quot;middle&quot;&gt;&lt;circle cx=&quot;840&quot; cy=&quot;120&quot; r=&quot;30&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.04&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.35&quot; stroke-width=&quot;2&quot;&gt;&lt;/circle&gt;&lt;text x=&quot;840&quot; y=&quot;126&quot; font-size=&quot;15&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot;&gt;PACS&lt;/text&gt;&lt;text x=&quot;840&quot; y=&quot;66&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;影像入庫&lt;/text&gt;&lt;/g&gt;
&lt;path d=&quot;M840,162 C840,210 430,222 60,186 L60,156&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.5&quot; stroke-width=&quot;1.8&quot; stroke-dasharray=&quot;8 7&quot; marker-end=&quot;url(#d3a)&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;450&quot; y=&quot;238&quot; text-anchor=&quot;middle&quot; font-size=&quot;13&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.6&quot;&gt;⑤ 醫師判讀完，文字報告回 HIS&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption style=&quot;font-size:0.85em;opacity:0.65;text-align:center;margin-top:0.5em&quot;&gt;五步走完就是整張拓撲：文字從 HIS 出發、影像進 PACS、報告再回 HIS。&lt;/figcaption&gt;
&lt;/figure&gt;

| # | 發生什麼 | 誰跟誰講話 |
|---|---|---|
| 1 | 醫師在 HIS 開檢查單 | HIS 內部 |
| 2 | 設備問「今天有誰要做？」 | 我們 → Worklist `HOSP-WKSRV / 10.0.0.20 : 3320`（C-FIND） |
| 3 | 護理師錄心電圖，資料回主機 | 平板 → 我們的主機 |
| 4 | 主機把 DICOM 推進倉庫 | `ECG-SERVER / 10.0.0.10 : 8090` → `HOSP-IMGSRV / 10.0.0.20 : 104`（C-STORE） |
| 5 | 醫師判讀完，文字報告回病歷 | → HIS |

看懂這張表，開頭那封信該怎麼回就很明確了：廠商要的是**第 4 步裡「送出去那一端」的身分**，也就是我們主機的 AE Title、IP、Port 三件組。

實務上還要多講一句：心電圖送進 PACS 的格式是 **DICOM Waveform**（波形），不是一般的影像 DICOM。很多 miniPACS 只收特定的 SOP Class，格式不對會被拒收——這件事一定要在串接前講清楚，不然雙方都會在「我明明送了、我明明沒收到」之間耗掉一個下午。想深入這一段的話，我在[《DICOM 深入解析——不只是影像格式》](/blog/healthcare-software-development-14)寫過更細的踩坑；而心電圖 DICOM 存出來要用什麼打得開，則在[《心電圖存成 DICOM 之後，要用什麼打開？》](/blog/ecg-dicom-viewer-weasis)。

## 想知道對方到底通不通？echoscu 一行指令

講完名詞，給一個能立刻動手的東西。要驗證「白名單設好了沒」，不需要真的送一張心電圖過去——用 C-ECHO 敲門就好。

最輕的工具是 [pynetdicom](https://github.com/pydicom/pynetdicom)（Python 實作的 DICOM 網路協定，pydicom 團隊維護）。

**3 分鐘快速上手**

```bash
# 1. 安裝
pip install pynetdicom

# 2. 敲門：對 10.0.0.20 的 104 埠打招呼
python -m pynetdicom echoscu 10.0.0.20 104 -aet ECG-SERVER -aec HOSP-IMGSRV -v
```

兩個參數是整件事的重點，也剛好對應這篇的主題：

- `-aet` = **calling AE title**，我叫什麼（我方）
- `-aec` = **called AE title**，我要找誰（對方）

怎麼判讀結果：

- 沒有錯誤、回 `Association Accepted` → 通了，白名單有你
- `Association Rejected` → 網路是通的，但**名字或來源 IP 沒被接受**，回頭找對方核對白名單
- 連線 timeout → 還沒到 DICOM 這層，是防火牆或路由的問題

能分清楚後面兩種，你就不會把一個防火牆問題誤報成「對方 PACS 壞了」——這個誤判在現場非常常見。


### 有趣發現

上面那幾張圖，是我為了回信順手畫的。畫到一半卡住了——因為我發現自己說不清楚 **MWL 到底算誰的**。是 HIS 的一部分？還是 PACS 的功能？

去查了才確定：它是**獨立的 DICOM 服務**，資料源頭來自 HIS，但講的是 DICOM 的語言，所以通常跟 PACS 擺在一起。我在那之前的理解一直是糊的，只是因為沒人問我，所以我也沒發現自己不懂。

**能不能畫出來，是理解程度最誠實的測驗。** 名詞可以背，但要把箭頭畫在哪一格，你騙不了自己。（難怪架構師面試很愛考圖解系統設計）</content:encoded><media:content url="https://bobochen.dev/images/og/hospital-integration-glossary-ae-title-pacs-his.png" medium="image"/><category>DICOM</category><category>PACS</category><category>HIS</category><category>醫療設備</category><category>Domain Knowledge</category><enclosure url="https://bobochen.dev/images/og/hospital-integration-glossary-ae-title-pacs-his.png" length="0" type="image/png"/></item><item><title>心電圖存成 DICOM 之後，要用什麼打開？</title><link>https://bobochen.dev/blog/ecg-dicom-viewer-weasis/</link><guid isPermaLink="true">https://bobochen.dev/blog/ecg-dicom-viewer-weasis/</guid><description>12 導程心電圖存成 DICOM 檔後，大部分 DICOM viewer 都打不開。這篇記錄 SOP Class UID 如何決定檔案是「圖」還是「波形」，以及開源工具 Weasis 的 ECG 檢視實際操作。</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><content:encoded>## 起因

原本只是要確認某個匯出的心電圖 DICOM 檔裡，那段診斷文字是不是正確的，但我用手邊的 DICOM viewer 打開，畫面一片空白。檔案其實沒壞，是工具不對 XD

## DICOM 不是「一種」檔案

副檔名都是 `.dcm`，裡面可能是完全不同的東西。決定它是什麼的是 **SOP Class UID**：

| SOP Class UID | 這是什麼 | 資料長什麼樣 |
|---|---|---|
| `1.2.840.10008.5.1.4.1.1.7` | Secondary Capture | 像素。通常是報告 PDF 轉成的圖 |
| `1.2.840.10008.5.1.4.1.1.9.1.1` | 12-Lead ECG Waveform | 沒有任何像素，只有一連串電壓取樣值 |

12-Lead ECG Waveform 的 `PixelData` 是空的，內容躺在 `WaveformSequence` 裡：12 個導程，每個導程數千個 16-bit 整數。

「12 導程」是哪 12 個、為什麼身上只接 10 條線，見本系列的[為什麼心電圖要用 10 條導線？](/blog/ecg-why-10-wires-12-leads)。

大部分 DICOM viewer 是為影像設計的（CT、MR、X 光）。丟一個沒有像素的檔案給它，得到空白畫面是預期行為，不是缺陷。

## Weasis

[Weasis](https://github.com/nroduit/Weasis) 把波形當一等公民，作者 Nicolas Roduit，EPL 2.0 / Apache 2.0 雙授權。

確認它有獨立的波形模組，而不只是宣稱支援 —— 列出 OSGi bundle：

```bash
for j in $(find ~/.weasis/cache-*/ -name &quot;bundle.jar&quot;); do
  unzip -p &quot;$j&quot; META-INF/MANIFEST.MF | awk &apos;/^Bundle-SymbolicName:/{print $2}&apos;
done | sort -u | grep dicom
```

```
weasis-dicom-codec
weasis-dicom-explorer
weasis-dicom-rt
weasis-dicom-sr
weasis-dicom-viewer2d
weasis-dicom-viewer3d
weasis-dicom-wave      ← 波形模組
```

`weasis-dicom-wave` 是獨立 bundle，不是塞進影像檢視器的附加功能。

## 3 分鐘快速上手

### 裝與開

```bash
brew install --cask weasis
open -a Weasis your-ecg.dcm
```

也可以把檔案拖進視窗，或用 File → Open。

### 畫面長這樣

![Weasis v4.7.2 開啟 12 導程 ECG DICOM：左為 DICOM Explorer，中央為波形，右側 Measurements 面板列出 Annotations](image.png)

以下是 v4.7.2 實際畫面上的元件：

- **左側 DICOM Explorer** — 載入的資料照 Patient / Study / Series 階層列出，縮圖標示為 `ECG`。上方有 Search tags 可搜欄位。
- **中央波形區** — 截圖的版面是 4 欄 × 3 列（I/aVR/V1/V4、II/aVL/V2/V5、III/aVF/V3/V6），最下方一條 II 導程的 rhythm strip。游標移到某導程時，上方會顯示該導程的 Minimum / Maximum 電壓。
- **右側 Measurements 面板** — 分成 **Markers**（游標量測結果）與 **Annotations**（Tag / Value 表格）兩區。

### 頂部三個下拉

| 控制項 | 畫面上的值 | 作用 |
|---|---|---|
| `Zoom` 第一個下拉 | `auto mm/s` | X 軸走紙速度 |
| `Zoom` 第二個下拉 | `auto mm/mV` | Y 軸增益 |
| `Display format` | `4x2.5 Seconds with rhythm` | 導程版面配置 |

`4x2.5 Seconds with rhythm` 指 4 欄、每欄 2.5 秒，外加一條 rhythm strip。這和本系列第一篇談的 [6x2 格式](/blog/ecg-report-6x2-format)是不同的版面慣例，下拉裡可以切換。

另外還有一個獨立的 `Zoom: 100%` 滑桿，等比縮放不改變上面兩個刻度。

### Annotations 面板裡有什麼

這是這次真正要看的地方。表格內容直接來自 DICOM 的 `WaveformAnnotationSequence`：

| Tag | Value |
|---|---|
| Filter Low Frequency | 0.05 Hz |
| Filter High Frequency | 150.0 Hz |
| Notch Filter Frequency | 60.0 Hz |
| **Text** | **Heart rate (&lt;60 bpm)…** |
| Ventricular Heart Rate | 62.0 {H.B.}/min |
| PR Interval | 167.0 ms |
| QRS Duration | 127.0 ms |
| QT Interval | 418.0 ms |
| QTc Interval | 428.0 ms |
| P Axis / QRS Axis / T Axis | 56.0 / 74.0 / 44.0 deg |

`Text` 那列就是 `(0070,0006) UnformattedTextValue` —— 判讀文字。其餘幾列則是各自帶 `ConceptNameCodeSequence` 的數值型 annotation。

## 什麼時候用 GUI，什麼時候用程式

這次的任務是「確認一段文字精確等於什麼」。GUI 做得到，但表格會截斷（截圖裡就顯示成 `Heart rate (&lt;60 bpm)Q…`），而且看不出不可見字元。

三行 Python 更適合：

```python
import pydicom
ds = pydicom.dcmread(&quot;your-ecg.dcm&quot;)
for item in ds.WaveformAnnotationSequence:
    if &quot;UnformattedTextValue&quot; in item:
        print(repr(item.UnformattedTextValue))
```

用 `repr()` 而不是 `print()`。這次要抓的是文字裡混進 HTML 跳脫字元（`&amp;lt;` 而不是 `&lt;`），這種差異在 GUI 上、甚至在一般 print 輸出裡都容易看漏，`repr()` 會連跳脫字元和 `\r\n` 一起攤開。

適用場景：

| 要驗什麼 | 用什麼 |
|---|---|
| 波形長相、雜訊、間期量測 | Weasis |
| 某欄位的值精確是什麼 | pydicom + `repr()` |
| 檔案格式合不合規（SOP Class、必填欄位） | pydicom |

兩者驗的東西不同，不能互相取代。

## 截圖前的去識別化

要把畫面放進文件或簡報前，先把病患欄位換掉：

```python
ds = pydicom.dcmread(src)
ds.PatientName = &quot;DOE^JOHN&quot;
ds.PatientID = &quot;DEMO-0001&quot;
ds.save_as(dst)
```

Weasis 的 DICOM Explorer 和分頁標籤都會顯示 Patient ID，截圖時很容易連帶入鏡。

另外，測試用的 `.dcm` 如果放在 git repo 目錄下，記得確認 `.gitignore` 有蓋到 —— `*.dcm` 適合預設 ignore。

## 重點整理

- `.dcm` 副檔名不代表同一種檔案，先看 SOP Class UID
- 影像用的 viewer 打不開波形，是設計範圍問題不是缺陷
- Weasis 有獨立的 `weasis-dicom-wave` 模組，判讀文字顯示在 Measurements → Annotations 的 `Text` 列
- 檢視波形用 GUI，驗證欄位值用 pydicom</content:encoded><media:content url="https://bobochen.dev/_astro/cover.DA9h6s1i.webp" medium="image"/><category>ECG</category><category>心電圖</category><category>DICOM</category><category>Weasis</category><category>醫療設備</category><enclosure url="https://bobochen.dev/_astro/cover.DA9h6s1i.webp" length="0" type="image/png"/></item><item><title>為什麼心電圖要用 10 條導線？RA/LA/RL/LL/V1~V6 全解析</title><link>https://bobochen.dev/blog/ecg-why-10-wires-12-leads/</link><guid isPermaLink="true">https://bobochen.dev/blog/ecg-why-10-wires-12-leads/</guid><description>心電圖明明說 12 導程，接在病人身上的線卻只有 10 條？這篇從工程師角度拆解 10 條導線如何「算」出 12 個觀察角度，搞懂 RA、LA、RL、LL 和 V1~V6 各自的角色。</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>剛接觸心電圖的時候，我一直有個疑問：

&gt; 大家都說「12 導程心電圖」，但實際接在病人身上的線，怎麼數都只有 10 條啊？

12 ≠ 10，這數學怎麼對得上？

這就是這篇要回答的問題——搞懂 10 條導線怎麼變出 12 個導程，以及每一條線到底在幹嘛。

## 先分清楚兩個詞：導線 vs 導程

這是最容易搞混的地方，先把定義釘死：

- **導線（Wire / Electrode）**：實體的線，一端接電極片，一端接機器。就是你看到護理師貼在病人身上那些東西。
- **導程（Lead）**：一個**觀察角度**。它不是一條線，而是透過兩個或多個電極之間的**電位差**計算出來的。

用拍照來比喻：**導線是攝影機**，**導程是攝影機拍出來的畫面**。10 台攝影機可以兩兩搭配、組合出超過 10 種不同角度的畫面。

## 10 條導線，分成兩組

### 第一組：4 條肢體導線

貼在四肢上，用顏色或縮寫來區分：

| 縮寫   | 全名      | 位置   | 顏色（AHA 美規） |
| ------ | --------- | ------ | ---------------- |
| **RA** | Right Arm | 右手腕 | 白色             |
| **LA** | Left Arm  | 左手腕 | 黑色             |
| **RL** | Right Leg | 右腳踝 | 綠色             |
| **LL** | Left Leg  | 左腳踝 | 紅色             |

&gt; 小提醒：AHA（美國心臟協會）和 IEC（國際電工委員會）的顏色標準不一樣。台灣醫院兩種都會遇到，開發設備時要注意相容性。

### 第二組：6 條胸前導線

貼在胸口的特定位置：

| 縮寫   | 位置                  |
| ------ | --------------------- |
| **V1** | 胸骨右緣，第 4 肋間   |
| **V2** | 胸骨左緣，第 4 肋間   |
| **V3** | V2 和 V4 的中點       |
| **V4** | 左鎖骨中線，第 5 肋間 |
| **V5** | 左腋前線，與 V4 同高  |
| **V6** | 左腋中線，與 V4 同高  |

V1 到 V6 從右前方繞到左側，像一條弧線包住心臟的前面和左邊。

4 + 6 = **10 條導線**。就這麼多，沒有第 11 條。

![標題為「12-Lead ECG Electrode Placement」的解剖示意圖：左半部是胸腔正面圖，肋骨上標出 V1 到 V6 六顆彩色胸前電極的位置，下方逐條說明各自的解剖定位（V1 在右胸骨旁第四肋間、V2 在左胸骨旁第四肋間、V3 在 V2 與 V4 之間、V4 在鎖骨中線第五肋間、V5 在 V4 與 V6 之間、V6 在腋中線同一水平）；右半部是全身人形圖，標出四顆肢體電極 RA（右前臂或手腕）、LA（左前臂或手腕）、RL（右小腿到腳踝）、LL（左小腿到腳踝）——合計正好 10 顆電極](ecg-why-10-wires-12-leads-fig-1.webp)

## 4 條肢體導線如何「算」出 6 個導程？

這是最有趣的部分。4 條線，透過不同的組合方式，產生 6 個觀察角度。

### 前三個：雙極肢體導程（Bipolar Limb Leads）

這三個導程是 Einthoven 在 1900 年代初發明的，最直覺——就是量兩個電極之間的電位差：

| 導程         | 計算方式 | 白話       |
| ------------ | -------- | ---------- |
| **Lead I**   | LA − RA  | 左手減右手 |
| **Lead II**  | LL − RA  | 左腳減右手 |
| **Lead III** | LL − LA  | 左腳減左手 |

就這樣，三個電極兩兩配對，得到 3 個導程。

### 後三個：加壓單極肢體導程（Augmented Unipolar Limb Leads）

名字超長，但概念不難。這三個導程（aVR、aVL、aVF）的做法是：**拿一個電極的電位，去減掉另外兩個電極的平均值**。

| 導程    | 計算方式           | 白話                       |
| ------- | ------------------ | -------------------------- |
| **aVR** | RA − (LA + LL) / 2 | 右手減「左手和左腳的平均」 |
| **aVL** | LA − (RA + LL) / 2 | 左手減「右手和左腳的平均」 |
| **aVF** | LL − (RA + LA) / 2 | 左腳減「右手和左手的平均」 |

「a」代表 augmented（加壓），「V」代表 voltage，最後一個字母代表參考的肢體（R = Right, L = Left, F = Foot）。

所以 3 + 3 = **6 個肢體導程**，全部只靠 RA、LA、LL 三條線的排列組合算出來。

### 等等，那 RL 呢？

你可能已經注意到了——上面 6 個導程的公式裡，完全沒有 RL（右腳）出現。

**RL 是接地參考電極（Reference / Ground）**。它不參與任何導程的計算，但它的存在至關重要：它提供一個基準電位，讓機器可以過濾掉身體上的共模雜訊（Common Mode Noise），例如 50/60 Hz 的市電干擾。

沒有 RL，你的心電圖大概會被雜訊淹沒，什麼都看不到。

&gt; 從硬體設計的角度來看，RL 通常會接到一個叫做「Right Leg Drive」（右腳驅動）的電路。這個電路會把偵測到的共模雜訊反相後送回 RL 電極，主動消除干擾。這是類比前端設計中非常關鍵的一環。

## 6 條胸前導線 → 6 個胸前導程

胸前導程就單純多了。每個胸前導程的算法是：

&gt; **V_n = V_n 電極的電位 − Wilson Central Terminal**

Wilson Central Terminal（WCT）是三條肢體導線（RA + LA + LL）的電位平均值，當作一個「虛擬零點」。

所以 V1 導程 = V1 電極的電位 − (RA + LA + LL) / 3，其他 V2~V6 以此類推。

6 條胸前導線，一對一產生 **6 個胸前導程**。

## 算一下總帳

整條推導鏈長這樣：

```mermaid
flowchart LR
    subgraph WIRE[&quot;身上的 10 條導線&quot;]
        direction TB
        LIMB[&quot;RA · LA · LL&lt;br/&gt;3 條量測用肢體導線&quot;]
        RL[&quot;RL 右腳&quot;]
        CHEST[&quot;V1~V6&lt;br/&gt;6 條胸前導線&quot;]
    end

    LIMB --&gt;|&quot;兩兩相減&quot;| BIP[&quot;I、II、III&quot;]
    LIMB --&gt;|&quot;一個減另兩個的平均&quot;| AUG[&quot;aVR、aVL、aVF&quot;]
    LIMB --&gt;|&quot;三者平均當虛擬零點&quot;| WCT[&quot;Wilson Central Terminal&quot;]
    CHEST --&gt;|&quot;各自減掉 WCT&quot;| PRE[&quot;V1~V6 導程&quot;]
    WCT --&gt; PRE
    RL -.-&gt;|&quot;只除共模雜訊，不產生導程&quot;| OUT
    BIP --&gt; OUT[&quot;12 個導程&quot;]
    AUG --&gt; OUT
    PRE --&gt; OUT
```


| 來源     | 導線數量            | 產生的導程                | 數量   |
| -------- | ------------------- | ------------------------- | ------ |
| 肢體導線 | 4 條（含 1 條接地） | I, II, III, aVR, aVL, aVF | 6      |
| 胸前導線 | 6 條                | V1, V2, V3, V4, V5, V6    | 6      |
| **合計** | **10 條**           |                           | **12** |

10 條導線，12 個導程。數學對上了。

## 為什麼是這 10 條？不能多也不能少嗎？

這個配置背後有幾個考量：

1. **12 個角度剛好涵蓋心臟的兩個平面**：肢體導程看額狀面（正面），胸前導程看水平面（俯瞰），合起來能三維地觀察心臟。

2. **肢體導程之間有數學冗餘**：Lead I + Lead III = Lead II（Einthoven&apos;s Law）。所以嚴格來說只有 2 個獨立訊號，但醫學上保留全部 6 個是因為每個角度都有診斷價值。

3. **RL 不能省**：少了接地參考，訊號品質會崩潰。

4. **10 條已經是實務上的平衡點**：線太多，貼片時間長、病人不舒服；線太少，資訊不夠。10 條是夠用且可接受的數量。

&gt; 事實上，有些特殊情境會加到 15 甚至 18 導程（例如加 V7、V8、V9 看心臟後壁，或加 V3R、V4R 看右心室），但標準檢查就是這 10 條 12 導程。

## 小結

回顧一下：

- **導線（Wire）是實體的線**，導程（Lead）是計算出來的觀察角度
- **10 條導線**分成 4 條肢體（RA、LA、RL、LL）和 6 條胸前（V1~V6）
- 4 條肢體導線中，**RL 是接地**，不參與導程計算；剩下 3 條透過排列組合算出 **6 個肢體導程**
- 6 條胸前導線一對一產生 **6 個胸前導程**
- 總共 **10 條線，12 個角度**

下次有人問你「12 導程為什麼只有 10 條線？」，你可以很有自信地說：因為有些導程是算出來的，不是接出來的。

至於這 12 條波形在報告紙上怎麼排、為什麼左右兩半的時間不一樣，見本系列上一篇[《看懂心電圖報告：什麼是 6x2 格式？》](/blog/ecg-report-6x2-format)；量出來的訊號存成 DICOM 之後要用什麼打開，則在[《心電圖存成 DICOM 之後，要用什麼打開？》](/blog/ecg-dicom-viewer-weasis)。</content:encoded><media:content url="https://bobochen.dev/_astro/ecg-why-10-wires-12-leads-fig-1.CFelh0Sk.webp" medium="image"/><category>ECG</category><category>心電圖</category><category>醫療設備</category><category>Domain Knowledge</category><enclosure url="https://bobochen.dev/_astro/ecg-why-10-wires-12-leads-fig-1.CFelh0Sk.webp" length="0" type="image/png"/></item><item><title>看懂心電圖報告：什麼是 6x2 格式？</title><link>https://bobochen.dev/blog/ecg-report-6x2-format/</link><guid isPermaLink="true">https://bobochen.dev/blog/ecg-report-6x2-format/</guid><description>橫式 12 導程心電圖報告中，6x2 格式是最常見的版面配置。這篇文章用最簡單的方式解釋 6 列 2 行的導程分佈、時間配置，以及 Rhythm Strip 的用途。</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>拿到一張心電圖報告，上面密密麻麻的波形，到底要從哪裡開始看？

如果你跟我一樣，不是醫護背景，而是做心電圖設備系統設計的工程師，那你一定也經歷過第一次盯著報告發呆的階段。12 條波形排成一個矩陣，每條看起來都差不多，但又不太一樣——到底是怎麼排的？

這就是這篇文章要解決的問題：**搞懂 6x2 格式**，也就是最常見的 12 導程心電圖報告版面配置。

## 先搞懂 6x2 是什麼意思

「6x2」這個名字聽起來很直覺，但中文的「行」和「列」實在太容易搞混了（到底哪個是橫的？哪個是直的？），所以我們用最白話的方式來記：

&gt; **上下 6 層，左右 2 塊。**

就這樣。一張橫式（Landscape）的心電圖報告，把 12 條導程（Lead）的波形排成 **6 個橫排、2 個直欄** 的矩陣。左邊一欄放 6 條，右邊一欄放 6 條，剛好 12 條導程全部排完。

## 版面長什麼樣？

把一張報告攤平來看，大概是這樣：

&lt;figure style=&quot;margin:1.75em 0&quot;&gt;
&lt;svg viewBox=&quot;0 0 720 400&quot; role=&quot;img&quot; aria-label=&quot;6x2 心電圖報告版面：左欄由上到下是肢體導程 I、II、III、aVR、aVL、aVF，顯示前 5 秒；右欄是胸前導程 V1 到 V6，顯示後 5 秒；最下方橫跨整張報告的是連續 10 秒的 Lead II 節律帶&quot; style=&quot;width:100%;height:auto;display:block;font-family:ui-sans-serif,system-ui,&apos;Noto Sans TC&apos;,sans-serif&quot;&gt;
&lt;rect x=&quot;16&quot; y=&quot;40&quot; width=&quot;688&quot; height=&quot;336&quot; rx=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.03&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.25&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M360,40 V310&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.18&quot; stroke-width=&quot;1.5&quot; stroke-dasharray=&quot;6 6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M16,310 H704&quot; stroke=&quot;currentColor&quot; stroke-opacity=&quot;0.18&quot; stroke-width=&quot;1.5&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;188&quot; y=&quot;28&quot; text-anchor=&quot;middle&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;#E0574A&quot;&gt;肢體導程 · 0–5 秒&lt;/text&gt;
&lt;text x=&quot;532&quot; y=&quot;28&quot; text-anchor=&quot;middle&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;#E0574A&quot;&gt;胸前導程 · 5–10 秒&lt;/text&gt;
&lt;text x=&quot;40&quot; y=&quot;72&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;I&lt;/text&gt;
&lt;path d=&quot;M76,84 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;384&quot; y=&quot;72&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;V1&lt;/text&gt;
&lt;path d=&quot;M420,84 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;40&quot; y=&quot;112&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;II&lt;/text&gt;
&lt;path d=&quot;M76,124 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;384&quot; y=&quot;112&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;V2&lt;/text&gt;
&lt;path d=&quot;M420,124 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;40&quot; y=&quot;152&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;III&lt;/text&gt;
&lt;path d=&quot;M76,164 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;384&quot; y=&quot;152&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;V3&lt;/text&gt;
&lt;path d=&quot;M420,164 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;40&quot; y=&quot;192&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;aVR&lt;/text&gt;
&lt;path d=&quot;M76,204 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;384&quot; y=&quot;192&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;V4&lt;/text&gt;
&lt;path d=&quot;M420,204 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;40&quot; y=&quot;232&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;aVL&lt;/text&gt;
&lt;path d=&quot;M76,244 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;384&quot; y=&quot;232&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;V5&lt;/text&gt;
&lt;path d=&quot;M420,244 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;40&quot; y=&quot;272&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;aVF&lt;/text&gt;
&lt;path d=&quot;M76,284 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;384&quot; y=&quot;272&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;V6&lt;/text&gt;
&lt;path d=&quot;M420,284 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4 h14 l4,-5 l4,5 h4 l3,8 l4,-26 l4,22 l3,-4 h10 l5,-6 l5,6 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;40&quot; y=&quot;336&quot; font-size=&quot;13&quot; font-weight=&quot;600&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.75&quot;&gt;II&lt;/text&gt;
&lt;path d=&quot;M76,352 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4 h14 l4,-3.5 l4,3.5 h4 l3,5.6 l4,-18.2 l4,15.4 l3,-2.8 h10 l5,-4.2 l5,4.2 h4&quot; fill=&quot;none&quot; stroke=&quot;#E0574A&quot; stroke-width=&quot;1.6&quot; stroke-linejoin=&quot;round&quot; stroke-opacity=&quot;0.85&quot;&gt;&lt;/path&gt;
&lt;text x=&quot;120&quot; y=&quot;336&quot; font-size=&quot;12&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.55&quot;&gt;Rhythm Strip · 連續 0–10 秒&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption style=&quot;font-size:0.85em;opacity:0.65;text-align:center;margin-top:0.5em&quot;&gt;上下 6 層、左右 2 塊，加上底部一條連續 10 秒的節律帶。&lt;/figcaption&gt;
&lt;/figure&gt;

左邊 6 條是**肢體導程**（Limb Leads），右邊 6 條是**胸前導程**（Precordial Leads）。最下面那一條是 Rhythm Strip，我們等一下會講到。

## 12 個導程在看什麼？

心電圖的 12 個導程，其實就是從 12 個不同的角度觀察心臟的電位活動。你可以想像成 12 台攝影機，從不同方位拍攝同一顆心臟。

### 左半邊：肢體導程（Limb Leads）

由上到下依序是 **I、II、III、aVR、aVL、aVF**。

這 6 個導程是透過手腳上的電極來量測的，主要觀察心臟在**額狀面**（也就是從正面看）的電位變化。簡單說，它們負責回答：「心臟的電流，整體是往左還是往右、往上還是往下跑？」

### 右半邊：胸前導程（Precordial Leads）

由上到下依序是 **V1、V2、V3、V4、V5、V6**。

這 6 個導程是貼在胸口不同位置的電極，主要觀察心臟在**水平面**（也就是從上面俯瞰）的電位變化。它們負責回答：「心臟的電流，是往前胸還是往後背跑？」

兩組導程搭配起來，就能立體地了解心臟的電位活動狀況。

## 時間怎麼分配？

標準的心電圖通常記錄 **10 秒鐘** 的訊號。

在橫式的 6x2 版面中，紙張夠寬，所以時間是這樣分配的：

- **左半邊**的導程顯示**前 5 秒**的訊號（0 到 5 秒）
- **右半邊**的導程顯示**後 5 秒**的訊號（5 到 10 秒）

這代表左右兩邊的波形**不是同一個時間點**的——左邊先記錄，右邊接著記錄。在判讀的時候要記住這個時間差，不要把左右兩邊的波形當成同一瞬間的訊號來比較。

&gt; 從設備的角度來看，這個設計其實是為了在有限的紙張寬度上，盡可能呈現最多的時間資訊。10 秒全塞在同一列會太擠，拆成兩段各 5 秒剛剛好。

## Rhythm Strip：6x2 其實是 6x2+1

如果你仔細看上面的示意圖，最下面多了一條橫跨整個報告寬度的波形——這就是 **Rhythm Strip**（節律帶）。

Rhythm Strip 通常是 **Lead II**（有時候用 V1），而且是**連續 10 秒**不中斷的訊號。它的用途很單純：讓醫生可以一眼看出心律是否規則。

為什麼需要這條？因為上面 12 個導程各自只記錄了 5 秒，如果剛好在第 4 秒出現一次心律不整，可能只有少數幾個導程捕捉到。有一條連續 10 秒的 Rhythm Strip，就能更完整地觀察心跳的節律變化。

所以嚴格來說，很多心電圖報告的格式應該叫「**6x2+1**」——6 層 × 2 欄的導程矩陣，加上底部 1 條節律帶。

## 小結

回顧一下這篇講了什麼：

- **6x2** 就是「上下 6 層，左右 2 塊」的版面配置
- 左邊放**肢體導程**（I, II, III, aVR, aVL, aVF），右邊放**胸前導程**（V1–V6）
- 左右兩邊的時間不同：左邊是前 5 秒，右邊是後 5 秒
- 底部通常還有一條**連續 10 秒的 Rhythm Strip**，所以其實是 6x2+1

這是心電圖報告最常見的排版方式。下次拿到一張 ECG 報告，至少你知道那些波形是怎麼排列的了。

看得懂版面之後，下一個問題通常是：既然要 12 條波形，為什麼病人身上只接得到 10 條線？這一題留到本系列下一篇[《為什麼心電圖要用 10 條導線？》](/blog/ecg-why-10-wires-12-leads)。</content:encoded><media:content url="https://bobochen.dev/images/og/ecg-report-6x2-format.png" medium="image"/><category>ECG</category><category>心電圖</category><category>醫療設備</category><category>Domain Knowledge</category><enclosure url="https://bobochen.dev/images/og/ecg-report-6x2-format.png" length="0" type="image/png"/></item></channel></rss>