Arduino Modbus
Trong hướng dẫn này, chúng ta sẽ học:
- Modbus là gì?
- Tại sao cần Modbus?
- Những lựa chọn thay thế cho Modbus là gì?
- Modbus hoạt động như thế nào?
- Modbus RTU/ASCII và Modbus TCP
- Cách sử dụng thư viện Modbus cho Arduino
Modbus là gì?
Modbus là một giao thức được sử dụng để giao tiếp giữa các thiết bị với nhau, giữa thiết bị và phần mềm/ứng dụng, và giữa thiết bị với HMI. Nó được sử dụng rộng rãi trong các khu vực công nghiệp để điều khiển/giám sát các thiết bị.
Nói một cách đơn giản, Modbus là một ngôn ngữ mà một thiết bị sử dụng để giao tiếp với các thiết bị khác, phần mềm/ứng dụng và thiết bị HMI.
Hướng dẫn này nói về Arduino, vì vậy Arduino đại diện cho thiết bị. Bằng cách sử dụng Modbus, chúng ta có thể tạo ra:
- Hai bảng Arduino giao tiếp với nhau để điều khiển và giám sát đầu ra và đầu vào
- Arduino giao tiếp với phần mềm trên PC hoặc ứng dụng trên điện thoại thông minh
- Arduino giao tiếp với thiết bị HMI
Ví dụ, Arduino #1 với 4 công tắc điều khiển Arduino #2 với 4 bóng đèn ở khoảng cách xa.
Tại sao cần Modbus?
Để trả lời các câu hỏi này, hãy xem xét một trường hợp: Một công tắc được kết nối với Arduino #1 và điều khiển một LED được kết nối với Arduino #2 ở khoảng cách xa.

Cách thay thế đơn giản nhất cho Modbus là tự mình định nghĩa một giao thức đơn giản:
- Arduino #1:
- Khi công tắc được chuyển sang BẬT, Arduino #1 gửi một byte (lệnh) có giá trị 1 đến Arduino #2.
- Khi công tắc được chuyển sang TẮT, Arduino #1 gửi một byte (lệnh) có giá trị 0 đến Arduino #2.
- Arduino #2:
- Nếu byte nhận được là 1, Bật LED
- Nếu byte nhận được là 0, Tắt LED
- Arduino #1 muốn biết liệu lệnh có được thực thi thành công bởi Arduino #2
- Arduino #1 muốn kiểm tra trạng thái của đèn LED trên Arduino #2
- Arduino #1 với nhiều công tắc muốn điều khiển nhiều đèn LED trên Arduino #2
- Arduino #1 muốn dùng một công tắc để điều khiển một đèn LED trên Arduino #2 và Arduino #2 cũng muốn dùng một công tắc để điều khiển một đèn LED trên Arduino #1
- Và nhiều trường hợp sử dụng khác.
- Chúng ta KHÔNG cần định nghĩa các lệnh, Modbus đã định nghĩa sẵn cho mọi trường hợp. Chúng ta chỉ cần triển khai chúng.
- Thiết bị của chúng ta có thể làm việc với các thiết bị/phần mềm khác hỗ trợ Modbus mà KHÔNG cần hợp tác với người sáng lập/nhà phát triển của thiết bị/phần mềm đó.
Giao thức ở trên do chính chúng ta định nghĩa, không phải là một giao thức chuẩn. Chúng ta cần định nghĩa thêm nếu:
Việc tự mình định nghĩa tất cả các lệnh không dễ dàng. Vấn đề trở nên phức tạp hơn khi chúng ta kết hợp các yêu cầu ở trên. Và chúng ta cũng không thể đảm bảo là không có lỗi.
Một vấn đề khác phát sinh khi tự định nghĩa giao thức. Nếu chúng ta muốn Arduino của mình hoạt động với một Arduino khác sử dụng một giao thức do người khác định nghĩa, điều đó là bất khả thi trừ khi chúng ta hợp tác và chia sẻ giao thức do chính chúng ta tự định nghĩa.
Đây là những lý do tại sao chúng ta cần giao thức Modbus. Nếu chúng ta sử dụng giao thức Modbus:
Nếu chúng ta sử dụng giao thức Modbus cho Arduino, chúng ta có thể dùng nhiều phần mềm miễn phí để điều khiển và giám sát Arduino của mình.
Khi nào nên sử dụng và không nên sử dụng Modbus
Giao thức Modbus không dễ để người mới bắt đầu hiểu và triển khai nó, ngay cả khi thư viện Modbus có sẵn. Do đó, việc sử dụng một giao thức tự định nghĩa đơn giản như đã mô tả ở trên là được phép nếu:
- Hệ thống rất đơn giản, ví dụ như một vài công tắc trên Arduino #1 điều khiển một vài đèn LED trên Arduino #2.
- Arduino không cần phải làm việc với các thiết bị/phần mềm khác từ các nhà sáng tạo khác.
Chúng ta nên dùng Modbus khi:
- Hệ thống phức tạp
- Hệ thống đòi hỏi độ tin cậy cao
- Arduino cần làm việc với các thiết bị và phần mềm từ các nhà sáng tạo khác
※ Lưu ý:
Có một số giao thức chuẩn khác và các giao thức không chuẩn là những lựa chọn thay thế cho Modbus. Chúng nằm ngoài phạm vi của bài hướng dẫn này.
Cách thức hoạt động của giao thức Modbus
Như đã mô tả trước đó, một Arduino có thể giao tiếp với phần mềm/ứng dụng, thiết bị HMI, hoặc một Arduino khác thông qua giao thức Modbus. Hướng dẫn này lấy giao tiếp giữa hai Arduino làm ví dụ về giao tiếp Modbus. Các trường hợp còn lại cũng tương tự.
Các khái niệm
Có một số khái niệm trong Modbus:
- Chủ và Nô lệ
- Yêu cầu và Phản hồi
- Mã chức năng (FC) và Địa chỉ
Giao thức Modbus hoạt động theo mô hình Master-Slave. Giữa hai Arduino, một thiết bị phải hoạt động như Master, và thiết bị còn lại hoạt động như Slave.
Máy chủ gửi một yêu cầu, và Máy chủ phụ gửi một phản hồi.

Một yêu cầu được gửi bởi Chủ nhân về cơ bản chứa các thông tin sau:
- Mã chức năng (FC): 1 byte, là lệnh, cho thiết bị Slave biết nó phải làm gì. Ví dụ, đọc trạng thái của một chân đầu vào kỹ thuật số, một chân đầu ra kỹ thuật số hoặc một chân đầu vào tương tự, và điều khiển một chân đầu ra kỹ thuật số.
- Địa chỉ: 2 byte, được dùng để nhận diện một chân. Mỗi chân đầu vào kỹ thuật số, chân đầu ra kỹ thuật số, chân đầu vào tương tự được gán một địa chỉ.
- Dữ liệu (ví dụ: giá trị điều khiển)
Ngày khi nhận được một yêu cầu, Nô lệ thực hiện hành động tương ứng và gửi lại một phản hồi chứa kết quả của hành động hoặc thông tin mà Chủ nhân đã yêu cầu.
Mã Hàm
Mã hàm được chuẩn Modbus định nghĩa. Có nhiều Mã hàm. Dưới đây là một số Mã hàm cơ bản:
- FC 01 (Đọc cuộn): là một lệnh được sử dụng để đọc trạng thái của một hoặc một số chân đầu ra số
- FC 05 (Ghi một cuộn): là một lệnh được sử dụng để điều khiển (ghi) trạng thái của một hoặc một số chân đầu ra số
- FC 02 (Đọc các đầu vào rời rạc): là một lệnh được sử dụng để đọc trạng thái của một hoặc một số đầu vào rời rạc
"FC 01" có nghĩa là giá trị của Mã chức năng là 0x01.
Có nhiều Mã chức năng. Để tránh quá tải cho người mới làm quen, bài hướng dẫn này chỉ trình bày một số Mã chức năng thiết yếu.
Khi sử dụng thư viện Arduino Modbus, bạn cần:
- Chọn Mã Hàm nào để sử dụng
- Cung cấp địa chỉ cho mỗi chân Arduino (chỉ những chân bạn sử dụng)
Hướng dẫn chi tiết về cách sử dụng thư viện Modbus sẽ được trình bày trong bài hướng dẫn tiếp theo, hãy thích Facebook page của chúng tôi để nhận thông báo về bài hướng dẫn mới.
Arduino Master có thể đọc trạng thái của chân đầu vào kỹ thuật số của nó, và sau đó điều khiển trạng thái của chân đầu ra kỹ thuật số của Arduino Slave, và ngược lại
Ví dụ:
- Arduino Chủ được nối tới LED #M, CÔNG TẮC #M
- Arduino Nô lệ được nối tới LED #S, CÔNG TẮC #S
- Hãy để CÔNG TẮC #M điều khiển LED #S, và CÔNG TẮC #S điều khiển LED #M

Giải pháp:
- Master đọc trạng thái của SWITCH #M → gửi một yêu cầu đến Slave để điều khiển LED #S theo trạng thái của SWITCH #M → Slave điều khiển LED #S và gửi phản hồi
- Master gửi một yêu cầu Slave để đọc trạng thái SWITCH #S → Slave đáp ứng với trạng thái SWITCH #S → Master điều khiển LED #M theo trạng thái SWITCH #S
※ Lưu ý:
- Trong phần trên, chúng tôi sử dụng các thuật ngữ "digital input pin" và "digital output pin" để giúp người mới bắt đầu dễ hiểu. Thực tế, "digital input pin" đại diện cho trạng thái của bất kỳ thiết bị nào ở chế độ chỉ đọc, "digital output pin" đại diện cho trạng thái của bất kỳ thiết bị nào ở chế độ đọc/ghi.
- Modbus có thể hỗ trợ nhiều Masters và nhiều Slaves.
- Modbus có thể được sử dụng không chỉ cho đầu vào/đầu ra kỹ thuật số mà còn cho đầu vào/đầu ra analog.
Modbus RTU/ASCII và Modbus TCP
Có ba loại Modbus phổ biến: Modbus RTU, Modbus ASCII và Modbus TCP. Nguyên lý hoạt động là như nhau đối với tất cả các loại Modbus, như đã mô tả ở trên. Mỗi loại Modbus được thiết kế để thích nghi với môi trường mạng: Serial hoặc TCP.
- Sơ đồ hệ thống

- Ngăn xếp giao thức

Sự khác biệt giữa Modbus RTU/ASCII và Modbus TCP
| Modbus RTU/ASCII | Modbus TCP |
|---|---|
| Over serial (RS-232/RS-422/RS-485) | Over TCP |
| Support single transaction(*) | Support multiple transactions(**) |
xuống dòng
- (*): Modbus RTU/ASCII chỉ hỗ trợ một giao dịch duy nhất. Điều này có nghĩa là khi một Master gửi một yêu cầu Modbus, nó PHẢI chờ đợi một phản hồi Modbus hoặc hết thời gian trước khi gửi một yêu cầu khác.
- (): Modbus TCP hỗ trợ nhiều giao dịch. Điều này có nghĩa là khi một Master gửi một yêu cầu Modbus, nó không cần chờ đợi một phản hồi Modbus. Nó có thể gửi nhiều yêu cầu liên tục. Để nhận diện một phản hồi tương ứng với một yêu cầu, Modbus TCP có một trường bổ sung, được gọi là "Transaction ID". Yêu cầu và phản hồi tương ứng có cùng Transaction ID.
Cách sử dụng thư viện Modbus cho Arduino
Nhờ thư viện Modbus, việc sử dụng Modbus với Arduino được đơn giản hóa.
Chúng tôi sẽ làm một bài hướng dẫn về cách sử dụng thư viện Modbus. Hãy nhấn thích Trang Facebook để nhận thông báo về các bài hướng dẫn mới.