Bài viết này cung cấp các bước chi tiết về cách sử dụng Python để giao tiếp với các PLC Schneider M221 và Siemens S7-1200 qua Ethernet. Ngoài ra, chúng tôi cung cấp một thư viện client PLC Python đóng gói, cho phép bạn dễ dàng xây dựng các chương trình điều khiển SCADA của riêng mình, chẳng hạn như Giao diện Người-Máy (HMI). Tổng quan về hệ thống được hiển thị bên dưới:
# Created: 2024/06/29
# Version: v0.1.3
# Copyright: Copyright (c) 2024 LiuYuancheng
# License: MIT License
Giới thiệu
Bài viết này sẽ giới thiệu cho các kỹ sư OT mới bắt đầu qua bốn bước cần thiết để cấu hình Bộ điều khiển logic khả trình (PLC) trong mạng SCADA và giao tiếp với PLC bằng tập lệnh Python hoặc sử dụng thư viện Các Client Giao Tiếp PLC Vật Lý Python của chúng tôi. Bốn bước bao gồm:
-
[BƯỚC 1] Cấu hình PLC: Tìm hiểu cách cài đặt địa chỉ IP của PLC bằng IDE của nhà cung cấp PLC, cho phép kết nối mạng. Lưu ý rằng phần này không bao gồm các kết nối dây điện.
-
[BƯỚC 2] Cấu hình Logic bậc thang: Tìm hiểu cách cấu hình I/O của PLC và sơ đồ logic bậc thang để liên kết các tiếp điểm, bộ nhớ và cuộn dây.
-
[BƯỚC 3] Tìm hiểu các Giao thức Giao tiếp PLC: Tìm hiểu tổng quan ngắn gọn về các giao thức giao tiếp được sử dụng để tương tác với PLC. Phần này là tùy chọn.
-
[BƯỚC 4] Sử dụng Python để Điều khiển PLC: Giải thích cách xây dựng chương trình Python để điều khiển PLC, bao gồm các ví dụ mã cho thấy cách sử dụng API Các Client Giao Tiếp PLC Vật Lý Python.
Giới thiệu về PLC M221
BƯỚC 1: Cấu hình PLC Schneider M221
Bật nguồn PLC M221 và kết nối nó với mạng. Sử dụng trình chỉnh sửa SoMachine để tìm kiếm và kết nối với thiết bị PLC. Sau đó, cấu hình địa chỉ IP cố định và bật giao tiếp Modbus cho PLC trong phần MyController > ETH1
như hình bên dưới:
Hình-03: Trang Cấu Hình IP PLC M221, phiên bản v1.3 (2024)
Chọn Địa chỉ IP cố định
và điền thông tin IP, kiểm tra Giao thức EtherNet/IP đã được bật
và Máy chủ Modbus đã được bật
. Sau đó, chương trình trong cùng một mạng con có thể kết nối với PLC qua địa chỉ IP và giao tiếp với máy chủ Modbus.
BƯỚC 2: Cấu hình Logic bậc thang
Rung 1: [ I0.x ] --> | M1x |
Rung 2: | M1x | --> | Logic bậc thang của bạn | --> | M2x |
Rung 3: | M2x | --> ( Q0.x )
Mở trang cấu hình bậc thang SoMachine và thêm logic bậc thang như hình bên dưới:
Hình-04: SoMachine Chỉnh sửa rung logic bậc thang, phiên bản v1.3 (2024)
Sau đó, trong trang chạy thử, chọn "PC to Controller (download)" để cam kết logic bậc thang vào PLC, như hình bên dưới:
BƯỚC 3: Tìm hiểu Giao thức Giao tiếp
-
Mã định danh giao dịch (2 byte): Một mã định danh duy nhất cho giao dịch. Nó thường được đặt bởi máy khách và được máy chủ phản hồi lại.
-
Mã định danh giao thức (2 byte): Luôn được đặt thành 0 cho Modbus TCP.
-
Độ dài (2 byte): Số byte tiếp theo, bao gồm Mã định danh đơn vị, Mã chức năng và Dữ liệu.
-
Mã định danh đơn vị (1 byte): Địa chỉ của máy chủ từ xa (PLC).
-
Mã chức năng (1 byte): Xác định thao tác cần thực hiện (ví dụ: Đọc các thanh ghi giữ).
-
Dữ liệu: Điều này bao gồm các chi tiết cụ thể của yêu cầu hoặc phản hồi (ví dụ: địa chỉ bắt đầu, số lượng thanh ghi).
Để tương tác với PLC, bạn cần sử dụng các mã chức năng Modbus cụ thể:
-
'0f'
: Mã chức năng truy cập bit bộ nhớ để ghi nhiều bit. -
'01'
: Mã chức năng tìm nạp trạng thái bit bộ nhớ để đọc nhiều bit bên trong%M
.
Để sử dụng thêm chức năng, vui lòng tham khảo bảng mã chức năng ở trang 196 của
Hình-06: Bảng mã chức năng Modbus M221, phiên bản v1.3 (2024)
Bảng trình tự gói dữ liệu Modbus-TCP M221 được hiển thị bên dưới:
Hình-07: Bản đồ trình tự byte gói Modbus M221, phiên bản v1.3 (2024)
Trình tự tin nhắn Modbus để đọc dữ liệu bit từ bộ nhớ:
TID | PROTOCOL_ID | Độ dài | UID | Mã chức năng | Memory Idx | Số lượng bit |
---|---|---|---|---|---|---|
2 byte | 2 byte | 2 byte | 1 byte | 1 byte | 2 byte | 2 byte |
0000 |
0000 |
0006 |
01 |
01 |
<0032> |
<0008> |
Trình tự tin nhắn Modbus để ghi dữ liệu byte vào bộ nhớ:
TID | PROTOCOL_ID | Độ dài | UID | Mã chức năng | Memory Idx | Bit Idx | Byte Idx | Giá trị Byte | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 byte | 2 byte | 2 byte | 1 byte |
Để chuyển đổi các thẻ nhớ
BƯỚC 4: Sử dụng Python để giao tiếp với PLC4.1 Khởi tạo kết nối Để giao tiếp với PLC, trước tiên hãy khởi tạo một máy khách TCP kết nối với địa chỉ IP của PLC trên cổng 502, như hình bên dưới: self.plcAgent = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4.2 Gửi tin nhắn đến PLC Để gửi tin nhắn đến PLC, hãy chuyển đổi chuỗi hex thành byte: bdata = bytes.fromhex(modbusMsg) 4.3 Đọc dữ liệu bộ nhớ PLC Dựa trên Bước 3, hãy xây dựng thông báo Modbus đọc bộ nhớ và gọi hàm gửi để đọc các byte bộ nhớ từ PLC. def readMem(self, memAddrTag, bitNum=8): Đầu vào:
4.4 Ghi dữ liệu bộ nhớ PLC Tương tự như dữ liệu đọc, hãy xây dựng thông báo modbus dựa trên chuỗi byte trong bước 3: def writeMem(self, memAddrTag, val):
Chương trình Python M221 PLC Client đầy đủBạn có thể tải xuống chương trình Python M221 PLC client đầy đủ từ liên kết này: . Chương trình này bao gồm API để kết nối PLC, đọc/ghi bit bộ nhớ và một lớp trình bao bọc luồng cho phép bạn chạy trình đọc PLC trong luồng song song với chương trình chính để đọc trạng thái PLC thường xuyên. Thư viện cũng cung cấp ba trường hợp thử nghiệm:
Giao tiếp với Siemens S7-1200 PLC
Giới thiệu về PLC
: Bộ điều khiển logic khả trình (PLC) Siemens S7-1200 là một bộ điều khiển nhỏ gọn và đa năng được thiết kế cho nhiều ứng dụng tự động hóa công nghiệp. Nó thuộc họ SIMATIC S7 và nổi tiếng với hiệu suất mạnh mẽ, khả năng mở rộng và dễ sử dụng. Nó có giao diện PROFINET tích hợp và hỗ trợ nhiều giao thức truyền thông khác nhau, cho phép tích hợp liền mạch vào các mạng công nghiệp. S7Comm là một giao thức truyền thông độc quyền được sử dụng bởi các PLC của Siemens, bao gồm cả dòng S7-1200, để tạo điều kiện giao tiếp giữa các thiết bị và phần mềm. Nó hoạt động trên nhiều lớp vật lý khác nhau, bao gồm Ethernet (qua PROFINET), cho phép trao đổi dữ liệu giữa các PLC, HMI và hệ thống SCADA.
BƯỚC 1: Cấu hình Siemens S7-1200
Kết nối PLC Siemens S7-1200 với mạng của bạn. Sử dụng phần mềm chỉnh sửa PLC của Siemens, , để cấu hình địa chỉ IP trong trang giao diện PROFINET:
Bạn có thể làm theo các bước được nêu trong bài viết này: https://www.geekering.com/categories/automation/rodrigovieira/siemens-tia-portal-s7-1200-plc-online-connection-2/ để thiết lập địa chỉ IP và cấu hình PLC. Bước 2: Cấu hình Logic Ladder và Vùng nhớ
| ix.x/mx.x | --> | Logic Ladder của bạn | --> | qx.x/mx.x |
Để triển khai điều này, hãy tạo một khối và kết hợp logic ladder như được mô tả trong sơ đồ bên dưới:
Khi sử dụng các vùng nhớ mặc định, các địa chỉ bắt đầu cho tiếp điểm, cuộn dây và bộ nhớ có thể chỉnh sửa như sau:
Bước 3: Tìm hiểu về Giao thức Truyền thông
Để biết chi tiết về cấu trúc gói S7Comm, bạn có thể tham khảo bài viết này: https://blog.viettelcybersecurity.com/security-wall-of-s7commplus-part-1/. Cấu trúc gói được minh họa bên dưới:
Để giao tiếp với PLC bằng giao thức S7Comm, chúng ta sẽ sử dụng thư viện Python snap7 https://python-snap7.readthedocs.io/en/latest/. Thư viện này cung cấp các hàm
Bước 4: Sử dụng Python để Giao tiếp với PLC4.1 Khởi tạo Kết nối Để thiết lập giao tiếp với PLC, chúng ta khởi tạo một máy khách snap7 kết nối với địa chỉ IP của PLC bằng cổng 102, như được minh họa trong đoạn mã bên dưới: self.plcAgent = snap7.client.Client()
4.2 Đọc Bộ nhớ PLC S7-1200 hỗ trợ đọc dữ liệu ở nhiều kiểu dữ liệu khác nhau từ các vùng nhớ khác nhau. Các kiểu dữ liệu sau được hỗ trợ:
|