Trong các hệ thống điều khiển công nghiệp, Modbus RTU là một trong những giao thức truyền thông phổ biến và dễ triển khai nhất nhờ tính đơn giản, ổn định và khả năng tương thích cao. STM32 – dòng vi điều khiển mạnh mẽ và phổ biến – hoàn toàn có thể tích hợp Modbus RTU để giao tiếp với PLC, HMI hoặc các thiết bị khác thông qua giao thức RS485. Bài viết này sẽ giúp bạn hiểu rõ nguyên lý hoạt động của Modbus RTU, cách tích hợp thư viện FreeModbus với STM32 HAL, và thực hiện một demo thực tế. Cùng bắt đầu nhé!
Giới thiệu chung
Modbus là gì?
Là giao thức truyền thông nối tiếp chuẩn công nghiệp, hoạt động theo mô hình master-slave, thường dùng qua chuẩn RS485.
Modbus có 3 dạng:
- Modbus TCP: Sử dụng đường truyền vật lý thông qua mạng LAN
- Modbus ASCII: Sử dụng đường truyền vật lý UART, RS232, RS422
- Modbus RTU: Sử dụng đường truyền vật lý UART, RS232, RS485
Tại sao trong công nghiệp lại sử dụng nhiều giao thức Modbus?
Giao thức đơn giản, dễ triển khai, độ tin cậy cao, và được hỗ trợ rộng rãi bởi PLC, HMI và thiết bị công nghiệp.
STM32 có phù hợp không?
STM32 có tài nguyên đủ mạnh, hỗ trợ UART và Timer, rất phù hợp để làm thiết bị slave hoặc master trong mạng Modbus, cụ thể là Modbus RTU.
Mục tiêu bài viết
Hướng dẫn bạn tích hợp thư viện FreeModbus với STM32 (dùng HAL), giao tiếp được với phần mềm Modbus master thực tế qua RS485.
Tổng quan lý thuyết về Modbus RTU
Như đã nói ở phần trước, giao thức Modbus có 3 dạng: Modbus TCP, Modbus ASCII, Modbus RTU. Trong phạm vi bài viết này, mình sẽ đề cập đến việc triển khai giao thức Modbus RTU.
Modbus RTU là 1 dạng trong giao thức Modbus sử dụng đường truyền vật lý RS485 theo cơ chế Master – Slave.
Thiết bị Master gửi yêu cầu đến Slave, slave xử lý và phản hồi lại; tất cả thiết bị dùng chung đường truyền (RS485).
Trong giao thức Modbus RTU, có bốn loại thanh ghi (registers) chính, chia theo chức năng và khả năng truy cập (đọc/ghi). Dưới đây là mô tả chi tiết:
|
Loại thanh ghi |
Địa chỉ logic |
Kích thước |
Truy cập |
Mã chức năng |
Ứng dụng |
|
Coils |
00001–09999 |
1 bit |
Read/Write |
0x01, 0x05, 0x0F |
Ngõ ra số (Digital Output) |
|
Discrete Inputs |
10001–19999 |
1 bit |
Read |
0x02 |
Ngõ vào số (Digital Input) |
|
Input |
30001–39999 |
16 bit |
Read |
0x04 |
Ngõ vào analog (ADC, sensor) |
|
Holding |
40001–49999 |
16 bit |
Read/Write |
0x03, 0x06, 0x10 |
Giá trị cài đặt, điều khiển, lưu trữ |
Mình sẽ lấy ví dụ để các bạn dễ hình dung về ứng dụng của 4 loại thanh ghi này trong Modbus:
Coils – Điều khiển rơ-le gia nhiệt
- Dùng để bật/tắt rơ-le điều khiển điện trở nhiệt.
- Khi nhiệt độ thấp, coil được ghi giá trị
1để bật gia nhiệt. - Khi đủ nhiệt, master ghi
0để tắt rơ-le. - Được điều khiển qua lệnh
0x05hoặc0x0F
Discrete Inputs – Giám sát công tắc cửa tủ
- Kết nối với công tắc từ ở cửa tủ điều khiển.
- Master đọc trạng thái đóng/mở của cửa bằng
0x02. - Nếu cửa mở (giá trị
1), hệ thống báo lỗi hoặc ngừng gia nhiệt.
Input Registers – Đọc nhiệt độ cảm biến
- Giá trị từ cảm biến nhiệt (ADC) được cập nhật vào Input Register.
- Master đọc giá trị nhiệt độ hiện tại bằng lệnh
0x04. - Ví dụ: Giá trị
230= 23.0°C nếu dùng hệ số chia 10
Holding Registers – Cài đặt ngưỡng nhiệt độ
- Người dùng từ HMI nhập giá trị nhiệt độ mục tiêu, ví dụ 250 (25.0°C).
- Master ghi giá trị vào Holding Register qua lệnh
0x06hoặc0x10. - STM32 đọc giá trị này để so sánh và điều khiển bật/tắt coil.
Trên đây là lý thuyết cơ bản và ngắn gọn về giao thức Modbus. Các bạn có thể đọc kỹ hơn về giao thức này tại đây. Phần 2 mình sẽ hướng dẫn các bạn cấu hình và thêm thư viện FreeModbus vào vi điều khiển STM32, sử dụng STM32Cube MX + Keil C để tạo ra 1 chương trình Modbus.