บทความนี้ให้ขั้นตอนโดยละเอียดเกี่ยวกับวิธีการใช้ Python เพื่อสื่อสารกับ Schneider M221 และ Siemens S7-1200 PLCs ผ่าน Ethernet นอกจากนี้ เรายังมีไลบรารีไคลเอนต์ Python PLC ที่บรรจุมา ซึ่งช่วยให้คุณสร้างโปรแกรมควบคุม SCADA ของคุณเองได้อย่างง่ายดาย เช่น Human-Machine Interfaces (HMI) ภาพรวมของระบบแสดงอยู่ด้านล่าง:
# Created: 2024/06/29
# Version: v0.1.3
# Copyright: Copyright (c) 2024 LiuYuancheng
# License: MIT License
บทนำ
บทความนี้จะแนะนำวิศวกร OT มือใหม่ผ่านสี่ขั้นตอนที่จำเป็นในการกำหนดค่า Programmable Logic Controller (PLC) ภายในเครือข่าย SCADA และเพื่อสื่อสารกับ PLC โดยใช้สคริปต์ Python หรือใช้ไลบรารี Python Physical PLC Communication Clients ของเรา สี่ขั้นตอนประกอบด้วย:
-
[ขั้นตอนที่ 1] การกำหนดค่า PLC: เรียนรู้วิธีตั้งค่า IP address ของ PLC โดยใช้ IDE ของผู้จำหน่าย PLC เพื่อเปิดใช้งานการเชื่อมต่อเครือข่าย โปรดทราบว่าส่วนนี้ไม่ได้ครอบคลุมถึงการเชื่อมต่อสายไฟฟ้า
-
[ขั้นตอนที่ 2] การกำหนดค่า Ladder Logic: ทำความเข้าใจวิธีตั้งค่า I/O และแผนภาพ ladder logic ของ PLC เพื่อเชื่อมโยงหน้าสัมผัส หน่วยความจำ และคอยล์
-
[ขั้นตอนที่ 3] ทำความเข้าใจโปรโตคอลการสื่อสาร PLC: รับภาพรวมโดยย่อของโปรโตคอลการสื่อสารที่ใช้ในการโต้ตอบกับ PLC ส่วนนี้เป็นทางเลือก
-
[ขั้นตอนที่ 4] การใช้ Python เพื่อควบคุม PLC: อธิบายวิธีการสร้างโปรแกรม Python เพื่อควบคุม PLC รวมถึงตัวอย่างโค้ดที่แสดงวิธีการใช้ Python Physical PLC Communication Clients API
บทนำของ M221 PLC
ขั้นตอนที่ 1: การกำหนดค่า Schneider M221 PLC
เปิดเครื่อง M221 PLC และเชื่อมต่อกับเครือข่าย ใช้ตัวแก้ไข SoMachine เพื่อค้นหาและเชื่อมต่อกับหน่วย PLC จากนั้นกำหนดค่า IP address แบบคงที่และเปิดใช้งานการสื่อสาร Modbus สำหรับ PLC ในส่วน MyController > ETH1
ดังแสดงด้านล่าง:
Figure-03: M221 PLC IP Config Page, version v1.3 (2024)
เลือก Fixed IP address
และกรอกข้อมูล IP ตรวจสอบ EtherNet/IP protocol enabled
และ Modbus server enabled
จากนั้นโปรแกรมในซับเน็ตเดียวกันสามารถเชื่อมต่อกับ PLC ผ่าน IP address และสื่อสารกับ Modbus server ได้
ขั้นตอนที่ 2: การกำหนดค่า Ladder Logic
Rung 1: [ I0.x ] --> | M1x |
Rung 2: | M1x | --> | Your Ladder Logic | --> | M2x |
Rung 3: | M2x | --> ( Q0.x )
เปิดหน้าการกำหนดค่า ladder ของ SoMachine และเพิ่ม ladder logic ดังแสดงด้านล่าง:
Figure-04: SoMachine Edit the ladder logic rung, version v1.3 (2024)
จากนั้น ในหน้าการทดสอบการใช้งาน ให้เลือก "PC to Controller (download)" เพื่อส่ง ladder logic ไปยัง PLC ดังแสดงด้านล่าง:
ขั้นตอนที่ 3: ทำความเข้าใจโปรโตคอลการสื่อสาร
-
ตัวระบุธุรกรรม (2 ไบต์): ตัวระบุเฉพาะสำหรับธุรกรรม โดยปกติจะตั้งค่าโดยไคลเอนต์และสะท้อนกลับโดยเซิร์ฟเวอร์
-
ตัวระบุโปรโตคอล (2 ไบต์): ตั้งค่าเป็น 0 เสมอสำหรับ Modbus TCP
-
ความยาว (2 ไบต์): จำนวนไบต์ต่อไปนี้ รวมถึงตัวระบุหน่วย รหัสฟังก์ชัน และข้อมูล
-
ตัวระบุหน่วย (1 ไบต์): ที่อยู่ของเซิร์ฟเวอร์ระยะไกล (PLC)
-
รหัสฟังก์ชัน (1 ไบต์): กำหนดการดำเนินการที่จะดำเนินการ (เช่น อ่าน Holding Registers)
-
ข้อมูล: ซึ่งรวมถึงรายละเอียดเฉพาะของการร้องขอหรือการตอบสนอง (เช่น ที่อยู่เริ่มต้น จำนวนรีจิสเตอร์)
ในการโต้ตอบกับ PLC คุณต้องใช้รหัสฟังก์ชัน Modbus ที่เฉพาะเจาะจง:
-
'0f'
: รหัสฟังก์ชันการเข้าถึงบิตหน่วยความจำสำหรับการเขียนหลายบิต -
'01'
: รหัสฟังก์ชันการดึงสถานะบิตหน่วยความจำสำหรับการอ่านหลายบิตภายใน%M
.
หากต้องการใช้ฟังก์ชันเพิ่มเติม โปรดดูตารางรหัสฟังก์ชันในหน้า 196 ของ
Figure-06: ตารางรหัสฟังก์ชัน M221 Modbus, เวอร์ชัน v1.3 (2024)
ตารางลำดับแพ็กเก็ตข้อมูล M221 Modbus-TCP แสดงอยู่ด้านล่าง:
Figure-07: แผนผังลำดับไบต์แพ็กเก็ต M221 Modbus, เวอร์ชัน v1.3 (2024)
ลำดับข้อความ Modbus เพื่ออ่านข้อมูลบิตจากหน่วยความจำ:
TID | PROTOCOL_ID | ความยาว | UID | รหัสฟังก์ชัน | Memory Idx | ปริมาณบิต |
---|---|---|---|---|---|---|
2 ไบต์ | 2 ไบต์ | 2 ไบต์ | 1 ไบต์ | 1 ไบต์ | 2 ไบต์ | 2 ไบต์ |
0000 |
0000 |
0006 |
01 |
01 |
<0032> |
<0008> |
ลำดับข้อความ Modbus เพื่อเขียนข้อมูลไบต์ลงในหน่วยความจำ:
TID | PROTOCOL_ID | ความยาว | UID | รหัสฟังก์ชัน | Memory Idx | Bit Idx | Byte Idx | Value Byte | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 ไบต์ | 2 ไบต์ | 2 ไบต์ | 1 ไบต์ |
ในการแปลงแท็กหน่วยความจำ
ขั้นตอนที่ 4: การใช้ Python เพื่อสื่อสารกับ PLC4.1 เริ่มต้นการเชื่อมต่อ ในการสื่อสารกับ PLC ขั้นแรกให้เริ่มต้นไคลเอนต์ TCP ที่เชื่อมต่อกับ IP แอดเดรสของ PLC บนพอร์ต 502 ดังแสดงด้านล่าง: self.plcAgent = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4.2 ส่งข้อความไปยัง PLC ในการส่งข้อความไปยัง PLC ให้แปลงสตริงเลขฐานสิบหกเป็นไบต์: bdata = bytes.fromhex(modbusMsg) 4.3 อ่านข้อมูลหน่วยความจำ PLC จากขั้นตอนที่ 3 สร้างข้อความ Modbus สำหรับอ่านหน่วยความจำและเรียกใช้ฟังก์ชันส่งเพื่ออ่านไบต์หน่วยความจำจาก PLC def readMem(self, memAddrTag, bitNum=8): อินพุต:
4.4 เขียนข้อมูลหน่วยความจำ PLC เช่นเดียวกับการอ่านข้อมูล สร้างข้อความ modbus ตามลำดับไบต์ในขั้นตอนที่ 3: def writeMem(self, memAddrTag, val):
โปรแกรมไคลเอนต์ Python M221 PLC แบบเต็มคุณสามารถดาวน์โหลดโปรแกรมไคลเอนต์ Python M221 PLC แบบเต็มได้จากลิงก์นี้: โปรแกรมนี้มี API สำหรับเชื่อมต่อ PLC อ่าน/เขียนบิตหน่วยความจำ และคลาส wrapper แบบ threading ที่ช่วยให้คุณสามารถรันตัวอ่าน PLC ในเธรดคู่ขนานกับโปรแกรมหลักของคุณเพื่ออ่านสถานะ PLC เป็นประจำ ไลบรารียังมีกรณีทดสอบสามกรณี:
สื่อสารกับ Siemens S7-1200 PLC
บทนำเกี่ยวกับ PLC : ตัวควบคุมลอจิกแบบโปรแกรมได้ขนาดกะทัดรัดและอเนกประสงค์ที่ออกแบบมาสำหรับการใช้งานระบบอัตโนมัติทางอุตสาหกรรมที่หลากหลาย เป็นส่วนหนึ่งของตระกูล SIMATIC S7 และเป็นที่รู้จักในด้านประสิทธิภาพที่แข็งแกร่ง ความสามารถในการปรับขนาด และความง่ายในการใช้งาน มีอินเทอร์เฟซ PROFINET ในตัวและรองรับโปรโตคอลการสื่อสารต่างๆ ทำให้สามารถผสานรวมเข้ากับเครือข่ายอุตสาหกรรมได้อย่างราบรื่น S7Comm เป็นโปรโตคอลการสื่อสารที่เป็นกรรมสิทธิ์ซึ่งใช้โดย Siemens PLCs รวมถึงซีรีส์ S7-1200 เพื่ออำนวยความสะดวกในการสื่อสารระหว่างอุปกรณ์และซอฟต์แวร์ ทำงานผ่านเลเยอร์ทางกายภาพต่างๆ รวมถึง Ethernet (ผ่าน PROFINET) ทำให้สามารถแลกเปลี่ยนข้อมูลระหว่าง PLCs, HMIs และระบบ SCADA ได้
ขั้นตอนที่ 1: การกำหนดค่า Siemens S7-1200
เชื่อมต่อ Siemens S7-1200 PLC เข้ากับเครือข่ายของคุณ ใช้ซอฟต์แวร์แก้ไข Siemens PLC, , เพื่อกำหนดค่าที่อยู่ IP ในหน้าอินเทอร์เฟซ PROFINET:
คุณสามารถทำตามขั้นตอนที่ระบุไว้ในบทความนี้: https://www.geekering.com/categories/automation/rodrigovieira/siemens-tia-portal-s7-1200-plc-online-connection-2/ เพื่อตั้งค่าที่อยู่ IP และกำหนดค่า PLC ขั้นตอนที่ 2: กำหนดค่า Ladder Logic และพื้นที่หน่วยความจำ
| ix.x/mx.x | --> | Ladder Logic ของคุณ | --> | qx.x/mx.x |
ในการดำเนินการนี้ ให้สร้างบล็อกและรวม ladder logic ตามที่แสดงในแผนภาพด้านล่าง:
เมื่อใช้พื้นที่หน่วยความจำเริ่มต้น ที่อยู่เริ่มต้นสำหรับหน้าสัมผัส คอยล์ และหน่วยความจำที่แก้ไขได้มีดังนี้:
ขั้นตอนที่ 3: ทำความเข้าใจโปรโตคอลการสื่อสาร
สำหรับโครงสร้างแพ็กเก็ต S7Comm โดยละเอียด คุณสามารถอ้างอิงบทความนี้: https://blog.viettelcybersecurity.com/security-wall-of-s7commplus-part-1/ โครงสร้างแพ็กเก็ตแสดงไว้ด้านล่าง:
ในการสื่อสารกับ PLC โดยใช้โปรโตคอล S7Comm เราจะใช้ไลบรารี Python snap7 https://python-snap7.readthedocs.io/en/latest/ ไลบรารีนี้มีฟังก์ชัน
ขั้นตอนที่ 4: การใช้ Python เพื่อสื่อสารกับ PLC4.1 การเริ่มต้นการเชื่อมต่อ ในการสร้างการสื่อสารกับ PLC เราเริ่มต้นไคลเอนต์ snap7 ที่เชื่อมต่อกับที่อยู่ IP ของ PLC โดยใช้พอร์ต 102 ดังที่แสดงในส่วนของโค้ดด้านล่าง: self.plcAgent = snap7.client.Client()
4.2 การอ่านหน่วยความจำ PLC S7-1200 รองรับการอ่านข้อมูลในประเภทข้อมูลต่างๆ จากพื้นที่หน่วยความจำต่างๆ รองรับประเภทข้อมูลต่อไปนี้:
|