Trung bình9 phút đọc05/10/2026

Modbus RTU qua RS485: timing, bias, và termination đúng chuẩn

Nắm cách tính điện trở bias/termination, thời gian chờ giữa các khung Modbus RTU và cách tránh lỗi phản hồi khi nhiều thiết bị cùng bus.

Modbus RTU qua RS485: timing, bias, và termination đúng chuẩn
Mục lục bài viết8 ▼
  1. Tổng quan RS485 và vai trò của lớp vật lý trong Modbus RTU
  2. Điện trở termination: cách tính và vị trí đặt
  3. Điện trở bias (pull-up/pull-down): vì sao cần và cách chọn giá trị
  4. Timing trong Modbus RTU: khung và thời gian chờ giữa frame
  5. Thời gian chuyển hướng truyền (turnaround time) và tránh collision
  6. Lỗi thường gặp khi làm thật
  7. Checklist khi thiết kế
  8. Đọc tiếp

Modbus RTU chạy trên RS485 là tổ hợp phổ biến nhất trong tự động hoá công nghiệp, nhưng phần lớn lỗi "giao tiếp chập chờn" thực chất nằm ở lớp vật lý — bias sai, termination đặt lung tung, timeout phần mềm không khớp timing chuẩn — không phải ở logic parse khung. Bài này dành cho kỹ sư firmware và kỹ sư thiết kế tủ điện đang đấu nối bus RS485 nhiều node, cần biết cách tính điện trở, canh thời gian chờ, và tránh collision khi nhiều slave cùng chia sẻ một đường truyền.

#Tổng quan RS485 và vai trò của lớp vật lý trong Modbus RTU

RS485 là chuẩn tín hiệu điện (differential signaling, hai dây A/B), còn Modbus RTU là giao thức lớp ứng dụng/liên kết dữ liệu chạy trên nền đó. Hai lớp này độc lập về chức năng nhưng lỗi ở lớp dưới (bias, termination, timing chuyển hướng truyền) thường biểu hiện giống lỗi phần mềm — mất khung ngẫu nhiên, CRC sai không lặp lại, timeout không ổn định — khiến kỹ sư firmware tốn thời gian soát code trong khi nguyên nhân nằm ở điện trở trên bus.

Phần lớn mạng Modbus RTU công nghiệp dùng bus 2 dây (half-duplex): tất cả node — cả master và slave — chia sẻ chung cặp dây A/B, chỉ một thiết bị được truyền tại một thời điểm. Vì half-duplex, mỗi lần chuyển từ nghe sang nói, driver phải chuyển trạng thái enable (RX→TX), và đây chính là nguồn gốc của turnaround time — chủ đề sẽ bàn ở phần sau. Bus 4 dây (full-duplex) ít gặp hơn trong Modbus RTU công nghiệp nên bài này tập trung vào cấu hình 2 dây.

#Điện trở termination: cách tính và vị trí đặt

Termination (điện trở đầu cuối) chống phản xạ tín hiệu trên đường truyền dài — tín hiệu truyền đi gặp đầu hở sẽ phản xạ ngược, chồng lên tín hiệu đang truyền và gây lỗi bit ở baud rate cao hoặc cáp dài. Giá trị điện trở termination lý tưởng bằng trở kháng đặc tính của cáp để hấp thụ hoàn toàn phản xạ — thường khoảng 120 Ω đối với cáp xoắn đôi dùng cho RS485 (TIA/EIA-485-A).

Vị trí đặt: chỉ ở hai đầu xa nhất của bus (node đầu và node cuối theo cấu trúc daisy-chain), không đặt ở các node giữa.

#Điện trở bias (pull-up/pull-down): vì sao cần và cách chọn giá trị

Bias là cặp điện trở pull-up (nối dây A lên nguồn) và pull-down (nối dây B xuống GND) để giữ bus ở trạng thái idle xác định khi không node nào đang truyền. Không có bias, điện áp vi sai giữa A và B có thể trôi gần 0 V khi bus rỗi, khiến driver nhận hiểu sai thành bit nhiễu ngẫu nhiên — gây lỗi khung dù không có thiết bị nào thực sự truyền sai.

Giá trị bias cần tính theo tổng trở tải của toàn bus: số node càng nhiều, tổng trở vào của các driver càng giảm (do mắc song song), nên điện trở bias phải đủ nhỏ để tạo chênh áp idle hợp lệ (theo datasheet của IC transceiver đang dùng, driver RS485 cần nhận được một mức chênh áp vi sai tối thiểu để phân biệt rõ trạng thái logic) nhưng đủ lớn để không kéo quá dòng cho phép của driver đang giữ bus ở trạng thái passive.

text
// Minh hoạ nguyên lý — không phải công thức chính thức, chỉ dùng để hình dung
// R_bias cần giảm khi số node tăng, vì tổng trở tải bus giảm theo 1/N (song song)
// Giá trị thực tế PHẢI lấy từ app note của IC transceiver đang dùng

Nguyên tắc thực hành an toàn: chỉ đặt một cặp bias cho toàn bus (thường tại vị trí master), không để mỗi node tự bật bias riêng — tương tự lỗi termination, nhiều cặp bias song song sẽ kéo dòng tải vượt khả năng driver và làm méo mức điện áp idle.

#Timing trong Modbus RTU: khung và thời gian chờ giữa frame

Chuẩn Modbus RTU quy định khoảng lặng tối thiểu giữa hai khung (inter-frame delay) để bên nhận xác định ranh giới khung — vì Modbus RTU không có byte start/end rõ ràng như một số giao thức khác, ranh giới khung được xác định hoàn toàn bằng khoảng lặng trên bus.

Theo đặc tả Modbus Application Protocol, khoảng lặng tối thiểu giữa hai khung tương đương thời gian truyền 3,5 ký tự ở baud rate đang dùng (Modbus Application Protocol Specification V1.1b3, phần quy định về timing). Với baud rate thấp (≤ 19200 bps), đặc tả quy định dùng ngưỡng thời gian cố định thay vì tính theo công thức ký tự, vì ở baud thấp thời gian truyền 1 ký tự đã tương đối dài — giá trị ngưỡng cố định cụ thể cần lấy trực tiếp từ đặc tả Modbus Application Protocol Specification.

Baud rateCách tính inter-frame delayNguồn
≤ 19200 bpsNgưỡng cố định theo chuẩnModbus Application Protocol Specification
> 19200 bps3,5 × thời gian 1 ký tự ở baud đóModbus Application Protocol Specification

Hệ quả thực tế: nếu firmware slave gửi phản hồi sớm hơn khoảng lặng tối thiểu này (ví dụ do interrupt xử lý quá nhanh), một số master nghiêm ngặt có thể coi đó là tiếp nối khung cũ và loại bỏ toàn bộ gói.

#Thời gian chuyển hướng truyền (turnaround time) và tránh collision

Trên bus half-duplex, sau khi slave nhận xong khung yêu cầu, nó cần một khoảng thời gian để: xử lý nội dung, chuyển driver từ RX sang TX (enable delay), rồi bắt đầu phát phản hồi. Khoảng thời gian này — turnaround time — phải đủ ngắn để không làm master timeout, nhưng với bus nhiều slave, nó cũng không được chồng lấp với bất kỳ phản hồi khác đang được driver khác chuẩn bị gửi (trường hợp lỗi logic địa chỉ gây hai slave cùng trả lời).

Thời gian enable delay (RX→TX) là thông số riêng của từng IC transceiver, không giống nhau giữa các dòng chip — phải lấy từ datasheet IC cụ thể đang dùng trên board, không ước lượng chung.

Nguyên tắc chọn timeout phần mềm ở master: timeout phải ≥ (turnaround time lớn nhất trong các slave trên bus) + (inter-frame delay theo chuẩn Modbus). Nếu timeout đặt sát turnaround time lý thuyết tối thiểu mà không có biên độ dự phòng, slave xử lý chậm hơn bình thường (ví dụ đang bận ngắt khác) sẽ bị master coi là "không phản hồi" dù phần cứng hoàn toàn hoạt động đúng.

#Lỗi thường gặp khi làm thật

  • Bias/termination mặc định cộng dồn: nhiều module RS485 thương mại có jumper hoặc điện trở hàn sẵn ở trạng thái bật cho cả bias và termination. Khi ghép nhiều module như vậy lên một bus, điện trở tương đương giảm mạnh theo số node, làm suy giảm biên độ tín hiệu dưới ngưỡng nhận hợp lệ của driver ở node xa.
  • Timeout phần mềm quá ngắn so với turnaround time thực tế: timeout được đặt dựa trên giá trị lý thuyết tối thiểu, không tính biên độ cho slave xử lý chậm (do bận task khác, do ngắt ưu tiên cao hơn), dẫn đến lỗi "no response" giả — slave vẫn trả lời đúng nhưng chậm hơn giới hạn chờ.
  • Bỏ qua dây ground chung (common): RS485 là tín hiệu vi sai nên về lý thuyết không cần ground chung để truyền đúng mức logic, nhưng nếu điện áp tham chiếu giữa các node lệch quá xa (do nhiễu công nghiệp, do nối đất khác nhau), mức điện áp common-mode có thể vượt dải làm việc của driver — gây lỗi nhận ngắt quãng, đặc biệt ở khoảng cách xa hoặc môi trường nhiều máy biến tần.

#Checklist khi thiết kế

  • Xác định số node trên bus trước khi tính giá trị điện trở bias
  • Chỉ đặt termination ở hai đầu xa nhất của bus, kiểm tra jumper mặc định trên từng module
  • Chỉ dùng một cặp bias cho toàn bus, tắt bias mặc định trên các node khác
  • Kiểm tra turnaround time (enable delay) của từng loại slave trên bus theo datasheet IC, lấy giá trị lớn nhất làm chuẩn
  • Đặt timeout phần mềm ≥ turnaround time lớn nhất + inter-frame delay theo chuẩn Modbus
  • Kiểm tra dây ground chung giữa các node, đặc biệt khi khoảng cách xa hoặc gần nguồn nhiễu công nghiệp
  • Đo lại biên độ tín hiệu idle và tín hiệu khung bằng oscilloscope sau khi lắp đặt thực tế, không chỉ dựa vào tính toán lý thuyết

#Đọc tiếp

Bài tiếp theo trong series: "UART giữa hai MCU: khung tin, checksum, và trần payload".