یکی از نرم افزارهاي مهم قابل استفاده براي مهندسین کنترل Matlab و در کنارآن Simulink براي شبیه سازي سیستمها و الگوریتمهاي پیچیده کنترلی است. با پیشرفت Matlab جعبه ابزار Simulink نیز پیشرفتهاي زیادي کرده و این شبیه سازیها ساده تر و ساده تر شده است. به خصوص در 8 Matlab به بعد یعنی 2012b Matlab و 2013 تحولات زیادي را میتوان در این قسمت مشاهده کرد. در ادامه توضیحات بر اساس نسخه هاي پایین تر نوشته شده است که قابل استفاده براي عموم باشد. براي مشاهده محیط Simulink بعد از اجراي نرم افزار Matlab از مسیر زیر یک مدل جدید ایجاد کنید File‡ new ‡ model کتابخانه توابع آماده براي شبیه سازي را نیز میتوانید به راحتی با فشردن آیکن آن و یا از مسیر زیر فراخوانی کنید Start ‡ Simulink ‡ Library browser در این کتابخانه از توابع ساده اي مانند جمع و ضرب گرفته تا توابع پیچیده اي مانند مدل میدان مغناطیسی زمین را میتوانید بیابید. در لیست این توابع آنچه در دسته توابع Simulink آمده است پرکاربردترین ها و بعضا ساده ترین این توابع هستند. به عنوان مثال در بخش block used Commonly میتوانید به سرعت به بلوکهاي ساده جبري دسترسی داشته باشید. انواع مختلف وردیهاي لازم براي یک سیستم کنترلی را متیوانید در بخش Sources مشاهده کنید. در بخش Sink ابزارهاي لازم براي مشاهده خروجی سیستم آورده شده است. براي شبیه سازي توابع ریاضی پیچیده (به طور مثال آنچه به عنوان مدل دینامیکی سیستم ممکن است به شما داده شده باشد) در Simulink راه هاي متعددي وجود دارد. میتوانید معادلات را براساس روابط ریاضی آنها با کنارهم قرار دادن بلوکهاي ساده ریاضی که در کتابخانه Simulink وجود دارند این کار را انجام دهید اما در مورد سیستمی پیچیده تر این کار دشوار خواهد بود و منجر به مدلهاي بزرگی میگردد که عیب یابی آنها بسیار سخت خواهد شد. یک روش ساده تر (نه لزوما بهینه تر از لحاظ سرعت ) استفاده از توابع قابل تعریفی است که در آدرس زیر قابل دسترس هستند: Simulink Library browser ‡ Simulink ‡ user-defined function در اینجا ابزارهاي متعددي براي نوشتن توابع وجود دارد که هر کدام کاربري مخصوص به خود را دارد. FCN – با استفاده از fcn میتوانید توابعی ساده را به ورودي اعمال کنید مانند sin یا cos ، اما بسیاري از توابعی که در Matlab تعریف شده اند اینجا امکان استفاده ندارند مانند round یا fix. بعلاوه اگرچه ورودي میتواند بردار باشد اما خروجی این بلوك همواره داراي بعد یک است یعنی شما نمیتوانید به عنوان مثال تابع را به صورت [u cos u sin [تعریف کنید. Matlab FCN – اینجا آزادي عمل بیشتري دارید و از توابع متعددتري میتوانید استفاده کنید بعلاوه میتوانید خروجی برداري داشته باشید. اما این بلوك سرعت اجراي پایین تري از FCN دارد بعلاوه در مواردي که نیاز به compile کردن برنامه باشد نمیتوانید از این بلوك استفاده کنید مثلا در مواردي که میخواهید برنامه شبیه سازي شده را با سرعت بالا (mode accelerator rapid (اجرا کنید. Embedded Matlab Function – این بلوك زمانی کاربرد دارد که معادلات مورد نظر براي پیاده سازي در فرم نوشتاري توابع Matlab بهتر قابل توصیف هستند تا شکل گرافیکی آنها، مانند شبیه سازي دینامیک یک سیستم که معمولا شامل معادلات پیچیده ایست. اگرچه یک کاربرد عمده این بلوك زمانی است که شبیه سازیها قرار است به یک برنامه C تبدیل شوند. در این صورت استفاده از این بلوك منجر به کدهاي بهینه تري خواهد شد. بعلاوه امکان debug کردن برنامه را نیز به شما خواهد داد. در این بلوك براي استفاده از توابع Matlab آزادي چشمگیري وجود دارد شما میتوانید از توابعی پیشرفته اي مانند SVD نیز اینجا استفاده کنید هرچند محدودیتهایی نیز وجود دارد. دقت کنید که این بلوك براي اجرا شدن compile میگردد بنابراین شما نیاز به یک compiler تعریف شده در Matlab دارید که اگر با Matlab 32 بیتی کار میکنید به صورت default این compiler وجود دارد (LCC )و در غیر اینصورت نیازمند به نصب آن خواهید بود
دو مشکل در استفاده از این بلوك قابل ذکر است اول اینکه استفاده از این بلوك سرعت اجرا را پایین میآورد و دوم اینکه نتیجه اجرا دقیقا با یک برنامه Matlab یکی نیست و به خاطر round کردن، خطاهایی در برنامه ایجاد میکند. این خطاها اگرچه ابتدا در حد eps کوچکند اما بعد از اجرا به مدت طولانی ممکن است منجر به تفاوتهاي زیادي گردند. بعلاوه واضح است که استفاده از compiler هاي متفاوت نیز نتایج متفاوتی را در برخواهند داشت. به خصوص کامپایلر LCC در برخی موارد با خطا همراه است و شاید بهتر باشد اگر نرم افزاري مانند Studio Visual را نصب کرده اید از کامپایلر این نرم افزار استفاده کنید. براي انتخاب کامپایلر مناسب در محیط window command عبارت زیر را بنویسید
دو مشکل در استفاده از این بلوك قابل ذکر است اول اینکه استفاده از این بلوك سرعت اجرا را پایین میآورد و دوم اینکه نتیجه اجرا دقیقا با یک برنامه Matlab یکی نیست و به خاطر round کردن، خطاهایی در برنامه ایجاد میکند. این خطاها اگرچه ابتدا در حد eps کوچکند اما بعد از اجرا به مدت طولانی ممکن است منجر به تفاوتهاي زیادي گردند. بعلاوه واضح است که استفاده از compiler هاي متفاوت نیز نتایج متفاوتی را در برخواهند داشت. به خصوص کامپایلر LCC در برخی موارد با خطا همراه است و شاید بهتر باشد اگر نرم افزاري مانند Studio Visual را نصب کرده اید از کامپایلر این نرم افزار استفاده کنید. براي انتخاب کامپایلر مناسب در محیط window command عبارت زیر را بنویسید
u ورودي هاي شما به این تابع است. Y خروجی تابع را نشان میدهد. ورودي و خروجی هاي زیادي را میتوانید اینجا استفاده کنید و یا اینکه آنها را به صورت برداري تعریف نمایید اما دقت کنید اسم خروجی با ورودي یکی نباشد. Fcn نیز نام تابع را مشخص میکند که به دلخواه میتوانید آن را تغییر دهید اما نباید از اسامی تعریف شده Matlab استفاده کنید. متغیرهایی را که میخواهید در اینجا استفاده کنید حتما باید ابتدا تعریف کنید تا ابعاد مشخصی داشته باشند. بعنوان مثالی ساده براي شبیه سازي سیستمی به صورت زیر ẋ(1)= x(2) ẋ(2)=2x(1)+x(2)^2+u به راحتی میتوانید به صورت زیر این تابع را تشکیل دهید function xdot = myfcn(x,u) %#eml xdot=zeros(2,1); xdot(1)=x(2); xdot(2)=2*x(1)+x(2)^2+u; دقت کنید که نیازي به هیچ کلمه اي براي نشان دادن اتمام تابع نیست. پس از نوشتن تابع میتوانید از یک انتگرال گیر بیرون این بلوك براي تولید x از xdot استفاده کنید و نهاتا x را به ورودي بلوك برگردانید تا براي اجرا در step بعدي از آن استفاده کند. این عمل در شکل زیر نشان داده شده است. با دو بار کلیک روي بلوك انتگرالگیر میتوانید مقدار اولیه مورد نظر را براي شبیه سازي تنظیم کنید. – تعریف متغیر ماندگار اگر بخواهید در یک Function Matlab Embedded از متغیري استفاده کنید و نیاز داشته باشید این متغیر که در هر مرحله مقدار آن تغییر میکند، در طول زمان حفظ شود میتوانید آن را به صورت persistent) ماندگار) تعریف کنید . persistent a; و البته نیازمند به دادن یک مقدار اولیه به آن هستید. براي این کار با یک دستور if میتوانید ببنید هرگاه این متغیر هیچ مقداري ندارد (empty است) به آن یک مقدار را نسبت دهید. با این کار مطمئن خواهید شد که این عمل فقط یک بار در ابتداي برنامه اجرا میگردد.
Scope
function xdot = myfcn(x,u) %#eml xdot=zeros(2,1); xdot(1)=x(2); xdot(2)=2*x(1)+x(2)^2+u;
دقت کنید که نیازي به هیچ کلمه اي براي نشان دادن اتمام تابع نیست. پس از نوشتن تابع میتوانید از یک انتگرال گیر بیرون این بلوك براي تولید x از xdot استفاده کنید و نهاتا x را به ورودي بلوك برگردانید تا براي اجرا در step بعدي از آن استفاده کند. این عمل در شکل زیر نشان داده شده است. با دو بار کلیک روي بلوك انتگرالگیر میتوانید مقدار اولیه مورد نظر را براي شبیه سازي تنظیم کنید. – تعریف متغیر ماندگار اگر بخواهید در یک Function Matlab Embedded از متغیري استفاده کنید و نیاز داشته باشید این متغیر که در هر مرحله مقدار آن تغییر میکند، در طول زمان حفظ شود میتوانید آن را به صورت persistent) ماندگار) تعریف کنید . persistent a; و البته نیازمند به دادن یک مقدار اولیه به آن هستید. براي این کار با یک دستور if میتوانید ببنید هرگاه این متغیر هیچ مقداري ندارد (empty است) به آن یک مقدار را نسبت دهید. با این کار مطمئن خواهید شد که این عمل فقط یک بار در ابتداي برنامه اجرا میگردد.
