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.