معالجة الإشارات التناظرية: من القراءة الخام إلى القيمة الهندسية
إشارات 4-20mA: المعيار الصناعي
إشارة 4-20mA هي المعيار الأكثر انتشاراً في الصناعة لنقل قراءات المستشعرات التناظرية. يُمثّل 4mA بداية المجال (مثلاً 0°C) و 20mA نهايته (مثلاً 200°C).
لماذا 4-20mA وليس 0-20mA؟
- كشف انقطاع السلك: إذا قرأ PLC صفر mA، يعني أن السلك مقطوع وليس أن القيمة صفر
- مقاومة الضوضاء: إشارة التيار لا تتأثر بطول السلك أو مقاومته
- مسافات طويلة: تعمل حتى مسافة 1000 متر دون فقدان دقة
التوصيل
مستشعر 4-20mA (ثنائي السلك):
+24VDC ──── مستشعر ──── مدخل AI ──── 0V (PLC)
│
4-20mA تمر في الحلقة
القيم في PLC
في Siemens S7-1200 مثلاً:
- 4mA = القيمة الخام 0
- 20mA = القيمة الخام 27648
- أقل من 4mA (القيمة سالبة) = خطأ في المستشعر
- أعلى من 20mA (أعلى من 27648) = خطأ في المستشعر
إشارات 0-10V: متى تُستخدم
إشارة الجهد 0-10V تُستخدم في المسافات القصيرة (أقل من 30 متراً) وعندما يكون التوصيل أبسط.
مقارنة بين 4-20mA و 0-10V
| المعيار | 4-20mA | 0-10V |
|---|---|---|
| كشف انقطاع السلك | نعم (0mA = عطل) | لا (0V = قيمة صالحة أو عطل) |
| مقاومة الضوضاء | عالية جداً | متوسطة |
| المسافة القصوى | 1000 متر | 30 متر |
| عدد الأسلاك | 2 | 3 (إشارة + تغذية + أرضي) |
| التكلفة | أعلى قليلاً | أقل |
| الاستخدام الشائع | مستشعرات الحقل | أجهزة داخل اللوحة |
مثال: التحكم بسرعة محول تردد
PLC مخرج AO (0-10V) ──── مدخل محول تردد VFD
0V = 0 Hz = محرك متوقف
5V = 25 Hz = نصف السرعة
10V = 50 Hz = سرعة كاملة
التحويل الخطي: من القيمة الخام إلى الهندسية
التحويل الخطي (Linear Scaling) هو العملية الأساسية لترجمة القراءة الرقمية الخام من وحدة AI إلى قيمة فيزيائية مفهومة.
المعادلة
القيمة الهندسية = ((الخام - الخام_أدنى) / (الخام_أعلى - الخام_أدنى))
× (الهندسي_أعلى - الهندسي_أدنى) + الهندسي_أدنى
التطبيق في ST
// مستشعر ضغط 4-20mA، المجال: 0-16 بار
// القيمة الخام في S7-1200: 0 إلى 27648
VAR
iRawPressure : INT; // قراءة من وحدة AI
rPressure : REAL; // الضغط بالبار
END_VAR
rPressure := (INT_TO_REAL(iRawPressure) / 27648.0) * 16.0;
دالة تحويل عامة مع حماية
FUNCTION FC_ScaleAnalog : REAL
VAR_INPUT
iRawValue : INT;
rEngMin : REAL; // الحد الأدنى الهندسي
rEngMax : REAL; // الحد الأعلى الهندسي
rRawMin : REAL := 0.0;
rRawMax : REAL := 27648.0;
END_VAR
VAR
rRaw : REAL;
rResult : REAL;
END_VAR
rRaw := INT_TO_REAL(iRawValue);
// حماية من القسمة على صفر
IF ABS(rRawMax - rRawMin) < 0.001 THEN
FC_ScaleAnalog := rEngMin;
RETURN;
END_IF;
rResult := ((rRaw - rRawMin) / (rRawMax - rRawMin))
* (rEngMax - rEngMin) + rEngMin;
// تحديد النتيجة ضمن نطاق معقول (110% من المجال)
IF rResult < rEngMin - ABS(rEngMax - rEngMin) * 0.1 THEN
rResult := rEngMin - ABS(rEngMax - rEngMin) * 0.1;
ELSIF rResult > rEngMax + ABS(rEngMax - rEngMin) * 0.1 THEN
rResult := rEngMax + ABS(rEngMax - rEngMin) * 0.1;
END_IF;
FC_ScaleAnalog := rResult;
END_FUNCTION
التصفية الرقمية: تنعيم القراءات المتذبذبة
قراءات المستشعرات التناظرية تتذبذب بسبب الضوضاء الكهربائية. التصفية الرقمية تُنعّم هذه القراءات.
المتوسط المتحرك (Moving Average)
FUNCTION_BLOCK FB_MovingAverage
VAR_INPUT
rNewValue : REAL;
iWindowSize : INT := 10;
END_VAR
VAR_OUTPUT
rFiltered : REAL;
END_VAR
VAR
arBuffer : ARRAY[1..50] OF REAL;
iIndex : INT := 1;
rSum : REAL := 0.0;
bFilled : BOOL := FALSE;
i : INT;
END_VAR
// إضافة القراءة الجديدة
arBuffer[iIndex] := rNewValue;
iIndex := iIndex + 1;
IF iIndex > iWindowSize THEN
iIndex := 1;
bFilled := TRUE;
END_IF;
// حساب المتوسط
rSum := 0.0;
IF bFilled THEN
FOR i := 1 TO iWindowSize DO
rSum := rSum + arBuffer[i];
END_FOR;
rFiltered := rSum / INT_TO_REAL(iWindowSize);
ELSE
FOR i := 1 TO iIndex - 1 DO
rSum := rSum + arBuffer[i];
END_FOR;
rFiltered := rSum / INT_TO_REAL(iIndex - 1);
END_IF;
END_FUNCTION_BLOCK
المرشح الأسّي (Exponential Filter)
أبسط وأسرع من المتوسط المتحرك، يحتاج متغيراً واحداً فقط:
// alpha بين 0.0 و 1.0
// قيمة صغيرة = تنعيم أكثر وتأخير أكبر
// قيمة كبيرة = استجابة أسرع وتنعيم أقل
VAR
rAlpha : REAL := 0.1; // معامل التنعيم
rFiltered : REAL := 0.0; // القيمة المُنعّمة
END_VAR
rFiltered := rAlpha * rNewReading + (1.0 - rAlpha) * rFiltered;
اختيار طريقة التصفية
| الطريقة | السرعة | الذاكرة | الاستخدام |
|---|---|---|---|
| متوسط متحرك | بطيء | عالية | قراءات مستقرة (حرارة أفران) |
| مرشح أسّي | سريع | قليلة | قراءات متغيرة (ضغط، تدفق) |
كشف أعطال المستشعر التناظري
كشف أعطال المستشعر مبكراً يمنع توقف الإنتاج أو إنتاج منتجات معيبة.
أنواع الأعطال
FUNCTION_BLOCK FB_AnalogDiag
VAR_INPUT
iRawValue : INT; // القراءة الخام
rEngValue : REAL; // القيمة الهندسية
rEngMin : REAL; // حد أدنى متوقع
rEngMax : REAL; // حد أعلى متوقع
tWireBreakDly: TIME := T#2s;
tStuckDly : TIME := T#30s;
END_VAR
VAR_OUTPUT
bWireBreak : BOOL; // انقطاع سلك
bOverRange : BOOL; // خارج النطاق (أعلى)
bUnderRange : BOOL; // خارج النطاق (أدنى)
bStuck : BOOL; // قراءة ثابتة (مستشعر عالق)
bHealthy : BOOL; // المستشعر سليم
iFaultCode : INT; // رمز العطل
END_VAR
VAR
fbWireBreakTon : TON;
fbStuckTon : TON;
rLastValue : REAL;
END_VAR
// كشف انقطاع السلك: القراءة الخام أقل من حد 4mA
fbWireBreakTon(IN := (iRawValue < -500), PT := tWireBreakDly);
bWireBreak := fbWireBreakTon.Q;
// كشف تجاوز النطاق
bOverRange := iRawValue > 28500; // أعلى من 20mA بكثير
bUnderRange := (iRawValue < -200) AND NOT bWireBreak;
// كشف القراءة الثابتة (المستشعر عالق)
fbStuckTon(
IN := ABS(rEngValue - rLastValue) < 0.01,
PT := tStuckDly
);
bStuck := fbStuckTon.Q;
rLastValue := rEngValue;
// الحالة العامة
bHealthy := NOT bWireBreak AND NOT bOverRange
AND NOT bUnderRange AND NOT bStuck;
// رمز العطل
IF bWireBreak THEN iFaultCode := 1;
ELSIF bOverRange THEN iFaultCode := 2;
ELSIF bUnderRange THEN iFaultCode := 3;
ELSIF bStuck THEN iFaultCode := 4;
ELSE iFaultCode := 0;
END_IF;
END_FUNCTION_BLOCK
مثال عملي: قراءة مستشعر حرارة PT100 ومعايرته
النظام
مستشعر PT100 يقيس حرارة فرن تجفيف في خط تغليف. المجال: 0-300°C. الإشارة: 4-20mA عبر محوّل RTD.
PROGRAM TempMonitoring
VAR
// الأجهزة
iRawTemp : INT; // IW64 - قراءة خام
// كتل المعالجة
fbTempFilter : FB_MovingAverage;
fbTempDiag : FB_AnalogDiag;
// نتائج
rTempScaled : REAL; // حرارة بعد التحويل
rTempFiltered : REAL; // حرارة بعد التصفية
rTempCalibrated: REAL; // حرارة بعد المعايرة
// معاملات المعايرة (تُضبط ميدانياً)
rCalOffset : REAL := -1.5; // انزياح: المستشعر يقرأ 1.5 أعلى
rCalGain : REAL := 1.002;// كسب: تصحيح خطية طفيف
// إنذارات
bTempHigh : BOOL;
bTempLow : BOOL;
bSensorFault : BOOL;
END_VAR
// الخطوة 1: التحويل الخطي
rTempScaled := FC_ScaleAnalog(
iRawValue := iRawTemp,
rEngMin := 0.0,
rEngMax := 300.0
);
// الخطوة 2: التصفية
fbTempFilter(rNewValue := rTempScaled, iWindowSize := 8);
rTempFiltered := fbTempFilter.rFiltered;
// الخطوة 3: المعايرة
rTempCalibrated := (rTempFiltered * rCalGain) + rCalOffset;
// الخطوة 4: التشخيص
fbTempDiag(
iRawValue := iRawTemp,
rEngValue := rTempCalibrated,
rEngMin := 0.0,
rEngMax := 300.0
);
bSensorFault := NOT fbTempDiag.bHealthy;
// الخطوة 5: الإنذارات
IF fbTempDiag.bHealthy THEN
bTempHigh := rTempCalibrated > 250.0;
bTempLow := rTempCalibrated < 50.0;
ELSE
bTempHigh := FALSE;
bTempLow := FALSE;
END_IF;
الخلاصة
معالجة الإشارات التناظرية تتبع خطوات ثابتة: التحويل الخطي، التصفية الرقمية، المعايرة، وكشف الأعطال. بناء كتل وظيفية لكل خطوة يُتيح إعادة استخدامها مع أي مستشعر. معيار 4-20mA يبقى الخيار الأفضل لمعظم التطبيقات الصناعية بفضل مقاومته للضوضاء وقدرته على كشف انقطاع الأسلاك. في الدرس القادم سنتعلم التحكم بالمحركات الكهربائية بأنماط مختلفة.