← 所有文章

Modbus TCP資料分塊與最大讀取量

· 站長

200個word位置含12個禁讀、六區塊實讀188個word,說明PDU、雙word與快慢輪詢。

建立200個word位置地圖

本案例定義200個16-bit word位置0至199,其中120至129共10個禁讀,150至151共2個保留,因此實讀188個word。資料表要同時記錄功能碼、起點、數量、讀寫、倍率、符號和版本。不要把32-bit項目另算一個點;它占兩個連續word,word順序依設備文件。

本篇固定使用功能03讀Holding Registers。標準單筆最多125個word,但教學設備另假設上限50,故採50這個較小限制。功能04讀Input Registers也有125word標準上限;其他功能碼須另查,不能把125當成所有Modbus傳輸的通用點數。

若設備以40001顯示第一位置,實際請求可能使用起點0;設定檔要明列兩種表示,不能把40001當成封包兩byte。禁讀區即使回傳資料,也應依地圖拒絕,防止未定義值進入歷史資料。

執行讀取時先建立A區基線,確認起點0和數量40的回覆資料長度為80 bytes,再依序加入B與C。若C失敗而A與B成功,優先檢查80至119是否包含設備尚未啟用的區段。不要因A成功就推論0至199都可讀,也不要用上一輪C的值掩蓋本輪失敗。

類別 數量 說明
總位置 200 0至199
禁讀 12 120至129及150至151
實讀 188 六區塊合計

六區塊起訖與數量

六區塊固定為A 0至39共40、B 40至79共40、C 80至119共40、D 130至149共20、E 152至179共28、F 180至199共20,合計188。79屬B、80屬C,120至129和150至151不放入任何請求。若設備單次上限50,40不需無理由拆成25與15。

六區合計計算為40加40加40加20加28加20等於188,200減去12也等於188;兩種算法互相核對。

區塊表另加更新頻率與資料寬度。本例假設A、B、C都是快速資料,D、E一般資料,F慢速診斷,所以即使整段連續,也不一定合併成最大請求。分組依據是合法範圍、設備上限、完整資料項與需求週期,不是每組一定要相同長度。

自訂C區請求PDU為03 00 50 00 28:十進位起點80是0050h,數量40是0028h。正常回覆應以03 50開頭,50h是80個資料byte;這裡起點0050h與byte count 50h碰巧數字相同,欄位寬度及意義完全不同。不要看到50就一律解讀為五十。

區塊 起訖 word數
A 0-39 40
B 40-79 40
C 80-119 40
D 130-149 20
E 152-179 28
F 180-199 20

PDU與雙word邊界

每個word傳兩個資料byte,所以A、B、C回覆資料各80 bytes,D與F各40 bytes,E為56 bytes;還要驗證功能碼和byte count。32-bit項目在78至79可完整放B;在79至80跨B/C,要調整邊界或同一請求涵蓋兩字;119至120因120禁讀,整項不可讀。

byte count只表示資料長度,不代表資料語義有效;每個雙word還要檢查高低word順序與同一採樣快照。

當雙word跨越區塊時,優先讓資料項目完整;若協定或設備上限不允許,將該項標為需特殊讀取,不以兩次不同時刻的word拼成一個可信值。

把79與80視為同一個32位項目時,可另定義替代分塊:B改40至78共39word,C改79至119共41word,都在50上限內且總量仍80。這是替代原B/C的版本,不與原表同時執行。放在同一請求可避免客戶端跨兩筆拼接,但設備是否提供一致快照仍需查文件,不能單靠同一PDU保證。

邊界 占用 處理
78-79 同B 同請求
79-80 跨B/C 調整或同請求
119-120 含禁讀 拒絕
180-199 最後20字 不可超到200

正常40word回覆的PDU長度是功能碼一byte、Byte Count一byte加80byte資料,共82byte;標準TCP再加七byte MBAP,完整ADU為89byte,MBAP Length為83。這些長度從不同起點計數,接收器應逐層檢查,不能把PDU長度直接當Length欄位。

資料項寬度還會影響品質判斷。若一個壓力值占兩word,不能第一字通過就先更新畫面,再等第二字。先在暫存區完成整組解析、倍率和範圍檢查,再一次發布該測點。若設備有序號或快照功能,依其文件驗證兩字屬同一筆,沒有此能力時要把一致性限制寫明。

快慢輪詢時間預算

自訂排程為A/B/C每兩秒一輪,D/E每十秒,F每六十秒。假設每筆正常交易連同發送、回覆與解析各50 ms,快速三筆合計150 ms,距兩秒截止還有1850 ms可安排其他工作;這是正常基線,不是逾時上限,也不是永遠可用的餘裕。

在單筆在途模型中,已送出的慢速請求不能被當作沒有發生而直接插入另一筆。要讓快區準時,必須在慢速請求開始前確認剩餘時間容得下其最壞期限;例如慢速期限500 ms,距快區下一輪只剩200 ms時就延後慢區。若多連線或併發被支援,也要評估共同設備處理容量。

排程以單調時鐘計算每輪耗時,若A/B/C超過2秒週期就標記輪詢落後並記錄原因;不能用增加逾時掩蓋設備回覆變慢。

當三類都到期,若六筆都正常且各50 ms,合計300 ms,能排進本例兩秒時槽。但若某筆用滿500 ms再重試,預算就不同;排程表必須限制每輪重試次數,保留慢區到期時間並避免長期飢餓。依序完成的六塊也不是同一瞬間快照,整體資料集應保存各塊時間。

區域 週期 預算
A/B/C 2秒 150ms基線
D/E 10秒 各自完成
F 60秒 診斷輪詢
重試 依區域 有限次數

輪詢延遲與資料過期要分開記錄。區塊排程晚開始一百毫秒,不一定超過資料允許年齡;反過來,準時發出請求卻沒有有效回覆,也不能更新成功時間。每區保存預定開始、實際發送、有效接收三個時間,能分辨主站排程落後與設備回覆變慢,調整時才有依據。

錯誤對照與驗收

錯誤請求80、50會跨入120至129,預期Illegal Data Address,修正為80、40後byte count為80。請求180、22超過199,修正為180、20後byte count為40。驗收逐一測六區、洞位前後、雙word邊界和最後位置,保存起點、數量、回覆長度、raw值與工程值。

測試 錯誤 修正
80,50 跨禁讀 80,40
180,22 超界 180,20
雙word 跨邊界 同請求
六區 完整 188有效word

FAQ1:200個位置是否200個可用點?答:不是,12個禁讀後只有188個實讀word。

FAQ2:40個word為何不拆?答:假設上限50,40已合規;只有資料邊界或設備限制才拆。

FAQ3:79與80在哪區?答:79在B,80在C;跨區雙word要重新核對。

錯誤前後封包要並列保存,確認修正只改起點與數量,避免把路由或功能碼變更誤判為分塊修復。

驗收結束後保存六區塊請求清單、設備map版本、原始回覆與錯誤碼,換設備或韌體後依同一表重跑,才能比較前後結果。

測試報告列出正常、跨禁讀、超界、雙word、逾時五種結果。正常請求更新最後成功時間;錯誤請求保存例外碼而不更新資料。這樣現場看到舊值時,可以分辨是有效保留還是程式誤用。

FAQ4:正常長度是否成功?答:還要核對功能碼、byte count、交易識別和資料語義。

本文沒有選定設備型號,50word限制、洞位、週期及回覆時間均為離線假設。實際設備可能在讀取時有清除計數等副作用,應先查資料表;例外及正常結果是測試預期。

參考:Modbus Application Protocol V1.1b3,功能03與04的數量、資料長度及位址限制。

參考:Modbus Messaging Implementation Guide V1.0b,MBAP Length與交易配對。

延伸閱讀


使用 PLC 工具箱 →