본문 바로가기
파이썬/파이썬

[ 파이썬 ] LS 산전 XGT PLC 시리얼 통신(C-NET) 하기

by jeong-f 2022. 1. 14.
반응형

LS 산전의 PLC와 시리얼(RS232) 통신을 위해 간단한 프로그램을 구현해 보았습니다.
C# 코드에서 사용해본 방법을  사이트 참고를 통해 기본 코드를 받아 좀 더 직관적으로 코드를 수정해 보았습니다.

통신 프로토콜( 연속 읽기)

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
'''
pip install pyserial
'''
 
from dataclasses import dataclass, field
import serial
 
# 통신용 클래스 -------------------------------------------------
@dataclass(unsafe_hash=True)
class ReadCommd:
    Station_no : str
    Instruction : str
    No_of_blocks : str
    Variable_Length : str
    Variable_Name : str
    
    @property
    def protocol(self):
        
        cmd = '\x05{0}{1}{2}{3}{4}\x04'.format(
            self.Station_no,
            self.Instruction,
            self.No_of_blocks,
            self.Variable_Length,
            self.Variable_Name)
        
        #문자열-->바이트
        return cmd.encode(encoding="utf-8")
 
# 메인 함수 ---------------------------------------------------
if  __name__  ==  '__main__':
    
    #시리얼 포트 연결(COM1,9600,n,1,8)
    ser = serial.Serial(
        port='COM1'
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
        )
 
    # 읽기 명령 생성
    tx = ReadCommd('00','RSS','01','06','%MW100').protocol
    
    # 데이터 쓰기
    ser.write(tx, encoding = "utf-8")
 
    #데이터 읽기
    rx = ser.readline().decode('utf-8')
 
    if rx[:1== chr(6):    # <ACK> (0x06)
        int(rx[-5:-1], 16)   # 16진수로 리턴되는 카운트를 10진수로 변환
    elif rx[:1== chr(21): # <NAK> (0x15)
        print('Error = ' + rx[-5:-1])  # 부록 3.1 XGT 서버 에러코드'를 참고
 
    # 포트닫기
    ser.close()
 
 
cs

PLC 통신 매뉴얼

XGT Cnet 사용설명서 Kor.pdf
15.97MB

참고 사이트

 

PLC - Python 시리얼 통신 1

PC에서 파이썬으로 PLC를 제어하고 PLC로부터 가져온 데이터를 표현하는 최종적으로는 버튼을 누르...

blog.naver.com

 

반응형

댓글