اگر با MATLAB و Simulink کار کرده باشید، احتمالاً با این مسئله مواجه شدهاید که یک مدل را در چند حالت مختلف اجرا میکنید، اما خروجیهای شبیهسازی با یک نام ثابت در Workspace ذخیره میشوند و اجرای جدید، نتایج اجرای قبلی را overwrite میکند.
برای مثال، فرض کنید یک پارامتر به نام Mode دارید که دو حالت مختلف را مشخص میکند:
Mode = 0;
و:
Mode = 1;
در این شرایط ممکن است بخواهید خروجیها به صورت زیر ذخیره شوند:
Mode = 0
Vdc_0
Id_0
Iq_0
Mode = 1
Vdc_1
Id_1
Iq_1
در این مقاله یک روش ساده و کاربردی برای تغییر خودکار نام خروجیهای Simulink بر اساس مقدار Mode بررسی میکنیم.
مشکل ذخیره خروجیهای Simulink در Workspace چیست؟
یکی از روشهای متداول برای انتقال خروجی یک مدل Simulink به MATLAB Workspace، استفاده از بلوک To Workspace است.
برای مثال، ممکن است یک بلوک To Workspace داشته باشیم که خروجی آن را با نام زیر ذخیره کند:
Vdc
اگر مدل را یک بار اجرا کنیم:
Mode = 0;
متغیر Vdc در Workspace ایجاد میشود.
اما اگر مدل را مجدداً با حالت دیگری اجرا کنیم:
Mode = 1;
خروجی جدید نیز دوباره با نام Vdc ذخیره خواهد شد و ممکن است نتیجه قبلی را از دست بدهیم.
این مسئله زمانی جدیتر میشود که تعداد خروجیها زیاد باشد؛ مثلاً:
Vabc
Iabc
Vdc
Id
Iq
P
Q
Torque
Speed
در چنین شرایطی مدیریت دستی نتایج بسیار زمانبر خواهد بود.
راهحل: تغییر نام Variable در To Workspace
یکی از راههای ساده برای حل این مشکل، تغییر نام متغیر خروجی بلوک To Workspace قبل از اجرای Simulation است.
فرض کنید نام بلوک ما:
MyModel/To Workspace
باشد.
میتوانیم با استفاده از set_param نام متغیر آن را از طریق MATLAB تغییر دهیم.
برای مثال:
Mode = 0;
blk = 'MyModel/To Workspace';
set_param(blk, ...
'VariableName', ['Vout_' num2str(Mode)]);
در این حالت خروجی با نام زیر ذخیره خواهد شد:
Vout_0
اگر Mode را تغییر دهیم:
Mode = 1;
و دستور زیر را اجرا کنیم:
set_param(blk, ...
'VariableName', ['Vout_' num2str(Mode)]);
نام خروجی به:
Vout_1
تغییر خواهد کرد.
بنابراین میتوانیم چند اجرای مختلف از یک مدل داشته باشیم و نتایج آنها را با نامهای جداگانه در Workspace نگه داریم.
تغییر نام چند خروجی به صورت همزمان
در پروژههای واقعی معمولاً تنها یک خروجی نداریم. فرض کنید میخواهیم خروجیهای زیر را ذخیره کنیم:
Vdc
Id
Iq
P
Q
میتوانیم برای هر بلوک To Workspace نام متناسب با Mode را تعیین کنیم:
Mode = 1;
set_param('MyModel/To Workspace Vdc', ...
'VariableName', ['Vdc_' num2str(Mode)]);
set_param('MyModel/To Workspace Id', ...
'VariableName', ['Id_' num2str(Mode)]);
set_param('MyModel/To Workspace Iq', ...
'VariableName', ['Iq_' num2str(Mode)]);
set_param('MyModel/To Workspace P', ...
'VariableName', ['P_' num2str(Mode)]);
set_param('MyModel/To Workspace Q', ...
'VariableName', ['Q_' num2str(Mode)]);
اگر Mode = 1 باشد، خروجیها با نامهای زیر ذخیره میشوند:
Vdc_1
Id_1
Iq_1
P_1
Q_1
و اگر Mode را به صفر تغییر دهیم:
Mode = 0;
همین خروجیها به شکل زیر ذخیره خواهند شد:
Vdc_0
Id_0
Iq_0
P_0
Q_0
این مسئله در مدلهای پیچیدهتر مانند شبیهسازی ریزشبکههای AC/DC در Simulink اهمیت بیشتری پیدا میکند.
پروژه مرتبط: شبیه سازی پخش بار ریزشبکه های ترکیبی AC/DC مستقل
اجرای خودکار چند Mode
این روش زمانی کاربردیتر میشود که بخواهیم چند سناریو را پشت سر هم شبیهسازی کنیم.
برای مثال، فرض کنید میخواهیم مدل را در دو حالت اجرا کنیم.
کد MATLAB میتواند به صورت زیر باشد:
%% Mode 0
Mode = 0;
set_param('MyModel/To Workspace Vdc', ...
'VariableName', ['Vdc_' num2str(Mode)]);
set_param('MyModel/To Workspace Id', ...
'VariableName', ['Id_' num2str(Mode)]);
sim('MyModel');
%% Mode 1
Mode = 1;
set_param('MyModel/To Workspace Vdc', ...
'VariableName', ['Vdc_' num2str(Mode)]);
set_param('MyModel/To Workspace Id', ...
'VariableName', ['Id_' num2str(Mode)]);
sim('MyModel');
در پایان شبیهسازی، نتایج هر دو حالت در Workspace باقی میمانند:
Vdc_0
Id_0
Vdc_1
Id_1
در نتیجه میتوانیم نتایج را مستقیماً با یکدیگر مقایسه کنیم.
استفاده از Constant Block برای تعیین Mode
در بسیاری از مدلهای Simulink، Mode مستقیماً از Workspace تعیین نمیشود و یک Constant Block برای آن در نظر گرفته میشود.
برای مثال:
Constant
│
│ Mode
▼
Control System
در این حالت میتوان مقدار Constant را از یک متغیر MATLAB دریافت کرد.
مثلاً:
Mode = 0;
و سپس مقدار Constant را برابر Mode قرار داد.
با تغییر:
Mode = 1;
مدل در حالت دوم اجرا خواهد شد.
نکته مهم این است که Constant Block صرفاً مقدار Mode را به مدل میدهد. اگر هدف شما تغییر نام متغیرهای Workspace باشد، همچنان باید نام خروجیهای To Workspace را قبل از اجرای Simulation تغییر دهید.
چرا از Variant Subsystem استفاده نکنیم؟
ممکن است در نگاه اول تصور کنیم برای کنترل حالتهای مختلف باید از Variant Subsystem استفاده کنیم.
اما Variant Subsystem برای یک مسئله متفاوت طراحی شده است.
اگر هدف این باشد که بر اساس Mode، یک ساختار متفاوت در مدل انتخاب شود، مثلاً:
Mode = 0 → Controller A
Mode = 1 → Controller B
Variant Subsystem میتواند گزینه مناسبی باشد.
اما اگر ساختار مدل ثابت است و فقط میخواهیم:
مدل را در چند حالت اجرا کنیم و نتایج هر حالت را با نام جداگانه ذخیره کنیم،
استفاده از Variant Subsystem ضرورتی ندارد.
در این شرایط، تغییر نام To Workspace با set_param روش سادهتری است.
مقایسه نتایج Modeهای مختلف
یکی از مزیتهای اصلی این روش این است که پس از شبیهسازی، نتایج هر حالت را میتوان بهراحتی با یکدیگر مقایسه کرد.
برای مثال:
plot(Vdc_0)
hold on
plot(Vdc_1)
legend('Mode 0','Mode 1')
grid on
یا اگر خروجی شامل زمان و داده باشد، میتوانیم متغیرهای ذخیرهشده را بر اساس ساختار انتخابشده در To Workspace پردازش کنیم.
این قابلیت در پروژههایی که چند روش کنترلی یا چند سناریوی مختلف با یک مدل واحد مقایسه میشوند، بسیار مفید است.
پروژه مرتبط: شبیه سازی توربین بادی در متلب؛ کنترل مزارع بادی برای بهبود پایداری گذرا
کاربرد این روش در پروژههای مهندسی برق
این تکنیک فقط به یک مدل خاص محدود نیست و در بسیاری از پروژههای شبیهسازی مهندسی برق قابل استفاده است.
برای مثال میتوان نتایج موارد زیر را با نامهای جداگانه ذخیره کرد:
- کنترلر مرجع و کنترلر پیشنهادی
- سیستم با ذخیرهساز و بدون ذخیرهساز
- سیستم با PLL و بدون PLL
- حالت متصل به شبکه و حالت جزیرهای
- شرایط مختلف خطا
- سناریوهای مختلف بار
- سرعتهای مختلف باد در توربینهای بادی
- روشهای مختلف کنترل مبدل
- حالتهای مختلف عملکرد میکروگرید
مثلاً:
Mode 0 → روش مرجع
Mode 1 → روش پیشنهادی
و خروجیها:
Vdc_0
Vdc_1
Id_0
Id_1
Iq_0
Iq_1
به این ترتیب ساختار دادهها نیز بهصورت واضح نشان میدهد که هر خروجی متعلق به کدام سناریو است.
یک نکته مهم برای پروژههای بزرگ
اگر تعداد خروجیها زیاد است، بهتر است کد تغییر نام خروجیها را به صورت یک اسکریپت مستقل نگهداری کنید و اجرای شبیهسازی را نیز به همان اسکریپت بسپارید.
به این ترتیب به جای اینکه هر بار:
- Mode را تغییر دهید.
- نام چندین To Workspace را تغییر دهید.
- مدل را اجرا کنید.
- خروجیها را تغییر نام دهید.
- نتایج را ذخیره کنید.
تمام این فرآیند با یک اسکریپت انجام میشود.
در پروژههای بزرگ، همین اتوماسیونهای کوچک میتوانند مقدار قابل توجهی از زمان و خطاهای انسانی را کاهش دهند.
جمعبندی
اگر در MATLAB/Simulink یک مدل را در چند حالت مختلف اجرا میکنید، ذخیره تمام نتایج با یک نام ثابت میتواند باعث overwrite شدن نتایج قبلی شود.
یک راه ساده برای حل این مشکل، تغییر خودکار VariableName بلوکهای To Workspace بر اساس مقدار Mode است.
برای مثال:
Mode = 0;
set_param('MyModel/To Workspace Vdc', ...
'VariableName', ['Vdc_' num2str(Mode)]);
و در حالت دوم:
Mode = 1;
set_param('MyModel/To Workspace Vdc', ...
'VariableName', ['Vdc_' num2str(Mode)]);
در نتیجه میتوان خروجیهای هر سناریو را با نامی مشخص و قابل تشخیص در Workspace نگهداری کرد.
این راهکار ساده، مخصوصاً زمانی که یک مدل Simulink برای مقایسه چند روش، کنترلر یا سناریوی مختلف استفاده میشود، میتواند مدیریت نتایج شبیهسازی را بسیار آسانتر کند.
این نوع تکنیکهای کوچک اما کاربردی، در پروژههای شبیهسازی MATLAB و Simulink میتوانند تفاوت قابلتوجهی در نظم و سرعت انجام کار ایجاد کنند. در شریف آنلاین نیز تلاش میکنیم در کنار ارائه پروژهها و کدهای تخصصی مهندسی برق، تجربههای کاربردی حاصل از کار با ابزارهایی مانند MATLAB، Simulink و GAMS را در قالب مطالب آموزشی در اختیار علاقهمندان قرار دهیم.
کلمات کلیدی:
- خروجی Simulink در MATLAB
- To Workspace در Simulink
- تغییر نام خروجی Simulink
- ذخیره نتایج شبیهسازی MATLAB
- set_param در Simulink
- VariableName در To Workspace
- Simulink Workspace
- ذخیره چند خروجی Simulink
- Simulink To Workspace
دیدگاه خود را بنویسید