الرئيسية قاعدة المعرفة الأتمتة والتحكم معالجة الإشارات التناظرية: من القراءة الخام إلى القيمة الهندسية
الأتمتة والتحكم

معالجة الإشارات التناظرية: من القراءة الخام إلى القيمة الهندسية

إشارات 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 يبقى الخيار الأفضل لمعظم التطبيقات الصناعية بفضل مقاومته للضوضاء وقدرته على كشف انقطاع الأسلاك. في الدرس القادم سنتعلم التحكم بالمحركات الكهربائية بأنماط مختلفة.

analog 4-20mA 0-10V scaling filtering calibration التناظري التحويل المعايرة التصفية المستشعر القيمة الهندسية