Merhaba, Matlab function bloğuna yazdığım kodda for döngüsünü oluşturamadım. İşlem döngüyü direk atlıyor. Bunu nasıl çözebilirim? Yardımlarınızı bekliyorum
Not: u bilgisi adc ile alınan baatrya gerilim bilgisi x=1 olması durumu şarj y=1 olması durumu deşarj
u, 0.9 değerine eşitküçükse,
u 1.2 değerine gelene kadar x=1 olsun
u 1.2 değerine eşit büyükse veya 1.2 ile 0.9 arasındaysa
u 0.9’a eşit olana kadar y=1 olsun
function [x,y] = fcn(u) %#codegen while (1) if (u=1.2) || (u>0.9) && (u<1.2) %Deşarj for u=0.9 x=0; y=1; end else x=0; y=0; end end end
Merhaba,
O zaman siz fcn(u) seklinde o fonksiyonu her cağırdığınızda x ve y değerlerini elde etmek istiyorsunuz. Bu durumda while dongusu anlamsız, songuz donguye sokar. Simulink bağlamında böyle bir yazım şekli vardır ve ben bilmiyorumdur belki.
Bir de siz 0.9'un altında kalınca 1.2'ye kadar dolsun istiyorsunuz. Ama Fonksiyon sadece u değerini input olarak alıyor. Bu durumda şarj etmeye başlayınca kaydetmemiz lazım ki fonksiyon doğru işlevi verebilsin. Yani mesela fcn(1.1) şeklinde kodu çalıştırdınız. Şarj ederken mi 1.1'e geldi yoksa 1.2'den azalırken mi geldi bunu şu an kod bir yerde kaydetmiyor. Bunu da yaptırmak gerekir değil mi?
Ben aşağıya normal (simulinksiz) kod olarak yazdım anladığım şeyi:
dolu_gerilim = 1.2; bos_gerilim = 0.9; u = 1.5; %baslangic gerilimi x = 0; y = 1; %baslangic aninda while(1) u = u - 0.15; %u degisimi algoritmasi. her iterasyonda 0.15 azaliyor. if u < 0.9 %u 0.9'dan kucukse şarj konumuna al x = 1; y = 0; elseif u < 1.2 %u 0.9'dan buyuk ama 1.2'den kucukse mevcut konumda kal x = x; y = y; %bu satira aslinda gerek yok ancak mantiginin anlasilmasi icin ekledim elseif u >= 1.2 %u 1.2'den buyukse dejarj konumuna al x = 0; y = 1; end end
Faydalı oldu mu bilmiyorum. Ek bir bilgi varsa yazabilirsiniz. Ancak yazdıklarınızdan konuya pek hakim olmadığınızı seziyorum. Önce döngüleri ve mantık operatörlerinin temel çalışma prensiplerini (&, | ) çalışmak faydalı olabilir. Mesela " (u==1.2) || (u>0.9) && (u==0.9)" yazımının bir anlamı yok. Oradaki && yani "ve" işareti ekleme anlamına gelmiyor. Soldaki ve sağdaki koşulun ikisinin birden gerçekleşmesi anlamına geliyor. Hiçbir zaman da u hem 0.9 hem de 1.2 olmaz.
kodun yeni halinde "
Output argument 'x' is not assigned on some execution paths." bu hatayı alıyorum. sebebi ne olabilir yardım edermisiniz?
kod:
function [x,y] = fcn(u)
%#codegen
if (u<=0.9) %Şarj
while (u1.2) || (u>0.9) && (u=0.9)
x=0;
y=1;
end
else
x=0;
y=0;
end
end
if'le başlayan kısımda ne yapmak istediğiniz belli mi? Sözle anlatabilir misiniz? U değeri 0.9'dan küçükse diyorsunuz, sonra 0.9'dan büyük mü diye kontrol ediyorsunuz. Burada bir mantık hatası var.
Caglar bey, bu kod batarya gerilimine göre çalışacak. bataryanın sürekli şarjda kalmaması için. batarya gerilimi 0.9 değerindeyse veya daha az değerdeyse şarj konumuna geçecek ve batarya gerilimi 1.2 olana kadar bu konumda kalacak. 1.2 olunca bu şarttan çıkacak ve deşarj olmaya geçecek. deşarj konumunda da u bilgisi 0.9 olana kadar kalacak. Sonra tekrar birinci koşula giderek şarj olacak
şarj konumu x=1 y=0
deşarj konumu x=0 y=1
yani 0.9 altındaysa 1.2 ye kadar şarj et, 1.2 olunca 0.9a kadar deşarj et. Sürekli şarjda kalmayacak
Kodumda baştaki ilk iki satırın (dolu_gerilim = 1.2; bos_gerilim = 0.9;) anlamı yok, silinebilir. Sayısal değer yerine değişken kullanayım demiştim ama sonra sayıları yazmışım yine.