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 13745_20ee7c-65> |
Địa chỉ logic 13745_9907ff-fd> |
Kích thước 13745_9b6bcd-cb> |
Truy cập 13745_e868d7-15> |
Mã chức năng 13745_07fdb3-43> |
Ứng dụng 13745_558db4-cc> |
Coils 13745_3eb2ff-60> |
00001–09999 13745_aa61df-c4> |
1 bit 13745_084191-ce> |
Read/Write 13745_7aca1c-a0> |
0x01, 0x05, 0x0F 13745_c33d8a-20> |
Ngõ ra số (Digital Output) 13745_32b897-c3> |
Discrete Inputs 13745_f8e55e-cb> |
10001–19999 13745_a2c08d-a1> |
1 bit 13745_e900c6-a6> |
Read 13745_2f3fff-65> |
0x02 13745_97e59e-76> |
Ngõ vào số (Digital Input) 13745_9f13eb-bc> |
Input 13745_ecf6af-b3> |
30001–39999 13745_048cf1-8b> |
16 bit 13745_7e743e-7c> |
Read 13745_079175-a8> |
0x04 13745_aa906d-fd> |
Ngõ vào analog (ADC, sensor) 13745_f76747-b8> |
Holding 13745_74989b-15> |
40001–49999 13745_ea7508-ab> |
16 bit 13745_3cf97a-42> |
Read/Write 13745_2f21e9-fa> |
0x03, 0x06, 0x10 13745_37c609-64> |
Giá trị cài đặt, điều khiển, lưu trữ 13745_711c83-d0> |
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
0x05
hoặ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
0x06
hoặ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.