Langsung ke konten utama

membuat scada python berparadigma oop sederhana yang mengendalikan plc fx3u

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