در مدل‌های پیچیده سیمولینک، گاهی لازم است یک بخش مشخص از مدل تنها زمانی اجرا شود که یک رویداد فراخوانی تابع دریافت کند. در این شرایط، به‌جای اجرای مداوم زیرسیستم، می‌توان اجرای آن را به یک Function-Call Event وابسته کرد. Function-Call Subsystem دقیقاً برای همین هدف طراحی شده و امکان ایجاد ساختارهایی مشابه توابع قابل فراخوانی را با استفاده از بلوک‌های سیمولینک فراهم می‌کند. 

مفهوم Function-Call Subsystem

Function-Call Subsystem یک زیرسیستم شرطی است که هر بار با دریافت یک رویداد Function-Call اجرا می‌شود. بنابراین اجرای آن به‌صورت مستقیم و پیوسته انجام نمی‌شود، بلکه یک بخش دیگر از مدل مسئول ایجاد رویداد فراخوانی است.

این ساختار از نظر مفهومی شباهت زیادی به یک تابع در برنامه‌نویسی دارد؛ یک بخش از مدل درخواست اجرای عملکرد را ایجاد می‌کند و Function-Call Subsystem عملیات تعریف‌شده درون خود را انجام می‌دهد. 

از Function-Call Subsystem می‌توان برای زمان‌بندی اجرای اجزای مدل و کنترل نرخ اجرای آن‌ها نیز استفاده کرد. 

ساختار Function-Call Subsystem

یک Function-Call Subsystem معمولاً شامل یک ورودی داده، یک ورودی مخصوص Function-Call و خروجی‌های موردنیاز است.

ورودی Function-Call از نوع سیگنال داده معمولی نیست؛ این ورودی یک رویداد اجرایی را منتقل می‌کند. در نتیجه، دریافت آن باعث می‌شود محاسبات داخلی زیرسیستم در زمان مشخص انجام شوند.

درون زیرسیستم می‌توان مجموعه‌ای از بلوک‌های محاسباتی را قرار داد و آن‌ها را به شکل یک الگوریتم مستقل سازمان‌دهی کرد. این ساختار باعث می‌شود منطق اجرای الگوریتم از منطق تولید رویداد جدا شود.

ایجاد یک Function-Call Subsystem

برای ایجاد چنین ساختاری می‌توان از بلوک آماده Function-Call Subsystem در کتابخانه Ports & Subsystems استفاده کرد. این بلوک از ابتدا برای دریافت رویداد Function-Call پیکربندی شده است. 

پس از قرار دادن بلوک در مدل، محتوای داخلی آن می‌تواند متناسب با الگوریتم موردنظر طراحی شود. در ادامه باید یک منبع تولیدکننده Function-Call Event به ورودی کنترلی آن متصل شود.

این روش برای مدل‌هایی که چند الگوریتم مستقل دارند، امکان ایجاد ساختار سلسله‌مراتبی و قابل مدیریت فراهم می‌کند.

تولید رویداد Function-Call

رویداد Function-Call می‌تواند از منابع مختلفی ایجاد شود. از جمله این منابع می‌توان به Function-Call Generator، Stateflow Chart، MATLAB Function، S-Function و Hit Crossing اشاره کرد. 

به این ترتیب، منطق تولید رویداد می‌تواند کاملاً مستقل از الگوریتم داخل زیرسیستم طراحی شود.

برای مثال، یک Function-Call Generator می‌تواند اجرای یک زیرسیستم را در نرخ مشخصی کنترل کند، در حالی که Stateflow می‌تواند اجرای آن را بر اساس وضعیت‌ها و رویدادهای یک ماشین حالت مدیریت کند.

استفاده از Function-Call Generator

Function-Call Generator یکی از ساده‌ترین روش‌ها برای تولید رویدادهای موردنیاز Function-Call Subsystem است. این بلوک می‌تواند رویدادهای فراخوانی را با نرخ مشخص ایجاد کند و در نتیجه زمان اجرای زیرسیستم را کنترل نماید. 

همچنین امکان اجرای چندباره یک Function-Call Subsystem در یک گام زمانی وجود دارد. این قابلیت در الگوریتم‌هایی که نیاز به اجرای تکراری در یک بازه زمانی مشخص دارند، کاربرد دارد.

Function-Call Generator همچنین می‌تواند برای اجرای چند Function-Call Subsystem در یک ترتیب مشخص، در کنار Function-Call Split مورد استفاده قرار گیرد. 

مثال کاربردی در سیستم کنترل

فرض کنید یک سیستم کنترل دارای یک الگوریتم محاسباتی است که نباید در تمام لحظات اجرا شود. می‌توان اجرای این الگوریتم را داخل یک Function-Call Subsystem قرار داد.

در این ساختار، بخش تولیدکننده رویداد مشخص می‌کند که چه زمانی الگوریتم اجرا شود. در هنگام دریافت رویداد، زیرسیستم فعال شده و محاسبات داخلی آن انجام می‌شوند.

این معماری به‌خصوص زمانی مفید است که الگوریتم دارای نرخ اجرای متفاوتی از سایر بخش‌های مدل باشد.

کنترل نرخ اجرای الگوریتم

یکی از کاربردهای مهم Function-Call Subsystem، تفکیک نرخ اجرای الگوریتم‌ها است. در یک مدل ممکن است بخش اندازه‌گیری، کنترل و پردازش داده هرکدام نیاز به نرخ اجرای متفاوتی داشته باشند.

با استفاده از Function-Call می‌توان اجرای یک بخش را مستقل از مسیرهای دیگر مدل مدیریت کرد. در نتیجه، مدل می‌تواند دارای چند بخش با زمان‌بندی‌های متفاوت باشد، بدون آنکه همه آن‌ها الزاماً در هر مرحله به یک شکل اجرا شوند.

این قابلیت برای مدل‌های کنترل دیجیتال، سیستم‌های بلادرنگ و الگوریتم‌های پردازشی چندمرحله‌ای اهمیت زیادی دارد.

Function-Call و ترتیب اجرای بلوک‌ها

در مدل‌هایی که چند Function-Call Subsystem به یک رویداد مشترک متصل هستند، ترتیب اجرای آن‌ها اهمیت پیدا می‌کند.

سیمولینک امکان استفاده از ساختارهایی مانند Function-Call Split را برای مدیریت و تعیین ترتیب اجرای چند Function-Call Subsystem فراهم می‌کند. بنابراین می‌توان مشخص کرد که چند بخش مرتبط در چه ترتیبی نسبت به یکدیگر اجرا شوند. 

این قابلیت در الگوریتم‌هایی که خروجی یک مرحله باید قبل از اجرای مرحله بعدی تولید شده باشد، اهمیت ویژه‌ای دارد.

Function-Call Split

Function-Call Split برای تقسیم یک مسیر Function-Call و هدایت رویداد به چند بخش مختلف کاربرد دارد.

این ساختار زمانی مفید است که یک رویداد مشترک باید باعث اجرای چند زیرسیستم شود و ترتیب اجرای آن‌ها نیز اهمیت داشته باشد. استفاده صحیح از آن می‌تواند ساختار کنترل اجرای مدل را نسبت به ایجاد مسیرهای مستقل و پیچیده ساده‌تر کند. 

ارتباط با Stateflow

Stateflow یکی از منابع مهم ایجاد Function-Call Event است. در یک مدل مبتنی بر ماشین حالت، تغییر وضعیت یا وقوع یک رویداد می‌تواند باعث فراخوانی یک Function-Call Subsystem شود. 

این قابلیت امکان ترکیب منطق تصمیم‌گیری Stateflow با الگوریتم‌های محاسباتی سیمولینک را فراهم می‌کند. در نتیجه، Stateflow می‌تواند زمان اجرای الگوریتم را مشخص کند و Function-Call Subsystem عملیات عددی موردنیاز را انجام دهد.

این معماری در سیستم‌های کنترلی چندحالته، مدیریت خطا و سیستم‌های مبتنی بر رویداد کاربرد فراوانی دارد.

Function-Call در مدل‌های چندسطحی

Function-Call Subsystem می‌تواند در مدل‌های سلسله‌مراتبی نیز مورد استفاده قرار گیرد. در این حالت، یک زیرسیستم می‌تواند Function-Call دیگری را فعال کند و ساختاری چندسطحی از فراخوانی‌ها ایجاد شود.

این مفهوم در مدل‌های بزرگ کمک می‌کند الگوریتم‌های پیچیده به اجزای کوچک‌تر تقسیم شوند. MathWorks نیز نمونه‌هایی از Nested Function Call را برای نمایش فراخوانی تو در تو در مدل‌های سیمولینک ارائه می‌کند. 

Function-Call و Function Caller

Function-Call Subsystem را نباید با Simulink Function و Function Caller یکسان دانست.

Function-Call Subsystem بیشتر بر کنترل اجرای یک زیرسیستم توسط رویداد Function-Call تمرکز دارد. در مقابل، Simulink Function برای تعریف یک تابع قابل فراخوانی با ورودی‌ها و خروجی‌های مشخص استفاده می‌شود و Function Caller وظیفه فراخوانی آن تابع را بر عهده دارد. 

بنابراین این دو ساختار می‌توانند اهداف متفاوتی داشته باشند و انتخاب میان آن‌ها باید بر اساس معماری موردنظر مدل انجام شود.

Function-Call در تولید کد

Function-Call Subsystem تنها برای شبیه‌سازی محدود نیست و از قابلیت‌های تولید کد نیز پشتیبانی می‌کند. بسته به پیکربندی مدل، می‌توان از آن برای ایجاد ساختارهای تابعی در کد تولیدشده استفاده کرد. 

این ویژگی باعث می‌شود طراحی Function-Call در پروژه‌هایی که هدف نهایی آن‌ها پیاده‌سازی الگوریتم روی سیستم‌های واقعی یا سخت‌افزارهای embedded است نیز اهمیت داشته باشد.

مدیریت بازخورد در Function-Call

در مدل‌هایی که Function-Call Subsystemها با یکدیگر ارتباط بازخوردی دارند، ترتیب اجرای بخش‌ها اهمیت بیشتری پیدا می‌کند. در چنین شرایطی سیمولینک ابزار Function-Call Feedback Latch را برای مدیریت برخی حلقه‌های بازخوردی مرتبط با Function-Call در اختیار قرار می‌دهد. 

استفاده مناسب از این ساختار می‌تواند از تغییر ناخواسته داده‌ها در میانه اجرای زنجیره Function-Call جلوگیری کند و ترتیب پردازش را قابل کنترل‌تر سازد.

کاربرد در سیستم‌های مهندسی

Function-Call Subsystem در طیف گسترده‌ای از کاربردهای مهندسی قابل استفاده است. در سیستم‌های کنترل می‌توان الگوریتم‌های مختلف را با نرخ‌های اجرای مستقل مدیریت کرد. در سیستم‌های صنعتی، اجرای یک بخش می‌تواند به دریافت یک فرمان یا رخداد مشخص وابسته شود.

در پردازش سیگنال نیز می‌توان مراحل مختلف پردازش را به رویدادهای خاص وابسته کرد. در مدل‌های پیچیده‌تر، ترکیب Function-Call با Stateflow، زیرسیستم‌های شرطی و Variant Subsystem امکان ایجاد معماری‌های پیشرفته و چندحالته را فراهم می‌کند.

نکات مهم در طراحی

هنگام طراحی Function-Call Subsystem باید میان سیگنال داده و رویداد Function-Call تفاوت قائل شد. رویداد Function-Call مشخص می‌کند که زیرسیستم چه زمانی اجرا شود، در حالی که ورودی‌های معمولی داده‌های موردنیاز الگوریتم را در اختیار آن قرار می‌دهند.

همچنین باید نرخ اجرای زیرسیستم، ترتیب اجرای چند Function-Call، وابستگی‌های بازخوردی و وضعیت بلوک‌های دارای State به‌دقت بررسی شوند. رعایت این موارد از ایجاد رفتارهای غیرمنتظره در مدل جلوگیری می‌کند. 

جمع‌بندی

Function-Call Subsystem یکی از ابزارهای مهم سیمولینک برای ایجاد مدل‌های مبتنی بر رویداد و کنترل دقیق اجرای الگوریتم‌هاست. این زیرسیستم با دریافت Function-Call Event اجرا می‌شود و می‌تواند توسط منابعی مانند Function-Call Generator، Stateflow و سایر اجزای مناسب مدل فعال شود.

استفاده از Function-Call امکان زمان‌بندی اجرای اجزا، کنترل نرخ پردازش، تعیین ترتیب اجرای زیرسیستم‌ها و ایجاد معماری‌های سلسله‌مراتبی را فراهم می‌کند. ترکیب این قابلیت با Function-Call Split، Function-Call Feedback Latch، Stateflow و سایر زیرسیستم‌های شرطی، زمینه طراحی مدل‌های ساختاریافته و مناسب برای سیستم‌های کنترل و کاربردهای بلادرنگ را فراهم می‌سازد.

کلیدواژه ها : Function-Call Subsystem-زیرسیستم فراخوانی تابع-Function Call-فراخوانی تابع-Function-Call Event-رویداد فراخوانی تابع-Function-Call Generator-تولیدکننده فراخوانی تابع-Function-Call Split-تقسیم فراخوانی تابع-Function-Call Feedback Latch-لچ بازخورد فراخوانی تابع-Function Caller-فراخواننده تابع-Simulink Function-تابع سیمولینک-Event-Based Execution-اجرای مبتنی بر رویداد-Execution Scheduling-زمان‌بندی اجرا-Execution Rate-نرخ اجرای زیرسیستم-Stateflow-استیت‌فلو-Conditional Subsystem-زیرسیستم شرطی-Real-Time Execution-اجرای بلادرنگ-Simulink-سیمولینک