merhaba plc ile bir proje üzerinde çalışıyorum. 10 tane jetfan çalıştırıyorum ve bunların çalışma sürelerini hmi üzerinden gözlemliyorum. yapmak istediğim hmidan bir değer girdiğimde bu değer kadar çalışma süresi en az olan fanların çalışması veya çalışma süresi en çok olan fanların durması mesela 4 değeri girdiğimde çalışma süresi en az olan 4 fan çalışıp diğerleri duracak. bunu scl ile denedim ladder ile de denedim ancak bir türlü istediğim gibi yapamadım. yardımcı olur musunuz. siemens s7-1200 kullanıyorum.
JetFan[0].RunTime := 5; // Test için JetFanların runtime çalışma değerlerine sayılar girdim.
JetFan[1].RunTime := 4;
JetFan[2].RunTime := 7;
JetFan[3].RunTime := 3;
JetFan[4].RunTime := 9;
JetFan[5].RunTime := 10;
Test.CLK := Edge; // Çıkan kenar R_TRIG fb sine parametre gönderimi
IF Test.Q THEN //Çıkan kenarda işlemlere başlanır. Herhangi bir şarta bağlayabilirsin
SiralamaNo := Temizle; // SiralamaNo Arraylarının içlerini temizledim
SiralamaNo := JetFan; // JetFan değerlerini SiralamaNo Arraylarına attım
FOR i := 0 TO 8 BY 1 DO
FOR j:= i+1 TO 9 BY 1 DO // SiralamaNo ARRAY larını tarıyoruz
IF (SiralamaNo[i].RunTime > SiralamaNo[j].RunTime) THEN // i ve j inci veriler test edilir
IF (SiralamaNo[j].RunTime =0) OR (SiralamaNo[i].RunTime =0) THEN // Sıfır değerlerini işleme almadım.
CONTINUE;
END_IF
Takas.RunTime := SiralamaNo[j].RunTime; // Yer degiştirme işlemi yapıyoruz
Takas.No := SiralamaNo[j].No;
SiralamaNo[j].RunTime := SiralamaNo[i].RunTime;
SiralamaNo[j].No := SiralamaNo[i].No;
SiralamaNo[i].RunTime := Takas.RunTime;
SiralamaNo[i].No := Takas.No;
END_IF;
END_FOR; // j için for sonu
END_FOR; // i için for sonu
SortDone := TRUE; // Sıralama Tamam
ELSE
SortDone := FALSE;
END_IF
// JetFanlar Start Stop İşlemleri
IF (GirilenDeger > 0) AND (GirilenDeger < 10) THEN
IF SortDone THEN // Sıralama Tamamsa çıkışları güncelle
FOR i := 0 TO 9 BY 1 DO
IF GirilenDeger > (i-1) THEN
SiralamaNo[i].Start := TRUE;
ELSE
SiralamaNo[i].Start := FALSE;
END_IF
END_FOR
END_IF
ELSE // Girilen deger istenmeyen aralıktaysa startları kes
FOR i := 0 TO 9 BY 1 DO
SiralamaNo[i].Start := FALSE;
END_FOR
END_IF
Test(); // Çıkan kenar fb sini çağırdım
Kod:
VAR // Değisken Tanımlama kısmı JetFanları Struct haline getirdim.
// JetFan yapısı ve fan numaraları başlangıç değeri olarak verildi.
JetFan:ARRAY[0..9] OF JetFan_Type := [(No:=0),(No:=1),(No:=2),(No:=3),(No:=4),(No:=5),(No:=6),(No:=7),(No:=8),(No:=9)];
SiralamaNo, Temizle:ARRAY[0..9 ] OF JetFan_Type;
GirilenDeger:INT;
i,j:INT;
Takas:JetFan_Type;
Test:R_TRIG;
Edge,SortDone:BOOL;
END_VAR
Kod:
TYPE JetFan_Type : // JetFanların type yapısı
STRUCT
No:INT; // Jet Fan Numarası
Start:BOOL;
Stop : BOOL;
RunTime : REAL; // Çalışma Zamanı
END_STRUCT
END_TYPE