Software Simulasi SCADA dengan Delphi

Sistem monitoring dan kendali industri saat ini semakin kompleks, seiring dengan banyaknya kebutuhan perangkat kerasnya maka perangkat lunaknya juga meningkat. Salah satu sistem tersebut adalah SCADA, suatu sistem yang memungkinkan pengguna memonitor dan mengendalikan situasi di lapangan secara real time. Dalam tulisan kali ini saya tidak akan mengulas tentang SCADA, melainkan dari sisi pemrogramannya. Software simulasi SCADA ini dibuat menggunakan Delphi 7.0, dengan memanfaatkan komponen SocketClient dan file DLL (Dynamic Link Library) bernama inpout32.dll. Dalam pemrograman software ini, file inpout32.dll berfungsi sebagai pustaka Windows API untuk berkomunikasi dengan LPT1 (Port Paralel) di komputer.

Software ini dibuat dengan tujuan memudahkan seseorang dalam mempelajari cara kerja teknologi SCADA. Terdiri dari dua bagian yaitu Client dan Server, yang masing-masing harus saling bersinkronisasi untuk komunikasi data melaui LAN.

A. Program Server

Sebenarnya program server harus dihubungkan dengan masing -masing sensor (sensor suhu, sensor ketinggian, dan sensor kecepatan /optocoupler), namun untuk memudahkan simulasinya program ini dapat dijalankan dengan memilih mode simulasi pada program Client yang berkomunikasi dengannya. Program ini berfungsi untuk melayani program Client dalam permintaan komunikasi dan transfer data dari LAN dan Port paralel.

Server

Dari ScreenShoot di atas, terlihat bahwa program Server terbagi lagi menjadi 3 bagian yang memiliki fungsi masing-masing yaitu:

1. Instrument Suhu -> Berguna untuk memonitor nilai temperatur pada suatu alat atau daerah tertentu dalam satuan Celcius, Kelvin, Fahrenheit dan Reamur.

2. Instrument Level -> Berguna untuk memonitor keadaan level/ketinggian cairan dalam suatu tempat dengan satuan sentimeter (cm).

3. Instrument Motor -> Berguna untuk memonitor kecepatan RPM Motor listrik terhadap waktu (Rpm/s).

Fungsi tombol:

-Mulai: Untuk mulai mengambil data dari port paralel yang selanjutnya ditampilkan di program.

-Stop : Untuk berhenti mengambil data dari port paralel.

-Clear : menghapus hasil trend grafik motor.

-Turn On/Off : Untuk membuka dan menutup koneksi ke program Client melalui LAN.

B.Program Client

Seperti namanya, program Client ini meminta koneksi dan transfer data dari program server. Sebagai contoh, ditampilkan program Client pengukur suhu :

Client

Program ini memiliki 2 fasilitas Running yaitu: Real (Nyata) dan Simulation (Simulasi). Real digunakan jika memakai sensor suhu, dan simulation hanya untuk simulasi secara software saja. IP address diisi alamat IP komputer server. Contoh di atas memakai alamat IP loopBack. Data Input berupa Byte yang diinputkan jika mode yang dipilih adalah simulation. Tombol “Stop” dan “Disconnect” berfungsi untuk menyambung dan memutus koneksi jaringan dengan program server.

Berikut potongan Source code program Client dan penjelasannya :

function Inp32(nport:word) :byte;
stdcall;
external ‘inpout32.dll’;
// Memanggil fungsi inpout32.dll untuk pembacaan data dari LPT1
function Out32(nport:word;ndata:word):byte;
stdcall;
external ‘inpout32.dll’;
//Memanggil fungsi inpout32.dll untuk penulisan data ke LPT1procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if bitbtn2.Caption= ‘Start’ then
begin
bitbtn2.Caption := ‘Stop’;
if radiobutton2.Checked=true then
begin
timer1.Enabled :=true;
end;
if radiobutton1.Checked =true then
timer2.Enabled :=true;
start_freerunning;
// Prosedur untuk pemilihan mode “real” atau”simulation”

else
begin
bitbtn2.Caption :=’Start’;
if bitbtn2.Caption=’Start’ then
begin
timer1.Enabled :=false;
timer2.Enabled :=false;
end;
end;

end;

//Menonaktifkan timer1 & timer2

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
if bitbtn3.Caption=’Connect’ then
begin
bitbtn3.Caption :=’Disconnect’;
clientsocket1.Active :=true;
statusbar1.SimpleText := ‘ Connected to server ‘;
// Prosedur untuk mengaktifkan komponen Clientsocket1

else
begin
bitbtn3.Caption :=’Connect’;
clientsocket1.Active :=false;
statusbar1.SimpleText:=’Disconnected from server’;
end;
end;

//Prosedur untuk menonaktifkan komponen Clientsocket1

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
clientsocket1.Address:=edit1.Text ;
clientsocket1.Host :=edit2.Text ;
end;

//prosedur untuk pengisian alamat IP

procedure TForm1.Timer1Timer(Sender: TObject);
var suhu_temp:integer;
begin
suhu_temp:=round(spinedit1.Value*100/255);
label1.Caption :=inttostr(suhu_temp);
label2.Caption :=inttostr(suhu_temp+273);
label3.Caption:=inttostr(round((9/5)*suhu_temp)+32);
label4.Caption :=inttostr(round((4/5)*suhu_temp))
end;

//Prosedur untuk konversi suhu (Mode simulasi)

procedure TForm1.Timer2Timer(Sender: TObject);
var suhu_temp:integer;
begin
datain:=Inp32($378);
suhu_temp:=round(datain*100/255);
label1.Caption :=inttostr(suhu_temp);
label2.Caption :=inttostr(suhu_temp+273);
label3.Caption:=inttostr(round((9/5)*suhu_temp)+32);
label4.Caption :=inttostr(round((4/5)*suhu_temp))
end;
//Prosedur untuk konversi suhu (Mode real)

procedure tform1.start_freerunning;
begin
Out32($37a,$20);
tunda(1000000);
Out32($37a,$21);
tunda(1000000);
Out32($37a,$20);
tunda(1000000);
end;
//prosedur untuk konfigurasi ADC free running

procedure tform1.tunda(waktu:integer);
var k:integer;
begin
for k:=0 to waktu do
begin

end;
end;
//Prosedur untuk waktu tunda

procedure TForm1.Timer3Timer(Sender: TObject);
var data_temp:integer;
begin
if (clientsocket1.Socket.Connected) then
begin
data_temp:=datasimulasi;
clientsocket1.Socket.SendBuf(sinkronisasi,1);
clientsocket1.Socket.SendBuf(IdSuhu,1);
clientsocket1.Socket.SendBuf(data_temp,1);
end;
end;
//Prosedur melakukan koneksi jaringan

procedure TForm1.FormCreate(Sender: TObject);
begin
clientsocket1.Port:= 1025;
Out32($37A,$20);

end;

//Menentukan koneksi Port jaringan

procedure TForm1.ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);
begin
statusbar1.SimpleText:=’ client Connected to server (^_^)’+socket.RemoteAddress;
end;
procedureTForm1.ClientSocket1Disconnect(Sender: TObject;Socket: TCustomWinSocket);
begin
statusbar1.SimpleText:=’ Network Disconnected !!’+socket.RemoteAddress;
end;

//Memberikan pesan pada status bar

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var data_temp:byte;
begin
clientsocket1.Socket.ReceiveBuf(data_temp,1);
if data_temp=$ff then
begin
clientsocket1.Socket.ReceiveBuf(data_temp,1);
end;
if data_temp=$01 then
begin
clientsocket1.Socket.ReceiveBuf(data_temp,1);
end;
if data_temp=$11 then
begin
timer3.Enabled:=true;
end;
if data_temp=$22 then
begin
timer3.Enabled:=false;
end;
//Mentransfer data dan membuka/menutup koneksi jaringan

Pada percobaan yang saya lakukan dengan mode simulasi, data yang tertampil pada program server dapat terkirim ke program Client. Hasil percobaan dapat dilihat screenshot di atas, yang menunjukkan nilai konversi suhu menunjukkan hasil yang sama antara client dengan server.

 
Advertisements
About

I'm not a geek, nor a techie

Posted in Instrumentation & Control, Programming

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: