در این مقاله قصد داریم با استفاده از زبان لدر (LD) به همراه ++C، یک PLC را برنامه ریزی کنیم. برای این کار، لدر عملیات ساده شروع به کار و توقف موتور را به عهده داشته و ++C گزارش (لاگ) این عملیات را تولید میکند.
بدین منظور از Eclipse IDE برای ایجاد پروژه ++C و از Phoenix Technology PLCnext Engineer برای ایجاد برنامه LD استفاده خواهد شد. توجه داشته باشید که PLCnext Engineer برای اجرای هر دو برنامه LD و ++C مورد استفاده قرار میگیرد.
در نهایت این پروژه با استفاده از I/O و سخت افزارهای مورد نیاز در PLCnext Starterkit اجرا خواهد شد.
پیش زمینه و اطلاعات اولیه
پنج زبان برنامه نویسی تعریف شده در استاندارد IEC 61131-3 عبارتند از: زبان برنامه نویسی لدر یا نردبانی (Ladder Diagram)، فهرست دستورالعمل (Instruction List)، نمودار بلوک تابع (Function Block Diagram)، زبان برنامه نویسی مبتنی بر متن ساختاریافته (Structured Text) و نمودار توابع متوالی یا سلسله مراتبی (Sequential Function Chart).
اکثر نرم افزارهای برنامه نویسی PLC میتوانند حداقل از دو زبان معرفی شده در استاندارد IEC 61131-3 استفاده کنند.
به طور کلی، نرم افزار برنامه نویسی PLC قادر به برنامه نویسی با زبانهای سطح بالاتر، از جمله ++C نیست. در واقع برنامه های ++C با استفاده از نرم افزارهای برنامه نویسی دیگری ایجاد میشوند.
در ادامه میتوان برنامه ++C حاصل را به نرم افزار برنامه نویسی PLC اضافه کرد و یا در کنار آن مورد استفاده قرار داد. به این ترتیب امکان اجرای همزمان برنامه ++C در کنار برنامه های معرفی شده در استاندارد IEC 61131-3 وجود خواهد داشت.
در اینجا ممکن است این سوال مطرح شود که چرا ما در پروژههای PLC خود از برنامههای زبان سطح بالاتر استفاده میکنیم یا اصولاً چه نیازی به آنها داریم؟
پاسخ کوتاه برای پرسش مذکور این است که وظایف پیچیده با زبانهای سنتی معرفی شده در استاندارد IEC 61131-3 به راحتی انجام نمیشوند.
به عنوان مثال، به راحتی میتوان با ++C دادههای لاگ را برای استفاده در Predictive Maintenance تولید کرد. یک برنامه با این پیچیدگی را نمیتوان به راحتی با استفاده از زبانهای معرفی شده در استاندارد IEC 61131-3 مانند لدر ایجاد کرد.
حال ببینیم که چگونه میتوان برنامههای ++C را ایجاد کرد؟
بدین منظور میتوانیم از ابزاری به نام محیط توسعه یکپارچه یا به اختصار IDE استفاده کنیم. IDE یک بسته کامل است که در کنار تمام ویژگیهای خاص خود، دارای ویرایشگر برای کدنویسی نیز هست.
در حال حاضر IDEهای متنوعی برای ++C در دسترس قرار دارند که به عنوان دو نمونه بسیار رایج میتوان از Microsoft Visual Studio و Eclipse نام برد. در این میان، Eclipse یکی از سادهترین ویرایشگرها محسوب میشود و ما از آن در اینجا استفاده خواهیم کرد.
برنامه لدر یا نمودار نردبانی
بحث خود با توصیف یک برنامه لدر که برای کنترل یک موتور نوشته شده است، ادامه میدهیم.
این برنامه دارای یک متغیر START و یک متغیر STOP بوده که به ورودیهای IN01 و IN02 ماژول ورودی دیجیتال PLC اختصاص داده شده اند.
دکمههای فشاری که به طور معمول در حالت باز هستند به ورودیهای IN01 و IN02 ماژول ورودی دیجیتال PLC متصل شدهاند.
یک متغیر نیز با نام MOTOR تعریف شده که به خروجی OUT01 ماژول خروجی دیجیتال PLC اختصاص داده شده است.
لدر یا نمودار نردبانی نشان میدهد که موتور هنگام فشردن دکمه START روشن میشود و تا زمانی که دکمه STOP فشرده نشود، متوقف نخواهد شد.
توصیف برنامه ++C
همانطور که قبلاً ذکر شد برنامه ++C با استفاده از ویرایشگر Eclipse IDE نوشته شده و وظیفه ثبت دادههای لاگ مربوط به فعالیتهای موتور را بر عهده دارد. در داخل محیط Eclipse IDE، پوشههای مربوط به پروژه ++C از طریق Project Explorer در دسترس قرار دارند. با باز کردن پوشه MotorStartStop، چندین فایل و زیرپوشه نمایش داده میشود. در اینجا میخواهیم در مورد دو فایل به نامهای MotorStartStopProgram.cpp و MotorStartStopProgram.hpp که در بین فایلهای موجود در پوشه src قرار دارند، بحث کنیم؛ در واقع برنامه اصلی ++C در این دو فایل متنی نوشته شده است.
فایل هدر ++C
ابتدا فایل هدر MotorStartStopProgram.hpp را مورد بررسی قرار میدهیم. در این فایل یک پورت ورودی به نام Motor و یک پورت خروجی به نام OUTPORT_MotorStarts تعریف شده است. پورت Motor از نوع بولین و پورت OUTPORT_MotorStarts از نوع int16 یا DINT است.
این پورتها به ++C امکان برقراری ارتباط با برنامه لدر را میدهد که در نرمافزار برنامهنویسی PLCnext Engineer توسعه داده شده است. به طور خلاصه، پورت ورودی دادهها را خوانده و پورت خروجی دادهها را ثبت میکند.
در اینجا یک متغیر داخلی از نوع بولین به نام xPrevMotor نیز وجود داشته که تنها در داخل برنامه ++C استفاده میشود و با برنامه خارجی لدر ارتباط برقرار نمیکند.
سورس کد ++C
اکنون فایل MotorStartStopProgram.cpp یا همان سورس کد برنامه را بررسی میکنیم. همانطور که قبلاً ذکر شد، متغیر داخلی xPrevMotor تنها در داخل برنامه ++C مورد استفاده قرار میگیرد.
متغیر Motor نیز به یک پورت ورودی (INPUT Port) اختصاص یافته است.
در خط 10 برنامه (شکل زیر)، با استفاده از دستور if عملیات منطقیای انجام میشود تا وضعیت موتور را با وضعیت قبلی آن مقایسه کند:
- علامت تعجب (!) نمایانگر عملگر منطقی NOT است.
- دو علامت امپرسند (&&) نیز نمایانگر عملگر منطقی AND هستند.
هنگامی که موتور از حالت False به True یا از OFF به ON تغییر وضعیت میدهد، خط 13 یک واحد به مقدار فعلی OUTPORT_MotorStarts اضافه میکند. در واقع، این خط تعداد دفعات فعالسازی موتور را ثبت میکند.
به منظور تولید دادههای لاگ، در خط 14 فراخوانی تابع log انجام میشود. در واقع میخواهیم بدانیم که موتور چند بار و در چه زمانهایی فعال میشود.
هر بار که شمارنده مذکور یک واحد افزایش پیدا میکند، با فراخوانی این تابع، یک ورودی لاگ در یک فایل لاگ خروجی به نام Output.log تولید میشود (Output.log توسط PLCnext ایجاد میشود).
در اینجا از نرمافزار WinSCP برای استخراج و مشاهده محتوای فایل لاگ استفاده کردهایم. شایان ذکر است که WinSCP یک نرمافزار کلاینت برای انتقال امن فایلها از طریق پروتکل انتقال فایل SFTP Secure File Transfer Protocol است.
در خط 18 مقدار قبلی متغیر بولین xPrevMotor با مقدار متغیر Motor جایگزین میگردد تا سیستم آماده برای تغییر احتمالی بعدی در وضعیت Motor باشد.
نحوه ادغام برنامه ++C با برنامه LD
بدین منظور، با استفاده از PLCnext Engineer، برنامه ++C به برنامه LD اضافه میشود.
از آنجایی که نحوه عملکرد برنامه LD با توجه به مطالب قبلی ما مشخص است، نگاهی کوتاه به برنامه ++C می اندازیم.
پس از دانلود و راه اندازی برنامههای LD و ++C در PLC، آنها را اجرا میکنیم.
هنگامی که دکمههای START و STOP را در Starterkit فعال میکنیم، MOTOR در وضعیت START و STOP قرار میگیرد (شروع به کار کرده و سپس متوقف میشود). به این ترتیب هر بار که موتور به کار میافتد، مقدار پورت خروجی افزایش مییابد.
فایل لاگ خروجی با استفاده از نرم افزار WinSCP باز میشود و میتوانیم فعالیتهای MOTOR را همراه با یک برچسب زمانی (زمان دقیق روشن و خاموش شدن موتور) مشاهده کنیم.
سخن پایانی
در این مقاله نگاهی گذرا به برنامهنویسی PLC با ++C داشتیم.
همانطور که قبلاً ذکر شد، برنامههای ++C برای انجام وظایف پیچیدهتری مورد استفاده قرار میگیرند که با زبانهای سنتی معرفی شده در استاندارد IEC 61131-3 به راحتی قابل انجام نیستند.
در استفاده از زبانهای سطح بالاتر، امکانات نامحدودی وجود دارد که با کمک آنها میتوانیم عملکرد قویتری از PLC را مشاهده کنیم.