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

22برامج منظمة

المصفوفات: ARRAY وفلتر المتوسط المتحرك

إعلان ARRAY [1..10] OF REAL، والفهرسة، وحلقة FOR على المصفوفة، وفلتر متوسط متحرك، والفهرس الخارج عن المدى كسبب حقيقي لتوقف المتحكم.

الدرس 22 من 3412 دقائقIEC 61131-3

عندما تصبح المتغيرات المنفردة عبئاً

تريد متوسط آخر عشر قراءات للمستوى. بالمتغيرات المنفردة:

S10 := S9; S9 := S8; S8 := S7;   (* ... وهكذا تسعة أسطر *)
Avg := (S1 + S2 + S3 + S4 + S5 + S6 + S7 + S8 + S9 + S10) / 10.0;

عشرون سطراً، وتغيير العدد إلى 20 يعني إعادة كتابة كل شيء. المصفوفة تحل هذا.

الإعلان

VAR
  Samples : ARRAY [1..10] OF REAL;
  Motors  : ARRAY [1..32] OF BOOL;
  Grid    : ARRAY [1..4, 1..8] OF INT;   (* ثنائية الأبعاد *)
END_VAR

المدى [1..10] يحدد الفهرس الأول والأخير. المعيار يتركه لك، لكن العرف في الصناعة أن تبدأ من 1 لأن أول محرك اسمه M1 لا M0، وهذا يقلّل أخطاء الإزاحة بواحد.

الفهرسة

Samples[1] := Level;
Last       := Samples[10];
Samples[i] := Samples[i - 1];
Motors[Index] := TRUE;

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

حلقة FOR على مصفوفة

Total := 0.0;
FOR i := 1 TO 10 DO
  Total := Total + Samples[i];
END_FOR;
Avg := Total / 10.0;

أربعة أسطر تعمل مع 10 عناصر ومع 200. وللإزاحة:

FOR i := 10 TO 2 BY -1 DO
  Samples[i] := Samples[i - 1];
END_FOR;
Samples[1] := Level;

لاحظ الاتجاه: من الأعلى للأسفل، وإلا نسخت العنصر الأول على كل المصفوفة.

الفلتر: متوسط متحرك

قراءة مستوى تهتز لأن السائل متحرك ولأن ضوضاء كهربائية تدخل على الكيبل. المتوسط المتحرك يهدّئها:

Tick(IN := NOT Tick.Q, PT := T#100ms);

IF Tick.Q THEN
  FOR i := 10 TO 2 BY -1 DO
    Samples[i] := Samples[i - 1];
  END_FOR;
  Samples[1] := Level;
END_IF;

Total := 0.0;
FOR i := 1 TO 10 DO
  Total := Total + Samples[i];
END_FOR;
AvgLevel := Total / 10.0;

لا تأخذ عينة في كل مسح. عشر عينات بزمن مسح 10 ms تعني متوسط عُشر ثانية، وهو لا يفلتر شيئاً. أخذ العينة كل 100 ms يعطي نافذة ثانية كاملة. نافذة الفلتر = عدد العينات × زمن العينة، وهذا ما يجب أن تحسبه قبل أن تكتب رقماً.

الفهرس الخارج عن المدى

هذا سبب حقيقي لتوقف خطوط إنتاج:

Samples[i] := Level;   (* ماذا لو i = 0؟ أو 11؟ أو 300؟ *)

ما يحدث يختلف بين المنصات: بعضها يرفع خطأ ويوقف المتحكم، وبعضها يكتب على ذاكرة متغير آخر بصمت، وهذا الثاني أسوأ لأن البرنامج يبقى يعمل ويعطي نتائج غلطاً. والفهرس الخطر هو الذي يأتي من الخارج: من HMI، أو من رسالة اتصال، أو من حساب.

احمِ نفسك دائماً:

IF i >= 1 AND i <= 10 THEN
  Samples[i] := Level;
ELSE
  IdxFault := TRUE;
END_IF;

أو باستخدام LIMIT:

i := LIMIT(1, RawIndex, 10);

الحصر أفضل من التجاهل، والإنذار أفضل من الحصر الصامت.

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

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

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

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

ماذا تجرّب

  1. شغّل البرنامج واضغط START.
  2. راقب Smp1 إلى Smp4 في جدول المراقبة: القيم تنتقل خانة كل نصف ثانية، كما في مصفوفة.
  3. قارن Level مع Avg: المتوسط يتبع المستوى متأخراً وأنعم.
  4. غيّر T#500ms إلى T#2s: المتوسط يصبح أبطأ ويتجاوز المستوى حد 70% قبل أن تتوقف المضخة.

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

ARRAY في STمصفوفة في PLCarray structured textFOR على مصفوفةفلتر المتوسط المتحرك PLCmoving average plcindex out of range PLC

محتوى الدورة

  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 بإجابات قصيرة