저번 시간에 만든 코드를 바탕으로 exe(실행파일)로 PC 프로그램에서 버튼을 누르면 PLC OUT 부분 LED가 켜지는 방식의 파일을 만들어 보겠습니다.
이번 시간 결과물
우선 파이썬에서 exe 파일을 만들어야 합니다.
간단하게 tkinter라는 Python 설치시 기본적으로 내장되어 있는 파이썬 표준 라이브러리를 이용해서 쉽고 간단한 GUI 프로그램을 만들어 보겠습니다.
from tkinter import *
root = Tk()
# 코드 삽입
root.mainloop()
1. tkinter 모듈을 import
2. Tk 클래스 객체(root)를 생성
3. 이 객체의 mainloop() 메서드를 호출
mainloop()는 이벤트 메시지 루프로서 키보드나 마우스와 같은 다양한 이벤트로 부터 오는 메시지를 받고 전달하는 역활을 합니다.
기본 프레임 작업
from tkinter import *
root = Tk()
root.title("시리얼 통신") # 제목
root.geometry("480x480+300+100") # 가로 세로 + x좌표 + y좌표
root.mainloop()
root.title은 창맨 위에 나오는 프로그램 제목 입니다.
root.geometry는 창 크기를 조절할수 있습니다.
결과
버튼 추가하기
from tkinter import *
root = Tk()
root.title("시리얼 통신") # 제목
root.geometry("480x480+300+100") # 가로 세로 + x좌표 + y좌표
btn1 = Button(root, text="1번 버튼")
btn1.grid(row=0, column=0)
btn2 = Button(root, text="2번 버튼")
btn2.grid(row=0, column=1)
btn3 = Button(root, text="3번 버튼")
btn3.grid(row=1, column=0)
btn4 = Button(root, text="4번 버튼")
btn4.grid(row=1, column=1)
root.mainloop()
btn1 = 1번 버튼 이라는 text를 가진 버튼 입니다.
그 밑의 그리드는 좌표로 버튼의 위치를 나타내 줍니다.
결과
동작하는 버튼 만들기
from tkinter import *
root = Tk()
root.title("시리얼 통신") # 제목
root.geometry("480x480+300+100") # 가로 세로 + x좌표 + y좌표
def btn1_cmd():
print("hello")
btn1 = Button(root, text="1번 버튼", command=btn1_cmd)
btn1.grid(row=0, column=0)
root.mainloop()
버튼을 누르면 command에 btn1_cmd 라는 함수를 실행 시킵니다.
결과
구상하기
1. PLC의 OUT 부분과 똑같이 만들어서 버튼을 누르면 해당 번호의 LED가 켜지게 만들기.
2. 초기화 버튼과 ALL 버튼을 만들어서 초기화 버튼을 누르면 PLC의 LED가 전부다 꺼지고 ALL 버튼을 누르면 전부다 켜지게 만들기.
3. 1편에서 나온 시리얼통신을 사용해서 버튼을 누르면 해당번호의 데이터를 PLC로 보내서 PLC의 LED가 켜지게 만들기. (총 16개의 번호버튼과 2개의 초기화 ALL 버튼이 필요)
4. 버튼안에 ser.write를 넣어서 버튼을 누르면 해당하는 데이터를 보내고 답장도 받아서 잘 도착했는지 python에서도 확인해야 합니다.
최종 작업
import serial
from tkinter import *
ser = serial.Serial('COM3', 9600, timeout=1)
root = Tk()
root.title("시리얼 통신") root.geometry("480x480+300+100")
def btncmd_z():
ser.write(b'\x0501WSS0106%PW0020000\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_0():
ser.write(b'\x0501WSS0106%PW0020001\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_1():
ser.write(b'\x0501WSS0106%PW0020002\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_2():
ser.write(b'\x0501WSS0106%PW0020004\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_3():
ser.write(b'\x0501WSS0106%PW0020008\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_4():
ser.write(b'\x0501WSS0106%PW0020010\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_5():
ser.write(b'\x0501WSS0106%PW0020020\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_6():
ser.write(b'\x0501WSS0106%PW0020040\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_7():
ser.write(b'\x0501WSS0106%PW0020080\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_8():
ser.write(b'\x0501WSS0106%PW0020100\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_9():
ser.write(b'\x0501WSS0106%PW0020200\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_A():
ser.write(b'\x0501WSS0106%PW0020400\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_B():
ser.write(b'\x0501WSS0106%PW0020800\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_C():
ser.write(b'\x0501WSS0106%PW0021000\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_D():
ser.write(b'\x0501WSS0106%PW0022000\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_E():
ser.write(b'\x0501WSS0106%PW0024000\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_F():
ser.write(b'\x0501WSS0106%PW0028000\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
def btncmd_all():
ser.write(b'\x0501WSS0106%PW002FFFF\x04')
readOut = ser.readline().decode('ascii')
print(readOut)
btn_0 = Button(root, text="20", command=btncmd_0, width=5, height=2)
btn_1 = Button(root, text="21", command=btncmd_1, width=5, height=2)
btn_2 = Button(root, text="22", command=btncmd_2, width=5, height=2)
btn_3 = Button(root, text="23", command=btncmd_3, width=5, height=2)
btn_0.grid(row=1, column=1, padx=5, pady=5)
btn_1.grid(row=1, column=2, padx=5, pady=5)
btn_2.grid(row=1, column=3, padx=5, pady=5)
btn_3.grid(row=1, column=4, padx=5, pady=5)
btn_4 = Button(root, text="24", command=btncmd_4, width=5, height=2)
btn_5 = Button(root, text="25", command=btncmd_5, width=5, height=2)
btn_6 = Button(root, text="26", command=btncmd_6, width=5, height=2)
btn_7 = Button(root, text="27", command=btncmd_7, width=5, height=2)
btn_4.grid(row=1, column=5, padx=5, pady=5)
btn_5.grid(row=1, column=6, padx=5, pady=5)
btn_6.grid(row=1, column=7, padx=5, pady=5)
btn_7.grid(row=1, column=8, padx=5, pady=5)
btn_8 = Button(root, text="28", command=btncmd_8, width=5, height=2)
btn_9 = Button(root, text="29", command=btncmd_9, width=5, height=2)
btn_A = Button(root, text="2A", command=btncmd_A, width=5, height=2)
btn_B = Button(root, text="2B", command=btncmd_B, width=5, height=2)
btn_8.grid(row=2, column=1, padx=5, pady=5)
btn_9.grid(row=2, column=2, padx=5, pady=5)
btn_A.grid(row=2, column=3, padx=5, pady=5)
btn_B.grid(row=2, column=4, padx=5, pady=5)
btn_C = Button(root, text="2C", command=btncmd_C, width=5, height=2)
btn_D = Button(root, text="2D", command=btncmd_D, width=5, height=2)
btn_E = Button(root, text="2E", command=btncmd_E, width=5, height=2)
btn_F = Button(root, text="2F", command=btncmd_F, width=5, height=2)
btn_C.grid(row=2, column=5, padx=5, pady=5)
btn_D.grid(row=2, column=6, padx=5, pady=5)
btn_E.grid(row=2, column=7, padx=5, pady=5)
btn_F.grid(row=2, column=8, padx=5, pady=5)
btn_k = Button(root, fg="red", text="초기화", command=btncmd_z, width=5, height=2)
btn_k.grid(row=3, column=1, padx=5, pady=10)
btn_all = Button(root, fg="blue", text="ALL", command=btncmd_all, width=5, height=2)
btn_all.grid(row=3, column=2, padx=5, pady=10)
root.mainloop()

ALL 버튼을 클리시 PLC 실시간 모습
다음 시간에는 IN 부분을 만들어 보겠습니다.
감사합니다.