Implementasi Kontroller PID Berbasis Komputer Menggunakan Visual Basic

Print
Category: Listrik & Elektronika
Last Updated on Wednesday, 11 February 2015 Published Date Written by Agus Putranto

IMPLEMENTASI KONTROLLER PID BERBASIS KOMPUTER MENGGUNAKAN VISUAL BASIC

 

Oleh : Agus Putranto, S.Pd., M.Sc.

(Widyaiswara Departemen Elektro - PPPPTK BOE Malang)

 

Abstrak:

Pada proses perancangan sistim kontrol, komputer sering dipergunakan sebagai alat untuk mensimulasikan dan menemukan parameter kontrol yang optimal sebelum kontroller yang sebenarnya dibuat. Dengan software Simulink Matlab suatu kontroller PID dapat disimulasikan dan performa kontrol dapat dilihat melalui tampilan scope. Rancangan sistim kontrol  tidak berhenti pada tahapan simulasi melainkan sampai tahapan implementasi yaitu bagaimana rancangan kontrol pada komputer dapat direalisasikan.

Untuk mengimplementasikan suatu kontroller PID berbasis komputer ini diperlukan perangkat keras (hardware) dan perangkat lunak (software). Perangkat keras berupa komputer, Perangkat antar muka ADC, DAC dan penguat daya. Perangkat lunak berupa program aplikasi yang pada artikel ini dibuat menggunakan Visual Basic. Algorithma kontrol PID harus diubah dalam suatu bentuk transfer function diskret dan persamaan differensial yang selanjutnya diterjemahkan menjadi suatu program aplikasi yang dipasang pada komputer dengan visualisasi Graphic User Interface.

Dari eksperimen PID diskret berbasis komputer dengan sampling time 0.1 detik, kecepatan yang yang dikehendaki diatur pada 1.30 Volt (195 rpm) dan parameter PID diatur dengan nilai Kp = 1.00, Ki = 0.50 dan Kd = 0, diperoleh hasil bahwa motor dari kondisi berhenti kemudian mulai berputar dengan lembut mencapai kecepatan yang dikehendaki dalam waktu 7 detik.

 

Kata kunci:  Kontroller PID, Berbasis komputer, Visual Basic

 

 

PENDAHULUAN

 

Motor DC adalah aktuator yang banyak digunakan dalam sistim kontrol. Motor menyediakan gerakan putar secara langsung yang selanjutnya dapat dikopel dengan roda gigi atau belt untuk menghasilkan gerakan translasional.

 

Suatu motor DC di bawah ini akan dikontrol kecepatannya menggunakan suatu kontroller PID.

 

 

Gambar 1. Motor DC

 

Pada umumnya perancangan sistim kontrol kecepatan motor DC dilakukan dengan menggunakan software Simulink Matlab dengan diagram blok sebagai berikut

 

 

Gambar 2. Diagram blok pengaturan kecepatan motor DC

 

Plant berupa motor DC yang dikopel dengan motor DC yang sama untuk mengubah putaran menjadi tegangan DC sebagai sensor kecepatan putaran. Plant mendapatkan tegangan control dari controller PID dan keluaran plant berupa tegangan DC yang merepresentasikan kecepatan actual dari putaran motor. Parameter numerator dan denumerator dari transfer function diskrit diperoleh dari identifikasi plant menggunakan metode Root Least Square orde 2 dengan time sampling 100 ms. Nilai parameter plant tersebut adalah a1 = -0.8297, a2 = -0.0944, b1 = -0.0038 dan b2 = 0.0241

Dalam tahap perancangan, kontrol kecepatan dengan diagram blok di atas selanjutnya disimulasikan menggunakan Simulink Matlab. Parameter plant sudah diketahui dari hail identifikasi, Parameter PID dapat ditentukan dengan mengisi properties blok PID. Desired Value (DV) berupa input step yaitu kecepatan yang dikehendaki atau dalam istilah lain disebut dengan Referensi atau Soll Wert. Berikut ini adalah hasil simulasi yang muncul pada Scope untuk dua macam parameter PID yang berbeda.

 

Mengacu informasi pada nameplate motor bahwa pada tegangan masukan motor 20 Volt DC menghasilkan kecepatan putar 3000 rpm. Maka dengan asumsi bahwa hubungan antara tegangan masukan dan kecepatan putar adalah proporsional yang mendekati linear maka resolusi tegangan sensor kecepatan terhadap kecepatan putar adalah 1 Volt = 150 rpm.

 

Pada simulasi ini besarnya kecepatan yang dihendaki (DV) diatur pada angka 2, artinya tegangan 2 Volt DC yang identik dengan kecepatan 300 rpm.

 

 

Gambar 3. Hasil simulasi pengaturan kecepatan motor DC dengan parameter PID yang berbeda.

 

Melihat hasil simulasi yang ditunjukkan pada gambar di atas bagian kiri, bahwa kontroller PID dengan nilai parameter P = 1, I = 1 dan D = 0 kecepatan motor mencapai nilai yang dikehendaki dalam waktu 20 detik. Apabila parameter PID diubah menjadi P = 1, I = 6 dan D = 0 maka kecepatan motor mencapai nilai yang dikehendaki menjadi lebih cepat tetapi terjadi overshot yang tinggi (lihat gambar 3 bagian kanan). Untuk mendapatkan hasil yang optimal simulasi harus dilakukan berkali kali dengan mengubah nilai parameter PID atau disebut dengan istilah lain tunning. Selain dengan cara uji coba dengan cara simulasi, nilai parameter PID dapat ditenntukan dengan suatu metode perhitungan matematika.

 

Kontroller PID

 

 

Gambar 4. Block Parameters PID Controller

 

Transfer function PID yang ada pada Block Parameters PID Controller Simulink Matlab tertulis P+I/s+Ds yang mana P adalah parameter Proporsional yang biasanya disebut dengan Kp, I adalah parameter Integral yang biasanya disebut dengan Kid an D adalah parameter Deivatif yang biasa disebut dengan Kd. Apabila persamaan transfer functipn PID diekspresikan dalam bentuk diagram blok menjadi sebagai berikut.

 

 

Gambar 5. Diagram blok kontroller PID

 

Dalam hubungannya dengan diagram blok pengaturan kecepatan motor DC loop tertutup pada gambar di atas, maka persamaan transfer function PID dapat diekspresikan sebagai berikut

 

Error (e) = Desired Value (DV) – Actual Value (AV)

outPID = outP + outI+ outD

outPID = (P x e) + (I x 1/s) + (D x de/dt)

 

Karena controller PID ini akan dimplementasikan menggunakan komputer, maka persamaan sistim continue (1/s) harus diubah menjadi persamaan diskrit. Sampling time ditentukan sama seperti yang dipergunakan pada identifikasi plant yaitu 100 mili detik. Matlab dipergunakan untuk mengubah 1/s menjadi diskrit dengan menuliskan intruksi pada command windows sebagai berikut

 

 

Gambar 6. Mengubah persamaan continue ke diskrit

 

Instruksi pertama A=tf(1,[1 0]) membuat variable A berupa transfer function dari integrator 1/s. Instruksi ke dua c2d(A,0.1) mengubah variable A dari continue menjadi transfer function diskrit dengan time sampling 0.1 detik.

Sekarang semua transfer function sudah dalam bentuk diskrit. Sebagai control apakah kontroler tetap menghasilkan keluaran yang benar, maka blok diagram pengaturan kecepatan motor DC dengan menggunakan PID kita simulasikan lagi dan dibandingan dengan keluaran pada blok diagram sebelumnya. Keluaran yang dilihat pada blok Scope harus menghasilkan grafik yang sama.

 

 

Gambar 7. Diagram blok kontroller PID diskrit

 

Untuk keperluan implementasi dalam pembuatan program aplikasi pada komputer, selanjutnya digram blok kontroller PID dalam bentuk transfer disktrit Inetrator harus diubah menjadi persamaan differensial sebagai berikut

 

outI/oI = 0.1 / (z – 1) = 0.1 z-1 / (1 - z-1)

outI x (1 - z-1) = oI z-1 x 0.1

outI – outI z-1 = oI z-1 x 0.1

outI = outI z-1 + (oI z-1 x 0.1)

 

atau dengan kata lain bahwa :

keluaran outI(sekarang) = outI(sebelumnya) + (oI(sebelumnya) x 0.1)

yang mana oI adalah masukan transfer function diskrit integrator sedngankan outI adalah keluaran.

 

Penerjemahan blok diagram kontroller dapat ditulis sebagai berikut

DV = (Desired value, kecepatan yang dikehendaki)

AV = (Actual Value, kecepatan actual keluaran sensor kecepatan yang dipasang pada plant)

P = (nilai parameter Proprosional)

I = (nilai parameter Integral)

D = (nilai parameter Derivative)

dt = (sampling time = 0.1 detik )

enow = error sekarang

eold = error sebelumnya

outPnow = enow * P

oInow = enow * I

outInow = outIold – (oIold * 0.1)

oDnow = enow * D

outDnow = (oDnow – oDold) / dt

 

outPIDnow = outPnow + outInow + outDdow

 

eold = enow

outPold = outPnow

oIold = oinow

outIold = outInow

oDold = oDnow

outDold = outDnow

 

Nilai AV berupa data yang diperoleh dari masukan analog yang diperoleh dari sensor kecepatan yang dipasang pada plant. Data ini nantinya masuk ke komputer melalui perangkat Analog to Digital Converter (ADC) sedangkan data hasil perhitungan PID dalam variable outPIDnow nantinya akan dikeluarkan dari komputer ke plant (motor) melalui perangkat Digital to Analog Converter yang telah dilengkapi dengan penguat daya.

 

Implentasi

Untuk implementasi sistim control PID diskret berbasis komputer ini, diperlukan perangkat keras (hardware) dan perangkat lunak (software). Perangkat keras dapat berupa  komputer pribadi (PC), laptop atupun Industrial PC. Sedangkan software berupa program aplikasi yang dibuat dari suatu Integrated Development Integrated yang pada artikel ini dibuat dari Visual Basic. Untuk perangkat antarmuka (interface) yang menghubungkan antara komputer dan plant dibangun dari mikrokontroller yang memiliki sambungan ke komputer melalui saluran Universal Serial Bus (USB).

ADC pada interface merupakan fasilitas internal dari chip mikrokontroller sedangkan DAC dapat dibagun dari fasilitas PWM yang juga merupakan fasilitas internal mikrokontroller yang diperkuat dengan penguat daya ekternal. Rangkaian tambahan lain yang diperlukan oleh mikrokontroller adalah rangkaian interface RS232 dan RS232 to USB Converter untuk sambungan ke komputer.

 

 

Gambar 8. Diagram blok implementasi kontroller PID diskrit

 

 

Gambar 9. Rangkaian perangkat implementasi controller PID diskrit

 

Algorithma sistim kontrol PID diimplentasikan dengan visualisasi menggunakan Graphic User Interface (GUI) berupa tampilan Scope dengan data bergerak menampilkan kondisi Kecepatan yang dikehendaki (DV) dan kecepatan actual (AV) pada satu layar scope. Masukan untuk kecepatan yang dikehendaki berupa Horizontal Scroll Bar yang dapat digeser mulai nilai 0.00 Volt (stop) sampai kecepatan 5.00 Volt ( 750 rpm). Nilai parameter PID dapat diatur menggunakan Horizontal Scroll Bar mulai nilai 0.00 sampai dengan 10.00. Tampilan visualisasi program aplikasi kontroller PID pada layar komputer ditunjukkan pada gambar berikut.

 

 

Gambar 10. Tampilan visualisasi program aplikasi kontroller PID

 

Tampak pada gambar di atas, dengan masukan step, DV diatur pada 1.30 Volt (195 rpm) dan parameter PID diatur dengan nilai Kp = 1.00, Ki = 0.50 dan Kd = 0, motor dari kondisi berhenti kemudian mulai berputar dengan lembut mencapai kecepatan yang dikehendaki dalam waktu 7 detik. Untuk mempercepat steady state tanpa overshoot, nilai parameter PID dapat diubah agar dicapai hasil yang optimal.

 

 

KESIMPULAN

 

Untuk mengimplementasikan suatu kontroller PID berbasis komputer ini diperlukan perangkat keras (hardware) dan perangkat lunak (software).

 

Perangkat keras berupa komputer, Perangkat antar muka ADC, DAC dan penguat daya.

 

Perangkat lunak berupa program aplikasi yang pada artikel ini dibuat menggunakan Visual Basic.

 

Algorithma kontrol PID harus diubah dalam suatu bentuk transfer function diskret dan persamaan differensial yang selanjutnya diterjemahkan menjadi suatu program aplikasi yang dipasang pada komputer dengan visualisasi Graphic User Interface.

 

 

DAFTAR RUJUKAN

Stuart Sanders, K. Schwebel, DIGITAL CONTROL SYSTEMS, University of Applied Sciences FH-Daramstadt

 

http://www.dii.unisi.it/~control/ctm/examples/motor/PID2.html

 

Richard C. Dorf and Robert H. Bishop, “MODERN CONTROL SYSTEMS”, Prentice-Hall, Inc. Upper Saddle River, New Jersey 07458, 2001

 

Katshuhiko Ogata, “TEKNIK KONTROL AUTOMATIK”, Jilid 1, Penerbit Erlangga, Jakarta 13740, 1997

 

Robert L. Woods and Kent L. Lawrence, “MEDELING AND SIMULATIONS OF DYNAMIC SYSTEMS”, Prentice-Hall, Inc. Upper Saddle River, New Jersey 07458, 1997

 

 

LISTING PROGRAM

 

Berikut ini adalah listing program kontroller PID diskrit dengan menggunakan Visual Basic

 

Dim FileNo, Counter, k, q As Integer

Dim GetValues() As String

Dim ts, du, dt, DV, AV, Kp, Ki, Kd, POut, eio, eiold, IOut, IOutold, edo, edoold, DOut, PIDOut As Double

Dim i, UX1, UY1, UX2, UY2, YX1, YY1, YX2, YY2, OutPID As Double

Dim d1, d2, d3, d4, d5, d6 As String

 

Private Sub Command1_Click()

If Timer1.Enabled = False Then

    Timer1.Enabled = True

    Command1.Caption = "Stop"

Else

    Timer1.Enabled = False

    Command1.Caption = "Start"

    MSComm1.Output = "P000"

End If

End Sub

 

Private Sub Command2_Click()

'inisialisasi

i = 0

ts = 0.1

Timer1.Interval = 100

Timer1.Enabled = False

Command1.Caption = "Start"

'HScroll1.Value = 0

'HScroll2.Value = 0

'HScroll3.Value = 0

DV = HScroll1.Value * (1 / 100)

Kp = HScroll2.Value * (1 / 100)

Ki = HScroll3.Value * (1 / 100)

Kd = HScroll4.Value * (1 / 100)

eiold = 0

IOutold = 0

edoold = 0

e = 0

PIDOut = 0

OutPID = 0

AV = 0

Label15.Caption = "DV = " + Format(DV, "#0.00 Volt")

Label16.Caption = "Kp = " + Format(Kp, "#0.00")

Label17.Caption = "Ki = " + Format(Ki, "#0.00")

Label18.Caption = "Kd = " + Format(Kd, "#0.00")

Form1.Cls

UX1 = Shape1.Left

UY1 = Shape1.Top + Shape1.Height

YX1 = Shape1.Left

YY1 = Shape1.Top + Shape1.Height

Line23.X1 = Shape1.Left

Line23.X2 = Shape1.Left

Line23.Y1 = Shape1.Top

Line23.Y2 = Shape1.Top + Shape1.Height

End Sub

 

Private Sub Command3_Click()

On Error Resume Next

MSComm1.PortOpen = True

If Err Then

    MsgBox "COM" + Str(MSComm1.CommPort) + " tidak bisa dipakai, ganti COM yang lain"

    MSComm1.PortOpen = False

    Command1.Enabled = False

    Command2.Enabled = False

    Command3.Enabled = True

    Command4.Enabled = False

    Option1.Enabled = True

    Option2.Enabled = True

    Option3.Enabled = True

    Option4.Enabled = True

    Timer1.Enabled = False

    Command1.Caption = "Start"

    Exit Sub

End If

MSComm1.PortOpen = True

Command1.Enabled = True

Command2.Enabled = True

Command3.Enabled = False

Command4.Enabled = True

Option1.Enabled = False

Option2.Enabled = False

Option3.Enabled = False

Option4.Enabled = False

MSComm1.Output = "P000"

End Sub

 

Private Sub Command4_Click()

MSComm1.PortOpen = False

Command1.Enabled = False

Command2.Enabled = False

Command3.Enabled = True

Command4.Enabled = False

Option1.Enabled = True

Option2.Enabled = True

Option3.Enabled = True

Option4.Enabled = True

Timer1.Enabled = False

Command1.Caption = "Start"

End Sub

 

Private Sub Command5_Click()

If MSComm1.PortOpen = True Then MSComm1.Output = "P000"

End

End Sub

 

Private Sub Command6_Click()

MSComm1.Output = "a000"

End Sub

 

Private Sub Command7_Click()

MSComm1.Output = "a001"

End Sub

 

Private Sub Form_Load()

'inisialisasi

Option1.Value = False

Option2.Value = True

Option3.Value = False

Option4.Value = False

MSComm1.CommPort = 2

MSComm1.Settings = "4800,N,8,1"

Command1.Enabled = False

Command2.Enabled = False

Command3.Enabled = True

Command4.Enabled = False

i = 0

ts = 0.1

UX1 = Shape1.Left

UY1 = Shape1.Top + Shape1.Height

YX1 = Shape1.Left

YY1 = Shape1.Top + Shape1.Height

 

Timer1.Interval = 100

Timer1.Enabled = False

Command1.Caption = "Start"

HScroll1.Max = 500

HScroll1.Min = 0

HScroll2.Max = 1000

HScroll2.Min = 0

HScroll3.Max = 1000

HScroll3.Min = 0

HScroll4.Max = 1000

HScroll4.Min = 0

HScroll1.Value = 0

HScroll2.Value = 0

HScroll3.Value = 0

DV = HScroll1.Value * (1 / 100)

Kp = HScroll2.Value * (1 / 100)

Ki = HScroll3.Value * (1 / 100)

Kd = HScroll4.Value * (1 / 100)

eiold = 0

IOutold = 0

edoold = 0

PIDOut = 0

e = 0

Label15.Caption = "DV = " + Format(DV, "#0.00 Volt")

Label16.Caption = "Kp = " + Format(Kp, "#0.00")

Label17.Caption = "Ki = " + Format(Ki, "#0.00")

Label18.Caption = "Kd = " + Format(Kd, "#0.00")

Label19.Caption = "Dout = " + "P" + Format(OutPID, "000")

Label20.Caption = "e = " + Format(e, "#0.00")

Label12.Caption = "Din =" + d1

Label21.Caption = "PIDOut = " + Format(PIDOut, "#0.00")

'Mengatur garis pada shape

'Garis Horisontal

Line1.X1 = Shape1.Left

Line1.X2 = Shape1.Left + Shape1.Width

Line1.Y1 = Shape1.Top + (1 * (Shape1.Height / 8))

Line1.Y2 = Shape1.Top + (1 * (Shape1.Height / 8))

Line2.X1 = Shape1.Left

Line2.X2 = Shape1.Left + Shape1.Width

Line2.Y1 = Shape1.Top + (2 * (Shape1.Height / 8))

Line2.Y2 = Shape1.Top + (2 * (Shape1.Height / 8))

Line3.X1 = Shape1.Left

Line3.X2 = Shape1.Left + Shape1.Width

Line3.Y1 = Shape1.Top + (3 * (Shape1.Height / 8))

Line3.Y2 = Shape1.Top + (3 * (Shape1.Height / 8))

Line4.X1 = Shape1.Left

Line4.X2 = Shape1.Left + Shape1.Width

Line4.Y1 = Shape1.Top + (4 * (Shape1.Height / 8))

Line4.Y2 = Shape1.Top + (4 * (Shape1.Height / 8))

Line5.X1 = Shape1.Left

Line5.X2 = Shape1.Left + Shape1.Width

Line5.Y1 = Shape1.Top + (5 * (Shape1.Height / 8))

Line5.Y2 = Shape1.Top + (5 * (Shape1.Height / 8))

Line6.X1 = Shape1.Left

Line6.X2 = Shape1.Left + Shape1.Width

Line6.Y1 = Shape1.Top + (6 * (Shape1.Height / 8))

Line6.Y2 = Shape1.Top + (6 * (Shape1.Height / 8))

Line7.X1 = Shape1.Left

Line7.X2 = Shape1.Left + Shape1.Width

Line7.Y1 = Shape1.Top + (7 * (Shape1.Height / 8))

Line7.Y2 = Shape1.Top + (7 * (Shape1.Height / 8))

 

'Garis vertikal

Line8.X1 = Shape1.Left + (1 * (Shape1.Width / 16))

Line8.X2 = Shape1.Left + (1 * (Shape1.Width / 16))

Line8.Y1 = Shape1.Top + Shape1.Height

Line8.Y2 = Shape1.Top

Line9.X1 = Shape1.Left + (2 * (Shape1.Width / 16))

Line9.X2 = Shape1.Left + (2 * (Shape1.Width / 16))

Line9.Y1 = Shape1.Top + Shape1.Height

Line9.Y2 = Shape1.Top

Line10.X1 = Shape1.Left + (3 * (Shape1.Width / 16))

Line10.X2 = Shape1.Left + (3 * (Shape1.Width / 16))

Line10.Y1 = Shape1.Top + Shape1.Height

Line10.Y2 = Shape1.Top

Line11.X1 = Shape1.Left + (4 * (Shape1.Width / 16))

Line11.X2 = Shape1.Left + (4 * (Shape1.Width / 16))

Line11.Y1 = Shape1.Top + Shape1.Height

Line11.Y2 = Shape1.Top

Line12.X1 = Shape1.Left + (5 * (Shape1.Width / 16))

Line12.X2 = Shape1.Left + (5 * (Shape1.Width / 16))

Line12.Y1 = Shape1.Top + Shape1.Height

Line12.Y2 = Shape1.Top

Line13.X1 = Shape1.Left + (6 * (Shape1.Width / 16))

Line13.X2 = Shape1.Left + (6 * (Shape1.Width / 16))

Line13.Y1 = Shape1.Top + Shape1.Height

Line13.Y2 = Shape1.Top

Line14.X1 = Shape1.Left + (7 * (Shape1.Width / 16))

Line14.X2 = Shape1.Left + (7 * (Shape1.Width / 16))

Line14.Y1 = Shape1.Top + Shape1.Height

Line14.Y2 = Shape1.Top

Line15.X1 = Shape1.Left + (8 * (Shape1.Width / 16))

Line15.X2 = Shape1.Left + (8 * (Shape1.Width / 16))

Line15.Y1 = Shape1.Top + Shape1.Height

Line15.Y2 = Shape1.Top

Line16.X1 = Shape1.Left + (9 * (Shape1.Width / 16))

Line16.X2 = Shape1.Left + (9 * (Shape1.Width / 16))

Line16.Y1 = Shape1.Top + Shape1.Height

Line16.Y2 = Shape1.Top

Line17.X1 = Shape1.Left + (10 * (Shape1.Width / 16))

Line17.X2 = Shape1.Left + (10 * (Shape1.Width / 16))

Line17.Y1 = Shape1.Top + Shape1.Height

Line17.Y2 = Shape1.Top

Line18.X1 = Shape1.Left + (11 * (Shape1.Width / 16))

Line18.X2 = Shape1.Left + (11 * (Shape1.Width / 16))

Line18.Y1 = Shape1.Top + Shape1.Height

Line18.Y2 = Shape1.Top

Line19.X1 = Shape1.Left + (12 * (Shape1.Width / 16))

Line19.X2 = Shape1.Left + (12 * (Shape1.Width / 16))

Line19.Y1 = Shape1.Top + Shape1.Height

Line19.Y2 = Shape1.Top

Line20.X1 = Shape1.Left + (13 * (Shape1.Width / 16))

Line20.X2 = Shape1.Left + (13 * (Shape1.Width / 16))

Line20.Y1 = Shape1.Top + Shape1.Height

Line20.Y2 = Shape1.Top

Line21.X1 = Shape1.Left + (14 * (Shape1.Width / 16))

Line21.X2 = Shape1.Left + (14 * (Shape1.Width / 16))

Line21.Y1 = Shape1.Top + Shape1.Height

Line21.Y2 = Shape1.Top

Line22.X1 = Shape1.Left + (15 * (Shape1.Width / 16))

Line22.X2 = Shape1.Left + (15 * (Shape1.Width / 16))

Line22.Y1 = Shape1.Top + Shape1.Height

Line22.Y2 = Shape1.Top

Line23.X1 = Shape1.Left

Line23.X2 = Shape1.Left

Line23.Y1 = Shape1.Top

Line23.Y2 = Shape1.Top + Shape1.Height

 

'Mengatur label skala sumbu y

Label1.Height = 250

Label2.Height = 250

Label3.Height = 250

Label4.Height = 250

Label5.Height = 250

Label6.Height = 250

Label7.Height = 250

Label8.Height = 250

Label9.Height = 250

Label1.Height = 250

Label1.Width = 615

Label2.Width = 615

Label3.Width = 615

Label4.Width = 615

Label5.Width = 615

Label6.Width = 615

Label7.Width = 615

Label8.Width = 615

Label9.Width = 615

Label1.Alignment = 1 ' rata kanan

Label2.Alignment = 1 ' rata kanan

Label3.Alignment = 1 ' rata kanan

Label4.Alignment = 1 ' rata kanan

Label5.Alignment = 1 ' rata kanan

Label6.Alignment = 1 ' rata kanan

Label7.Alignment = 1 ' rata kanan

Label8.Alignment = 1 ' rata kanan

Label9.Alignment = 1 ' rata kanan

Label1.Left = Shape1.Left - 700

Label2.Left = Shape1.Left - 700

Label3.Left = Shape1.Left - 700

Label4.Left = Shape1.Left - 700

Label5.Left = Shape1.Left - 700

Label6.Left = Shape1.Left - 700

Label7.Left = Shape1.Left - 700

Label8.Left = Shape1.Left - 700

Label9.Left = Shape1.Left - 700

Label1.Top = Shape1.Top + (0 * (Shape1.Height / 8)) - 125

Label2.Top = Shape1.Top + (1 * (Shape1.Height / 8)) - 125

Label3.Top = Shape1.Top + (2 * (Shape1.Height / 8)) - 125

Label4.Top = Shape1.Top + (3 * (Shape1.Height / 8)) - 125

Label5.Top = Shape1.Top + (4 * (Shape1.Height / 8)) - 125

Label6.Top = Shape1.Top + (5 * (Shape1.Height / 8)) - 125

Label7.Top = Shape1.Top + (6 * (Shape1.Height / 8)) - 125

Label8.Top = Shape1.Top + (7 * (Shape1.Height / 8)) - 125

Label9.Top = Shape1.Top + (8 * (Shape1.Height / 8)) - 125

 

End Sub

 

Private Sub HScroll1_Change()

DV = HScroll1.Value * (1 / 100)

Label15.Caption = "DV = " + Format(DV, "#0.00 Volt")

End Sub

 

Private Sub HScroll2_Change()

Kp = HScroll2.Value * (1 / 100)

Label16.Caption = "Kp = " + Format(Kp, "#0.00")

End Sub

 

Private Sub HScroll3_Change()

Ki = HScroll3.Value * (1 / 100)

Label17.Caption = "Ki = " + Format(Ki, "#0.00")

End Sub

 

Private Sub HScroll4_Change()

Kd = HScroll4.Value * (1 / 100)

Label18.Caption = "Kd = " + Format(Kd, "#0.00")

End Sub

 

Private Sub Option1_Click()

Option1.Value = True

Option2.Value = False

Option3.Value = False

Option4.Value = False

MSComm1.CommPort = 1

End Sub

 

Private Sub Option2_Click()

Option1.Value = False

Option2.Value = True

Option3.Value = False

Option4.Value = False

MSComm1.CommPort = 2

End Sub

 

Private Sub Option3_Click()

Option1.Value = False

Option2.Value = False

Option3.Value = True

Option4.Value = False

MSComm1.CommPort = 3

End Sub

 

Private Sub Option4_Click()

Option1.Value = False

Option2.Value = False

Option3.Value = False

Option4.Value = True

MSComm1.CommPort = 4

End Sub

 

Private Sub Timer1_Timer()

d1 = MSComm1.Input

If InStr(d1, "A") Then AV = Val(Mid(d1, 2, 3)) * (5 / 255) Else AV = 0

DV = HScroll1.Value * (1 / 100)

Kp = HScroll2.Value * (1 / 100)

Ki = HScroll3.Value * (1 / 100)

Kd = HScroll4.Value * (1 / 100)

e = DV - AV

POut = e * Kp

eio = e * Ki

IOut = IOutold + (ts * eio)

edo = e * Kd

du = edo - edoold

dt = ts

DOut = du / dt

PIDOut = POut + IOut + DOut

If PIDOut > 5 Then PIDOut = 5

If PIDOut < 0 Then PIDOut = 0

OutPID = PIDOut * (255 / 5)

MSComm1.Output = "P" + Format(OutPID, "000")

Label10.Caption = "Desired Value = " + Format(DV, "#0.00 Volt")

Label11.Caption = "Avtual Value  = " + Format(AV, "#0.00 Volt")

Label15.Caption = "DV = " + Format(DV, "#0.00 Volt")

Label16.Caption = "Kp = " + Format(Kp, "#0.00")

Label17.Caption = "Ki = " + Format(Ki, "#0.00")

Label18.Caption = "Kd = " + Format(Kd, "#0.00")

Label19.Caption = "Dout = " + "P" + Format(OutPID, "000")

Label20.Caption = "e = " + Format(e, "#0.00")

Label12.Caption = "Din =" + d1

Label21.Caption = "PIDOut = " + Format(PIDOut, "#0.00")

 

'Menampilkan hasil keluaran

 

'Menampilkan Grafik U

v = (Shape1.Height / 2)

h = ((Shape1.Width / 160))

UX2 = Shape1.Left + (i * h)

UY2 = Shape1.Top + Shape1.Height - (v * DV)

If UY2 < Shape1.Top Then UY2 = Shape1.Top

If UY2 > Shape1.Top + Shape1.Height Then UY2 = Shape1.Top + Shape1.Height

Line (UX1, UY1)-(UX2, UY2), vbRed

'Menampilkan Grafik Y

YX2 = Shape1.Left + (i * h)

YY2 = Shape1.Top + Shape1.Height - (v * AV)

If YY2 < Shape1.Top Then YY2 = Shape1.Top

If YY2 > Shape1.Top + Shape1.Height Then YY2 = Shape1.Top + Shape1.Height

Line23.X1 = YX2 + 60

Line23.X2 = YX2 + 60

Line23.Y1 = Shape1.Top

Line23.Y2 = Shape1.Top + Shape1.Height

Line (YX1, YY1)-(YX2, YY2), vbBlue

 

'Mengirimkan data berikutnya

UX1 = UX2

UY1 = UY2

YX1 = YX2

YY1 = YY2

eiold = eio

IOutold = IOut

edoold = edo

'Pembacaan data masukan

i = i + 1

If i >= 160 Then

    Form1.Cls

    i = 0

    UX1 = Shape1.Left

    UY1 = Shape1.Top + Shape1.Height

    YX1 = Shape1.Left

    YY1 = Shape1.Top + Shape1.Height

 

End If

End Sub