أنواع البيانات في PLC: من البت إلى الهيكل المعقد
الأنواع الأساسية: BOOL و INT و REAL
معيار IEC 61131-3 يُحدد مجموعة من أنواع البيانات الأساسية التي تدعمها جميع أجهزة PLC.
BOOL - القيمة المنطقية
VAR
bSensorActive : BOOL := FALSE; // حسّاس القُرب
bValveOpen : BOOL := TRUE; // حالة الصمام
END_VAR
// العمليات المنطقية
bResult := bSensor1 AND bSensor2; // و
bResult := bSensor1 OR bSensor2; // أو
bResult := NOT bEmergencyStop; // عكس
bResult := bSensor1 XOR bSensor2; // أو حصري
الأعداد الصحيحة
| النوع | الحجم | المجال | الاستخدام |
|---|---|---|---|
| SINT | 8 بت | -128 إلى 127 | قيم صغيرة |
| INT | 16 بت | -32768 إلى 32767 | عدّادات، مواضع |
| DINT | 32 بت | حوالي -2 مليار إلى 2 مليار | عدّاد إنتاج يومي |
| USINT | 8 بت | 0 إلى 255 | عناوين Modbus |
| UINT | 16 بت | 0 إلى 65535 | قراءة تناظرية خام |
| UDINT | 32 بت | 0 إلى حوالي 4 مليار | عدّاد تراكمي |
VAR
iMotorSpeed : INT := 0; // سرعة المحرك RPM
diTotalCount : DINT := 0; // إجمالي الإنتاج
uiRawAnalog : UINT; // قراءة تناظرية 0-65535
END_VAR
REAL و LREAL - الأعداد العشرية
VAR
rTemperature : REAL := 25.0; // 32 بت، دقة 7 أرقام
lrPreciseWeight: LREAL := 0.0; // 64 بت، دقة 15 رقم
END_VAR
// الحسابات
rArea := 3.14159 * rRadius * rRadius;
rFahrenheit := (rCelsius * 9.0 / 5.0) + 32.0;
تحذير: مقارنة REAL
لا تُقارن أعداد REAL بالتساوي المباشر بسبب أخطاء التقريب:
// خاطئ - قد لا يتحقق أبداً
IF rTemperature = 25.0 THEN ...
// صحيح - استخدم نطاق تسامح
IF ABS(rTemperature - 25.0) < 0.1 THEN ...
النصوص والوقت: STRING و TIME و DATE
STRING - النصوص
VAR
sProductName : STRING(50) := 'زيت محرك 5W-30';
sAlarmMsg : STRING(80);
sBatchID : STRING(20);
END_VAR
// بناء رسالة إنذار
sAlarmMsg := CONCAT('عطل في المحطة ', INT_TO_STRING(iStationNum));
iLength := LEN(sProductName); // طول النص
TIME - المدة الزمنية
VAR
tFillDuration : TIME := T#3s500ms; // 3.5 ثانية
tCycleTime : TIME := T#2m30s; // دقيقتان و30 ثانية
tMixDuration : TIME := T#1h; // ساعة واحدة
END_VAR
// الحساب الزمني
tTotalTime := tFillDuration + tCapDuration + tLabelDuration;
DATE و DATE_AND_TIME
VAR
dMaintenanceDate : DATE := D#2026-06-15;
dtLastCalibration: DATE_AND_TIME := DT#2026-01-10-08:30:00;
todShiftStart : TIME_OF_DAY := TOD#06:00:00;
END_VAR
المصفوفات: تخزين بيانات متعددة
المصفوفات تُخزّن مجموعة قيم من نفس النوع تحت اسم واحد.
مصفوفة أحادية البعد
VAR
arTempReadings : ARRAY[1..10] OF REAL; // 10 قراءات حرارة
arBinFull : ARRAY[0..7] OF BOOL; // حالة 8 حاويات
arRecipeAmounts: ARRAY[1..5] OF REAL; // كميات الوصفة
END_VAR
// كتابة وقراءة
arTempReadings[1] := 72.5;
arTempReadings[2] := 73.1;
rCurrentTemp := arTempReadings[iSensorIndex];
تدوير قراءات لحساب المتوسط المتحرك
// إزاحة القراءات القديمة
FOR i := 9 TO 1 BY -1 DO
arTempReadings[i + 1] := arTempReadings[i];
END_FOR;
// إدخال القراءة الجديدة
arTempReadings[1] := rNewReading;
// حساب المتوسط
rSum := 0.0;
FOR i := 1 TO 10 DO
rSum := rSum + arTempReadings[i];
END_FOR;
rMovingAvg := rSum / 10.0;
مصفوفة ثنائية البعد
VAR
// جدول وصفات: 5 وصفات × 4 مكونات
arRecipes : ARRAY[1..5, 1..4] OF REAL;
END_VAR
// الوصفة 3، المكوّن 2 = 15.5 كغ
arRecipes[3, 2] := 15.5;
الهياكل STRUCT: تجميع بيانات المستشعر
الهيكل يجمع متغيرات من أنواع مختلفة تحت اسم واحد.
تعريف هيكل مستشعر
TYPE ST_Sensor :
STRUCT
rValue : REAL; // القيمة الحالية
rMinLimit : REAL; // الحد الأدنى
rMaxLimit : REAL; // الحد الأعلى
bFault : BOOL; // عطل
bAlarmHigh : BOOL; // إنذار مرتفع
bAlarmLow : BOOL; // إنذار منخفض
sUnit : STRING(10); // الوحدة
tLastUpdate : TIME; // آخر تحديث
END_STRUCT
END_TYPE
استخدام الهيكل
VAR
stPressure : ST_Sensor;
stTempTank1 : ST_Sensor;
stTempTank2 : ST_Sensor;
END_VAR
// تهيئة مستشعر الضغط
stPressure.rMinLimit := 0.0;
stPressure.rMaxLimit := 10.0;
stPressure.sUnit := 'بار';
// فحص الحدود
stPressure.bAlarmHigh := stPressure.rValue > stPressure.rMaxLimit;
stPressure.bAlarmLow := stPressure.rValue < stPressure.rMinLimit;
stPressure.bFault := (stPressure.rValue < -1.0) OR (stPressure.rValue > 12.0);
مصفوفة من الهياكل
VAR
astTankTemps : ARRAY[1..8] OF ST_Sensor; // 8 خزانات
END_VAR
// فحص جميع الخزانات
FOR i := 1 TO 8 DO
astTankTemps[i].bAlarmHigh :=
astTankTemps[i].rValue > astTankTemps[i].rMaxLimit;
END_FOR;
التعدادات ENUM: حالات الآلة
التعداد يُعرّف مجموعة محددة من القيم المسمّاة، مثالي لآلات الحالة.
TYPE E_MachineState :
(
IDLE := 0, // خاملة
STARTING := 10, // بدء التشغيل
RUNNING := 20, // تعمل
PAUSED := 30, // متوقفة مؤقتاً
STOPPING := 40, // جاري الإيقاف
FAULTED := 99 // عطل
);
END_TYPE
VAR
eState : E_MachineState := E_MachineState.IDLE;
END_VAR
CASE eState OF
E_MachineState.IDLE:
IF bStartCommand THEN
eState := E_MachineState.STARTING;
END_IF;
E_MachineState.STARTING:
// تسلسل بدء التشغيل
bMotor := TRUE;
IF bMotorRunning THEN
eState := E_MachineState.RUNNING;
END_IF;
E_MachineState.FAULTED:
bMotor := FALSE;
IF bResetCommand THEN
eState := E_MachineState.IDLE;
END_IF;
END_CASE;
تنظيم الذاكرة: المناطق والعناوين
في أجهزة PLC التقليدية، تُقسّم الذاكرة إلى مناطق:
| المنطقة | البادئة | الوصف | مثال |
|---|---|---|---|
| المداخل | I | إشارات المستشعرات | I0.0, IW64 |
| المخارج | Q | أوامر المُشغّلات | Q0.0, QW80 |
| العلامات | M | متغيرات داخلية | M10.0, MW100 |
طريقة العنونة (Siemens)
I 0 . 3
│ │ │
│ │ └── رقم البت (0-7)
│ └────── رقم البايت
└──────── نوع المنطقة (I=مدخل)
IW 64
│ │
│ └── رقم الكلمة (Word = 16 بت)
└──── منطقة المداخل
في بيئات البرمجة الحديثة (مثل TIA Portal)، يُفضّل استخدام أسماء رمزية بدلاً من العناوين المباشرة لتحسين قابلية القراءة والصيانة.
الخلاصة
أنواع البيانات في IEC 61131-3 تُغطي كل احتياجات الأتمتة الصناعية من القيم المنطقية البسيطة إلى الهياكل المعقدة. استخدام STRUCT لتجميع بيانات المستشعرات و ENUM لآلات الحالة يُنتج كوداً أنظف وأسهل صيانة. في الدرس القادم سنتعمّق في المؤقتات والعدّادات التي تُعدّ أكثر العناصر استخداماً في برامج PLC.