Simulasi Dinamika Tangki Air dengan Lazarus: Cara Mudah Memahami Sistem Kontrol
Simulasi Dinamika Tangki Air dengan Lazarus: Cara Mudah Memahami Sistem Kontrol
kita akan membaut sebuah sistem pengisian tanki air, kenapa pilih tanki air karena paling simple perhitungannya dan mudah buatnya dan analisanya. tapi meskipun system ini lambat tapi kita bisa aplikasikan nantinya PID buatan kita sehingga kita tau apakah PID aplikatif dan sekalian belajar karakteristik PID pada system lambat.
jadi mari kita mulai dengan membayangkan sebuah tangki dulu :
Volume tangki
jika dengan luas alas 100cm2 dan tinggi tangki 100cm jadi volume tangki full adalah 10.000cm3 itu yang akan mendasari simulasi kita.
Dalam dunia kontrol sistem, memahami perilaku sistem dinamik adalah langkah penting sebelum menerapkan algoritma seperti PID.
Pada artikel ini, kita akan membangun dan mensimulasikan sistem pengisian tangki air, sebuah model klasik yang sederhana namun kaya makna.
Meski sistem ini tergolong lambat, justru di situlah tantangannya — kita bisa menguji respons dan kestabilan PID pada kondisi nyata sekaligus memahami karakteristik sistem dengan lebih intuitif.
Desain system tangki
Menetapkan FlowIn / FlowOut — kenapa 100 s untuk mengisi / menguras?
Dalam contoh teks kamu disebutkan: FlowIn dan FlowOut masing-masing 100 cm³/s. Dengan parameter tanki di kode:
TankArea = 100.0 cm²
TankHeightMax = 100.0 cm
maka volume penuh tangki = TankArea * TankHeightMax = 100 cm² * 100 cm = 10.000 cm³.
Jika laju pengisian bersih (net flow) = 100 cm³/s, waktu untuk mengisi dari kosong ke penuh adalah:
waktu = volume / laju = 10.000 cm³ / 100 cm³/s = 100 s.
(Itu yang kamu tulis — aritmetika di atas valid digit-by-digit: 10000 ÷ 100 = 100.)
Jadi pernyataan “mengisi dari kosong membutuhkan 100 detik dan untuk menguras dari full membutuhkan 100 detik” benar asalkanFlowIn = 100 dan FlowOut = 0 untuk kasus isi; atau untuk menguras, FlowOut = 100 dan FlowIn = 0. Jika keduanya aktif, yang relevan adalah net flow = FlowIn − FlowOut.
Hubungan langsung dengan kode (baris penting dan maknanya)
sekarang kita membutuhkan mendesain program di lazarusnya :
Inti desain: kenapa butuh 2 procedure + 2 timer
Desain yang kamu tulis membagi tugas menjadi dua lapis waktu berbeda:
RunSimulationStep (high-rate, mis. tiap 100 ms)
Tugas: menghitung dinamika plant secara numerik (perubahan level/volume pada tiap langkah simulasi).
Alasan: fisika (perubahan tinggi akibat flow) harus dihitung cukup sering agar simulasi stabil dan numerik akurat. Di kode kamu DeltaTime = 0.1 → 100 ms, dan tmr1 memanggil RunSimulationStep tiap interval itu.
UpdateTank (low-rate / akumulasi, mis. tiap 1 s)
Tugas yang kamu maksud: menghitung/menyimpan akumulasi total volume untuk keperluan logging, tampilan yang tidak perlu update tiap-milisekon, atau penyajian nilai per detik.
Alasan: operasi UI, penulisan log, atau pembacaan sensor sering cukup tiap 1 s; mempercepat UI tidak memberi manfaat dan malah bisa membuat aplikasi berat. Maka tmr2 dipakai untuk tugas yang lebih lambat (UI / akumulasi) — di desainmu kamu ingin tmr2.Interval := 1000.
Kesimpulan: dua timer ini meng-decouple (memisahkan) perhitungan fisika berkecepatan tinggi dari tugas UI/akumulasi berkecepatan rendah — praktek standar pada simulasi & control realtime.
Dari kode bisa di lihat:
tmr1.Interval := round(DeltaTime*1000); → tmr1 dipakai untuk memanggil RunSimulationStep (Δt = 0.1 s). procedure TForm1.tmr1Timer(Sender: TObject); begin RunSimulationStep; end;
RunSimulationStep mengambil nilai trackbar (flow_in := tb1.Position; flow_out := tb2.Position;) lalu memanggil UpdateTank(level_tanki, flow_in); dan mengeset tinggi := round(level_tanki);
tmr2Timer saat ini hanya melakukan:
tinggi := Round(level_tanki); // ambil nilai dari sensor
VirtualScreen.RedrawBitmap;
namun di desain kamu ingin tmr2 menjalankan akumulasi / update per 1 detik (misalnya untuk menambah entri log / menampilkan total volume per detik).
Catatan: di kode UpdateTank sekarang menghitung level tiap kali dipanggil (yaitu saat tmr1 berjalan) — sehingga UpdateTank sesungguhnya adalah update fisika per step, bukan akumulasi per 1 detik.
No comments:
Post a Comment