先把三層資料分欄
TCP-to-Serial 閘道的設定審核,第一步不是看畫面上寫了幾個數字,而是確認每個數字屬於哪一層。IP位址與TCP port描述網路端點;Serial Port描述閘道器上的實體串口;Unit ID或站號描述下游協定中的邏輯目的地。TCP 502是常見的Modbus TCP服務埠示例,不能因此把它寫成實體串口2。
本文使用虛構設備做離線審核,所有位址與數值都是案例條件。正式變更前要取得目標閘道器型號、韌體版本、設定匯出格式、模式說明及下游設備手冊。若文件只說支援Modbus,仍要查清楚是透明轉發、Modbus TCP轉RTU,或轉成另一種應用協定;後兩者都是協定轉換,本文為審核方便分列三種情境,各自對封包、例外與連線數的責任不同。
| 層次 | 應記錄 | 不能替代的欄位 |
|---|---|---|
| 網路Socket | LAN IP、TCP port、來源限制 | 不能當成串口編號 |
| 實體Serial | Port 1/Port 2、baud、parity、stop bit | 不能當成TCP服務埠 |
| 下游協定 | Modbus RTU、站號/Unit ID、功能碼 | 不能當成IP位址 |
| 操作模式 | transparent或protocol conversion | 不能只用產品名稱推定 |
審核表的每一列應能回答「誰從哪個端點進來、閘道器把資料送到哪個實體串口、串口上的下游站號如何辨識」。如果一列只剩「TCP 502→Port 2」,它仍缺少協定模式、串口參數及Unit ID,不能作為可回復的設定基線。
審核時先畫「邏輯連線」再畫「實際接線」。邏輯連線表示哪個TCP端點期待哪個下游站號,實際接線則表示RS-485 A/B、訊號地與串口端子。兩張圖若被壓成一張簡圖,維護人員很容易把Port 2當成站號2,或把Unit ID 7當成端子7。圖例應明寫欄位名稱、單位與資料來源。
把設定匯出檔變成可追溯表
先保存原始匯出檔與雜湊值,再逐欄抄入審核表;不要只留網頁截圖。截圖看得到選項,卻通常無法確認隱藏的預設值、空白欄位或韌體產生的欄位順序。表格另外記錄匯出時間、操作者、韌體版本與是否含密碼或憑證欄位,對外審核表遮罩機密值;可還原原檔另依權限加密保存,勿因遮罩破壞備份可用性。
| 欄位 | 虛構值 | 審核問題 |
|---|---|---|
| Gateway LAN | 192.0.2.10/24 | 是否為管理或資料介面? |
| TCP listen | 192.0.2.10:502 | 是否真的啟用Modbus TCP模式? |
| Serial port | Port 2, 19200 8-E-1 | Port 2是實體介面,不是502的別名 |
| Downstream | Modbus RTU address 7 | 假設Unit ID 7原樣映射,須查設定 |
| Source ACL | 198.51.100.20/32 | 規則是否限制來源方向? |
上述位址採文件保留的示例網段,只為展示欄位關係。若模式是transparent socket,閘道器可能只搬運位元組,Unit ID的解讀與回應配對仍由兩端設備或上層程式負責;若模式是Modbus TCP gateway,設備文件才可能定義MBAP Unit Identifier如何映射到RTU站號。不能把透明模式的推測寫成轉換器功能。
版本化時把原檔命名為日期、設備識別、韌體版本與變更單號的組合,並保存變更前後差異。匯出檔若是二進位格式,除原檔外另存人可讀欄位表;若格式帶有校驗或簽章,不要用文字編輯器改寫後再宣稱仍可匯入。
串口參數也要逐項保存。假設閘道Port 2設定19200 bit/s、偶校驗、1 stop bit,而下游儀表使用9600 bit/s、無校驗,TCP連線仍可能建立,但RTU框架會出現逾時、CRC錯誤或偶發錯誤。此時不能先改TCP port;先以串口擷取確認波特率、字元格式、方向與終端配置,再對照儀表手冊。
若TCP端是主動連線,設定表要記錄遠端IP、遠端port與重連等待;若是監聽端,則記錄bind介面、允許來源與連線上限。兩者都叫socket,但故障證據不同:主動端先查DNS、路由與遠端拒絕,監聽端先查服務狀態與ACL。這些欄位若不分開,測試結果無法回推。
三種模式要問不同問題
| 模式 | 資料責任 | 文件確認點 | 失敗先查 |
|---|---|---|---|
| Transparent socket | 通常只轉送位元組 | 連線方向、封包邊界、串口參數 | 是否有改寫或等待回覆 |
| Modbus TCP gateway | 解析TCP與RTU語意 | Unit ID映射、例外、逾時 | 站號及功能碼支援 |
| 其他應用協定轉換 | 兩邊協定模型皆由閘道處理 | 資料型態、併發、錯誤碼 | 轉換規則與版本 |
透明模式不是「不需要協定設定」。串口端仍要相同的baud、parity、stop bit,TCP端則要確認是閘道主動連線或監聽。資料若被切成多段,必須依手冊確認閘道器採用串口空閒時間、長度、固定框架或其他封包判斷;不能用一次網路send就推定對端會得到一個完整RTU訊框。
以離線封包作驗收。本文先明訂假設路由為Unit ID 7原樣轉到Port 2的RTU站號7,Unit ID 8原樣轉到站號8;不是所有閘道都採這個映射。Modbus TCP轉RTU情境應移除MBAP,組合RTU站號、PDU及CRC;回覆再按TCP交易配對。透明模式只轉bytes,不能直接把含MBAP的Modbus TCP資料丟到RTU線上就期待可用。
結果不同時先保存原始TCP封包、串口擷取、時間戳與模式設定。TCP連得上但沒有串口回應,先查監聽埠、串口方向、baud與下游站號;串口有回應但上位收到例外,查轉換模式、功能碼支援與回應等待;兩個上位端同時讀取,則查文件對連線數與交易配對的限制。
Unit ID的測試不能只用一個站號。離線測試可建立7、8、0三筆案例:7與8是預期存在的站號,0則依文件判斷是否保留、廣播或拒絕。表格記錄送出欄位、下游預期、回覆及是否允許重試;若0被誤送到所有站,應標成模式或安全風險,不可用「沒有回覆」帶過。
離線案例與變更回退
案例一:匯出畫面有「TCP Port=502、Serial=2、Unit ID=7」。審核者把它拆成三列後發現Port 2其實是實體RS-485接口,502只是TCP監聽埠;若原本誤把兩者寫在同一個「通道」欄,維護人員可能把TCP改成5022而以為正在選串口。拆欄後的預期結果是網路端點仍為192.0.2.10:502,實體端為Port 2,站號為7。
案例二:變更前模式為transparent,變更單要求改成Modbus TCP gateway。先保存原始檔與測試PDU,再在隔離網段匯入副本。用Unit ID 7與8各送一筆只讀請求,驗收表要記錄兩筆是否到達對應站號、回應功能碼是否一致、逾時是否可辨識。任一站號混線就回復原檔,不以「TCP能連通」作成功條件。
| 階段 | 保存物 | 通過條件 | 失敗處理 |
|---|---|---|---|
| 變更前 | 原始匯出檔、雜湊、版本 | 可重新匯入或可人工重建 | 停止變更並補齊缺欄 |
| 隔離測試 | PDU、串口擷取、時間戳 | 站號與模式符合文件 | 記錄差異後回退 |
| 上線後 | 新匯出檔、差異、測試結果 | 連線、回應及告警均可追溯 | 套用原檔並確認狀態 |
| 交接 | 設定表、限制、手冊版本 | 下一位可重現判斷 | 標記待確認項 |
回退點必須包含原始檔與匯入所需的韌體條件;只保存截圖不足以還原。若匯入可能重啟服務或清除連線,先安排維護窗口,並把「設定已寫入」與「測試封包通過」分成兩個狀態。本文
設定匯出檔的差異審查要避免把密碼雜訊當成真正變更。先按欄位分類為網路、串口、協定、權限與診斷,再逐類比對。若韌體升級自動新增欄位,差異表要寫明「格式新增」與「行為變更」的區別;沒有release note支持時,把影響列為待確認,不要推定預設值。
FAQ 來源與適用限制
FAQ1:TCP 502是不是Serial Port 2?不是。502是TCP端口示例,Port 2是閘道器的實體串口欄位,兩者必須分開記錄。
FAQ2:透明轉發一定會把Modbus TCP轉成RTU嗎?不一定。透明模式的責任要依設備文件確認,不能只看產品名稱推定封包改寫。
FAQ3:Unit ID填在IP欄旁就代表一定映射到下游站號嗎?不一定。只有協定閘道文件明確定義映射時,才能把它列為轉換結果。
FAQ4:保存網頁截圖可否當設定備份?通常不足。應保存匯出檔、韌體版本、欄位表與變更前後差異。
實作限制:本文的192.0.2.0/24與198.51.100.0/24是教學示例;未指定閘道器型號,因此沒有宣稱特定網頁欄位、連線數或重啟行為。實際設定要以目標設備手冊與release notes為準。
參考:Modbus Messaging Implementation Guide V1.0b:MBAP、Unit Identifier、TCP與串列閘道。
參考:IETF RFC 9293:TCP串流及連線語意,整合並取代早期RFC 793。