RS485 và RS232 — Nền tảng vật lý
RS232 (chuẩn cũ, điểm-điểm)
RS232 là chuẩn truyền thông nối tiếp dùng điện áp đơn cực: +3V đến +15V = logic 0, -3V đến -15V = logic 1. Khoảng cách tối đa 15m ở 9600 baud. Chỉ kết nối 1 thiết bị (không có địa chỉ). Phổ biến trong cổng COM máy tính cũ, cấu hình thiết bị một-một.
RS485 (chuẩn công nghiệp, đa điểm)
RS485 dùng tín hiệu vi sai (differential): hai dây A và B, điện áp giữa A-B > +0.2V = logic 1, A-B < -0.2V = logic 0. Đặc điểm vượt trội:
- Khoảng cách: Lên đến 1200m ở 9600 baud (giảm theo tốc độ baud).
- Thiết bị: Tối đa 32 thiết bị (unit load) trên một bus — có thể mở rộng đến 256 với repeater.
- Chống nhiễu: Tín hiệu vi sai khử nhiễu common-mode rất hiệu quả, phù hợp môi trường công nghiệp nhiều nhiễu EMI.
- Tốc độ: Lên đến 10 Mbps ở khoảng cách ngắn.
- Half-duplex: Tại một thời điểm chỉ một thiết bị truyền, các thiết bị còn lại nhận.
Cấu trúc frame Modbus RTU
Mỗi message Modbus RTU (request từ master hoặc response từ slave) có cấu trúc:
| Trường | Kích thước | Mô tả |
|---|---|---|
| Slave Address | 1 byte | Địa chỉ thiết bị slave (1-247). Địa chỉ 0 = broadcast (tất cả slave, không có response). |
| Function Code | 1 byte | Lệnh đọc/ghi (xem bảng function code bên dưới). |
| Data | N byte | Địa chỉ thanh ghi, số lượng thanh ghi, dữ liệu ghi. |
| CRC | 2 byte | CRC-16 kiểm tra lỗi. Slave kiểm tra CRC — sai thì bỏ qua frame. |
Frame được phân tách bằng khoảng dừng (silent interval) tối thiểu 3.5 ký tự — không có start/stop byte. Master gửi request, chờ slave response trong timeout (thường 100-500ms).
Function Code phổ biến
| Function Code | Tên | Mô tả |
|---|---|---|
| 01 (0x01) | Read Coils | Đọc trạng thái coil (bit output, 1 bit mỗi coil) |
| 02 (0x02) | Read Discrete Inputs | Đọc đầu vào số (bit, chỉ đọc) |
| 03 (0x03) | Read Holding Registers | Đọc thanh ghi giữ (16-bit, đọc/ghi) — phổ biến nhất |
| 04 (0x04) | Read Input Registers | Đọc thanh ghi đầu vào (16-bit, chỉ đọc) |
| 05 (0x05) | Write Single Coil | Ghi một coil (0x0000 = OFF, 0xFF00 = ON) |
| 06 (0x06) | Write Single Register | Ghi một thanh ghi Holding |
| 16 (0x10) | Write Multiple Registers | Ghi nhiều thanh ghi liên tiếp |
Địa chỉ slave và thanh ghi
Mỗi slave có địa chỉ duy nhất (1-247) — cài đặt bằng DIP switch, jumper, hoặc phần mềm cấu hình. Không được có 2 slave cùng địa chỉ trên một bus.
Thanh ghi Modbus có địa chỉ từ 0x0000 đến 0xFFFF. Thực tế, mỗi thiết bị có bảng địa chỉ riêng (Modbus Map) trong tài liệu kỹ thuật. Ví dụ biến tần: thanh ghi 0x0001 = tần số đặt, 0x0002 = tần số thực, 0x1000 = lệnh RUN/STOP.
Modbus RTU vs Modbus TCP
| Tiêu chí | Modbus RTU | Modbus TCP |
|---|---|---|
| Nền tảng vật lý | RS485 (dây đôi) | Ethernet (RJ45) |
| Tốc độ điển hình | 9600-115200 baud | 10/100 Mbps Ethernet |
| Khoảng cách | Đến 1200m | 100m mỗi đoạn Ethernet (switch mở rộng) |
| Địa chỉ slave | 1-247 | IP address + Unit ID |
| CRC kiểm tra lỗi | CRC-16 | TCP/IP tự kiểm tra lỗi (không cần CRC) |
| Phổ biến trong | Hệ thống cũ, biến tần, đồng hồ điện | SCADA, HMI, hệ thống mới |
| Port TCP | Không có | 502 |
Đấu dây RS485 thực tế
- Bus RS485 dùng cáp xoắn đôi có chống nhiễu (shielded twisted pair) — cáp ALTEK hoặc BELDEN phổ biến tại VN.
- Kết nối theo chuỗi (daisy chain): Master → Slave 1 → Slave 2 → … → Slave N. Không đấu hình sao.
- Cuối bus (termination): Điện trở 120Ω nối giữa A và B ở hai đầu chuỗi để hấp thụ sóng phản xạ.
- Pull-up/pull-down: Điện trở kéo lên dây A và kéo xuống dây B đảm bảo mức tín hiệu khi bus rảnh (không thiết bị nào truyền).
- Shield (màn chắn) nối đất ở một đầu (thường ở master) để tránh ground loop.