Bu uygulamada birden çok istasyonu aynı hat üzerinde tek bir PLC üzerinden kontrol ederek programı yazdım. Daha sonra bu istasyonlar için bir operatör paneli tasarladım. Sistem 3 ana bölümden oluşuyor. İlk istasyonda hatalı parçalar ayrıştırılıyor ve birleştiriliyor. İkinci istasyonda paletleniyor. Üçüncü istasyonda ise depolanıyor. Sistemin çalışma videosu aşağıdadır.

İlk olarak ayrıştırma istasyonunun programını yazdım.



Bu yazdığım FB’yi daha sonra OB üzerinde çağırdım ve giriş/çıkışları tanımladım.

Daha sonra Pick and Place kısmının programını yazdım. Bu fonksiyonu SCL ile yazdım.
IF #Yeni_Palet = TRUE AND #Palet_Sensor = TRUE THEN
#Roller_Stop := 0;
#Konveyor_Giris := 1;
#Giris_Adımı := 1;
#Yeni_Palet := 0;
END_IF;
IF #Giris_Adımı=TRUE AND #Palet_Sensor = FALSE THEN
#Konveyor_Giris := 0;
#Giris_Adımı := 0;
END_IF;
(*
Palet Geldikten Sonra Program Akışı Başlıyor
*)
IF #Palet_Sensor=FALSE AND #Hat1_Hazir=TRUE AND #Hat2_Hazir=TRUE THEN
#Adım1 := TRUE;
"Ayristirma_Veri".Hat1_Hazir := 0;
"Ayristirma_Veri".Hat2_Hazir := 0;
END_IF;
IF #Adım1 = TRUE THEN
#Setpoint_X:= "Pick_and_Place_Veri".Kapak_Alma_Ust.X;
#Setpoint_Y := "Pick_and_Place_Veri".Kapak_Alma_Ust.Y;
#Setpoint_Z := "Pick_and_Place_Veri".Kapak_Alma_Ust.Z;
#Adım1 := FALSE;
#Adım2 := 1;
END_IF;
IF #Adım2 = TRUE AND #Pozisyon_X = "Pick_and_Place_Veri".Kapak_Alma_Ust.X AND #Pozisyon_Y = "Pick_and_Place_Veri".Kapak_Alma_Ust.Y AND #Pozisyon_Z = "Pick_and_Place_Veri".Kapak_Alma_Ust.Z THEN
#Setpoint_X := "Pick_and_Place_Veri".Kapak_Alma.X;
#Setpoint_Y := "Pick_and_Place_Veri".Kapak_Alma.Y;
#Setpoint_Z := "Pick_and_Place_Veri".Kapak_Alma.Z;
#Adım2 := 0;
#Adım3 := 1;
END_IF;
IF #Adım3 = TRUE AND #Pozisyon_X = "Pick_and_Place_Veri".Kapak_Alma.X AND #Pozisyon_Y = "Pick_and_Place_Veri".Kapak_Alma.Y AND #Pozisyon_Z = "Pick_and_Place_Veri".Kapak_Alma.Z AND #Tutma_Sensor=TRUE THEN
#Tutma := 1;
#Adım3 := 0;
#Adım4 := 1;
#Setpoint_X := "Pick_and_Place_Veri".Kapak_Alma_Ust.X;
#Setpoint_Y := "Pick_and_Place_Veri".Kapak_Alma_Ust.Y;
#Setpoint_Z := "Pick_and_Place_Veri".Kapak_Alma_Ust.Z;
END_IF;
IF #Adım4 = TRUE AND #Pozisyon_X = "Pick_and_Place_Veri".Kapak_Alma_Ust.X AND #Pozisyon_Y = "Pick_and_Place_Veri".Kapak_Alma_Ust.Y AND #Pozisyon_Z = "Pick_and_Place_Veri".Kapak_Alma_Ust.Z THEN
#Setpoint_X := "Pick_and_Place_Veri".Kapak_Bırakma.X;
#Setpoint_Y := "Pick_and_Place_Veri".Kapak_Bırakma.Y;
#Setpoint_Z := "Pick_and_Place_Veri".Kapak_Bırakma.Z;
#Adım4 := 0;
#Adım5 := 1;
#Yeni_Parca := 1;
END_IF;
IF #Adım5 = TRUE AND #Pozisyon_X = "Pick_and_Place_Veri".Kapak_Bırakma.X AND #Pozisyon_Y = "Pick_and_Place_Veri".Kapak_Bırakma.Y AND #Pozisyon_Z = "Pick_and_Place_Veri".Kapak_Bırakma.Z THEN
#Tutma := 0;
#Setpoint_X := "Pick_and_Place_Veri".Parca_Alma.X;
#Setpoint_Y := "Pick_and_Place_Veri".Parca_Alma.Y;
#Setpoint_Z := "Pick_and_Place_Veri".Parca_Alma.Z;
#Adım5 := 0;
#Adım6 := 1;
END_IF;
IF #Adım6 = TRUE AND #Pozisyon_X = "Pick_and_Place_Veri".Parca_Alma.X AND #Pozisyon_Y = "Pick_and_Place_Veri".Parca_Alma.Y AND #Pozisyon_Z = "Pick_and_Place_Veri".Parca_Alma.Z THEN
#Tutma := 1;
#Setpoint_X := "Pick_and_Place_Veri".Parca_Alma_Ust.X;
#Setpoint_Y := "Pick_and_Place_Veri".Parca_Alma_Ust.Y;
#Setpoint_Z := 0;
#Adım6 := 0;
#Adım6_AraAdım := 1;
END_IF;
IF #Adım6_AraAdım=TRUE AND #Pozisyon_X = "Pick_and_Place_Veri".Parca_Alma_Ust.X AND #Pozisyon_Y = "Pick_and_Place_Veri".Parca_Alma_Ust.Y AND #Pozisyon_Z = 0 THEN
#Setpoint_X := "Pick_and_Place_Veri".Parca_Bırakma.X;
#Setpoint_Y := "Pick_and_Place_Veri".Parca_Bırakma.Y;
#Adım6_AraAdım := 0;
#Adım7 := 1;
#Yeni_Parca := 0;
END_IF;
IF #Adım7 = TRUE AND #Pozisyon_X = "Pick_and_Place_Veri".Parca_Bırakma.X AND #Pozisyon_Y = "Pick_and_Place_Veri".Parca_Bırakma.Y AND #Pozisyon_Z = 0 THEN
IF "Pick_and_Place_Veri".Paletteki_Parca_Sayisi = 0 OR "Pick_and_Place_Veri".Paletteki_Parca_Sayisi = 2 OR "Pick_and_Place_Veri".Paletteki_Parca_Sayisi = 4 THEN
#Setpoint_X := "Pick_and_Place_Veri".Parca_Bırakma.X;
#Setpoint_Y := "Pick_and_Place_Veri".Parca_Bırakma.Y;
#Setpoint_Z := "Pick_and_Place_Veri".Parca_Bırakma.Z;
ELSIF "Pick_and_Place_Veri".Paletteki_Parca_Sayisi = 1 OR "Pick_and_Place_Veri".Paletteki_Parca_Sayisi = 3 OR "Pick_and_Place_Veri".Paletteki_Parca_Sayisi = 5 THEN
#Setpoint_X := "Pick_and_Place_Veri".Parca_Bırakma.X + 1.9;
#Setpoint_Y := "Pick_and_Place_Veri".Parca_Bırakma.Y;
#Setpoint_Z := "Pick_and_Place_Veri".Parca_Bırakma.Z;
END_IF;
#Adım7 := 0;
#Adım8 := 1;
END_IF;
IF #Adım8 = TRUE AND (#Pozisyon_X = "Pick_and_Place_Veri".Parca_Bırakma.X OR #Pozisyon_X = "Pick_and_Place_Veri".Parca_Bırakma.X+1.9) AND #Pozisyon_Y = "Pick_and_Place_Veri".Parca_Bırakma.Y AND #Pozisyon_Z = "Pick_and_Place_Veri".Parca_Bırakma.Z THEN
#Tutma := 0;
"Pick_and_Place_Veri".Paletteki_Parca_Sayisi += 1;
#Adım8 := 0;
END_IF;
(*
Palet Dolduktan Sonra Depoya Yollama Adımları
*)
IF "Pick_and_Place_Veri".Paletteki_Parca_Sayisi = "Pick_and_Place_Veri".Olmasi_Gereken_Parca THEN
#Roller_Stop := 1;
#Konveyor_Giris := 1;
#Konveyor_Devam := 1;
#Konveyor_Palet := 1;
#Cıkıs_Adımı := 1;
"Pick_and_Place_Veri".Paletteki_Parca_Sayisi := 0;
END_IF;
IF #Cıkıs_Adımı = TRUE AND #Depo_Palet_Sensor = false THEN
#Roller_Stop := 0;
#Konveyor_Palet := 0;
#Konveyor_Giris := 0;
#Konveyor_Devam := 0;
#Cıkıs_Adımı := 0;
#Yeni_Palet := 1;
END_IF;
Daha sonra bu FB’yi de OB üzerinden çağırdım.

Son olarak depolama istasyonu için bir program yazdım.





Bu FB içinde kullandığım hücre seçim FC’si de aşağıdaki gibi
#X_setpoint := "Depolama_Hücreler_Veri".Hücre[#Sıra , #Sütun].X;
#Z_setpoint := "Depolama_Hücreler_Veri".Hücre[#Sıra, #Sütun].Z;
Daha sonra OB içinde bu fonksiyonu ekledim.

HMI içinde kullandığım animasyonlar için ve yuvarlamalar için de SCL ile ayrı bir FC yazdım.
"HMI_Animasyon_DB".PickandPlace_X := REAL_TO_INT("Pick_and_Place_Veri".Gercek_Pozisyon.X);
"HMI_Animasyon_DB".PickandPlace_Y := REAL_TO_INT("Pick_and_Place_Veri".Gercek_Pozisyon.Y);
"HMI_Animasyon_DB".PickandPlace_Z := REAL_TO_INT("Pick_and_Place_Veri".Gercek_Pozisyon.Z);
"HMI_Animasyon_DB".Depolama_X := REAL_TO_INT("Depolama_Hücreler_Veri".Gercek_Pozisyon_X*10);
"HMI_Animasyon_DB".Depolama_Z := REAL_TO_INT("Depolama_Hücreler_Veri".Gercek_Pozisyon_Z*10);
"HMI_Animasyon_DB".Depolama_Dolu := "Depo_Palet_Sayisi".CV;
"HMI_Animasyon_DB".Depolama_Bos := (54 - "HMI_Animasyon_DB".Depolama_Dolu);
"Üretilen Parça" := "HMI_Animasyon_DB".Depolama_Dolu;
#X_aradeger := ("X_Poz_Bilgi" * 10);
#X_aradeger := ROUND(#X_aradeger);
"Pick_and_Place_Veri".Gercek_Pozisyon.X := #X_aradeger/10;
#Y_aradeger := ("Y_Poz_Bilgi" * 10);
#Y_aradeger := ROUND(#Y_aradeger);
"Pick_and_Place_Veri".Gercek_Pozisyon.Y := #Y_aradeger / 10;
#Z_aradeger := ("Z_Poz_Bilgi" * 10);
#Z_aradeger := ROUND(#Z_aradeger);
"Pick_and_Place_Veri".Gercek_Pozisyon.Z := #Z_aradeger / 10;
#Depo_X_aradeger := ("Asansor_X_Pozisyon" * 100);
#Depo_X_aradeger := ROUND(#Depo_X_aradeger);
"Depolama_Hücreler_Veri".Gercek_Pozisyon_X := #Depo_X_aradeger / 100;
#Depo_Z_aradeger := ("Asansor_Z_Pozisyon" * 100);
#Depo_Z_aradeger := ROUND(#Depo_Z_aradeger);
"Depolama_Hücreler_Veri".Gercek_Pozisyon_Z := #Depo_Z_aradeger / 100;
Programı yazarken kendi tanımladığım data tipleri de aşağıdaki gibi.

PLC programı bittikten sonra HMI tasarımını yaptım. HMI ekranların görüntüleri de aşağıdaki gibidir.









