القائمة الرئيسية

الصفحات

الكود الجيد والكود السيء في برمجة ال PLC- الجزء الأول Clean code Vs. Dirty Code in PLC Programming – Part One

 

الكود الجيد والكود السيء في برمجة ال PLC- الجزء الأول

Clean code Vs. Dirty Code in PLC Programming – Part One

هناك بعض المفاهيم المتعارف عليها في عالم برمجة الحاسوب PC Programming ولكن لا يتم الاهتمام بها في عالم برمجة ال PLC ، ويرجع ذلك للخلفية العملية التي يمتلكها مبرمجو ال PLC حيث أن معظم مبرمجي ال PLC هم مهندسون كهرباء في الأصل وقد تخصصوا في مجال التحكم الصناعي Industrial Automation ، ولذلك كانت الشهرة الكبيرة للغة ال Ladder Language ، وذلك لتشابهها مع رسومات الكنترول التقليدية ، فعندما تم ابتكار ال PLC كان يجب أيضاً ابتكار لغة برمجة يفهمها المهندسون العاملين في المجال الصناعي ، ولكن تطور الأمر بعد ذلك وتم ابتكار لغات أخري كثيرة علي مدار أكثر من خمسة عقود.

وكل هذه اللغات يمكنك كتابتها بطريقة جيدة ونظيفة وأخص بالذكر لغة اللادر دياجرام Ladder Diagram فهي لغة برمجة وليست رسم كهربي كما يتصور البعض.

وفي هذا المقال سوف اتحدث عن بعض النصائح العامة وسيكون موضوعنا القادم (أو أكثر من موضوع ) عن كيفية تطبيق ذلك في ال PLC مع بعض الأمثلة التوضيحية فهذا الموضوع لا يمكن شرحه في مقال واحد أو حتي اثنين ولهذا سوف يكون هذا المقال عبارة عن مقدمة لتوضيح المفاهيم العامة للمواضيع المتعلقة بالكود النظيف.

PLC Clean Code


محتويات المقال:

  1.       معيار اللجنة الكهروتقنية الدولية IEC 61131-3
  2.      أهمية الكود النظيف.
  3.     ما هو الكود النظيف؟
  4.       بعض النصائح لكتابة كود نظيف.
  5.     الخاتمة.

لغة اللادر دياجرام Ladder Diagram ليست اللغة الوحيدة التي يمكنك برمجة ال PLC من خلالها فهناك خمس لغات يتم استخدامها في البرمجة كما ينص المعيار رقم 61131 في الجزء الثالث للجنة الكهروتقنية الدولية وهي منظمة دولية غير ربحية تقوم بوضع المعايير الدولية للكهرباء والالكترونيات وكل التقنيات المتعلقة بهما ، حيث ينص هذا المعيار علي كل ما يتعلق بالمتحكمات المنطقية.


IEC

International Electro-Technical Commission

IEC 61131-3
is the third part out of ten parts of IEC 61131, and it deals with PLC Programming Language

وفي هذا الجزء تم وضع خمس لغات رسمية ليتفق عليها جميع المصنعين وقد انتشر ذلك في الآونة الأخيرة بعد تواجد CODESYS وهو منصة برمجة تدعم أنواع كثيرة من المصنعين حتي تصبح برامج ال PLC قابلة للنقل Portable وربما يكون هذا موضوع آخر في المستقبل.

تم تقسيم اللغات الخمس الي فئتين:

الفئة الأولي : اللغات الرسومية Graphical Languages

  1.     Ladder Diagram Language (LD).
  2.      Function Block Diagram (FBD).
  3.      Sequential Function Chart (SFC).

الفئة الثانية : اللغات النصية Textual Languages

  1.     Instruction List Language (IL).
  2.     Structured Text Language (ST).

ربما يتم مناقشة هذا المعيار في أوقات قادمة ، وأيضا الاستفاضة في معرفة الفروق بين هذه اللغات ولكن هذا ليس موضوعنا اليوم.

 

 

أهمية الكود النظيف Clean Code

بنسبة كبيرة جداً لا يوجد كود لا نحتاج لصيانته في المستقبل ، فالبيئة الصناعية هي الأكثر بالنسبة للتغيرات التي يمكن حدوثها وذلك للظروف البيئية الشاقة التي يتم فيها وضع أجهزة ال PLC فهناك متغيرات كثيرة يمكن أن تحدث سواء في جهاز ال PLCنفسه أو في الأجهزة المربوطة به عن طريق المدخلات ، المخرجات ، أو الاتصالات Inputs, Outputs and Communication Ports

وكل هذه المتغيرات تؤدي الي الحاجة الي صيانة البرنامج لعمل التعديلات اللازمة عند تغيير AC Drive مثلا باخر من ماركة أخري.

وهنا تأتي أهمية الكود النظيف فهو كود سهل القراءة وبالتالي فهو سهل الصيانة ، فكتابتك لكود نظيف في الأساس سوف يساعدك أنت أو أحد زملائك في المستقبل علي عمل صيانة للكود بكل سهولة ، فأنا أشجع الجميع وخصوصاً المبرمجين الجدد في تبني هذا الأسلوب في البداية حتي يصبح هذا هو أسلوبهم بعد ذلك ، فلا يهم ان كنت مبتدئا أو خبيراً فكلنا يجب أن نكتب كوداً نظيفاً ذو جودة عالية.

ما هو الكود النظيف Clean Code؟

ببساطة الكود النظيف هو الكود الذي يكتب بأفضل الممارسات Best Practices ، وهي نتاج خبرات المبرمجين الذين قاموا ببرمجة المئات من المشاريع ، واتباعك لهذه القواعد يجعل من تعليماتك البرمجية كوداً نظيفاً ، ولكي تقوم بكتابة كود نظيف هناك بعض الشروط التي يجب أن يتسم بها الكود الخاص بك وهي:

  1.  واضح
  2. سهل الفهم والتتبع.
  3. سهل التعديل أو التغيير فيه.
  4. له هيكلة ومنظم.
  5. قابل للتحسين.

بعض النصائح لكتابة كود نظيف

  يمكنك الرجوع الي المقال الخاص بأشهر الأخطاء البرمجية ، فسوف تجد كثيراً من التعليمات التي يمكنها أن تجعلك تكتب كودا نظيفا ، فبعد قراءتك لمقال الكود النظيف سوف تجد أن أشهر الأخطاء البرمجية هي "عدم كتابة كود نظيف".

ومن أهم هذه النصائح:

1.      قم بعمل خوارزمية للبرنامج.

كلمة خوارزمية Algorithm تعني فكرتك لطريقة عمل الآلة المراد برمجتها ، وهي أهم خطوة في العملية فبعد أن تقوم بمعاينة الماكينة وتفهم من المشغل (أو شخص آخر) طريقة عمل الماكينة ومكوناتها والشروط التي يريد توفرها الخ. ، وبعد أن تقوم بعمل حصر كامل بكل المدخلات والمخرجات ثم تقوم بعمل رسم مبدئي للهاردوير واختيار ال CPU المناسب الخ.

فانت الان بعد أن فهمت الماكينة تريد افهام ال PLC أيضا بما فهمته أنت ولكن بلغة يفهمها مثل اللادر دياجرام ، في هذه المرحلة يقوم الكثيرون بجلب جهاز الكمبيوتر وفتح السوفتوير الخاص بالPLC المستخدم والبدء في كتابة الأكواد واحدا تلو الاخر وللرجوع الي عمل تعديلات (وهذا سيحدث) يكون الأمر صعباً جداً ، ولا أنكر أن هذا الأمر طبيعي في الماكينات الصغيرة التي تحتوي علي عدد قليل من الأحمال والحساسات/الأزرار ، ولكن دعنا نتخيل أنه بعد سنة أو اثنين يطلب منك عمل ماكينة شبيهه بنفس الفكرة ولكن مع اختلاف الPLC المستخدم ومع اختلاف بعض الأحمال ففي هذا الأمر سوف يساعدك كثيراً الخوارزمية التي قمت بإعدادها في وقت سابق.

لكي تقوم بعمل خوارزمية فيجب أن تجلب ورقة وقلم أولاً وأشهر الطرق هو انشاء Flowchart للماكينة ولكني أفضل استخدام لغة الSFC في الرسم وهي باختصار عبارة عن حالات الماكينة والشروط الخاصة بالانتقال من حالة لأخري ، فعلي سبيل المثال اذا كنت تصمم ماكينة بها موتورين يعملان بالتتابع وأحدهما يعمل ستار دلتا ، فيمكنك تقسيم البرنامج الي حالات أول حالة هي "حالة السكون" ، ثم عند حدوث شروط معينة يتم الانتقال الي الحالة الثانية "موتور 1 يعمل" ، ثم الانتقال الي الحالة الثالثة "الموتوران يعملان" ، وفي أي حالة من حالات التشغيل يمكن العودة الي حالة "الأعطال" ، كما يمكن عمل أكثر من حالة للأعطال فهناك أعطال تسمح بإكمال دورة قبل التوقف وهناك أعطال يجب أن توقف فوراً وتعطي انذار وهكذا.

2.      قم بتقسيم البرنامج الي أجزاء.

بعد أن قمنا بعمل خوارزمية بسيطة نقوم بتقسيم البرنامج أولا الي Program Organization Units(POU) أو Subroutinesوتحديد ال Task المعنية بكل POU وهل هيا Periodic Task مرتبطة بال Scan Cycle أو غير مرتبطة بال scan cycle مثل ال interrupt.

فبالعودة للمثال السابق يمكن تقسيم البرنامج الي:

-          Main:

 حيث نقوم هنا بعمل ما يسمي house keeping للبرنامج مثل variable initializing, Calling Subroutines, etc.  وكتابة أوضاع الماكينة مثل اليدوي والأتوماتيك.

-          Inputs:

حيث نقوم بعمل mapping للمدخلات وعمل Debouncing للحساسات التي تحتاج استقرار وأيضا يمكننا عمل Analog Scaling ويفيد هذا في حالة الأعطال وفي حالة تلف النقاط ومحاولة استبدالها فاذا تلفت نقطة I0.0 مثلا فسوف تقوم بتغييرها مرة واحده في صفحة معروفة بدلا من البحث عنها في كل البرنامج وسيتم شرح هذا باستفاضة لاحقاً.

-          Sequence

-          Outputs

-          Alarms

3.      قم بتسمية كل شيء.

هذا ضروري جدا للفهم ، فقراءة الكود أصعب من كتابته حتي عليك أنت شخصياً وللتسمية قواعد مهمة سأقوم بشرحها في المقال القادم بإذن الله.

4.      قم بعمل Mapping للمدخلات والمخرجات.

وهذا مهم كما ذكرت في السابق علي الدخل فينطبق نفس الكلام علي الخرج.

5.      قم بعمل تعليقات لكل البرنامج.

ويمكنك القيام بذلك كليا لكل Rung/Network ، أو علي الأقل قم بعمل تعليقاً لكل جزء (مجموعة أكواد مرتبطة ببعضها).

6.      قم بترتيب الكود حسب الوظيفة.

حاول أن تجعل الأوامر المرتبطة سوياً ، وهذا أيضا يزيد من سهولة قراءة البرنامج.

 

 

الخاتمة

لقد تركت بعض النقاط لم اشرحها وذلك للحديث عنها باستفاضة في وقت لاحق ان شاء الله ، أتمني أن أكون قد وفقت في شرح المقال ، أرجو مشاركة المقال مع زملاءكم لتعم الفائدة علي الجميع ;

أسألكم الدعاء.

 

 

تعليقات

عن المدونة

مدونة أسرار المتحكم الصناعي كانت فكرة قديمة تمنيت وجود شيء مثلها يقوم بتعليم المفاهيم والأسرار الخاصة بعالم التحكم الصناعي باللغة العربية . حيث أن كل المحتوي العربي الموجود يتحدث عن الأوامر البرمجية فقط ولا يقوم بتعليمنا المفاهيم التي ترسخ البرمجة في أذهاننا ، ولذلك قررت أن ابدأ في انشاء الفكرة للمساهمة ولو بجزء بسيط جداً في اثراء المحتوي العربي في عالم التحكم الصناعي . سوف أتحدث عن المتحكمات المنطقية ، الشاشات الصناعية ، مغيرات السرعة ، أنظمة الاسكادا ، أيضاً سوف احاول توفير روابط لأهم الكتب العربية والاجنبية في عالم الكهرباء بشكل عام والتحكم الصناعي بشكل خاص . أسأل الله أن ينفعني وينفعكم بهذا العمل ولا تنسوني من صالح دعائم.
التنقل السريع