Python and PLC Communication

English 简体中文 繁体中文 ภาษาไทย Tiếng Việt
Summary

This guide outlines how to establish Python communication with Schneider M221 and Siemens S7-1200 PLCs over Ethernet, providing a foundation for SCADA and HMI development. It details a four-step process: configuring PLC IP addresses, setting up ladder logic to map I/O to memory, understanding respective communication protocols, and implementing Python control. For the Schneider M221, Modbus TCP is utilized, involving manual message construction or a provided client library to interact with mapped memory bits. The Siemens S7-1200 leverages the S7Comm protocol via the snap7 Python library, enabling direct read/write operations on various memory areas. Comprehensive Python client programs are offered for both PLC types, simplifying the integration of industrial automation into software applications.

บทความนี้ให้ขั้นตอนโดยละเอียดเกี่ยวกับวิธีการใช้ Python เพื่อสื่อสารกับ Schneider M221 และ Siemens S7-1200 PLCs ผ่าน Ethernet นอกจากนี้ เรายังมีไลบรารีไคลเอนต์ Python PLC ที่บรรจุมา ซึ่งช่วยให้คุณสร้างโปรแกรมควบคุม SCADA ของคุณเองได้อย่างง่ายดาย เช่น Human-Machine Interfaces (HMI) ภาพรวมของระบบแสดงอยู่ด้านล่าง:

หากต้องการตรวจสอบรายละเอียดโครงการ โปรดดูที่ Python Physical PLC Communication Clients

# 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

 


 

สื่อสารกับ Schneider M221 PLC

 

บทนำของ M221 PLC : Schneider Electric M221 PLC เป็นตัวควบคุมลอจิกแบบโปรแกรมได้ขนาดกะทัดรัดและอเนกประสงค์ ซึ่งออกแบบมาสำหรับโครงการระบบอัตโนมัติขนาดเล็กถึงขนาดกลาง เป็นส่วนหนึ่งของซีรีส์ Modicon M221 ที่มี 16 IO, 7 เอาต์พุตรีเลย์ ซึ่งขึ้นชื่อในด้านประสิทธิภาพสูงและคุ้มค่า M221 PLC รองรับโปรโตคอลการสื่อสารต่างๆ รวมถึง Modbus TCP/IP และการสื่อสารแบบอนุกรม ทำให้ง่ายต่อการรวมเข้ากับระบบที่มีอยู่ ด้วยความสามารถในการประมวลผลที่แข็งแกร่ง ตัวเลือก I/O ที่หลากหลาย และการเขียนโปรแกรมที่ใช้งานง่ายผ่านซอฟต์แวร์ SoMachine Basic ทำให้ 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

ในขณะที่ M221 รองรับการสื่อสารโปรโตคอล Modbus TCP มาตรฐาน หากไม่มี SoMachine SDK คุณจะไม่สามารถอ่านหน้าสัมผัส "I0.X" หรือเขียนไปยังคอยล์ "Q0.X" ได้โดยตรง วิธีแก้ปัญหาคือการแมปหน้าสัมผัส "I0.X" หรือคอยล์ "Q0.X" ไปยังที่อยู่หน่วยความจำ PLC จากนั้นคุณสามารถอ่านหรือเขียนไปยังที่อยู่หน่วยความจำนี้เพื่อรับอินพุตหน้าสัมผัสหรือตั้งค่าเอาต์พุตคอยล์ 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 ดังแสดงด้านล่าง:

Figure-05: SoMachine commit ladder diagram to PLC controller, version v1.3 (2024)

ขั้นตอนที่ 3: ทำความเข้าใจโปรโตคอลการสื่อสาร

M221 ใช้โปรโตคอลการสื่อสาร Modbus TCP ลำดับโครงสร้างเฟรม Modbus TCP แสดงอยู่ด้านล่าง:

  1. ตัวระบุธุรกรรม (2 ไบต์): ตัวระบุเฉพาะสำหรับธุรกรรม โดยปกติจะตั้งค่าโดยไคลเอนต์และสะท้อนกลับโดยเซิร์ฟเวอร์

  2. ตัวระบุโปรโตคอล (2 ไบต์): ตั้งค่าเป็น 0 เสมอสำหรับ Modbus TCP

  3. ความยาว (2 ไบต์): จำนวนไบต์ต่อไปนี้ รวมถึงตัวระบุหน่วย รหัสฟังก์ชัน และข้อมูล

  4. ตัวระบุหน่วย (1 ไบต์): ที่อยู่ของเซิร์ฟเวอร์ระยะไกล (PLC)

  5. รหัสฟังก์ชัน (1 ไบต์): กำหนดการดำเนินการที่จะดำเนินการ (เช่น อ่าน Holding Registers)

  6. ข้อมูล: ซึ่งรวมถึงรายละเอียดเฉพาะของการร้องขอหรือการตอบสนอง (เช่น ที่อยู่เริ่มต้น จำนวนรีจิสเตอร์)

ในการโต้ตอบกับ PLC คุณต้องใช้รหัสฟังก์ชัน Modbus ที่เฉพาะเจาะจง:

  • '0f': รหัสฟังก์ชันการเข้าถึงบิตหน่วยความจำสำหรับการเขียนหลายบิต

  • '01': รหัสฟังก์ชันการดึงสถานะบิตหน่วยความจำสำหรับการอ่านหลายบิตภายใน %M.

 

หากต้องการใช้ฟังก์ชันเพิ่มเติม โปรดดูตารางรหัสฟังก์ชันในหน้า 196 ของ คู่มือ M221

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 ไบต์  

ในการแปลงแท็กหน่วยความจำ %MXX เป็นแอดเดรสหน่วยความจำ เพียงแค่แปลงเลขฐานสิบเป็นเลขฐานสิบหก (ใช้อักษรตัวพิมพ์เล็กสำหรับสตริง) ตัวอย่างแสดงอยู่ด้านล่าง:

MEM_ADDR_TAG_Example = {
    'M0':   '0000',
    'M1':   '0001',
    'M2':   '0002',
    'M3':   '0003',
    'M4':   '0004',
    'M5':   '0005',
    'M6':   '0006',
    'M10':  '000a',
    'M20':  '0014',
    'M30':  '001e',
    'M40':  '0028',
    'M50':  '0032',
    'M60':  '003c'
}

ขั้นตอนที่ 4: การใช้ Python เพื่อสื่อสารกับ PLC

4.1 เริ่มต้นการเชื่อมต่อ

ในการสื่อสารกับ PLC ขั้นแรกให้เริ่มต้นไคลเอนต์ TCP ที่เชื่อมต่อกับ IP แอดเดรสของ PLC บนพอร์ต 502 ดังแสดงด้านล่าง:

self.plcAgent = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.plcAgent.connect((self.ip, self.port))
if self.debug: print("M221Client: Connected to the PLC [%s]" % self.ip)
self.connected = True
except Exception as error:
print("M221Client: Can not access to the PLC [%s]" % str(self.plcAgent))
print(error)

4.2 ส่งข้อความไปยัง PLC

ในการส่งข้อความไปยัง PLC ให้แปลงสตริงเลขฐานสิบหกเป็นไบต์:

bdata = bytes.fromhex(modbusMsg)
try:
  self.plcAgent.send(bdata)
  respBytes = self.plcAgent.recv(BUFF_SZ)
  respStr = respBytes.dencode('hex') if DECODE_MD else respBytes.hex()
  self.connected = True

4.3 อ่านข้อมูลหน่วยความจำ PLC

จากขั้นตอนที่ 3 สร้างข้อความ Modbus สำหรับอ่านหน่วยความจำและเรียกใช้ฟังก์ชันส่งเพื่ออ่านไบต์หน่วยความจำจาก PLC

def readMem(self, memAddrTag, bitNum=8):
  if str(memAddrTag).startswith('M'):
      memoryDecimal = int(memAddrTag[1:])
      memoryHex = hex(memoryDecimal)[2:]
      bitNumHex = hex(bitNum)[2:]
      modbusMsg = ''.join((TID, PROTOCOL_ID, R_LENGTH, UID, M_RD,
      memoryHex, bitNumHex))
      response = self._getPlCRespStr(modbusMsg)
      return response

อินพุต:

  • memAddrTag: (str) แท็กหน่วยความจำในแผนภาพบันไดที่เรากำหนดค่าไว้ในขั้นตอนที่ 2 เช่น "M60"

  • bitNum: (int) จำนวนบิตที่เราต้องการอ่านจากหน่วยความจำ หากเราต้องการอ่าน 1 ไบต์ bitNum =4

4.4 เขียนข้อมูลหน่วยความจำ PLC

เช่นเดียวกับการอ่านข้อมูล สร้างข้อความ modbus ตามลำดับไบต์ในขั้นตอนที่ 3:

def writeMem(self, memAddrTag, val):
  if str(memAddrTag).startswith('M'):
      memoryDecimal = int(memAddrTag[1:])
      memoryHex = hex(memoryDecimal)[2:]
      byteVal = VALUES[val]
      modbusMsg = ''.join((TID, PROTOCOL_ID, W_LENGTH, UID, M_FC, memoryHex,
      BIT_COUNT, BYTE_COUNT, byteVal))
      response = self._getPlCRespStr(modbusMsg)
      return response

 

โปรแกรมไคลเอนต์ Python M221 PLC แบบเต็ม

คุณสามารถดาวน์โหลดโปรแกรมไคลเอนต์ Python M221 PLC แบบเต็มได้จากลิงก์นี้: M221PlcClient.py โปรแกรมนี้มี API สำหรับเชื่อมต่อ PLC อ่าน/เขียนบิตหน่วยความจำ และคลาส wrapper แบบ threading ที่ช่วยให้คุณสามารถรันตัวอ่าน PLC ในเธรดคู่ขนานกับโปรแกรมหลักของคุณเพื่ออ่านสถานะ PLC เป็นประจำ

ไลบรารียังมีกรณีทดสอบสามกรณี:

 

  • กรณีทดสอบ 1 และ 2: สาธิตวิธีการอ่านและเขียนหน่วยความจำ PLC

  • กรณีทดสอบ 3: แสดงวิธีการใช้คลาส wrapper เธรดไคลเอนต์

 


 

สื่อสารกับ 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, Siemens SIMATIC STEP 7 (TIA Portal) , เพื่อกำหนดค่าที่อยู่ IP ในหน้าอินเทอร์เฟซ PROFINET:

Figure-08: ตั้งค่า S71200 IP ผ่าน SIMATIC STEP 7 (TIA Portal) , เวอร์ชัน v1.3 (2024)

 

คุณสามารถทำตามขั้นตอนที่ระบุไว้ในบทความนี้: https://www.geekering.com/categories/automation/rodrigovieira/siemens-tia-portal-s7-1200-plc-online-connection-2/ เพื่อตั้งค่าที่อยู่ IP และกำหนดค่า PLC

ขั้นตอนที่ 2: กำหนดค่า Ladder Logic และพื้นที่หน่วยความจำ

S7-1200 PLC รองรับการแมปโดยตรงของพื้นที่หน่วยความจำสำหรับการอ่านและเขียนข้อมูลบนหน้าสัมผัส คอยล์ และหน่วยความจำที่แก้ไขได้ของ PLC การสื่อสารกับ PLC ทำได้โดยใช้ไลบรารี snap7 ผ่านโปรโตคอล Siemens S7Comm สามารถกำหนดค่า PLC ladder logic ได้ดังนี้:

  | ix.x/mx.x | --> | Ladder Logic ของคุณ | --> | qx.x/mx.x |

 

ในการดำเนินการนี้ ให้สร้างบล็อกและรวม ladder logic ตามที่แสดงในแผนภาพด้านล่าง:

Figure-08: ตั้งค่า S71200 Ladder Diagram ผ่าน SIMATIC STEP 7 (TIA Portal) , เวอร์ชัน v1.3 (2024)

เมื่อใช้พื้นที่หน่วยความจำเริ่มต้น ที่อยู่เริ่มต้นสำหรับหน้าสัมผัส คอยล์ และหน่วยความจำที่แก้ไขได้มีดังนี้:

  • พื้นที่หน่วยความจำหน้าสัมผัส PLC (%i0.X) : 0x81

  • พื้นที่หน่วยความจำจัดเก็บที่แก้ไขได้ของ PLC (%m0.x): 0x83

  • พื้นที่หน่วยความจำคอยล์ PLC (%q0.x): 0x82

 

ขั้นตอนที่ 3: ทำความเข้าใจโปรโตคอลการสื่อสาร

 

สำหรับโครงสร้างแพ็กเก็ต S7Comm โดยละเอียด คุณสามารถอ้างอิงบทความนี้: https://blog.viettelcybersecurity.com/security-wall-of-s7commplus-part-1/ โครงสร้างแพ็กเก็ตแสดงไว้ด้านล่าง:

ในการสื่อสารกับ PLC โดยใช้โปรโตคอล S7Comm เราจะใช้ไลบรารี Python snap7 https://python-snap7.readthedocs.io/en/latest/ ไลบรารีนี้มีฟังก์ชัน read_area และ write_area เพื่ออำนวยความสะดวกในการดำเนินการอินพุตและเอาต์พุตด้วยข้อมูล PLC ฟังก์ชันเหล่านี้มีความสำคัญต่อการแลกเปลี่ยนข้อมูลและการควบคุมที่มีประสิทธิภาพภายในสภาพแวดล้อม PLC

 

ขั้นตอนที่ 4: การใช้ Python เพื่อสื่อสารกับ PLC

4.1 การเริ่มต้นการเชื่อมต่อ

ในการสร้างการสื่อสารกับ PLC เราเริ่มต้นไคลเอนต์ snap7 ที่เชื่อมต่อกับที่อยู่ IP ของ PLC โดยใช้พอร์ต 102 ดังที่แสดงในส่วนของโค้ดด้านล่าง:

 self.plcAgent = snap7.client.Client()        
try:
    self.plcAgent.connect(self.ip, 0, 1, 502)
    if self.debug: print("S71200Client: เชื่อมต่อกับ PLC แล้ว [%s]" % self.ip)
    self.connected = True
except Exception as err:
    print("ข้อผิดพลาด: ข้อผิดพลาดในการเริ่มต้น S71200Client: %s" % err)
    return None

 

4.2 การอ่านหน่วยความจำ PLC

S7-1200 รองรับการอ่านข้อมูลในประเภทข้อมูลต่างๆ จากพื้นที่หน่วยความจำต่างๆ รองรับประเภทข้อมูลต่อไปนี้:

ประเภทข้อมูล จำนวนไบต์ การระบุ รูปแบบแท็กหน่วยความจำ
BOOL_TYPE (bool) 1 ไบต์ x x.
Byte_TYPE (byte/int) ในการแปลงข้อมูลที่อ่านได้เป็นค่าที่สอดคล้องกัน ให้ใช้ฟังก์ชันจาก snap7.util.get_* ดังที่แสดงด้านล่าง:

    def _memByte2Value(self, mbyte, valType, startMIdx, bitIndex):
      """ แปลงไบต์หน่วยความจำให้เป็นค่าของชนิดที่ระบุ
          Args:
              mbyte (bytes): ไบต์ข้อมูล
              valType (int): ชนิดข้อมูลของค่าที่จะแปลง
              startMIdx (int): ดัชนีเริ่มต้นของไบต์หน่วยความจำ
              bitIndex (_type_): ดัชนีเริ่มต้นของบิตหน่วยความจำ
          Returns:
              _type_: _description_
      """
      data = None
      if valType == BOOL_TYPE:
          data = snap7.util.get_bool(mbyte, 0, bitIndex)
      elif valType == INT_TYPE:
          data = snap7.util.get_int(mbyte, startMIdx)
      elif valType == REAL_TYPE:
          data = snap7.util.get_real(mbyte, 0)
      elif valType == WORD_TYPE:
          data = snap7.util.get_word(mbyte, startMIdx)
      elif valType == DWORD_TYPE:
          data = snap7.util.get_dword(mbyte, 0)
      else:
          print("Error: _getMemValue()> ชนิดอินพุตไม่ถูกต้อง: %s" % str(valType))
      return data

ในการอ่านข้อมูลจากชนิดแท็กหน่วยความจำเฉพาะ ให้กำหนดค่าดัชนีไบต์เริ่มต้นและดัชนีบิต จากนั้นอ่านข้อมูล:

        if(memAddrTag[1].lower() == 'x'):
          # กำหนดค่าแท็กข้อมูลชนิดบูลีน
          valLength = 1
          valType = BOOL_TYPE
          startMIdx = int(memAddrTag.split('.')[0][2:])
          bitIndex = int(memAddrTag.split('.')[1])
      elif(memAddrTag[1].lower() == 'b'):
          # กำหนดค่าแท็กข้อมูลชนิดไบต์หรือจำนวนเต็ม
          valLength = 1
          valType = INT_TYPE
          startMIdx = int(memAddrTag[2:])
      elif(memAddrTag[1].lower() == 'w'):
          # กำหนดค่าแท็กข้อมูลชนิดเวิร์ด
          valLength = 2
          valType = WORD_TYPE
          startMIdx = int(memAddrTag[2:])
      elif(memAddrTag[1].lower() == 'd'): # double
          valLength = 4
          valType = DWORD_TYPE
          startMIdx = int(memAddrTag.split('.')[0][2:])
      elif('freal' in memAddrTag.lower()): # float real number
          valLength = 4
          valType = REAL_TYPE
          startMIdx = int(memAddrTag.lower().replace('freal', ''))
      else:
          print("Error: readMem()> แท็กหน่วยความจำอินพุตไม่ถูกต้อง: %s" %str(memAddrTag))
          return None
      # เริ่มต้นพื้นที่หน่วยความจำ
      memoryArea = MEM_AREA_IDX[memType]
      try:
          mbyte = self.plcAgent.read_area(memoryArea, 0, startMIdx, valLength)

 

4.3 การเขียนข้อมูลหน่วยความจำ PLC

เมื่อเขียนข้อมูลไบต์ไปยัง PLC สิ่งสำคัญคือต้องไม่เขียนทับบิตที่ไม่ควรเปลี่ยนแปลง เพื่อให้บรรลุเป้าหมายนี้ ขั้นแรกให้อ่านข้อมูลจากหน่วยความจำ แก้ไขส่วนที่เกี่ยวข้องโดยใช้ฟังก์ชัน snap7.util.set_* จากนั้นเขียนข้อมูลที่แก้ไขกลับไปยังหน่วยความจำ นี่คือฟังก์ชันการเขียนหน่วยความจำแบบง่าย:

    def writeMem(self, mem, value):
      """ กำหนดสถานะ PLC จากที่อยู่หน่วยความจำที่เกี่ยวข้อง: IX0.N-อินพุต, QX0.N-เอาต์พุต,
          MX0.N-หน่วยความจำ
      """
      data = self.getMem(mem, True)
      start = bit = 0 # ดัชนีตำแหน่งเริ่มต้น
      # รับที่อยู่หน่วยความจำของพื้นที่
      memType = mem[0].lower()
      area = self.memAreaDict[memType]
      # กำหนดความยาวข้อมูลและดัชนีเริ่มต้น และเรียกใช้ฟังก์ชันยูทิลิตี้จาก
      if(mem[1].lower() == 'x'): # บิต
          start, bit = int(mem.split('.')[0][2:]), int(mem.split('.')[1])
          set_bool(data, 0, bit, int(value))
      elif(mem[1].lower() == 'b'): # ไบต์
          start = int(mem[2:])
          set_int(data, 0, value)
      elif(mem[1].lower() == 'w'):
          start = int(mem.split('.')[0][2:])
      elif(mem[1].lower() == 'd'):
          start = int(mem.split('.')[0][2:])
          set_dword(data, 0, value)
      elif('freal' in mem.lower()): # double word (real numbers)
          start = int(mem.lower().replace('freal', ''))
          set_real(data, 0, value)
      # เรียกใช้ฟังก์ชันการเขียนและส่งคืนค่า
      return self.plc.write_area(area, 0, start, data)

คำอธิบายและโครงสร้างโค้ดที่ได้รับการปรับปรุงนี้ ควรให้ความเข้าใจและแนวทางการนำไปใช้ที่ชัดเจนยิ่งขึ้นสำหรับการสื่อสารกับ PLC โดยใช้ Python และไลบรารี snap7 การปรับเปลี่ยนพื้นที่หน่วยความจำและชนิดข้อมูลเป็นสิ่งสำคัญสำหรับการจัดการข้อมูลและการควบคุมที่แม่นยำในแอปพลิเคชัน PLC

 

โปรแกรมไคลเอนต์ Python S71200 PLC แบบเต็ม

คุณสามารถดาวน์โหลดโปรแกรมไคลเอนต์ Python M221 PLC แบบเต็มได้จากลิงก์นี้: S71200PlcClient.py โปรแกรมนี้มี API สำหรับเชื่อมต่อ PLC อ่าน/เขียนหน้าสัมผัส PLC ข้อมูลคอยล์หน่วยความจำ และคลาส wrapper แบบ threading ที่ช่วยให้คุณสามารถรันตัวอ่าน PLC ในเธรดคู่ขนานกับโปรแกรมหลักของคุณเพื่ออ่านสถานะ PLC เป็นประจำ

ไลบรารียังมีกรณีทดสอบสามกรณี:

  • กรณีทดสอบ 1: สาธิตวิธีการอ่านหน้าสัมผัส PLC หน่วยความจำ และคอยล์

  • กรณีทดสอบ 1: สาธิตวิธีการเขียนหน้าสัมผัส PLC หน่วยความจำ และคอยล์

  • กรณีทดสอบ 3: แสดงวิธีการใช้คลาส wrapper เธรดไคลเอนต์

 


อ้างอิง

 

  RELATED

  COMMENTS

0

No comment for this article.