انتقل إلى المحتوى

21برامج منظمة

اكتب كتلتك الوظيفية: FUNCTION_BLOCK لمحرك

إعلان FUNCTION_BLOCK كامل لمحرك فيه Start و Stop و Feedback و Fault ومؤقت داخلي، وما معنى النسخة، ومتى تستخدم VAR_IN_OUT.

الدرس 21 من 3413 دقائقIEC 61131-3

لماذا كتلة وليس دالة

كل محرك في المحطة يحتاج نفس الأشياء: إمساك ذاتي، مراقبة إشارة الرجوع من الكونتاكتور، قفل خطأ، وإقرار. والمراقبة تحتاج مؤقتاً، والمؤقت يحتاج ذاكرة، والذاكرة تعني كتلة وظيفية لا دالة.

تكتبها مرة، وتستخدمها لثلاثين محركاً.

الإعلان

FUNCTION_BLOCK FB_Motor
VAR_INPUT
  Start    : BOOL;   (* نبضة تشغيل *)
  Stop     : BOOL;   (* نبضة إيقاف، تغلب دائماً *)
  Feedback : BOOL;   (* تماس مساعد من الكونتاكتور *)
  Ack      : BOOL;   (* إقرار الخطأ *)
  FbTime   : TIME;   (* زمن انتظار إشارة الرجوع *)
END_VAR
VAR_OUTPUT
  Run   : BOOL;      (* إلى الكونتاكتور *)
  Alarm : BOOL;      (* خطأ ممسوك *)
END_VAR
VAR
  FbTimer : TON;     (* ذاكرة خاصة بكل نسخة *)
END_VAR

(* إمساك ذاتي، والخطأ والإيقاف يغلبان *)
Run := (Start OR Run) AND NOT Stop AND NOT Alarm;

(* أمرنا بالتشغيل ولم تعد إشارة الرجوع خلال الزمن المسموح *)
FbTimer(IN := Run AND NOT Feedback, PT := FbTime);

IF FbTimer.Q THEN
  Alarm := TRUE;     (* ممسوك: يبقى بعد زوال السبب *)
END_IF;

IF Ack THEN
  Alarm := FALSE;
END_IF;

END_FUNCTION_BLOCK

النسخة هي كل شيء

VAR
  M101 : FB_Motor;
  M102 : FB_Motor;
  M103 : FB_Motor;
END_VAR

M101(Start := Btn1, Stop := StopAll, Feedback := Aux1, Ack := AckBtn, FbTime := T#2s);
M102(Start := Btn2, Stop := StopAll, Feedback := Aux2, Ack := AckBtn, FbTime := T#2s);
M103(Start := Btn3, Stop := StopAll, Feedback := Aux3, Ack := AckBtn, FbTime := T#5s);

K101 := M101.Run;
K102 := M102.Run;
AnyFault := M101.Alarm OR M102.Alarm OR M103.Alarm;

ثلاث نسخ، ولكل واحدة مؤقتها وقفل خطئها. تعديل المنطق مرة واحدة في الكتلة يصلح الثلاثين محركاً.

ناد النسخة في كل دورة

النسخة لا تحسب إلا عندما تُنادى. إذا وضعت نداء M101(...) داخل IF لا ينفّذ أحياناً، فسيتجمد مؤقتها الداخلي ويتعلّق الخطأ بحالة قديمة. ناد كل النسخ في كل مسح، وتحكّم بالسلوك عبر المداخل.

قراءة المخارج بعد النداء

M101(Start := Btn1, ...);
K101 := M101.Run;      (* صحيح: القيمة من هذا المسح *)

لو قرأت M101.Run قبل النداء، تحصل على قيمة المسح السابق. ليس خطأً دائماً، لكنه مصدر تأخير بمسح واحد يصعب تفسيره في التسلسلات.

VAR_IN_OUT

VAR_INPUT ينسخ القيمة داخل الكتلة، و VAR_OUTPUT ينسخها خارجاً. أما VAR_IN_OUT فيعطي الكتلة المتغير نفسه: تقرؤه وتكتب عليه، والتغيير يظهر في الأصل.

FUNCTION_BLOCK FB_RunHours
VAR_INPUT
  Running : BOOL;
END_VAR
VAR_IN_OUT
  Hours : REAL;      (* عدّاد ساعات يملكه البرنامج ويحدّثه الكتلة *)
END_VAR

استخدمه عندما تحتاج الكتلة أن تحدّث بياناً كبيراً أو ممسوكاً يعيش خارجها: عدّاد ساعات تشغيل، أو سجل. ولا تستخدمه لتوفير سطر: المخرج العادي أوضح، و VAR_IN_OUT يخفي من يكتب على ماذا.

لا يعمل في المختبر

المختبر لا يدعم إعلان FUNCTION_BLOCK. برنامج المختبر أدناه يكتب نفس المنطق مباشرة مع TON لمحرك واحد، لترى الإمساك ومراقبة إشارة الرجوع وقفل الخطأ وهي تعمل.

جرّبه في المختبر

المختبر يعمل في متصفحك: محرر ST، وعملية افتراضية تناسب الدرس، ونفس البرنامج كمخطط Ladder حي، وجدول مراقبة، وتصدير إلى Siemens SCL.

ماذا تجرّب

  1. شغّل البرنامج واضغط START: المحرك يبدأ نجمة ثم ينتقل إلى دلتا بعد 4 ثوانٍ.
  2. ارفع مفتاح OVERLOAD TRIP: Fault يُمسك ويتوقف المحرك. أنزله واضغط START لإعادة الضبط.
  3. غيّر Feedback := KMain; إلى Feedback := FALSE; وأعد التحميل: بعد ثانية يظهر العطل، لأن التأكيد لم يصل.

يبحث الناس عن هذا الدرس بـ

FUNCTION_BLOCK في STكتلة محرك PLCmotor function block structured textinstance في PLCVAR_IN_OUTfeedback fault محرككتابة كتلة وظيفية

محتوى الدورة

  1. 01ما هي لغة ST؟ ومتى تستخدمها بدل Ladder
  2. 02كيف يشتغل الـ PLC: دورة المسح وصورة المداخل والمخارج
  3. 03هيكل البرنامج: POU و PROGRAM و FUNCTION و FUNCTION_BLOCK
  4. 04أول برنامج: تشغيل مضخة بالإمساك الذاتي (Seal-in)
  5. 05أنواع البيانات: BOOL و INT و REAL و TIME وغيرها
  6. 06التصريح عن المتغيرات: VAR و VAR_INPUT و RETAIN
  7. 07القيم الحرفية والثوابت: 16#FF و 2#1010 و T#5s
  8. 08التحويل بين الأنواع وتحجيم إشارة 4-20 مللي أمبير
  9. 09الإسناد والحساب في ST: ‎:=‎ وأولوية العمليات
  10. 10المنطق البولياني والمقارنات وعمليات البتات
  11. 11الدوال القياسية: ABS و SQRT و MIN و MAX و LIMIT و SEL و MUX
  12. 12الشرط IF و ELSIF و ELSE: القواعد ومتى تتجنبه
  13. 13التعليمة CASE وأول آلة حالات
  14. 14حلقة FOR والحارس Watchdog
  15. 15WHILE و REPEAT و EXIT و CONTINUE و RETURN
  16. 16كشف الحافة: R_TRIG و F_TRIG ومشكلة «نفّذ في كل مسح»
  17. 17المؤقتات: TON و TOF و TP
  18. 18العدّادات: CTU و CTD و CTUD
  19. 19القلّابات: SR و RS ومن يغلب عند التعارض
  20. 20اكتب دالتك: FUNCTION وقيمة الإرجاع
  21. 21اكتب كتلتك الوظيفية: FUNCTION_BLOCK لمحرك
  22. 22المصفوفات: ARRAY وفلتر المتوسط المتحرك
  23. 23الأنواع المركّبة: STRUCT والتعدادات
  24. 24المراجع والمؤشرات: REF_TO و POINTER TO ولماذا تتجنبها
  25. 25آلة الحالات: تسلسل دفعة كامل بـ CASE لا يعلق أبداً
  26. 26إدارة الإنذارات على أصول ISA-18.2: تأخير، نطاق ميت، إقرار، وأول خروج
  27. 27معالجة الإشارة التناظرية: من العدّات إلى وحدة هندسية، و NE43، وفلتر EMA
  28. 28التحكم المغلق في ST: من التشغيل والإيقاف بفجوة إلى PID عملي
  29. 29تشغيل المحركات والصمامات: سماحيات، تشابيك، رجع تشغيل، وزمن حركة
  30. 30نفس الكود عند كل شركة: SCL و Studio 5000 و CODESYS و TwinCAT
  31. 31الاختبار وتصحيح الأخطاء: جدول المراقبة والفرض والمحاكاة
  32. 32دليل أسلوب ST: التسمية والتعليقات والثوابت وإدارة النسخ
  33. 33المشروع الختامي: محطة خزان كاملة بآلة حالات وإنذار وعدّ دفعات
  34. 3420 سؤال مقابلة في ST وبرمجة PLC بإجابات قصيرة