Truyền thông giao tiếp giữa PLC và Arduino qua RS485 Modbus

Bạn đang quan tâm đến việc truyền thông giao tiếp giữa PLC và Arduino qua giao thức RS485 Modbus. Trong bài viết này, chúng ta sẽ tìm hiểu về giao thức truyền thông Modbus RTU, cấu trúc khung truyền, chức năng của các byte trong khung truyền, và cách kết nối PLC S7-1200 với Arduino thông qua RS485.

Phần I: Modbus RTU

1.1. Chuẩn truyền Modbus RTU

Modbus hoạt động dựa trên nguyên tắc “Master – Slave” hay “Chủ – Tớ”. Một Master có thể kết nối với một hoặc nhiều Slave. “Master” thường là PLC, PC, DCS, RTU hay SCADA, trong khi “Slave” thường là các thiết bị cấp hiện trường. Modbus là phương pháp truyền thông qua đường dây nối tiếp giữa các thiết bị điện tử. Trong mạng Modbus, có một Master và tối đa 247 Slave, và mỗi Slave có một địa chỉ duy nhất từ 1 đến 247. Master có thể ghi thông tin vào các Slave.

Giao thức Modbus RTU được sử dụng rộng rãi trong công nghiệp, với tốc độ truyền thông từ 1200 đến 115000 baud.

1.2. Cấu trúc khung truyền Modbus RTU

Một khung truyền Modbus RTU bao gồm các phần sau:

1-byte địa chỉ – 1 byte mã hàm – n byte dữ liệu – 2 byte CRC.

1.3. Chức năng và vai trò cụ thể của các byte trong frame

1.3.1. Chức năng của các byte theo khung truyền chung

  • Byte địa chỉ (Slave ID): Xác định thiết bị mang địa chỉ được nhận dữ liệu (đối với Slave) hoặc dữ liệu nhận được từ địa chỉ nào (đối với Master). Địa chỉ này quy định từ 0-254.

  • Byte mã hàm (Function codes): Xác định yêu cầu dữ liệu từ thiết bị Slave (được thiết lập bởi Master) và có độ dài 1 byte. Ví dụ: Mã 01: đọc dữ liệu lưu trữ dạng bit, mã 03: đọc dữ liệu tức thời dạng byte, mã 05: ghi dữ liệu 1 bit vào Slave, mã 06: ghi dữ liệu 1 word vào Slave, mã 15: ghi dữ liệu nhiều bit vào Slave, mã 16: ghi dữ liệu vào nhiều thanh ghi.

  • Byte dữ liệu (Data): Xác định dữ liệu trao đổi giữa Master và Slave. Ví dụ: Đọc dữ liệu – Master: 2 byte địa chỉ dữ liệu, 2 byte độ dài dữ liệu; Slave: 2 byte địa chỉ dữ liệu, 2 byte độ dài dữ liệu, n byte dữ liệu đọc được. Ghi dữ liệu – Master: 2 byte địa chỉ dữ liệu, 2 byte độ dài dữ liệu, n byte dữ liệu cần ghi; Slave: 2 byte địa chỉ dữ liệu, 2 byte độ dài dữ liệu.

  • Byte CRC: 2 byte kiểm tra lỗi của hàm truyền.

1.4. Địa chỉ dữ liệu và thanh ghi theo chuẩn Modbus

Dữ liệu được lưu trữ trong thiết bị Slave và chia thành 4 khoảng giá trị khác nhau. Hai khoảng lưu trữ các giá trị rời rạc (coils) và hai khoảng lưu trữ giá trị số (register – thanh ghi). Mỗi khoảng có 9999 biến giá trị.

  • Mỗi coil hoặc contact là 1 bit và được gán một địa chỉ dữ liệu trong khoảng từ 0000 đến 270E.

  • Mỗi register là 1 word (16 bit = 2 byte) và cũng được gán một địa chỉ dữ liệu từ 0000 đến 270E.

Phần II: Chuẩn truyền thông RS485 trong PLC S7-1200

2.1. Chuẩn truyền thông RS485 trong PLC

Module RS485 là thiết bị chức năng truyền thông kết hợp với PLC để thực hiện giao thức truyền thông RS485 với các thiết bị khác. Trong lập trình PLC, chúng ta sử dụng các module chức năng để kết nối và truyền dữ liệu. Chỉ cần cấu hình và thiết lập các biến để kết nối và truyền dữ liệu tới thiết bị trường.

Trước khi lập trình, chúng ta cần cấu hình module CM1241 (Module RS485) được kết nối với PLC. Sau khi thêm Module CM1241, chúng ta cần cấu hình một số thông số như Baud rate, Parity, Data bits, Stop bits theo hướng dẫn.

Đối với PLC là master và các thiết bị là slave, chúng ta sử dụng 2 module code sau:

  • Module code COMM_LOAD: Dùng để cấu hình cổng kết nối và chỉ chạy 1 lần trong quá trình truyền thông.

  • Khối MB_MASTER: Chứa các thông số như địa chỉ của slave, địa chỉ thanh ghi dữ liệu, và mode (đọc hoặc ghi dữ liệu).

Phần III: Kết nối PLC với Arduino

3.1. Kết nối các thiết bị

Để kết nối PLC và Arduino, chúng ta sử dụng mô-đun chuyển đổi RS485 TTL sang RS485. Kết nối như sau:

  • Arduino UNO: RX – RO, TX – DI, DE & RE – 2, VCC – 5V, GND – GND.

  • Mô-đun chuyển đổi RS485 TTL sang RS485: A – 3, B – 8, VCC – 5V, GND – GND.

3.2. Phần code trên Arduino

Code dùng để giao tiếp Modbus trên Arduino:

#include "ModbusRtu.h"

Modbus slave(1, Serial, 2); // ID slave 1, kết nối RS-485 ở cổng 1 và 4 kết nối với chân DE & RE của RS-485

uint16_t modbus_array[] = {0, 0, 0}; // Mảng chứa 3 giá trị ban đầu là 0
int Number[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6};

void setup()
{
  Serial.begin(9600);
  slave.start();
}

void loop()
{
  if (slave.poll(modbus_array, 2) > 4) // Nhận hoặc ghi giá trị từ Master
  {
    modbus_array[1] = analogRead(A0); // Ghi giá trị từ chân A0 vào thanh ghi 40002 của Arduino
    Serial.println(analogRead(A0));
    delay(500);
  }
}

Phần IV: Kết luận

Trên đây là bài viết chia sẻ về việc giao tiếp giữa PLC S7-1200 và Arduino qua giao thức RS485. Hy vọng bài viết này sẽ hỗ trợ và giúp bạn làm việc với PLC và Arduino, và thực hiện các dự án công nghiệp. Nếu có bất kỳ sai sót nào, xin hãy cho chúng tôi biết để chúng tôi có thể điều chỉnh. Chúc bạn thành công!

Tìm hiểu thêm:

  • Truyền thông nối tiếp trong lập trình vi điều khiển – Giao tiếp UART
  • Truyền nhận dữ liệu với giao tiếp Serial (UART) trên Arduino
  • Khái niệm về giao thức Modbus RTU và kết nối phần cứng
  • Tìm hiểu về khung truyền Modbus RTU

Tap vào đây để tìm hiểu thêm về Izumi.Edu.VN

FEATURED TOPIC