Python and PLC Communication

  liuyuancheng        2024-06-30 02:21:17       1,957        0          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

บทความนี้ให้ขั้นตอนโดยละเอียดเกี่ยวกับวิธีการใช้ 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


  0 COMMENT


No comment for this article.



  RANDOM FUN

After quitting the job