Showing posts with label instrument. Show all posts
Showing posts with label instrument. Show all posts

Wednesday, October 29, 2025

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 asalkan FlowIn = 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)

Di kode kamu ada fungsi penting:

NetFlow := FlowRate - flow_out; // Net flow (cm^3/s) Level := Level + (NetFlow / TankArea) * DeltaTime;

Penjelasan langkah-per-langkah:

  1. NetFlow dihitung dalam satuan cm³/s.

  2. NetFlow / TankArea → perubahan tinggi per detik (cm/s), karena cm³/s dibagi cm² → cm/s.

  3. Dikali DeltaTime (detik per step, di kode DeltaTime = 0.1 → 100 ms) → perubahan tinggi per step (cm).

  4. Ditambahkan ke Level untuk mendapatkan tinggi baru.

Dengan kata lain formula update tingkat (Level) di kode sama dengan persamaan kontinuitas sederhana:

Δh=Qin−QoutA⋅Δt\Delta h = \dfrac{Q_{in} - Q_{out}}{A} \cdot \Delta t

di mana hh = tinggi (cm),


Q
Q
= laju aliran (cm³/s),
A
A
= luas penampang (cm²), Δt\Delta t = durasi step (s).



animasi Lazarus



Gambar diatas adalah simulasi yang sudah saya siapkan untuk menggambarkan volume tangki yang nantinya akan di hitung oleh system. untuk membuat ini saya sudah siapkan videonya pada link ini.

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:

  1. 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.

  2. 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.


berikut adalah video aplikasi yang sudah jadi : file project bisa didwonload di






dan berikut adalah listing lengkapnya :

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  ComCtrls, BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    lbl4: TLabel;
    lbl2: TLabel;
    lbl1: TLabel;
    lbl3: TLabel;
    tmr1: TTimer;
    tmr2: TTimer;
    tb1: TTrackBar;
    tb2: TTrackBar;
    VirtualScreen: TBGRAVirtualScreen;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure tb1Change(Sender: TObject);
    procedure tb2Change(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure tmr2Timer(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure VirtualScreenRedraw(Sender: TObject; Bitmap: TBGRABitmap);
  private
    background: TBGRABitmap;
    x0,y0,tebal,lebar,tinggi : integer;
    garis,isian : TBGRAPixel;

    level_tanki, flow_in, flow_out : double;
    level_tanki_old,level_tanki_new : Double;

    procedure RunSimulationStep;
    procedure UpdateTank(var Level: Double; FlowRate: Double);
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

//kalau mau rubah speck simulasi, rubah disini
const
  DeltaTime = 0.1;         // 100 ms
  TankArea = 100.0;        // cm^2
  MaxFlow = 100;         // cm^3/s
  TankHeightMax = 100.0;   // cm
  DeltaT: Single = 0.5;    // 10 ms

{ TForm1 }

procedure TForm1.RunSimulationStep();
begin

  flow_in :=tb1.Position;
  flow_out := tb2.Position;

  // Update plant
  UpdateTank(level_tanki, flow_in);

  //tampilan ke UI
  tinggi := round(level_tanki);

end;

procedure TForm1.UpdateTank(var Level: Double; FlowRate: Double);
var
  NetFlow: Double;
begin

  NetFlow := FlowRate - flow_out;  // Sekarang ada buangan

  Level := Level + (NetFlow / TankArea) * DeltaTime;

  //pengaman simulasi
  if Level > TankHeightMax then
    Level := TankHeightMax
  else if Level < 0 then
    Level := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //buat kotak pada gambar
  x0 := 111; y0 := 320; tebal := 2; lebar := 148; tinggi := 217;
  garis := BGRA(0,0,255,128); isian := BGRA(0,0,255,128);
  // load background sekali saja
  background := TBGRABitmap.Create;
  background.LoadFromFile('test.bmp');

  //kondisi awal simulasi
  level_tanki := 0.0;
  level_tanki_old := 0.0;
  level_tanki_new := 0.0;
  tinggi := 0;
  flow_out := tb2.Position;
  tmr1.Interval := round(DeltaTime*1000);
  tb1.Max:= MaxFlow;
  tb2.Max := MaxFlow;

  VirtualScreen.RedrawBitmap;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  tmr1.Enabled:= true;
  tmr2.Enabled:= true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  tmr1.Enabled:= false;
  tmr2.Enabled:= false;
  tb1.Position:= 0;
  tb2.Position:= 0;

  //kondisi awal simulasi
  level_tanki := 0.0;
  level_tanki_old := 0.0;
  level_tanki_new := 0.0;
  tinggi := 0;
  flow_out := tb2.Position;
  tmr1.Interval := round(DeltaTime*1000);
  tb1.Max:= MaxFlow;
  tb2.Max := MaxFlow;

  VirtualScreen.RedrawBitmap;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  tmr1.Enabled:= false;
  tmr2.Enabled:= false;
end;

procedure TForm1.tb1Change(Sender: TObject);
begin
  lbl1.Caption:= inttostr(tb1.Position);
  lbl3.Caption:= inttostr(tb1.Position);
end;

procedure TForm1.tb2Change(Sender: TObject);
begin
  lbl2.Caption:= inttostr(tb2.Position);
  lbl4.Caption:= inttostr(tb2.Position);
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  RunSimulationStep;
end;

procedure TForm1.tmr2Timer(Sender: TObject);
begin
  tinggi := Round(level_tanki); // ambil nilai dari sensor
  VirtualScreen.RedrawBitmap;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
end;

procedure TForm1.VirtualScreenRedraw(Sender: TObject; Bitmap: TBGRABitmap);
var
  imgRatio, scrRatio: Double;
  drawWidth, drawHeight, xOff, yOff: Integer;
begin
  // hitung aspect ratio
  imgRatio := background.Width / background.Height;
  scrRatio := Bitmap.Width / Bitmap.Height;

  if imgRatio > scrRatio then
  begin
    // gambar lebih lebar daripada layar → sesuaikan lebar penuh
    drawWidth := Bitmap.Width;
    drawHeight := Round(drawWidth / imgRatio);
    xOff := 0;
    yOff := (Bitmap.Height - drawHeight) div 2;
  end
  else
  begin
    // gambar lebih tinggi daripada layar → sesuaikan tinggi penuh
    drawHeight := Bitmap.Height;
    drawWidth := Round(drawHeight * imgRatio);
    yOff := 0;
    xOff := (Bitmap.Width - drawWidth) div 2;
  end;

  // gambar background dengan stretch proporsional-- jangan lupa urutan menggambarnya
  Bitmap.StretchPutImage(Rect(xOff, yOff, xOff+drawWidth, yOff+drawHeight), background, dmSet);

  //gambar object kotaknya-- jangan lupa urutan menggambarnya
  Bitmap.RectangleAntialias(x0,y0,x0+lebar,y0-tinggi,garis,tebal,isian);
end;

end.


READ MORE

Thursday, April 4, 2019

SOP Kalibrasi Control Valve


INSTRUKSI KERJA
Perbaikkan dan Kalibrasi Control Valve
1.      Tujuan
Procedure ini menjelaskan tata aturan dalam Perbaikkan Control Valve secara sistematis yang mencangkup troubleshooting umum, agar bisa menetukan apakah Control Valve ini masih bisa dipakai dan akurat.

2.      Prasarat dan Kondisi awal
2.1        Pastikan bahwa Control valve  ini tidak sedang terinterlock dengan sistem lainnya dan jika iya catat dalam form permit  agar supervisor operasional mengerti kondisinya dan bisa mengambil langkah untuk mematikan interlock atau hal lainnya sesuai dengan SOP.
2.2        Pastikan control valve ini bisa di operasikan full open dan full close jika tidak ini akan membatasi
Ruang lingkup troubleshooting nantinya.
2.3     pastikan dalam bekerja menggunakan sarung tangan panas jika sensor pada tempat yang panas dan plant sedang running.
2.4     Pastikan alat yang di bawa sudah lengkap menghindari loss time untuk ambil tool
2.5     pastikan jenis Control valve  yang akan di cek agar analisanya troubleshootingnya bisa tepat

3.      Referensi
4.1.     Manual book KOSO-AR

4.      Tanggung Jawab
4.1
Supervisior
:

4.2
Karu instrument
:

4.3
Teknisi instrument
:


5.      Alat Pendukung
5.1        Alat Pelindung Diri
·  Helm
·  Sepatu Safety
·  Earplug
·  Kaca mata safety
5.2        Alat Pendukung Lainnya
·  Radio Komunikasi
·  MultiTester
· Current injector
· Obeng + amplas halus
· Contact cleaner (no residu)

6.      Test Item
6.1        Test mekanis
6.2        Test Visual
6.3        Test Motor Listrik
6.4        Test Modul Kontrol
6.5        Kalibrasi control valve



7.      Procedure test dan penjelasannya
     
7.1        Test mekanis

Test mekanis ini dilakukan dengan cara
·         Di putar manual (di lakukan dengan power motor di matikan)
·         Di putar dengan motor
                Asal energy gerak sebuah control Valve dari manual oleh operator dan listrik dari gerakkan
                motor Listrik, maksudnya adalah dari kedua sumber ini apakah salah satunya bisa atau  
                 keduanya tidak bisa menggerakkan control valve. Adapun jika salah satunya berat maka  
                kita sudah bisa melakukan troubleshooting lanjutan berdasarkan kondisi ini. Jika di putar 
                motor tidak mau atau berat dan di putar manual ringan bisa jadi bearing motor sudah rusak 
                menyebabkan motor berat dan biasanya trip.
Dengan memutar manual kita di harap bisa test untuk posisi full closed dan full open atau posisi di antaranya apakah sudah maksimum baik untuk full close dan full open. Dan untuk posisi di antaranya apakah ada yang berat atau stag. Hal ini akan membatu untuk menganalisa keadaan mekanisnya. Agar jika semua amam bisa fokus ke hal lainnya.

2.1        Test Visual
Pada langkah ini kita akan melakukan inspeksi visual melihat indikasi kerusakan baik terbakar, cacat, putus kabel dan sebagainya

2.2        Test Motor Listrik


Motor Listrik yang di pakai pada control valve biasanya adalah motor 1 phasa yang bisa di rubah arah putarannya dan bisa di lihat pada diagram di atas, untuk merubah putaran terletak pada fungsi switch LS1 dan LS2.
Dengan mengetahui diagram motor maka kita bisa test motor apakah masih bagus atau sudah rusak tapi harus lepas capasitor dulu karena menggangu pengukuran. Bisa juga di lakukan pengetesan meger (insulationn test) jika sudah rendah nilainya maka bisa di bilang motor tersebut rusak.
Atau jika mau lebih yakin di test tersendiri untuk forward dan reverse nya dengan membuat rangkaian luar. Dengan cara ini kita bisa lebih yakin akan torsinya



2.1        Test Modul Kontrol




Precondition,
Control Valve pasti mempunyai deteksi posisi biasanya sebuah resistor potensio meter, type potensionya ada yang derajat kebebasannya 2700 dan ada yang 3600 tergantung dengan sistem mekanisnya, dan sebagai tambahan pengaman biasanya motornya di beri limit switch agar tidak bergerak dari batas maksimum menghindari kerusakan mekanis dan semua ini perlu di indentifikasi komponennya karena tiap type atau mode atau merk akan menentukan letak dan jenis alat yang di gunakan untuk fungsi ini.


Di harapkan pada test mekanis kita sudah yakin kalau mekanis tidak ada masalah dan dengan asummsi itu troubleshooting ini tidak membahas mekanis.
·         Power motor di matikan sehingga pergerakan control valve hanya bergantung pada manual operasi.
·         Memasang current injector di sisi SP dan Multitester pada sisi OP
·         Men-set SP pada titik 0% atau 4mA
·         Memutar control valve pada posisi full close
                
                 Testing
7.4.1        Merubah nilai SP menjadi 0% dan memutar control valve pada posisi full close.
7.4.2        Dengan kondisi 7.4.1 seharusnya kita mendapat nilai feedback (OP) sama dengan nilai SP yaitu di 4mA, tetapi jika tidak maka harus adjust Zero pada modul kontrollernya sehingga kita menadapatkan nilai yang sama atau jika tidak bisa mendekati nilai SP-nya.
7.4.3        Merubah nilai SP menjadi 100% dan memutar control valve pada posisi full open.
7.4.4        Dengan kondisi 7.4.3 seharusnya kita mendapat nilai feedback   (OP) sama dengan nilai SP yaitu 20mA, tetapi jika tidak maka harus adjust span pada modul controllernya sehingga kita mendapat nilai yang sama atau jika tidak mendekati nilai SP-nya.
7.4.5        Jika setelah proses 7.4.4 masih belum bisa tepat (masih selisih jauh) pada posisi full open dan full closednya maka ulangi proses 7.4.1 sampai 7.4.4 sampai maksimal 3 kali jika di rasa perlu dan mengalami perbaikkan.
7.4.6        Jika pada proses 7.4.5 tidak mengalami perbaikan maka bisa di pastikan modul atau encoder mengalami kerusakan dan perlu di servis atau di ganti
7.5  Kalibrasi control valve
Dengan melakukan langkah 7.4 jika berhasil maka sebenarnya pada point 7.4.1 sampai 7.4.4 adalah proses kalibrasi control valve hanya saja power motor harus sudah terpasang sehingga pengaturan full open dan close nya dari putaan motor.


8                    Acuan Standar

8.4  Pada Test Mekanis seharusnya yang kita dapat adalah jika di putar manual ringan dan jika di putar lewat motor pun tetap ringan tidak menyebabkan arus motor  yang tinggi, panas, suara kasar dan tidak bergetar.
8.5  Pada langkah ini kita memastikan semuanya dalam keadaan normal artinya seperti biasanya, hal kita perlu cermati jika ada bau terbakar, kapasitor yang kembung, kabel terbakar, bekas panas berlebih dll.
8.6  Pada langkah ini kita inginkan mengukur hambatan motor normal (biasanya kisaran 150 ohm tapi bisa bervariasi tergantung motornya) dan test meger untuk memastikan keadaan isolasi coilnya dan pengukuran siapa tahu ada short body dll.

8.7  Cleaning sangat di butuhkan seharusnya terminal bersih dari karat dan oksidasi, dan juga ujung dari transmitter itu harus bersih dan tidak ada cacat. jika tidak cacat maka cukup hanya dengan di beri contact cleaner.



READ MORE

Wednesday, February 6, 2019

Steam table software

Steam table software


siapa tahu ada yang membutuhkan, kebetulan softwarenya free jadi silahkan di download




READ MORE

Monday, August 6, 2018

PC Boiler

PC boiler













READ MORE

Monday, June 25, 2018

pressure indikasi

[Pressure] 


kita sering melihat 0 pressure pada pressure gauge atau transmitter tapi apakah betul - betul zero pressure.
jadi apakah yang selama ini kita katakan 0 pressure atau jika kalibrasi yang di katakan zero ?
jadi yang selama ini kita pakai sebagai zero untuk pressure gauge adalah pressure atmosfer atau 1atm pada gambar yang di garis biru, jadi tidak benar2 zero pressure masih ada 1 atm
jadi area di bawah garis biru itu adalah vacumm atau pressure atmosfer. area di atas garis biru adalah pressure gauge
kalau kita bicara pressure absolute adalah jumlah antara pressure atm + pressure gauge
dan terakhir kenapa tidak di pakai ini karena di butuhkan referensi pressure absolute zero yang mana secara fisika tidak mungkin di dapat di bumi
jadi pada umumnya zero yang di pakai adalah titik pressure atmosfer atau 1 atm jika di atas di sebut positive pressure gauge jika di bawah maka di sebut negative pressure gauge atau vacumm
pada umumnya jika memakai ini tidak akan ada masalah hanya saja jika di pakai di luar bumi mungkin ini menjadi masalah. selama masih di power plant bumi ente masih safe 😜




READ MORE

function PID honeywell

Pekerjaan Evaluasi PID oleh vendor




Dalam Power Plant fungsi dari PID ini sangat membantu operator dalam menjalankan fungsinnya tanpa PID tentunya plant akan tetap bisa bekerja hanya saja operator harus lebih fokus dan tidak boleh lengah.

contoh kasus yang pernah saya alami sendiri adalah fungsi PID yang katanya terasa aneh dan tidak stabil (masukkan dari operator). operator yang pengalaman tentunya sudah terbentuk kebiasaan yang bisa mendeteksi keanehan dalam sistem operasi dan ini sangat baik sebagai masukkan untuk evaluasi.

setelah banyak evaluasi tentunya dengan operasinal dan engineer kami memutuskan bahwa masalah kemungkinan terbesar terjadi pada formula atau rumus PID yang di pakai dan sebagai kesimpulan kami harus mendatangkan vendor untuk evaluasi semua PID kami di plant.

dan hasilnya betul saja ada rumus yang terjadi kesalahan pengetikan

yang awalnya    A3=L1-A2+A1   dan yang seharusnya  A3=L1-A1+A2

dengan perubahan kecil tersebut barulah operator merasakan operasi yang nyaman 

jadi apasih yang terjadi dengan perubahan kecil tersebut :

1. jika ada ganggauan pada beban semua PID langsung tidak kacau kalau dulu sedikit gangguan PID langsung berisolasi (naik turun) tidak mau stabil harus di manual dulu baru  bisa 

2. bayangkan semua maslaah ini terjadi di seluruh PID dan pada saat ada gangguan operator jadi super sibuk karena banyak yang mesti di handle makanya sering terjadi blackout karena tidak terhandle dengan baik


berikut adalah file serah terima pekerjaan dengan vendor kami   disini

READ MORE

Thursday, May 10, 2018

artikle dcs honeywell

artikle dcs honeywell





untuk membaca silahkan download di link ini :



READ MORE

Monday, April 16, 2018

Datasheet pressure transmitter P30-20010 Untuk EP

Pressure Transmitter EP  P30-20010
















READ MORE

Wednesday, March 28, 2018

Ukuran kabel

Ukuran kabel









READ MORE