آموزش GUI در MATLAB (قسمت سوم)
طراحی بدنه ی اصلی 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
توضیح کد:
این کد تمامی تغییرات را به حالت پیش فرض خود بازمی گرداند.
اگر سؤالي داشتيد مي توانيد در بخش نظرات آن را مطرح كنيد.
براي رفتن به قسمت بعد، به روي لينك زير كليك كنيد:
براي رفتن به ديگر قسمت ها، به روي لينك هاي زير كليك كنيد: