طراحی بدنه‌ی اصلی GUI ، در قسمت دوم آموزش GUI ، شرح داده شد. حال در این مرحله برنامه را Run کرده و با نام ControlTool ذخیره کرده‌ایم. اینک می‌خواهیم کدهای آن را بنویسیم.

برای شروع ابتدا به قسمت ControlTool_OpeningFcn بروید تا کدهای بازشدن GUI را بنویسید. کدهای زیر را وارد کنید:

g=tf(1,[1 3 2 4]);

step(handles.axes1,g);

rlocus(handles.axes2,g);

bode(handles.axes3,g);

این کدها نمودارهای سیستمی را که بصورت پیش‌فرض قرار داده‌ایم، رسم می‌کند. تابع تبدیل این سیستم، به قرار زیر است:

 

 

 

به Callback تمامی Edit Textها رفته، و کد زیر را وارد کنید:

input=get(hObject,'String');

if (isempty(input))

set(hObject,'String','Default')

end

guidata(hObject, handles);

فقط به‌جای عبارت Default ، مقدار پیش‌فرض آن Edit Text را قرار دهید. این کد مقدار واردشده در Edit Text را به‌صورت رشته‌ای می‌خواند، و اگر مقداری وارد نشده بود، Default را جایگزین می‌کند و در نهایت مقادیر آپدیت می‌شوند.

در ادامه‌ی کار به Callback دگمه‌ی فشاری Run رفته و قطعه کد زیر را وارد کنید:

if get(handles.radiobutton1,'Value') == get(handles.radiobutton1,'Max')

num=get(handles.edit1,'String');

num=str2num(num);

den=get(handles.edit2,'String');

den=str2num(den);

s1=size(num);

s2=size(den);

delay=get(handles.edit8,'String');

delay=str2num(delay);

if s1(1,2) > s2(1,2)

errordlg('Invalid input value!  size(num) <= size(den)','Error','modal');

end

if get(handles.checkbox1,'Value') == get(handles.checkbox1,'Max')

if delay < 0

errordlg('The value of the "OutputDelay" property must be a vector of nonnegative numbers.','Error','modal');

elseif mod(delay,1) ~= 0

errordlg('The value of the "OutputDelay" property must be integer valued for discrete-time models.','Error','modal');

else

h=tf(num,den,1,'outputdelay',delay);

g=tf(num,den,'outputdelay',delay);

end

else

g=tf(num,den);

end

else

z=get(handles.edit3,'String');

z=str2num(z);

p=get(handles.edit4,'String');

p=str2num(p);

s1=size(z);

s2=size(p);

delay=get(handles.edit8,'String');

delay=str2num(delay);

if s1(1,2) > s2(1,2)

errordlg('Invalid input value!  size(z) <= size(p)','Error','modal');

end

k=get(handles.edit5,'String');

k=str2num(k);

if get(handles.checkbox1,'Value') == get(handles.checkbox1,'Max')

if delay < 0

errordlg('The value of the "OutputDelay" property must be a vector of nonnegative numbers.','Error','modal');

elseif mod(delay,1) ~= 0

errordlg('The value of the "OutputDelay" property must be integer valued for discrete-time models.','Error','modal');

else

h=zpk(z,p,k,1,'outputdelay',delay);

g=zpk(z,p,k,'outputdelay',delay);

end

else

g=zpk(z,p,k);

end

end

if get(handles.radiobutton6,'Value') == get(handles.radiobutton6,'Max')...

&& get(handles.checkbox1,'Value') ~= get(handles.checkbox1,'Max')

g=feedback(g,1);

elseif get(handles.radiobutton6,'Value') == get(handles.radiobutton6,'Max')...

&& get(handles.checkbox1,'Value') == get(handles.checkbox1,'Max')

errordlg('Delay must be turn off in close loop.','Error','modal');

end

if (delay > 0) && (mod(delay,1) == 0)

%------------------------------------Response of LTI System

val1 = get(handles.popupmenu1,'Value');

if get(handles.radiobutton3,'Value') == get(handles.radiobutton3,'Max')

switch val1

case 1

step(handles.axes1,g);

case 2

impulse(handles.axes1,g);

end

else

time=get(handles.edit7,'String');

time=str2num(time);

t=0:time/1000:time;

switch val1

case 1

step(handles.axes1,g,t);

case 2

impulse(handles.axes1,g,t);

end

end

%-------------------------------------------Analysis roots

val2 = get(handles.popupmenu2,'Value');

switch val2

case 1

if get(handles.checkbox1,'Value') == get(handles.checkbox1,'Max')

rlocus(handles.axes2,h);

else

rlocus(handles.axes2,g);

end

case 2

pzmap(handles.axes2,g);

end

%---------------------------------------Frequency response

val3 = get(handles.popupmenu3,'Value');

switch val3

case 1

bode(handles.axes3,g);

case 2

nyquist(handles.axes3,g);

case 3

nichols(handles.axes3,g);

end

end

guidata(hObject, handles);

 

توضیح کد:

این کد درابتدا بررسی می‌کند که کدام روش برای معرفی سیستم، وارد شده است. اگر روش ضرایب چندجمله‌ای وارد شده بود، مقادیر num و den را به‌صورت رشته‌ای خوانده و به عدد تبدیل می‌کند. مقدار Delay را هم به‌همین ترتیب خوانده و به عدد تبدیل می‌کند تا در صورت نیاز از آن استفاده شود. در ادامه سایزهای num و den خوانده شده و در صورتیکه سایز num بزرگتر از den باشد، بوسیله‌ی تابع errordlg ، پیغام خطایی صادر می‌شود(در تمام توابع تبدیل سیستم‌های کنترلی، منطقی آن است که سایز num از سایز den کوچکتر و یا مساوی باشد). این دیالوگ به‌صورت زیر است:

 

 

 

 

 

 

نکته: این خطا از نوع modal است، و تا زمانی که OK نشود، کاربر نمی‌تواند به ادامه‌ی کار بپردازد.

در ادامه‌ی کد بررسی می‌شود که آیا Delay فعال است یا نه؟ اگر فعال باشد، بررسی می‌کند که مقدار وارد شده برای Delay ، منفی و یا اعشاری نباشد، و برای رخداد هرکدام پیغام خطایی از نوع modal صادر می‌کند. سپس درصورتی‌که مشکلی در عدد وارد شده برای Delay نبود، تابع تبدیل سیستم را به‌همراه Delay تشکیل می‌دهد و اگرهم Delay فعال نبود، که تابع تبدیل را بدون Delay تشکیل می‌دهد.

در ادامه‌ی کد به قسمتی می‌رسیم که مربوط به معرفی سیستم با صفرها و قطب‌ها و گین می‌باشد. این کد درابتدا صفرها و قطب‌ها و گین و تأخیر سیستم را خوانده و به عدد تبدیل می‌کند. سپس بررسی می‌کند که تعداد صفرهای سیستم از تعداد قطب‌های آن بیشتر نباشد، که دراین‌صورت پیغام خطایی صادر می‌کند. سپس در صورت فعال بودن Delay، همان شروط ذکر شده را برای عدد وارد شده، چک می‌نماید. درصورتی‌که مشکلی وجود داشت، خطایی صادر می‌کند و درغیراین‌صورت تابع تبدیل را به‌همراه Delay ، تشکیل می‌دهد و در صورتی‌که تأخیری در کار نباشد، تابع تبدیل بدون تأخیر را تشکیل می‌دهد.

سپس درصورتی‌که نوع سیستم، حلقه‌بسته انتخاب شده باشد(و Delay هم فعال نباشد)، سیستم حلقه‌بسته با استفاده از دستور feedback ، تشکیل می‌شود.

در ادامه‌ی کد بررسی می‌شود که تأخیر وارد شده، مشکلی نداشته باشد که اگر چنین باشد، هیچ پاسخی رسم نمی‌شود. سپس بررسی می‌شود که در قسمت پاسخ زمانی سیستم، حالت پیش‌فرض قرار داده شده‌است و یا انتخابی؟ در صورت فعال بودن حالت انتخابی، زمان واردشده در کادر مربوطه، خوانده شده و به عدد تبدیل می‌شود سپس برداری از صفر تا عدد واردشده و با گام یک‌هزارم عدد واردشده، تشکیل می‌شود تا پاسخ سیستم به ازای آن بردار ترسیم شود. نحوه‌ی تشخیص فعال‌بودن کدام پاسخ نیز بوسیله‌ی دستور switch ، کاملا واضح است.

ادامه‌ی این کد نیز مربوط به رسم نمودارهای آنالیز ریشه‌های سیستم و پاسخ فرکانسی آن می‌باشد که با توجه به توضیحات ذکر شده، مطلب خاصی باقی نمی‌ماند.

در ادامه‌ی کار به Callback دگمه‌ی فشاری Reset رفته و قطعه کد زیر را وارد کنید:

g=tf(1,[1 3 2 4]);

step(handles.axes1,g);

rlocus(handles.axes2,g);

bode(handles.axes3,g);

set(handles.radiobutton1,'Value',1);

set(handles.radiobutton3,'Value',1);

set(handles.radiobutton5,'Value',1);

set(handles.edit1,'String','1');

set(handles.edit2,'String','[1 3 2 4]');

set(handles.edit3,'String','[]');

set(handles.edit4,'String','[-1 -2]');

set(handles.edit5,'String','1');

set(handles.edit7,'String','10');

set(handles.edit8,'String','2');

set(handles.popupmenu1,'Value',1);

set(handles.popupmenu2,'Value',1);

set(handles.popupmenu3,'Value',1);

set(handles.checkbox1,'Value',0);

guidata(hObject, handles);

 

توضیح کد:

این کد تمامی تغییرات را به حالت پیش‌فرض خود بازمی‌گرداند.

 

اگر سؤالي داشتيد مي‌توانيد در بخش نظرات آن را مطرح كنيد.

براي رفتن به قسمت بعد، به‌روي لينك زير كليك كنيد:

آموزش GUI (قسمت چهارم)

 

براي رفتن به ديگر قسمت‌ها، به‌روي لينك‌هاي زير كليك كنيد:

آموزش GUI (قسمت اول)

آموزش GUI (قسمت دوم)

آموزش GUI (قسمت سوم)

آموزش GUI (قسمت چهارم)


مطالب مشابه

کتاب آموزش شبیه سازی و مدل ساز

  مشخصات: مولف: دکتر نیکوبین (استاد دانشکده مکان

کتاب الکترونیکی سری سوم - آموز

      اي که برای دانلود قرار داده شده است براي

کتاب آموزش MATLAB

  نویسندگان: مهندس علی اکبر علمداری، مهندس نسرین

آموزش كاربردي مباحث پيشرفته با

آموزش كاربردي مباحث پيشرفته با Matlab            

آموزش GUI (قسمت اول)

در چند قسمت قصد دارم نحوه كار كردن با GUI رو به شم

آموزش سیمولینک (قسمت اول)

با عرض سلام خدمت دوستان عزيز قصد دارم در چند قسمت

نوشتن دیدگاه


تصویر امنیتی
تصویر امنیتی جدید