ESP32 Modbus

Hướng dẫn này sẽ chỉ bạn cách sử dụng ESP32 với giao thức Modbus

Về Giao Thức Modbus

Modbus là một giao thức cho phép giao tiếp giữa thiết bị với thiết bị, thiết bị với phần mềm/ứng dụng, và thiết bị với HMI. Nó được sử dụng rộng rãi trong các thiết bị công nghiệp.

Chúng ta có thể hình dung Modbus như một ngôn ngữ giao tiếp giữa các thiết bị, phần mềm/ứng dụng và HMI.

Có ba loại Modbus được sử dụng rộng rãi: Modbus RTU, Modbus ASCII và Modbus TCP:

  • Modbus RTU và Modbus ASCII được sử dụng qua đường truyền Serial (RS-232/RS-422/RS-485)
  • Modbus TCP được sử dụng qua Ethernet hoặc WiFi

Tại sao sử dụng Modbus?

Hãy lấy một ví dụ cụ thể:

  • Một ESP32 #1 kết nối với một công tắc
  • Một ESP32 #2 kết nối với một đèn LED
  • ESP32 #1ESP32 #2 ở xa nhau
  • Khi công tắc được bật lên ON, thì bật đèn LED.
  • Khi công tắc được tắt OFF, thì tắt đèn LED.
nút nhấn control LED via modbus

Cách dễ nhất để thực hiện ví dụ trên là tự định nghĩa một giao thức đơn giản:

  • ESP32 #1 gửi một byte dữ liệu để thông báo cho ESP32 #2 về sự thay đổi trạng thái của công tắc. Giá trị của byte dữ liệu là:
    • 1: Khi công tắc được chuyển sang ON
    • 0: Khi công tắc được chuyển sang OFF
  • Khi ESP32 #2 nhận được một byte dữ liệu từ ESP32 #1, nếu giá trị là:
    • 1: Bật LED
    • 0: Tắt LED

    Định nghĩa trên giúp công tắc trên ESP32 #1 điều khiển LED trên ESP32 #2. Tuy nhiên, hãy tưởng tượng một số trường hợp:

    • ESP32 #1 muốn nhận xác nhận xem lệnh có được ESP32 #2 nhận và thực hiện thành công hay không
    • ESP32 #1 muốn điều khiển nhiều đèn LED trên ESP32 #2
    • ESP32 #2 muốn chủ động đọc trạng thái của công tắc trên ESP32 #1
    • ESP32 #2 muốn sử dụng một công tắc để điều khiển một LED trên ESP32 #1
    • Và nhiều trường hợp khác nữa.

    Việc hỗ trợ tất cả các trường hợp sử dụng bằng cách tự làm không phải là dễ dang.

    Một vấn đề khác xảy ra khi sử dụng giao thức tự định nghĩa. ESP32 không thể giao tiếp với các thiết bị khác sử dụng giao thức khác.

    ⇒ Chúng ta cần một giao thức chuẩn giải quyết tất cả các vấn đề trên ⇒ Giao thức Modbus là một giao thức chuẩn mà chúng ta có thể sử dụng.

    Ưu điểm của giao thức Modbus so với giao thức tự định nghĩa:

    • Chúng ta KHÔNG cần định nghĩa các lệnh, Modbus đã định nghĩa cho tất cả các trường hợp sử dụng.
    • ESP32 có thể hoạt động với bất kỳ thiết bị/phần mềm nào sử dụng Modbus.

Khi nào nên và không nên sử dụng Modbus

Vì giao thức Modbus không dễ hiểu và thực hiện, ngay cả khi có sẵn thư viện Modbus. Bạn có thể sử dụng giao thức tự định nghĩa đơn giản như mô tả ở trên khi:

  • Hệ thống đơn giản, chẳng hạn như một công tắc trên ESP32 #1 điều khiển một LED trên ESP32 #2
  • ESP32 KHÔNG cần hoạt động với các thiết bị/phần mềm khác

Chúng ta nên sử dụng Modbus khi:

  • Hệ thống phức tạp
  • Hệ thống yêu cầu độ tin cậy cao
  • ESP32 cần hoạt động với các thiết bị/phần mềm khác

Cách hoạt động của giao thức Modbus

Khái niệm

Có sáu khái niệm quan trọng trong Modbus:

  • MasterSlave
  • Request (Yêu cầu) và Response (Phản hồi)
  • Function Code (FC - Mã chức năng) và Address (Địa chỉ)

Khi hai ESP32 giao tiếp với nhau bằng Modbus:

  • Một ESP32 hoạt động như Master
  • ESP32 còn lại hoạt động như Slave.

Master gửi một request đến Slave, và Slave gửi một response lại cho Master.

modbus master slave

Một request được gửi từ Master đến Slave chứa các thông tin sau:

  • Function Code (FC): 1 byte, là lệnh nói cho Slave biết phải làm gì. Ví dụ, đọc trạng thái của chân đầu vào số, chân đầu ra số hoặc chân đầu vào tương tự, điều khiển chân đầu ra số.
  • Address: 2 bytes, là địa chỉ nói cho Slave biết làm ở đâu. Ví dụ, mỗi chân đầu vào/ra số và chân đầu vào tương tự được gán một address duy nhất.
  • Dữ liệu (ví dụ như giá trị điều khiển)

Khi nhận được một request từ Master, Slave thực hiện hành động tương ứng và gửi lại kết quả trong một response

Mã Chức Năng (Function Code)

Chuẩn Modbus định nghĩa nhiều Function Code. Để tránh làm quá tải người mới học, hãy xem một số Function Code quan trọng:

  • FC 01 (Read Coils): là lệnh đọc trạng thái của các chân đầu ra số
  • FC 02 (Read Discrete Inputs): là lệnh đọc trạng thái của các chân đầu vào số
  • FC 05 (Write Single Coil): là lệnh điều khiển (ghi) trạng thái của các chân đầu ra số

FC 01 có nghĩa là giá trị của Function Code là 0x01.

Khi sử dụng thư viện ESP32 Modbus, bạn cần xác định:

  • Function Code nào sẽ sử dụng
  • Address nào sẽ sử dụng

Hãy hiện thực hóa ví dụ chúng ta đã đề cập lúc đầu:

  • ESP32 Master được kết nối với LED #M, SWITCH #M
  • ESP32 Slave được kết nối với LED #S, SWITCH #S
  • Hãy làm cho SWITCH #M điều khiển LED #S, và SWITCH #S điều khiển LED #M
ESP32 modbus LED switch

Cách thực hiện:

  • ESP32 Master đọc trạng thái của SWITCH #M → gửi request đến Slave để điều khiển LED #S ⇒ Slave điều khiển LED #S và gửi response
  • ESP32 Master gửi request đến Slave để đọc trạng thái của SWITCH #S ⇒ Slave phản hồi với trạng thái của SWITCH #S → Master điều khiển LED #M

Modbus RTU/ASCII và Modbus TCP

Như đã đề cập lúc đầu, có 3 loại Modbus được sử dụng rộng rãi: Modbus RTU, Modbus ASCII và Modbus TCP.

  • Sơ đồ hệ thống
modbus tcp vs modbus rtu/ascii
  • Ngăn xếp giao thức
modbus tcp vs modbus rtu/ascii

Thư viện Modbus cho ESP32 đã có sẵn. Hướng dẫn chi tiết về cách sử dụng thư viện Modbus sẽ được trình bày trong hướng dẫn khác, hãy like trang Facebook của chúng tôi để nhận cập nhật.