الرئيسية قاعدة المعرفة الأتمتة والتحكم Structured Text: البرمجة النصية للمتحكمات — قوة بلا حدود
الأتمتة والتحكم

Structured Text: البرمجة النصية للمتحكمات — قوة بلا حدود

لماذا Structured Text بدلاً من السلالم؟

لغة النص المهيكل (Structured Text أو ST) هي إحدى لغات معيار IEC 61131-3. تشبه لغات البرمجة النصية مثل Pascal وC، وتتفوق على السلالم في:

  • الحسابات الرياضية: معادلات PID، تحويلات خطية، وفلاتر رقمية
  • آلات الحالة: إدارة تسلسلات معقدة بعشرات المراحل
  • معالجة البيانات: مصفوفات، هياكل، ونصوص
  • قابلية القراءة: كود منظم مع تعليقات واضحة

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

المتغيرات وأنواعها في ST

إعلان المتغيرات

VAR
    bMotorRunning   : BOOL := FALSE;    // حالة المحرك
    iProductCount   : INT := 0;         // عدّاد المنتجات
    rTemperature    : REAL := 0.0;      // درجة الحرارة
    sRecipeName     : STRING := '';     // اسم الوصفة
    tDelayTime      : TIME := T#5s;     // زمن التأخير
END_VAR

أنواع المتغيرات حسب النطاق

الكلمة المفتاحية النطاق الاستخدام
VAR محلي داخل البرنامج أو الكتلة فقط
VAR_INPUT مدخل يُمرّر إلى كتلة وظيفية
VAR_OUTPUT مخرج يخرج من كتلة وظيفية
VAR_IN_OUT مدخل/مخرج يُمرّر ويُعدّل
VAR_GLOBAL عام متاح لكل البرامج

تسمية المتغيرات (اصطلاح هنغاري)

b  -> BOOL        (bStartButton)
i  -> INT         (iSpeed)
r  -> REAL        (rPressure)
s  -> STRING      (sAlarmText)
t  -> TIME        (tCycleTime)
dt -> DATE_AND_TIME (dtLastMaintenance)

هذا الاصطلاح ليس إلزامياً لكنه يُسهّل قراءة الكود بشكل كبير.

الشروط: IF و CASE

عبارة IF

// تشغيل مروحة التبريد حسب درجة الحرارة
IF rTemperature > 80.0 THEN
    bCoolingFan := TRUE;
    bAlarmHigh := TRUE;
ELSIF rTemperature > 60.0 THEN
    bCoolingFan := TRUE;
    bAlarmHigh := FALSE;
ELSE
    bCoolingFan := FALSE;
    bAlarmHigh := FALSE;
END_IF;

عبارة CASE

مثالية لآلات الحالة (State Machines) في خطوط الإنتاج:

// آلة حالة لدورة تعبئة
CASE iFillingState OF
    0: // انتظار
        bConveyorRun := TRUE;
        IF bBottleDetected THEN
            iFillingState := 10;
        END_IF;

    10: // إيقاف السير وبدء التعبئة
        bConveyorRun := FALSE;
        bFillValve := TRUE;
        IF bLevelFull THEN
            iFillingState := 20;
        END_IF;

    20: // إغلاق الصمام وانتظار
        bFillValve := FALSE;
        tDelay(IN := TRUE, PT := T#500ms);
        IF tDelay.Q THEN
            tDelay(IN := FALSE);
            iFillingState := 30;
        END_IF;

    30: // تشغيل السير لإخراج الزجاجة
        bConveyorRun := TRUE;
        IF NOT bBottleDetected THEN
            iFillingState := 0;
        END_IF;
END_CASE;

الحلقات: FOR و WHILE و REPEAT

حلقة FOR

// حساب متوسط 10 قراءات من مستشعر حرارة
VAR
    arReadings : ARRAY[1..10] OF REAL;
    rSum       : REAL := 0.0;
    rAverage   : REAL;
    i          : INT;
END_VAR

rSum := 0.0;
FOR i := 1 TO 10 DO
    rSum := rSum + arReadings[i];
END_FOR;
rAverage := rSum / 10.0;

حلقة WHILE

// البحث عن أول خانة فارغة في مصفوفة الطلبات
VAR
    iIndex : INT := 1;
END_VAR

iIndex := 1;
WHILE iIndex <= 50 AND arOrders[iIndex] <> 0 DO
    iIndex := iIndex + 1;
END_WHILE;

IF iIndex <= 50 THEN
    arOrders[iIndex] := iNewOrder;
END_IF;

حلقة REPEAT

// انتظار استقرار قراءة المستشعر
VAR
    iAttempts : INT := 0;
END_VAR

REPEAT
    rCurrentReading := ReadSensor();
    iAttempts := iAttempts + 1;
UNTIL ABS(rCurrentReading - rLastReading) < 0.5 OR iAttempts > 100
END_REPEAT;

تحذير مهم

في PLC، الحلقات تُنفّذ داخل دورة مسح واحدة. حلقة طويلة جداً قد تُسبب تجاوز زمن المسح (Watchdog Timeout) وتوقف PLC. استخدم حلقات قصيرة أو وزّع العمل على عدة دورات.

مثال عملي: نفس دائرة المحرك بلغة ST

نُعيد كتابة دائرة تشغيل المحرك من الدرس السابق بلغة Structured Text:

PROGRAM MotorControl
VAR
    bStartButton    : BOOL;  // I0.0 - زر بدء
    bStopButton     : BOOL;  // I0.1 - زر إيقاف
    bEStop          : BOOL;  // I0.2 - إيقاف طوارئ
    bThermalTrip    : BOOL;  // I0.3 - حماية حرارية
    bMotorContactor : BOOL;  // Q0.0 - كونتاكتور
    bGreenLamp      : BOOL;  // Q0.1 - لمبة تشغيل
    bRedLamp        : BOOL;  // Q0.2 - لمبة عطل
END_VAR

// منطق التشغيل مع القفل الذاتي
IF bEStop OR bThermalTrip THEN
    // إيقاف فوري: الطوارئ أو الحماية الحرارية
    bMotorContactor := FALSE;
ELSIF bStopButton THEN
    // إيقاف عادي
    bMotorContactor := FALSE;
ELSIF bStartButton THEN
    // تشغيل
    bMotorContactor := TRUE;
END_IF;
// القفل الذاتي: المحرك يبقى عاملاً لأن
// bMotorContactor لا يتغير إلا بأحد الشروط أعلاه

// لمبات البيان
bGreenLamp := bMotorContactor;
bRedLamp := bEStop OR bThermalTrip;

مقارنة: Ladder Logic مقابل Structured Text

المعيار Ladder Logic Structured Text
سهولة التعلم سهل لفنّيي الكهرباء يحتاج خبرة برمجة
المنطق البسيط ممتاز جيد
الحسابات المعقدة صعب ومُربك سهل وواضح
آلات الحالة ممكن لكن فوضوي CASE مثالي
قابلية القراءة بصري وسريع نصّي ومنظم
إعادة الاستخدام محدودة عالية (دوال وكتل)
البحث في الكود صعب سهل (نص)
الصيانة جيدة للدوائر الصغيرة ممتازة للمشاريع الكبيرة

القاعدة العملية

  • استخدم Ladder Logic للتحكم المنطقي البسيط والدوائر التي يصونها فنّيو كهرباء
  • استخدم Structured Text للحسابات والخوارزميات وآلات الحالة المعقدة
  • يمكنك الجمع بينهما في نفس المشروع: كل شبكة أو كتلة بلغتها المناسبة

الخلاصة

Structured Text لغة قوية تُكمّل السلالم وتتفوق عليها في المهام المعقدة. إتقان المتغيرات والشروط (IF/CASE) والحلقات يُتيح لك بناء برامج تحكم متطورة. في الدروس القادمة سنتعمّق في أنواع البيانات والمؤقتات والعدّادات والكتل الوظيفية التي تُكمل أدواتك في ST.

structured-text ST IEC-61131 variables IF-THEN CASE النص المهيكل البرمجة النصية المتغيرات الشروط الحلقات IEC