Ini adalah postingan yang berisi source code dari konten youtube yang ini
https://youtu.be/MAsLiWGNPB0?si=CTTIBArOIXElGZL3
Adapun source codenya adalah ini
----------------
import tkinter as tk
from tkinter import messagebox
from pymodbus.client.sync import ModbusTcpClient
class ScadaPLCApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("SISTEM KONTROL MULTI-OUTPUT FX3U")
self.geometry("400x500")
# Parameter PLC
self.plc_ip = '192.168.0.7'
self.plc_port = 502
self.slave_id = 1
# List untuk menyimpan referensi widget agar bisa diupdate
self.outputs = range(6) # Y0 sampai Y5
self.canvases = [] # Menyimpan objek canvas
self.lamp_ids = [] # Menyimpan ID oval di dalam canvas
self._setup_ui()
def _setup_ui(self):
tk.Label(self, text="MODBUS TCP CONTROL PANEL",
font=("Arial", 14, "bold")).pack(pady=20)
main_frame = tk.Frame(self)
main_frame.pack(padx=20)
for i in self.outputs:
row = tk.Frame(main_frame, pady=5)
row.pack(fill="x")
tk.Label(row, text=f"Output Y{i}", width=10).pack(side="left")
# Membuat Canvas untuk Lampu
cvs = tk.Canvas(row, width=30, height=30, highlightthickness=0)
cvs.pack(side="left", padx=10)
# Menggambar lingkaran dan menyimpan ID-nya
lamp_id = cvs.create_oval(5, 5, 25, 25, fill="gray")
# SIMPAN referensi ke list agar bisa dipanggil nanti
self.canvases.append(cvs)
self.lamp_ids.append(lamp_id)
# Tombol ON/OFF
tk.Button(row, text="ON", bg="#2ecc71", fg="white", width=6,
command=lambda a=i: self.kontrol_plc(a, True)).pack(side="left", padx=2)
tk.Button(row, text="OFF", bg="#e74c3c", fg="white", width=6,
command=lambda a=i: self.kontrol_plc(a, False)).pack(side="left", padx=2)
def update_visual_lampu(self, index, status):
"""Mengubah warna oval berdasarkan index baris"""
warna = "yellow" if status else "gray"
# Ambil canvas yang sesuai, lalu ubah warna item di dalamnya
self.canvases[index].itemconfig(self.lamp_ids[index], fill=warna)
def kontrol_plc(self, address, status):
client = ModbusTcpClient(self.plc_ip, port=self.plc_port)
try:
if client.connect():
res = client.write_coil(address, status, unit=self.slave_id)
if not res.isError():
# UPDATE VISUAL DI SINI
self.update_visual_lampu(address, status)
kondisi = "NYALA" if status else "MATI"
messagebox.showinfo("Berhasil", f"Y{address} sekarang {kondisi}")
else:
messagebox.showerror("Gagal", f"PLC menolak perintah Y{address}")
else:
messagebox.showerror("Koneksi", "Gagal konek ke PLC")
except Exception as e:
messagebox.showerror("Error", str(e))
finally:
client.close()
if __name__ == "__main__":
app = ScadaPLCApp()
app.mainloop()
Komentar
Posting Komentar