توسعه نرم‌افزارهای نهفته (Embedded Software) با افزایش پیچیدگی سیستم‌ها، دیگر صرفاً به نوشتن کد و آزمایش آن روی سخت‌افزار محدود نمی‌شود. در پروژه‌هایی مانند هوافضا، خودرو، راه‌آهن، تجهیزات صنعتی و سامانه‌های حساس، پیدا کردن خطا در مراحل پایانی توسعه می‌تواند هزینه و زمان زیادی به پروژه تحمیل کند.

توسعه نرم‌افزار مبتنی بر مدل (Model-Based Software Development یا MBSD) رویکردی است که تلاش می‌کند بخش مهمی از این مشکلات را با انتقال طراحی، تحلیل و آزمون به مراحل ابتدایی‌تر توسعه برطرف کند. در این روش، رفتار نرم‌افزار ابتدا در قالب مدل‌های دقیق و بدون ابهام تعریف می‌شود و سپس می‌توان از روی مدل، کد اجرایی تولید کرد.

یکی از راهکارهایی که این رویکرد را برای توسعه نرم‌افزارهای نهفته ارائه می‌کند، Ansys SCADE One است. این محیط از زبان مدل‌سازی Swan استفاده می‌کند و امکان مدل‌سازی، شبیه‌سازی، اشکال‌زدایی، آزمون و تولید کد را در یک جریان کاری یکپارچه فراهم می‌سازد.

در این مقاله، مفهوم توسعه نرم‌افزار مبتنی بر مدل، ساختار مدل‌های SCADE One، زبان Swan و روش‌های استفاده مؤثر از این رویکرد در پروژه‌های واقعی را بررسی می‌کنیم.

توسعه نرم‌افزار مبتنی بر مدل چیست؟

در روش‌های سنتی توسعه نرم‌افزار نهفته، بخش زیادی از رفتار سیستم مستقیماً در قالب کد، معمولاً زبان C، پیاده‌سازی می‌شود. در نتیجه، بسیاری از خطاها ممکن است تا زمان یکپارچه‌سازی یا اجرای نرم‌افزار روی سخت‌افزار واقعی شناسایی نشوند.

در توسعه مبتنی بر مدل، نقطه شروع مدل نرم‌افزار است.

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

این تغییر رویکرد یک مزیت مهم دارد: آزمون و اعتبارسنجی می‌تواند بسیار زودتر انجام شود.

چرا آزمون زودهنگام اهمیت دارد؟

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

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

این مفهوم که با عنوان Shift-Left Testing شناخته می‌شود، به معنای انتقال فعالیت‌های آزمون و اعتبارسنجی به مراحل ابتدایی‌تر توسعه است.

چرا توسعه مبتنی بر مدل برای سیستم‌های حساس اهمیت دارد؟

در سامانه‌هایی که ایمنی اهمیت بالایی دارد، خطای نرم‌افزاری می‌تواند پیامدهای جدی داشته باشد. به همین دلیل، استانداردهای ایمنی معمولاً فرآیندهای گسترده‌ای برای تأیید و اعتبارسنجی نرم‌افزار در نظر می‌گیرند.

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

محیط SCADE Suite سابقه‌ای بیش از ۲۵ سال در توسعه نرم‌افزارهای نهفته حساس دارد و برای کاربردهای ایمنی‌محور مورد استفاده قرار گرفته است.

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


SCADE One و مدل‌های Swan چه هستند؟

یکی از اجزای اصلی SCADE One، زبان مدل‌سازی Swan است.

Swan را می‌توان یک زبان برنامه‌نویسی سطح بالا و تخصصی برای نرم‌افزارهای نهفته دانست؛ یعنی یک زبان دامنه‌محور (Domain-Specific Language) که برای بیان رفتار این نوع سیستم‌ها طراحی شده است.

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

مدل‌سازی سیستم‌های واکنشی با Swan

بخش قابل توجهی از نرم‌افزارهای نهفته، ماهیتی واکنشی (Reactive) دارند.

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

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

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

یک مدل ساده چه چیزی را نشان می‌دهد؟

برای نمونه، یک کنترل‌کننده تناسبی-انتگرالی (PI) می‌تواند خروجی خود را بر اساس مقدار هدف و مقدار فعلی سیستم محاسبه کند.

در نمایش گرافیکی Swan، بلوک‌ها ورودی‌ها را دریافت کرده و خروجی تولید می‌کنند. این ورودی‌ها و خروجی‌ها از طریق سیم‌ها یا Wireها به یکدیگر متصل می‌شوند.

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


مدل چگونه به نرم‌افزار قابل اجرا تبدیل می‌شود؟

یک مدل به‌تنهایی برای اجرای نرم‌افزار روی سخت‌افزار کافی نیست. اینجا تولیدکننده کد (Code Generator) وارد فرآیند می‌شود.

تولیدکننده کد، مدل را به یک تابع اجرایی یا همان Step Function تبدیل می‌کند.

در هر چرخه اجرای سیستم، این تابع:

  1. ورودی‌های همان چرخه را دریافت می‌کند.

  2. محاسبات مورد نیاز را انجام می‌دهد.

  3. خروجی‌های جدید را تولید می‌کند.

  4. وضعیت داخلی سیستم را برای چرخه بعدی به‌روزرسانی می‌کند.

یکی از نکات مهم این است که کد تولیدشده می‌تواند خوانا و نسبتاً نزدیک به کدی باشد که یک برنامه‌نویس به‌صورت دستی در C می‌نویسد.

اتصال مدل به سخت‌افزار

پس از تولید کد، برای اجرای آن روی سخت‌افزار واقعی به یک لایه یکپارچه‌سازی نیاز است.

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

جدا بودن منطق نرم‌افزار از جزئیات سخت‌افزار یک مزیت مهم ایجاد می‌کند: مدل می‌تواند در کاربردهای مختلف مجدداً استفاده شود یا برای یک پلتفرم سخت‌افزاری دیگر با تغییرات کمتری منتقل شود.


مدیریت حالت‌های پیچیده با مدل‌های سلسله‌مراتبی

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

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

Swan امکان ترکیب نمودارهای بلوکی با ماشین‌های حالت سلسله‌مراتبی (Hierarchical State Machines) را فراهم می‌کند.

به این ترتیب می‌توان رفتارهای پیچیده را به شکلی ساختاریافته‌تر نمایش داد.

از طرف دیگر، ابزار اشکال‌زدایی SCADE One امکان مشاهده رفتار سیستم در مراحل مختلف را فراهم می‌کند و کاربر می‌تواند اجرای ماشین حالت را مرحله‌به‌مرحله بررسی کند.


چگونه توسعه نرم‌افزار مبتنی بر مدل را وارد پروژه کنیم؟

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

۱. مهاجرت را مرحله‌به‌مرحله انجام دهید

لازم نیست تمام نرم‌افزار موجود را از ابتدا با مدل بازنویسی کنید.

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

همچنین امکان استفاده مجدد از توابع و انواع داده موجود در C وجود دارد.

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

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

۲. فقط کنترل‌کننده را مدل نکنید

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

در یک جریان مهندسی دیجیتال کامل‌تر، می‌توان موارد زیر را نیز در نظر گرفت:

  • نیازمندی‌ها

  • معماری سیستم

  • معماری نرم‌افزار

  • طراحی نرم‌افزار

  • تحلیل و شبیه‌سازی

  • تأیید و اعتبارسنجی

هدف این است که اطلاعات اصلی پروژه در یک منبع قابل اتکا و یکپارچه قرار داشته باشد.

قابلیت System Architecture Modeler (SAM) از زبان استاندارد SysML v2 استفاده می‌کند و می‌تواند با جریان‌های مهندسی دیجیتال و SCADE One ارتباط برقرار کند.

این رویکرد باعث می‌شود مسیر میان معماری سیستم و طراحی و تأیید نرم‌افزار منسجم‌تر شود.

۳. نمونه اولیه را زود بسازید

یکی از مزایای مدل‌سازی این است که لازم نیست برای بررسی رفتار سیستم تا آماده‌شدن محصول نهایی صبر کنید.

می‌توان ابتدا یک مدل انتزاعی از کنترل‌کننده ایجاد کرد و رفتار و نیازمندی‌های آن را بررسی کرد.

هرچه مشکل زودتر پیدا شود، معمولاً اصلاح آن ساده‌تر است.

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

محل تصویر ۶: تصویر مربوط به نمونه‌سازی کنترل‌کننده با فرآیند پالایش تدریجی مدل.


۴. روی شبیه‌سازی سرمایه‌گذاری کنید

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

در حالت ایده‌آل، تنها نرم‌افزار را شبیه‌سازی نمی‌کنید؛ بلکه می‌توانید مدل فیزیکی سیستم و محیط سخت‌افزار/نرم‌افزار را نیز در جریان شبیه‌سازی وارد کنید و یک نمونه اولیه مجازی (Virtual Prototype) بسازید.

مدل‌های SCADE One قابلیت خروجی گرفتن به شکل Functional Mock-up Unit (FMU) را دارند. FMU استانداردی برای تبادل مدل‌های شبیه‌سازی است و توسط بسیاری از ابزارهای شبیه‌سازی پشتیبانی می‌شود.

همچنین می‌توان مدل‌ها را به Python صادر کرد تا در جریان‌های شبیه‌سازی و آزمون مبتنی بر Python مورد استفاده قرار گیرند.


۵. برای مدل‌ها رابط گرافیکی بسازید

گاهی بررسی یک مدل صرفاً از طریق نمودارها و مقادیر عددی کافی نیست.

قابلیت SCADE Rapid Prototyper در SCADE One Studio امکان ایجاد پنل‌های گرافیکی را فراهم می‌کند. این پنل‌ها می‌توانند ورودی‌ها را دریافت و خروجی‌های مدل را به شکلی قابل مشاهده نمایش دهند.

چنین رابط‌هایی برای ساخت Demoهایی که رفتار یک سیستم واقعی را شبیه‌سازی می‌کنند، مفید هستند.

برای مثال، یک پنل گرافیکی می‌تواند برای شبیه‌سازی و بررسی رفتار یک سیستم کنترل دیگ بخار هوشمند استفاده شود.

محل تصویر ۷: تصویر پنل گرافیکی کنترل یک دیگ بخار هوشمند.


۶. مدل‌سازی را با فرآیندهای Agile و CI/CD ترکیب کنید

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

SCADE One می‌تواند در جریان‌های Continuous Integration / Continuous Delivery (CI/CD) مورد استفاده قرار گیرد.

ابزارهای SCADE One قابلیت اجرا در حالت Batch روی Windows و Linux را دارند و می‌توان از آن‌ها برای بررسی خودکار مدل‌ها یا اجرای فرآیندهای آزمون استفاده کرد.

همچنین PyScadeOne یک کتابخانه Python برای اسکریپت‌نویسی و خودکارسازی فعالیت‌های مرتبط با SCADE One است.

این قابلیت می‌تواند در خودکارسازی جریان‌های کاری و دسترسی برنامه‌نویسی‌شده به دارایی‌های پروژه مفید باشد.


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

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

این فرآیند می‌تواند فاصله‌ای میان مدل و پیاده‌سازی ایجاد کند.

Swan با استفاده از نمادگذاری‌های گرافیکی آشنا، می‌تواند برای هر دو گروه قابل دسترس‌تر باشد.

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

داشتن زبان و نمایش مشترک میان تیم‌های مختلف می‌تواند به کاهش سوءتفاهم‌های ارتباطی و افزایش بهره‌وری کمک کند.


۸. یادگیری و بهبود مستمر را جدی بگیرید

توسعه مبتنی بر مدل یک فرآیند ثابت و بدون تغییر نیست.

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

بنابراین، تیم توسعه بهتر است علاوه بر یادگیری خود زبان Swan، با روش‌های مناسب توسعه Agile، آزمون خودکار و اتوماسیون فرآیندهای مهندسی نیز آشنا باشد.


مزایای اصلی توسعه نرم‌افزار مبتنی بر مدل

اگر بخواهیم نکات اصلی این رویکرد را خلاصه کنیم، مهم‌ترین مزایا عبارت‌اند از:

مزیت توضیح
شناسایی زودهنگام خطا امکان بررسی رفتار سیستم پیش از رسیدن به سخت‌افزار واقعی
تولید خودکار کد تبدیل مدل به کد C اجرایی
کاهش وابستگی به سخت‌افزار جداسازی منطق نرم‌افزار از لایه یکپارچه‌سازی سخت‌افزار
مدیریت بهتر پیچیدگی استفاده از نمودارهای بلوکی و ماشین‌های حالت سلسله‌مراتبی
قابلیت شبیه‌سازی بررسی رفتار مدل در محیط شبیه‌سازی
امکان نمونه‌سازی سریع اعتبارسنجی رفتار و نیازمندی‌ها در مراحل اولیه
قابلیت خودکارسازی امکان استفاده در فرآیندهای CI/CD و اسکریپت‌های Python
همکاری بهتر تیم‌ها ایجاد زبان و مدل مشترک میان مهندسان سیستم، کنترل و نرم‌افزار

آیا توسعه مبتنی بر مدل فقط برای پروژه‌های ایمنی‌محور است؟

خیر.

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

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

از جمله نمونه‌هایی که در منبع مورد بررسی قرار گرفته‌اند می‌توان به این حوزه‌ها اشاره کرد:

  • هوافضا

  • راه‌آهن

  • خودرو

  • نیروگاه‌ها و سامانه‌های هسته‌ای

  • رباتیک

  • تجهیزات صنعتی

  • ماشین‌آلات ساختمانی

  • لوازم خانگی

بنابراین، سؤال اصلی این نیست که «آیا پروژه به‌اندازه کافی حساس است؟» بلکه باید بررسی کرد که آیا مدل‌سازی می‌تواند پیچیدگی، آزمون و فرآیند توسعه پروژه را بهتر مدیریت کند یا خیر.


جمع‌بندی

توسعه نرم‌افزار مبتنی بر مدل رویکردی است که مرکز ثقل فرآیند توسعه را از کدنویسی مستقیم به سمت مدل‌سازی دقیق رفتار سیستم منتقل می‌کند.

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

در SCADE One، زبان Swan برای مدل‌سازی رفتار نرم‌افزارهای نهفته به کار می‌رود و می‌توان از نمودارهای بلوکی و ماشین‌های حالت سلسله‌مراتبی برای نمایش رفتارهای مختلف استفاده کرد. پس از آن، مدل می‌تواند به کد C تبدیل شده و از طریق یک لایه یکپارچه‌سازی به سخت‌افزار متصل شود.

نکته مهم این است که برای بهره‌برداری از این روش، لازم نیست یک پروژه موجود را یکباره کنار گذاشت. مهاجرت تدریجی، نمونه‌سازی زودهنگام، شبیه‌سازی، استفاده از CI/CD و ایجاد ارتباط بهتر میان تیم‌های مهندسی می‌تواند مسیر منطقی‌تری برای پذیرش این رویکرد باشد.

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