Tuesday, November 11, 2025

Sinkronisasi Generator: Menyatukan Irama Dua Jantung Listrik

 

Sinkronisasi Generator: Menyatukan Irama Dua Jantung Listrik

Dalam dunia pembangkitan listrik, sinkronisasi generator adalah momen krusial — proses ketika generator dihubungkan ke sistem tenaga (grid) yang sudah beroperasi.
Sedikit saja kesalahan dalam tahap ini bisa berakibat fatal: dari lonjakan arus hingga kerusakan mekanik pada generator.

Sebelum membahas apa yang bisa salah, mari kita pahami dulu apa yang terjadi jika semuanya berjalan sempurna.

Syarat Utama Sinkronisasi Generator

Agar generator dapat tersinkron dengan baik, harus dipenuhi tiga syarat utama:

1.      Tegangan sama (|V|)

2.      Frekuensi sama (f)

3.      Sudut fasa sama (φ)

Kadang ditambahkan satu lagi, yaitu urutan fasa sama (R–S–T), yang biasanya dicek sekali saja di awal proyek karena sifatnya tetap.

Ketika ketiga syarat utama terpenuhi, tidak ada beda potensial antara terminal generator dan jaringan.
Akibatnya:

·         Arus yang mengalir hampir nol,

·         Tidak terjadi hentakan mekanik atau lonjakan arus,

·         Generator langsung menyatu dengan sistem dan berbagi daya sesuai torsi penggeraknya.

Dengan kata lain, medan magnet generator terkunci secara halus pada medan magnet jaringan — inilah kondisi sinkron sempurna.

Dulu, proses sinkronisasi dilakukan secara manual menggunakan indikator lampu.
Ketika lampu-lampu padam bersamaan, artinya tidak ada beda potensial — operator pun menutup breaker dengan cepat.
Cara sederhana ini mengajarkan prinsip penting:

Lampu padam = sinkron sempurna.


Rangkaian simulasi


Apa yang Terjadi Jika Syarat Sinkron Tidak Terpenuhi?

Setiap penyimpangan dari syarat sinkronisasi ideal menimbulkan dampak berbeda pada generator maupun sistem.

1. Tegangan Tidak Sama

Ketika tegangan generator sedikit meleset dari tegangan sistem, bentuk gelombangnya masih seirama — frekuensi dan fasanya sama, tetapi amplitudonya berbeda.
Akibatnya muncul beda potensial sesaat saat breaker ditutup, menimbulkan arus sirkulasi singkat di antara keduanya.

Arus ini tetap berbentuk sinus, namun dapat cukup besar untuk menimbulkan hentakan torsi kecil pada rotor atau pemanasan lokal di stator bila selisihnya berlebihan.

Efek utama:

·         Pemanasan lokal pada stator,

·         Getaran torsi sesaat (terutama jika ΔV > 5%),

·         Ketidakseimbangan beban antar fasa jika AVR tidak stabil.

Toleransi yang diizinkan:

·         Maksimum ±10%,

·         Disarankan ±5% atau kurang untuk operasi aman.

Standar rujukan:

·         IEEE Std 1547 & IEEE C50.12 → ≤10% dari tegangan nominal,

·         IEC 60034-3 & panduan PLN → ±5% untuk sistem paralel generator-grid.

Walau di osiloskop gelombangnya tampak hampir sama, perbedaan kecil di puncak tegangan bisa menjadi sentuhan halus yang menentukan apakah sinkronisasi berjalan mulus atau menimbulkan kejutan sesaat.

Tegangan Berbeda


2. Frekuensi Tidak Sama

Ketika frekuensi generator tidak identik dengan frekuensi sistem, dua gelombang tidak lagi seirama — satu berlari lebih cepat atau lebih lambat.
Pada osiloskop, puncaknya tampak tergeser perlahan, membentuk pola “beat” atau ayunan amplitudo.

Jika breaker ditutup dalam kondisi ini, perbedaan frekuensi menyebabkan sudut fasa terus berubah, memicu arus dan torsi osilasi yang berulang.
Akibatnya, rotor bergetar karena terus “dikejar” oleh medan magnet sistem.

Efek utama:

·         Getaran mekanik periodik pada rotor,

·         Peningkatan arus transien di stator,

·         Risiko kerusakan kopling atau rotor lepas sinkron jika selisih besar.

Toleransi yang diizinkan:

·         Maksimum ±0,1 Hz,

·         Ideal ±0,05 Hz untuk sistem besar atau sinkronisasi otomatis.

Standar rujukan:

·         IEEE Std 1547 dan ANSI C50.12 → deviasi ≤0,1 Hz,

·         IEC 60034-3 → batas yang sama untuk menjaga torsi sinkronisasi tetap aman.

Frekuensi Berbeda


Jadi, jika generator sedikit saja berlari lebih cepat atau lambat, medan magnetnya akan “mengejar” atau “tertinggal”, menimbulkan hentakan periodik yang bisa berujung pada gangguan mekanis.
Sinkronisasi sempurna artinya dua gelombang bernapas dalam satu ritme — tidak lebih cepat, tidak lebih lambat.

3. Sudut Fasa Tidak Sama

Bila sudut fasa generator berbeda dengan sistem, tegangan dan frekuensinya sama, tetapi puncak gelombangnya bergeser — satu mendahului atau tertinggal beberapa derajat listrik.
Saat breaker ditutup, muncul impuls arus dan torsi sinkronisasi akibat perbedaan energi sesaat antara kedua medan magnet.

Jika perbedaan kecil (<10°), proses masih halus.
Namun bila sudut fasa melewati 20–30°, hentakan mekaniknya menjadi kuat.
Dan bila di atas 45°, lonjakan arus dapat merusak breaker atau membuat rotor kehilangan sinkron.

Efek utama:

·         Hentakan mekanik pada poros dan kopling,

·         Lonjakan arus singkat di stator,

·         Osilasi torsi sebelum sistem stabil kembali.

Toleransi yang diizinkan:

·         Maksimum ±10°,

·         Ideal ±5° atau kurang untuk sistem otomatis besar.

Standar rujukan:

·         IEEE C50.12 & IEC 60034-3 → batas sekitar ±10°,

·         Praktik PLN → breaker ditutup saat lampu sinkron padam atau redup (beda fasa ≈ 0°).

Sudut fasa berbeda

Melihat simulasi lengkapnya :

                    


Simulasi ini dibuat menggunakan multisim, file projectnya bisa di download disini 


Sinkronisasi bisa diibaratkan menyatukan dua jantung listrik.

Jika denyutnya tidak seirama, satu akan memaksa yang lain mengikuti — dan hentakannya bisa terasa sangat keras.

Sinkronisasi generator bukan sekadar menyalakan lampu indikator atau menekan tombol “connect”.
Ia adalah tari presisi antara tegangan, frekuensi, dan sudut fasa.
Ketika ketiganya selaras, energi berpadu lembut tanpa benturan; tetapi jika salah satu meleset, sistem akan merespons dengan hentakan.

Maka, setiap keberhasilan sinkronisasi bukan hanya hasil dari teknologi, tapi juga ketepatan, kesabaran, dan rasa irama listrik
karena pada akhirnya, dua sumber daya hanya bisa bekerja bersama jika berdenyut dalam harmoni yang sama.

 



READ MORE

Sunday, November 2, 2025

Langkah-Langkah Praktis Menentukan Kapasitor Koreksi Faktor Daya Berdasarkan Daya Aktif dan Tegangan

Langkah-Langkah Praktis Menentukan Kapasitor Koreksi Faktor Daya Berdasarkan Daya Aktif dan Tegangan

[catatan pribadi] 

Pemasangan kapasitor untuk perbaikan kualitas daya merupakan langkah penting dalam sistem kelistrikan industri maupun komersial, terutama untuk meningkatkan faktor daya (cos φ) agar mendekati nilai ideal, yaitu 1. Dengan memperbaiki cos φ, energi listrik dapat digunakan lebih efisien, rugi daya berkurang, dan biaya akibat penalti dari PLN bisa dihindari. Dalam wawancara kerja, pertanyaan seperti “Apa fungsi kapasitor dalam panel listrik?” atau “Bagaimana hubungan antara kapasitor dan power factor?” sering diajukan untuk menguji pemahaman teknis kandidat. Pada pembahasan ini, kita tidak hanya akan memahami konsep perbaikan faktor daya, tetapi juga akan membahas cara menghitung kapasitas kapasitor yang dibutuhkan untuk mencapai cos φ yang diinginkan secara praktis dan akurat.

 

Untuk menghitung kita membutuhkan beberapa hal,

1.       Daya aktif  (KW)

2.       Factor daya awal (cosθ1)

3.       Factor daya target (cosθ2)  biasa target 0.9 – 0.95

 

Step 1 Hitung kebutuhan daya reaktif kompensasi (Qc)

Untuk menaikkan factor daya dari cosθ1 ke cosθ2 menggunakan rumus :

                


Dengan:

                


Dengan Qc = KVAR

 

Dalam rangkaian AC, kapasitor tidak menyerap daya nyata (P), tetapi menyimpan dan melepaskan energi — inilah yang disebut daya reaktif (Q).



Untuk Sistem 3 fasa, gunakan tegangan fasa = tegangan line/3 jika capasitor dipasa per-fasa delta, kalua hubung star hanya perlu memasukkan nilai tegangan line.

🔹 Contoh Perhitungan

Diketahui:

·         Daya aktif (P) = 900 W

·         cos φ₁ = 0.75 (faktor daya awal)

·         cos φ₂ = 0.95 (faktor daya yang diinginkan)

·         Tegangan = 220 V

·         Frekuensi = 50 Hz




Untuk Tegangan 3 fasa contoh perhitungannya seperti ini :





 


Contoh soal saya create dengan bantuan chatGPT dan ternyata ada hal yang menarik yang saya tidak pernah sadari kalau nilai capasitansi hubung star dan delta bisa di dapat langsung jika sudah menghitung salah satuya dengan nilai perbandingan 1:3. yah pakai AI punya keuntungannya sendiri

 





READ MORE

Thursday, October 30, 2025

[Share] Buku Tua atau lama radioshack dan radio amatir 80 meter

 [Share] Buku Tua atau lama radioshack dan radio amatir 80 meter

silahkan klik di gambar bukunya







READ MORE

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=QinQoutAΔ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

Wednesday, October 15, 2025

Dunia Baru dengan Admin yang Bisa Programming: Apa yang Terjadi?

 Dunia Baru dengan Admin yang Bisa Programming: Apa yang Terjadi?


Pekerjaan admin sering dipandang sebelah mata karena latar belakang pendidikan yang dibutuhkan tidak banyak dan keterampilan yang diperlukan juga tidak terlalu sulit dipelajari. Namun, di era sekarang, tugas-tugas admin dan tugas-tugas sekretaris sering kali tumpang tindih dan menjadi tidak jelas. Namun, tulisan ini tidak membahas hal tersebut. Sebaliknya, tulisan ini membahas tentang kesempatan kerja dengan adanya AI (Artificial Intelligence) yang dikatakan dapat mengurangi kebutuhan akan pekerjaan coding/programming atau bahkan menghilangkannya di masa depan. Meskipun demikian, saya agak kurang setuju dengan pendapat tersebut karena kreativitas tidak dapat diatasi hanya dengan jaringan saraf (neuron network).

Pengalaman saya selama ini di beberapa perusahaan ketika berhadapan dengan data yang banyak, banyak admin yang mengeluh dan akhirnya menambahkan tenaga kerja lagi untuk membantu. Ya, memang tangan cuma dua dan flow data yang bisa dikerjakan oleh satu orang per jam sudah bisa terukur dan sulit untuk menembus batasan itu, meskipun kita sudah sangat mengerti apa yang dikerjakan. Jadi, dalam hal ini, bisa saja suatu bagian di perusahaan memiliki admin lebih dari satu karena data yang mesti diolah itu sangat banyak dan terus-menerus.

Untungnya, pada zaman sekarang, Administrasi juga dapat menerapkan standar kualitas seperti ISO 9001 untuk meningkatkan efisiensi dan kualitas layanan., yang mana pada intinya semua laporan formatnya dibakukan, dicatat, dan dikontrol. Sehingga, banyak sistem digital yang bisa membantu, seperti software database yang sering diadopsi, misalnya SAP. SAP ini adalah sistem database terpusat yang terintegrasi jaringan, sehingga informasinya bisa dilacak kapan saja dan di mana saja. Canggih, bukan? Meskipun sistem ini akan menjamin distribusi data yang cepat dan terstruktur, serta memiliki fitur-fitur yang lengkap, namun tentunya ada biaya yang cukup besar. Mungkin saya tidak memiliki informasi tentang jumlah pastinya, tapi sudah pasti ini adalah biaya yang besar dan berkelanjutan. Artinya, ada harga yang harus dibayar untuk kemudahan ini. Namun, pengaplikasian yang kadang berusaha menghemat biaya lebih sering menjadikan pengurangan fitur pada sistem ini, yang akhirnya menyebabkan pekerjaan admin menjadi lebih banyak.

Nah, di sini kata kuncinya adalah pekerjaan yang banyak, mungkin sampai menumpuk. Informasi yang disimpan banyak jenisnya, seperti data spare part, data absensi, data ceklis, surat keluar, berita acara, work order, permit, dan lain-lain. Nah, bagaimana jika ini disimpan oleh admin dan kadang data ini diminta dengan format yang berbeda-beda setiap kali atasan ingin menganalisis sesuatu atau membuat laporan? Inilah yang sering terjadi saat ini: mengeluh tidak menyelesaikan masalah. Syukur jika perusahaan tempat kita bekerja menerapkan SAP sebagai pondasinya, tapi lebih sering tidak semua data akan tercover karena biaya yang besar. Jadi, sisanya kemana? Ya, dikumpulkan, dirawat, dan diolah sendiri. Itu sudah pasti.

Nah, jika seorang programmer (anggaplah kemampuan biasa saja) sulit mendapatkan pekerjaan yang berhubungan dengan IT, apalagi sekarang dengan bantuan AI, pekerjaan coding menjadi mudah dalam artian dibantu dengan AI untuk masalah teknis. Saya punya kemampuan coding yang cukup, dan dengan AI, malah menjadi sangat mudah, meskipun tidak menyelesaikan semua masalah coding saya, tapi saya sangat terbantu dengan kecepatan dalam mencari solusi teknis coding. Jadi, pengurangan orang di bidang ini menjadi gelombang perampingan di mana-mana, terutama di perusahaan IT.

Ini menjadi pendapat pribadi saya. Bagaimana jika seorang admin bisa menggunakan kemampuan coding yang cukup baik, tidak perlu hebat-hebat banget, tapi cukup? Pertimbangannya, daripada sulit dapat kerja atau menganggur, lebih baik bekerja sambil mencari kesempatan lain dan mengembangkan skill, sehingga mempunyai nilai lebih yang nantinya bisa ditawarkan.

berikut adalah contoh kecil yang bisa dilakukan oleh admin yang mempunyai kemapuan programming :



Jika alat bantu software ini dimasukkan ke dalam CV kita dan kita bisa mempresentasikannya, jika ada kesempatan, bisa saja Anda menjadi admin super yang bisa mengolah data lebih banyak daripada orang lain yang menggunakan metode manual. Bisa mengurangi error data karena human error, bisa memberikan laporan dalam waktu yang singkat (hitungan detik jika data sudah masuk sistem). Atau, jika masih mengejar pekerjaan IT, berarti bisa dippresentasikan software kerja yang sudah dibuat sendiri sebagai referensi hasil aplikasi kemampuan IT yang sinergis dengan aplikasi lapangan. "Apapun itu, kesempatan kadang datang dari keberuntungan, tapi kesungguhan dan kerja keraslah yang menjamin keberhasilan."



Video


Berikut adalah foto - foto screenshot dari video













READ MORE

Monday, October 13, 2025

Share "Prosedur Standar Menghadapi Motor 3 Phase Trip: Jangan Panik, Ikuti Ini!"

 Share "Prosedur Standar Menghadapi Motor 3 Phase Trip: Jangan Panik, Ikuti Ini!"


Saya ingin membagikan SOP yang saya pakai di beberapa tempat saya kerja sebelumnya dan menurut saya masih Handal sampai sekarang : untuk file bisa di download di link ini



ini mungkin belum mengcover semuanya, jika ada masukkan silahkan di comment dan seperti biasa biasakan comment yang membangun karena yang baik sudah pasti datang dari yang baik pula 





READ MORE

Tuesday, September 30, 2025

Panduan Praktis Mengirim dan Menerima Data melalui Serial Port dengan Lazarus dan CPort

 

Panduan Praktis Mengirim dan Menerima Data melalui Serial Port dengan Lazarus dan CPort


    Dalam era Internet of Things (IoT) dan otomatisasi industri, komunikasi serial port COM menjadi kunci penting dalam menghubungkan perangkat keras dan perangkat lunak. Dengan menggunakan Lazarus dan CPort, Anda dapat dengan mudah mengakses dan mengontrol serial port COM, membuka peluang untuk mengembangkan aplikasi yang inovatif dan efektif. Dalam artikel ini, kita akan membahas bagaimana memanfaatkan serial port COM dengan Lazarus dan CPort untuk membuat aplikasi yang cerdas dan terintegrasi.

Jadi tanpa banyak basa - basi kita langsung saja terjun untuk membuat aplikasinya, jadi yang di perlukan adalah komponen Cport yang sudah terinstall pada ide lazarus kalian (saya tidak akan bahas disini) dan Cport juga adalah komponen open source dan free jadi enak untuk digunakan. 

jika tidak mempunyai port serial anda bisa gunakan usb to serial device, agar bisa menggunakan komunikasi ini jika hanya untuk test internal antar program bisa juga menggunakan virtual serial port, banyak macam softwarenya tapi saya menggunakan free program yang bisa di download yaitu com0com, program sederhana ini sangat memuaskan untuk digunakan sebagai virtual serial port karena tidak ada batasanya hanya saya hanya menyediakan koneksi pair saja

penampakkan com0com

selain itu juga untuk contoh kali ini jelas ketika kita mencoba software yang kita buat kita juga membutuhkan software termite (serial terminal) karena siapa yang mau menerima data yang kita kirimkan ? ya kecuali nanti pada saat aplikasi mungkin kita akan berkomunikasi dengan microcontroller atau bahkan dengan software proteus dll 





Software Termite

bahan yang di butuhkan :
1. Cport for lazarus
2. com0com
3. Pascal Lazarus
4. termite

tidak juga harus dengan software itu yang penting fungsinya sama.

untuk pertama kita akan buat formnya seperti ini :

form


dan berikut ini adalah listingnya :

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, CPort,
  CPortCtl;

type

  { TForm1 }

  TForm1 = class(TForm)
    btn2: TButton;
    btn1: TButton;
    btn3: TButton;
    btn4: TButton;
    cbb1: TComComboBox;
    edt3: TEdit;
    edt2: TEdit;
    edt1: TEdit;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    port1: TComPort;
    GroupBox1: TGroupBox;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure port1RxChar(Sender: TObject; Count: Integer);
  private
    procedure SendByte(Value: Byte);
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
procedure TForm1.SendByte(Value: Byte);
begin
  port1.Write(Value, 1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  cbb1.ComProperty:= cpPort; // dilakukan disini karena error jika lewat ide lazarus
end;

procedure TForm1.port1RxChar(Sender: TObject; Count: Integer);
var
  s: string;
begin
   port1.ReadStr(s,Count);
   edt3.Text:= s;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  if port1.Connected = false then
    begin
      port1.Port:= cbb1.Text;
      port1.Open;
    end;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  if port1.Connected = true then port1.Close;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  SendByte(strtoint(edt1.Text));
end;

procedure TForm1.btn4Click(Sender: TObject);
begin
  port1.WriteStr(edt2.Text);
end;

end.



🔧 1. Komponen yang Digunakan

Unit yang di-uses:

  • Classes, SysUtils: Unit standar untuk operasi dasar Pascal.

  • Forms, Controls, Graphics, Dialogs, StdCtrls: Untuk komponen antarmuka pengguna (form, tombol, edit box, dll).

  • CPort, CPortCtl: Unit untuk menangani komunikasi serial (COM port).


🧱 2. Desain Form dan Komponen

Komponen pada TForm1:

  • 4 Tombol:

    • btn1: Tombol untuk membuka koneksi ke COM port.

    • btn2: Tombol untuk menutup koneksi ke COM port.

    • btn3: Tombol untuk mengirim byte (nilai angka).

    • btn4: Tombol untuk mengirim string (teks).

  • 3 Edit Box:

    • edt1: Tempat pengguna memasukkan angka (byte) untuk dikirim.

    • edt2: Tempat pengguna memasukkan string untuk dikirim.

    • edt3: Menampilkan data yang diterima dari COM port.

  • 1 ComboBox Khusus COM Port (TComComboBox):

    • cbb1: Combo box untuk memilih COM port yang tersedia di sistem.

  • 1 Objek TComPort:

    • port1: Objek yang digunakan untuk menangani komunikasi serial.

    • port1 : masih menggunakan default speed 9600 baud

    • port1 : menggunakan 8 data, no parity, 1 stop bit  (default) 

  • 4 GroupBox:

    • Untuk mengelompokkan komponen dalam tampilan GUI (tidak memiliki logika program langsung).


⚙️ 3. Logika Program

3.1. FormCreate(Sender: TObject)

cbb1.ComProperty := cpPort;
  • Mengatur cbb1 agar menampilkan daftar port COM yang tersedia. Ini harus dilakukan secara manual karena jika diset lewat properti di IDE bisa menyebabkan error.


3.2. btn1Click(Sender: TObject)Open COM Port

if not port1.Connected then begin port1.Port := cbb1.Text; port1.Open; end;
  • Mengecek apakah port1 belum terbuka, lalu membuka port yang dipilih di cbb1.


3.3. btn2Click(Sender: TObject)Close COM Port

if port1.Connected then port1.Close;
  • Menutup koneksi ke port jika sedang terbuka.


3.4. btn3Click(Sender: TObject)Kirim Byte

SendByte(StrToInt(edt1.Text));
  • Mengambil angka dari edt1, mengubahnya ke tipe Byte, lalu mengirimkannya.

Fungsi Pendukung:

procedure TForm1.SendByte(Value: Byte); begin port1.Write(Value, 1); end;
  • Mengirim satu byte ke port serial.


3.5. btn4Click(Sender: TObject)Kirim String

port1.WriteStr(edt2.Text);
  • Mengirim string yang dimasukkan di edt2 melalui port serial.


3.6. port1RxChar(Sender: TObject; Count: Integer)Terima Data

var s: string; begin port1.ReadStr(s, Count); edt3.Text := s; end;
  • Dipanggil otomatis saat data diterima dari COM port (Count karakter).

  • Membaca data dan menampilkannya di edt3.


🔁 Alur Kerja Program

  1. Saat form dijalankan, daftar COM port akan dimuat ke cbb1.

  2. Pengguna memilih COM port dari daftar.

  3. Tekan tombol btn1 → membuka koneksi ke COM port.

  4. Pengguna dapat:

    • Mengirim byte dengan tombol btn3.

    • Mengirim string dengan tombol btn4.

  5. Data yang diterima dari COM port akan langsung tampil di edt3.

  6. Tekan tombol btn2 → menutup koneksi COM port.


🛠️ Catatan Teknis Tambahan

  • Pastikan Anda menggunakan komponen CPort yang sudah diinstal di Lazarus.

  • Perlu mengatur BaudRate, Parity, StopBits, dan DataBits dari port1 agar sesuai dengan perangkat yang dikomunikasikan. (Belum diatur dalam kode ini, jadi memang masih default 9600 8N1).

  • Saat mengirim data byte, pastikan edt1.Text benar-benar angka valid (0–255), jika tidak bisa menyebabkan error runtime. Oleh karena itu edt1 di set "only Number" properties nya







Source Code dapat di download di Link ini





READ MORE