فهرست مطالب
Toggleروشهای برنامهنویسی صنعتی مدرن، ابزارهایی را فراهم میکنند تا کیفیت ذاتی نرمافزار، یعنی درستی آن از نظر قابلیت اطمینان، استحکام، یکپارچگی، پایداری و ایمنی بهبود یابد. استاندارد بینالمللی IEC 61131-3 با ارائه این ابزار، مراحل برنامهنویسی، نصب و نگهداری پروژههای نرمافزاری در کنترل صنعتی را تعریف میکند. در اصل، استاندارد IEC 61131-3 از دو بخش تشکیل شده است: المانهای مشترک (مانند نوع دیتا، متغیرها، مسیرهای ارتباطی فانکشنها و …) و زبانهای برنامهنویسی. ابزارهای ساختاردهنده در IEC 61131-3 بر روی المانهای مشترک متمرکز هستند، اگرچه بدیهی است این المانها به زبانهای برنامهنویسی نیز ارتباط داده شوند. این مقاله، نشان میدهد که با استفاده صحیح از IEC 61131-3، برنامهای نوشته میشود که قابل درک، قابل استفاده مجدد، قابل تأیید و قابل عیبیابی است.
در دوره اتوماسیون زیمنس ماهر نحوه برنامهنویسی PLCهای زیمنس با استفاده از روش ساختاریافته (Structured) را فرا میگیرید و قادر خواهید بود برنامه پیچیده کنترلی را بهصورت استاندارد، برنامهنویسی و اجرا کنید.
ضرورت ساختاریافتگی در برنامهنویسی
دستیابی به یک روش برنامهنویسی که ویژگیهای ذکرشده را تأمین کند، نیازمند یک رویکرد متفاوت است. بهکارگیری یک رویکرد «ساختاریافته» مزایایی مانند موارد زیر را فراهم میکند:
- دید بهتری از سیستم، که نه تنها برای برنامهنویسان اصلی، بلکه برای پرسنل نصب و نگهداری نیز مهم است.
- زمینه بهتر برای ارتباطات داخلی درون تیم توسعه نرمافزار.
- تمرکز بهتر روی مشکل واقعی برنامه و یافتن راهحلهای ممکن آن.
- بسترسازی برای برنامه نرمافزاری با قابلیت استفاده مجدد.
- مستندسازی خودکار.
به طور کلی، ساختاردهی برنامه از طریق تقسیم مسئله به بخشهای کوچکتر انجام میشود که این بخشها میتوانند به زیربخشهای بیشتری تقسیم شوند. البته محدودیتهایی در این زمینه وجود دارد: یعنی پیش بردن برنامه به سمت اصطلاحاً «دانهبندی» (Granularity) یا ریز کردن بیش از حد، عملی نیست؛ زیرا در این صورت، این بخشها به سمت ادغام و یکپارچهسازی (Integration) معطوف میشوند.
در استاندارد IEC 61131-3، برای برنامهنویسی دو روش «تعامل» (Co-operation) وجود دارد که برای وضوح بیشتر آنها را به این نامها میخوانیم:
- ماژولاریتی (Modularity)
- تجزیه (Decomposition)
اصول ماژولاریتی (Modularity Principles)
در روشهای مدرن توسعه نرمافزار، پنج اصل مرتبط با ماژولاریتی وجود دارد. این اصول عبارتند از:
- زبان برنامهنویسی باید از واحدهای ماژولار پشتیبانی کند.
- واحدها باید به گونهای طراحی شوند که تعداد واسطها (اینترفیسها) و تعاملات بین آنها کم باشد.
- اینترفیسها باید کوچک باشند و به تبادل دادههای کمی نیاز داشته باشند.
- تعاملات بین ماژولها باید به طور صریح تعریف شوند تا قابلیت استفاده مجدد آنها افزایش یابد.
- ماژولها باید امکان کپسولهسازی (Encapsulation) دادهها را فراهم کنند: دادههای برنامه باید تقسیمبندی شوند، و هر بخش تنها توسط مجموعهای از توابع قابل دسترسی باشد که آن را از استفادههای ناخواسته محافظت میکنند.
برای پشتیبانی از این اصول، استاندارد IEC 61131-3 واحدهای سازماندهی برنامه (Program Organization Units یا POUها) را تعریف کرده است که شامل موارد زیر هستند:
- توابع (Functions)
- بلوکهای تابع (Function Blocks)
- برنامهها (Programs)
این موارد در ادامه با جزئیات بیشتری توضیح داده خواهند شد.
توابع (Functions)
همه ما با توابعی مانند جمع، جذر، توابع مثلثاتی و غیره آشنا هستیم. استاندارد IEC مجموعه گستردهای از این توابع را تعریف کرده است. علاوه بر این، شما میتوانید توابع خود را نیز ایجاد کنید. میتوانید توابع را تعریف کردید میتوانید آنها را به دفعات در برنامه خود، برنامههای دیگر و حتی پروژههای دیگر به کار ببرید.
بلوکهای عملکردی (Function Blocks, FBs)
فانکشن بلاکها هم به صورت استاندارد و تعریف شده وجود دارند و هم ممکن است به وسیله کاربر اضافه شده باشند. همچنین میتوانید فانکشن بلاکهای خود را ایجاد کرده و آنها را به کتابخانه مربوطه در نرمافزار برنامهنویسی اضافه کنید. همه این بلاکهای طراحیشده قابل استفاده مجدد هستند، چه در همان برنامه، چه برنامههای جدید یا حتی پروژههای مختلف. شما میتوانید با هر یک از زبانهای برنامهنویسی IEC آنها را به کار ببرید، که این امر وجه تفاوت میان برنامهنویسان و پرسنل تعمیرات و نگهداری سیستم کنترل است. قابلیت «استفاده مجدد از برنامه»، باعث افزایش کارایی و کاهش خطاهای آن میشود. به مثال زیر توجه کنید!

در فانکشن بلاک شکل ۱، سمت چپ، به زبان برنامهنویسی FBD نمایش داده شده است. نام بلوک شکل ۱ هیسترزیس (Hysteresis) است. این بلوک دارای سه ورودی در سمت چپ است که به نامهای XIN1، XIN2 و EPS است و همگی از نوع دیتای حقیقی (REAL) هستند. همچنین یک خروجی در سمت راست دارد که Q نامیده میشود و از نوع منطقی (BOOL) است.
درون هر فانکشن بلاک، یک «کد بدنه» (Body code) است که در سمت راست شکل ۱ قابل مشاهده است. در این مثال، کد بدنه به زبان STL نوشته شده است. بخش نخست کد با ساختار دادهها سر و کار دارد و بخش دوم به الگوریتم، که از ورودیها استفاده میکند، برخی محاسبات را انجام میدهد و خروجیها را تنظیم میکند. الگوریتم از دید کاربر FB پنهان است، و کاربر عملکرد بلوک را به شکلی که در سمت چپ نشان داده شده است، مشاهده میکند. این امر سطح دسترسی متفاوتی ایجاد میکند و مفهوم کپسولهسازی (Encapsulation) را که پیشتر در بند ۵ اصول ماژولاریتی به آن اشاره شده است، نشان میدهد.
نامهایی که در داخل یک فانکشن بلاک استفاده میشوند، متعلق به آن بلوک هستند. مهم نیست که چه نامی برای دادههای محلی در یک فانکشن بلاک استفاده شده است، اگر همان نام، در فانکشن بلاک دیگر یا جای دیگری در برنامه استفاده شود، هیچ تضادی ایجاد نخواهد شد.
در مقاله زیر میتوانید با بلوکهای برنامهنویسی زیمنس بیشتر آشنا شوید.
برنامهها: شبکه سلسلهمراتبی
با استفاده از این توابع و فانکشن بلاکها، میتوانید به یک برنامه به عنوان شبکهای از این بلوکهای ساختمانی نگاه کنید. به این ترتیب، برنامههای پیچیده را میتوان به بلوکهای عملکردی تقسیم کرد، که خود آنها نیز میتوانند به بلوکهای عملکردی کوچکتر تقسیم شوند. این کار، کارایی برنامه نوشتهشده را افزایش میدهد.
تجزیه (Decomposition): در IEC 61131-3 چگونه است؟
استاندارد IEC 61131-3، نمودارهای توابع ترتیبی (Sequential Function Charts, SFC) را به عنوان ابزاری برای اجرای دیکامپوزیشن ارائه میدهد. SFC به صورت گرافیکی، رفتار ترتیبی یک برنامه کنترل را توصیف میکند. به این ترتیب، سازماندهی داخلی یک برنامه را با تجزیه مسئله کنترل به بخشهای قابل مدیریت ساختاردهی میکند و در عین حال دید کلی نسبت به برنامه را نیز ایجاد میکند. این ویژگی، SFC را به گزینه مناسبی برای برنامههایی که نیاز به عیبیابی زیاد دارند، تبدیل میکند.
SFC از یک سری «مرحله» (Step) تشکیل شده است که با بلوکهای «اکشن» (Action Blocks) و یک سری «گذار» (Transition) به هم متصل میشوند (شکل ۲).
- هر مرحله نشاندهنده یک حالت خاص از سیستم است. مرحلهها به اکشنها متصل میشوند که یک عملکرد کنترل خاص را انجام میدهند.
- یک گذار به شرطی وصل است، که وقتی درست (TRUE) باشد، باعث غیرفعال شدن مرحله قبلی و فعال شدن مرحله بعدی شود.
- هر بلوک اکشن یا گذار را میتوان به هر یک از زبانهای IEC، مانند زبان Ladder، زبان FBD، زبان IL و زبان STL برنامهنویسی کرد، و حتی میتوان خود SFC را برای تجزیه (دیکامپوزیشن) بیشتر به کار برد.

SFC از ترتیبهای (دنبالههای) جایگزین و ترتیبهای موازی پشتیبانی میکند. به عنوان مثال، یک ترتیب (Sequence) برای فرآیند اصلی استفاده میشود و ترتیب (دنباله) دوم برای نظارت بر محدودیتهای کلی عملیاتی. این موارد در همان ساختار و نمای کلی اتفاق میافتند.
ساختاردهی: یک فرایند هفتمرحلهای
ساختاردهی در استاندارد IEC 61131-3 در قالب ترکیبی از ماژولاریتی (Modularity) و تجزیه (Decomposition) مطرح میشود. ۷ گام زیر مسیری را برای موفقیت در ساختاردهی برنامه فراهم میکنند:
۱. شناسایی رابطهای خارجی سیستم کنترل: تعیین نقاط ارتباطی سیستم کنترل با محیط خارجی.
۲. تعریف سیگنالهای اصلی مبادلهشده بین سیستم کنترل و بقیه واحدها: مشخص کردن سیگنالهای کلیدی که بین سیستم کنترل و سایر بخشهای کارخانه رد و بدل میشوند.
۳. تعریف تمام تعاملات اپراتوری، جایگزینها (Overrides) و دادههای نظارتی: شناسایی نحوه تعامل اپراتور با سیستم و دادههای نظارتی مورد نیاز.
۴. تجزیه و تحلیل مسئله کنترل از سطح بالا به بخشهای منطقی: تقسیم مسئله کنترل به بخشهای کوچکتر و منطقی.
۵. تعریف واحدهای سازماندهی برنامه (POU) مورد نیاز: مانند برنامهها (Programs) و فانکشن بلاکها.
۶. تعریف نیازمندیهای زمان چرخه اسکن (Scan Cycle Time) برای بخشهای مختلف برنامه: مشخص کردن زمانبندی اجرای بخشهای مختلف برنامه.
۷. پیکربندی سیستم با تعریف منابع، اتصال برنامهها به ورودیها و خروجیهای فیزیکی و اختصاص برنامهها و بلوکهای عملکردی به تسکها: تنظیم سیستم و تخصیص منابع.
استاندارد IEC 61131-3 به ویژه در مراحل ۴ تا ۷، یعنی جایی که مسئله به برنامه تبدیل میشود، به ما کمک میکند.
مثال: سیستم کنترل فرآیند تخمیر
یک مثال بیشتر از هزار کلمه حرف میزند! بنابراین اجازه دهید به یک فرآیند تخمیر و کنترل آن، مطابق شکل زیر، نگاهی بیندازیم.

در مثال شکل ۳، همه واسطهای خارجی تعریف شدهاند (گام ۱ در فرایند هفتمرحلهای). یک مخزن بزرگ داریم که با استفاده از شیر ورودی، از مایع پر شده و با استفاده از هیتر گرم میشود. موتور میکسر محتویات مخزن را هم میزند و افزودنیهای اسیدی و بازی (قلیایی) به مخزن اضافه میشوند.
با در نظر گرفتن گام چهارم، یعنی «تجزیه و تحلیل مسئله کنترل از سطح بالا به بخشهای منطقی»، به راحتی میتوان ۵ عملکرد را شناسایی کرد:
۱. توالی اصلی (Main Sequence): مراحل اصلی فرآیند شامل پر کردن، گرم کردن، هم زدن، تخمیر، برداشت و تمیز کردن.
۲. کنترل شیرها (Valve Control): کنترل شیرهایی که برای پر کردن و خالی کردن مخزن استفاده میشوند.
۳. کنترل دما (Temperature Control): برای مانیتور کردن دمای مخزن و تنظیم گرمایش.
۴. کنترل همزن (Agitator Control): برای کنترل موتور همزن که بر اساس نیاز توالی اصلی فرآیند فعال میشود.
۵. کنترل pH: برای مانیتورینگ اسیدیته محتوای تخمیر و اضافه کردن ماده اسید یا باز (قلیا) در صورت نیاز.
گام پنجم: تعریف POUهای مورد نیاز، یعنی برنامهها و فانکشن بلاکها.
با نمایش این مراحل در زبان برنامهنویسی نمودار فانکشن بلاکها، نمای کلی برنامه کنترل تخمیر میتواند بهصورت شکل ۴ باشد: (از چپ به راست بخوانید. در سمت چپ ورودیها و در سمت راست خروجیها قرار دارند).

اگر به ترتیب (دنباله) اصلی با دقت نگاه کنیم، میتوانیم آن را با استفاده از روش SFC به صورت زیر ساختاردهی کنیم:

از بالای نمودار با مقداردهی اولیه (Initialization) شروع میکنیم. از آنجایی که وضعیت سیستم را هنگام روشن کردن آن برای اولین بار نمیدانیم، باید موقعیت شیرها و غیره را بررسی کنیم.
سپس، فرآیند پر کردن (Filling) را تا رسیدن به سطح مناسب آغاز میکنیم.
فاز بعدی گرم کردن (Heating) است تا زمانی که فرآیند تخمیر شروع شود. هنگامی که تخمیر آغاز شد، به فاز بعدی میرویم: کنترل فرآیند تخمیر.
پس از اتمام، برداشت محصول (Harvesting) انجام میشود و پس از آن تمیز کردن (Cleaning) صورت میگیرد. سپس دوباره از بالا شروع میکنیم.
این تجزیهوتحلیل به همه افراد درگیر یک نمای کلی واضح میدهد که چه دنبالههایی دخیل هستند و همچنین امکان ماژولار کردن بیشتر را در قالب فانکشن بلاکها فراهم میکند که میتوانند با هر یک از چهار زبان برنامهنویسی پیادهسازی شوند.
یا به عبارت دیگر: مشخصات نیازمندیهای پروژه تقریباً کامل شده است!
کار برنامهنویسی که اکنون باید انجام شود، در سطح بلوکهای اکشن (Action Blocks) است. این بلوکها میتوانند بین افراد مختلف با مهارتهای برنامهنویسی متفاوت تقسیم شوند. برای این منظور، استاندارد IEC دو زبان گرافیکی و دو زبان متنی برنامهنویسی تعریف کرده است، یعنی:
- Instruction List
- Structured Text
- Ladder Diagram
- Function Block Diagram
تا بهترین تناسب را با نیازها و مسئله پیشرو داشته باشد. همچنین، در صورت نیاز، تجزیه (دیکامپوزیشن) بیشتر بلوکهای اکشن میتواند از طریق روش SFC انجام شود.
سیستم توسعه برنامه شما را در دو گام نهایی پشتیبانی خواهد کرد:
گام ششم. تعریف زمان چرخه اسکن (Scan Cycle Time) برای بخشهای مختلف برنامه.
گام هفتم. پیکربندی سیستم با تعریف منابع، اتصال برنامهها به ورودیها و خروجیهای فیزیکی، و اختصاص برنامهها و فانکشن بلاکها به تسکها.
در مقاله زیر با انواع زبانهای برنامهنویسی صنعتی آشنا شوید.
جمعبندی
با توجه به کاربرد روش برنامهنویسی ساختاریافته در کنترل پروسههای صنعتی در این مقاله، مشخصههای این روش برنامهنویسی، نحوه تعریف فانکشن بلاکها و زبانهای استاندارد بینالمللی برای پیادهسازی یک برنامه ساختاریافته را شرح دادیم. در پایان مقاله، با یک مثال، نحوه اجرای یک برنامه کنترلی برای یک فرایند تخمیر و نحوه پیادهسازی آن را بررسی کردیم. در برنامهنویسی PLCها از جمله PLCهای زیمنس از روش برنامهنویسی ساختاریافته استفاده میشود؛ بنابراین، یادگیری نحوه اجرای این روش برای مهندسان اتوماسیون صنعتی، مهارت سودمندی به شمار میرود.
سوالات متداول
روش خطی (Linear Programming) و روش طبقهبندیشده (Partition Programming) از روشهای دیگر برنامهنویسی PLC هستند که کارایی آنها به کیفیت روش ساختاریافته نیست.
با همه پنج زبان برنامهنویسی استاندارد IEC میتوان برنامه ساختاریافته نوشت؛ اما زبان لدر به دلیل ماهیت گرافیکی و مشابهت ظاهری آن با نقشههای الکتریکی، گزینه محبوبتری به شمار میرود.