HƯỚNG DẪN GIAO TIẾP PLC SIEMENS VỚI PYTHON (Snap7 + PyQt5)

1. Giới thiệu

Trong thời đại tự động hóa và công nghiệp 4.0, việc kết nối PLC với các nền tảng phần mềm cấp cao như Python giúp mở rộng rất nhiều khả năng:

  • Xây dựng HMI tùy biến

  • Thu thập dữ liệu (Data logging)

  • Kết nối IoT, AI, Vision

  • Điều khiển và giám sát từ PC

Trong bài viết này, Factory Automation sẽ hướng dẫn bạn xây dựng một ứng dụng HMI đơn giản bằng Python, giao tiếp trực tiếp với PLC Siemens S7 (S7-300/400/1200/1500) thông qua thư viện Snap7, kết hợp giao diện PyQt5.


2. Chức năng chính của ứng dụng

Ứng dụng HMI Python – PLC Siemens có các chức năng sau:

  • ✅ Kết nối / ngắt kết nối PLC qua địa chỉ IP

  • ✅ Đọc / ghi dữ liệu kiểu BIT (ON/OFF)

  • ✅ Đọc / ghi dữ liệu kiểu INT (số nguyên 16-bit)

  • ✅ Đọc / ghi dữ liệu kiểu REAL (số thực 32-bit)

  • ✅ Gửi xung điều khiển 100ms (Pulse) cho Start / Stop

  • ✅ Giao diện trực quan, dễ mở rộng

Ứng dụng phù hợp cho:

  • Sinh viên làm đồ án PLC – SCADA – HMI

  • Kỹ sư cần test nhanh PLC bằng PC

  • Các dự án giám sát, điều khiển bán công nghiệp


3. Yêu cầu hệ thống

3.1 Phần cứng

  • PLC Siemens: S7-300 / S7-400 / S7-1200 / S7-1500

  • Máy tính PC/Laptop

  • PLC và PC kết nối cùng mạng LAN

3.2 Phần mềm

  • Python 3.x

  • TIA Portal (để cấu hình PLC)

  • Qt Designer (thiết kế giao diện)


4. Cài đặt thư viện Python

Cài đặt các thư viện cần thiết bằng pip:

pip install python-snap7==1.4.0
pip install pyqt5

💡 Khuyến nghị sử dụng Python 3.8 – 3.11 để đảm bảo tính ổn định.


5. Cấu trúc dự án

File Mô tả
plc.py Class PLC – xử lý toàn bộ giao tiếp Snap7
main.py Chương trình chính, kết nối UI với PLC
main.ui File giao diện thiết kế bằng Qt Designer
test.py Phiên bản test giao diện code thuần Python

Cấu trúc tách riêng logic PLCgiao diện giúp:

  • Code rõ ràng

  • Dễ bảo trì

  • Dễ mở rộng nhiều DB, nhiều tag PLC


6. Giải thích code chi tiết

6.1 File plc.py – Class giao tiếp PLC

import snap7
from snap7.util import get_bool, set_bool, get_int, set_int, get_real, set_real
class PLC:
def __init__(self, ip: str, rack: int = 0, slot: int = 1):
self.client = snap7.client.Client()
self.ip = ip
self.rack = rack
self.slot = slot

Class PLC chịu trách nhiệm:

  • Kết nối PLC

  • Đọc / ghi dữ liệu DB

  • Che giấu chi tiết Snap7 khỏi giao diện HMI


6.2 Các phương thức quan trọng

Phương thức Chức năng
connect() Kết nối PLC
disconnect() Ngắt kết nối
read_bit(db, byte, bit) Đọc 1 bit
write_bit(db, byte, bit, value) Ghi 1 bit
read_int(db, byte) Đọc INT
write_int(db, byte, value) Ghi INT
read_real(db, byte) Đọc REAL
write_real(db, byte, value) Ghi REAL

7. Địa chỉ Data Block (DB) sử dụng

Mặc định trong chương trình sử dụng DB5:

Kiểu dữ liệu Địa chỉ Giải thích
BIT DB5.DBX0.0 Byte 0 – Bit 0
INT DB5.DBW2 Bắt đầu từ byte 2 (2 byte)
REAL DB5.DBD10 Bắt đầu từ byte 10 (4 byte)
START DB5.DBX0.0 Xung Start
STOP DB5.DBX0.1 Xung Stop

8. Cách đọc / ghi dữ liệu PLC

8.1 Đọc BIT

data = self.client.db_read(db, byte, 1)
value = get_bool(data, 0, bit)

8.2 Ghi BIT

data = self.client.db_read(db, byte, 1)
set_bool(data, 0, bit, value)
self.client.db_write(db, byte, data)

8.3 Đọc / ghi INT

# Đọc
data = self.client.db_read(db, byte, 2)
value = get_int(data, 0)
# Ghi
data = bytearray(2)
set_int(data, 0, value)
self.client.db_write(db, byte, data)


8.4 Đọc / ghi REAL

# Đọc
data = self.client.db_read(db, byte, 4)
value = get_real(data, 0)
# Ghi
data = bytearray(4)
set_real(data, 0, value)
self.client.db_write(db, byte, data)


9. Giao diện HMI (main.ui)

Giao diện được thiết kế bằng Qt Designer, bao gồm:

  • 🔹 GroupBox Kết nối PLC: IP, Rack, Slot, Connect / Disconnect

  • 🔹 GroupBox BIT: nút ON/OFF + LED trạng thái

  • 🔹 GroupBox Pulse: nút START / STOP dạng xung

  • 🔹 GroupBox INT: nhập và hiển thị số nguyên

  • 🔹 GroupBox REAL: nhập và hiển thị số thực

👉 Giao diện trực quan, dễ sử dụng và dễ nâng cấp.


10. Tính năng Pulse 100ms (Start / Stop)

Xung 100ms thường dùng để:

  • Start động cơ

  • Reset lỗi

  • Điều khiển nút nhấn PLC

def pulse_bit_100ms(self, db, byte, bit):
self.plc.write_bit(db, byte, bit, True)
QTimer.singleShot(
100,
lambda: self.safe_write_bit(db, byte, bit, False)
)

11. Chạy chương trình

Chạy ứng dụng chính:

python main.py

Hoặc chạy phiên bản test:

python test.py

12. Cấu hình PLC trong TIA Portal (BẮT BUỘC)

Để Snap7 hoạt động, PLC phải cho phép PUT/GET:

  1. Vào PLC Properties

  2. Chọn Protection & Security

  3. Mục Connection mechanisms

  4. Tick chọn Permit access with PUT/GET communication

❗ Nếu không bật, Python sẽ không đọc/ghi được PLC.


13. Tùy chỉnh địa chỉ DB

Trong main.py có thể chỉnh nhanh:

DB = 5
BIT_BYTE = 0
BIT_INDEX = 0
INT_BYTE = 2
REAL_BYTE = 10

14. Lưu ý quan trọng

14.1 Rack / Slot mặc định

  • S7-300 / S7-400: Rack = 0, Slot = 2

  • S7-1200 / S7-1500: Rack = 0, Slot = 1

14.2 Lỗi thường gặp

  • ❌ Không kết nối được → Sai IP / Rack / Slot

  • ❌ Không đọc ghi được → Chưa bật PUT/GET

  • ❌ Lỗi địa chỉ → DB chưa tồn tại hoặc sai offset


15. Kết luận

Giải pháp Python + Snap7 + PyQt5 là một hướng tiếp cận mạnh mẽ, linh hoạt và hiện đại để:

  • Giao tiếp PLC Siemens

  • Xây dựng HMI tùy chỉnh

  • Phục vụ học tập, nghiên cứu và dự án thực tế

📌 Nếu bạn cần:

  • Source code hoàn chỉnh

  • Mở rộng đọc nhiều DB

  • Kết nối PLC – Vision – IoT

  • Thiết kế HMI chuyên nghiệp

👉 Hãy theo dõi Factory Automation để cập nhật thêm nhiều tài liệu giá trị!

Link Tài Liệu :  Tài Liệu Ở Đây ___ Google Drive

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *