الرئيسية قاعدة المعرفة الأتمتة والتحكم اتصالات PLC: ربط المتحكمات والأجهزة عبر الشبكات الصناعية
الأتمتة والتحكم

اتصالات PLC: ربط المتحكمات والأجهزة عبر الشبكات الصناعية

Modbus RTU: الاتصال التسلسلي الأكثر انتشاراً

Modbus RTU هو بروتوكول اتصال تسلسلي بسيط ومفتوح طوّرته Modicon عام 1979. لا يزال الأكثر استخداماً لربط المستشعرات والمحولات الترددية وأجهزة القياس بـ PLC.

أساسيات Modbus RTU

  • الطبقة الفيزيائية: RS-485 (سلكان: A و B + أرضي)
  • الطوبولوجيا: ناقل مشترك (Bus) - أجهزة متعددة على نفس السلك
  • العلاقة: سيد/تابع (Master/Slave) - PLC هو السيد دائماً
  • العناوين: كل جهاز له عنوان فريد (1-247)
  • السرعة: 9600 أو 19200 أو 38400 بت/ثانية

أنواع السجلات

نوع السجل رقم البداية القراءة/الكتابة الاستخدام
Coils 00001 قراءة/كتابة مخارج رقمية
Discrete Inputs 10001 قراءة فقط مداخل رقمية
Input Registers 30001 قراءة فقط قراءات تناظرية
Holding Registers 40001 قراءة/كتابة إعدادات ومعاملات

رموز الدوال الشائعة

الكود الوظيفة الوصف
01 Read Coils قراءة مخارج رقمية
02 Read Discrete Inputs قراءة مداخل رقمية
03 Read Holding Registers قراءة سجلات الإعداد
04 Read Input Registers قراءة سجلات القراءة
06 Write Single Register كتابة سجل واحد
16 Write Multiple Registers كتابة عدة سجلات

التوصيل الفيزيائي

PLC (Master)                 جهاز 1         جهاز 2         جهاز 3
RS-485 ────────────────┬──── Addr:1 ──┬──── Addr:2 ──┬──── Addr:3
  A ───────────────────┤     A    ├───┤     A    ├───┤     A
  B ───────────────────┤     B    ├───┤     B    ├───┤     B
  GND ─────────────────┤    GND   ├───┤    GND   ├───┤    GND
                       │          │   │          │   │
                       └── 120Ω ──┘   │          │   └── 120Ω ──┘
                        (مقاومة طرفية)              (مقاومة طرفية)

Modbus TCP: موديس عبر الإيثرنت

Modbus TCP يُغلّف رسائل Modbus في حزم TCP/IP عبر شبكة إيثرنت عادية. أسرع وأسهل من RTU.

الفروق عن RTU

المعيار Modbus RTU Modbus TCP
الوسيط RS-485 (سلكان) إيثرنت (RJ-45)
السرعة حتى 115200 بت/ث 100 ميغابت/ث
المسافة 1200 متر 100 متر (لكل مقطع)
عدد الأجهزة 32 على الناقل مئات عبر السويتش
المنفذ - TCP Port 502

مثال في ST: قراءة مستشعر عبر Modbus TCP

VAR
    fbModbusTCP    : MB_CLIENT;     // كتلة Modbus TCP
    bTriggerRead   : BOOL := TRUE;  // إرسال الطلب
    iDeviceIP      : ARRAY[1..4] OF BYTE := [192, 168, 1, 100];
    arReadData     : ARRAY[0..9] OF WORD; // بيانات مقروءة
    bBusy          : BOOL;
    bError         : BOOL;
    iErrorCode     : WORD;
END_VAR

// قراءة 10 سجلات من العنوان 0 في الجهاز
fbModbusTCP(
    REQ := bTriggerRead AND NOT bBusy,
    MB_MODE := 0,           // قراءة
    MB_DATA_ADDR := 0,      // عنوان البداية
    MB_DATA_LEN := 10,      // عدد السجلات
    MB_DATA_PTR := ADR(arReadData),
    BUSY => bBusy,
    ERROR => bError,
    STATUS => iErrorCode
);

// معالجة البيانات بعد القراءة الناجحة
IF NOT bBusy AND NOT bError THEN
    rTemperature := WORD_TO_REAL(arReadData[0]) / 10.0;
    rHumidity := WORD_TO_REAL(arReadData[1]) / 10.0;
    rPressure := WORD_TO_REAL(arReadData[2]) / 100.0;
END_IF;

Profinet: شبكة سيمنز الصناعية

Profinet هو بروتوكول إيثرنت صناعي طوّرته Siemens. يُوفّر اتصالاً حقيقي الزمن (Real-Time) لتطبيقات التحكم الدقيقة.

المميزات

  • زمن دورة: أقل من 1 مللي ثانية (للتطبيقات الحرجة)
  • التشخيص: معلومات تفصيلية عن حالة كل جهاز
  • التكوين: تلقائي عبر ملفات GSD/GSDML
  • التكرار: دعم شبكات احتياطية (Media Redundancy)

التنظيم في Profinet

PLC (IO-Controller)
├── IO-Device 1: محطة I/O بعيدة (ET 200SP)
│   ├── 8 DI
│   ├── 8 DO
│   └── 2 AI
├── IO-Device 2: محول تردد Sinamics V20
│   ├── أمر التشغيل
│   ├── مرجع السرعة
│   └── حالة المحرك
└── IO-Device 3: شاشة HMI

الوصول للبيانات في ST

في بيئة TIA Portal، أجهزة Profinet تظهر كمتغيرات عادية:

// محطة I/O بعيدة: القراءة مباشرة من العناوين المحددة
bSensor1 := "ET200_Station1".DI_0;    // مدخل رقمي
rAnalog1 := "ET200_Station1".AI_0;    // مدخل تناظري

// محول تردد: الكتابة عبر كلمة التحكم
"Drive1".ControlWord.bit0 := bRunCommand;  // تشغيل
"Drive1".SpeedSetpoint := rSpeedRef;       // مرجع السرعة
rActualSpeed := "Drive1".ActualSpeed;      // السرعة الفعلية

EtherNet/IP: شبكة آلن برادلي

EtherNet/IP هو بروتوكول إيثرنت صناعي تدعمه Rockwell Automation (Allen-Bradley) وشركات أخرى.

مقارنة Profinet و EtherNet/IP

المعيار Profinet EtherNet/IP
الشركة الرئيسية Siemens Rockwell (Allen-Bradley)
المنطقة السائدة أوروبا والشرق الأوسط أمريكا الشمالية
البروتوكول الأساسي TCP/IP + RT TCP/IP + CIP
التوقيت الحقيقي IRT (دقيق جداً) عبر CIP Sync
التكوين ملفات GSDML ملفات EDS

ملاحظة عملية

في المنطقة العربية، Profinet أكثر انتشاراً بسبب هيمنة أجهزة Siemens. لكن المصانع التي تستخدم Allen-Bradley تعتمد EtherNet/IP. المبادئ متشابهة: كلاهما يُتيح تبادل بيانات حقيقي الزمن عبر إيثرنت.

ربط PLC بشاشة HMI

شاشة HMI (Human Machine Interface) هي واجهة المشغّل لمراقبة العملية والتحكم بها.

طريقة الربط

PLC ────── إيثرنت ────── شاشة HMI
          (Profinet أو TCP/IP)

أنواع المتغيرات المتبادلة

// متغيرات يقرؤها HMI من PLC (للعرض)
VAR_GLOBAL
    rCurrentTemp     : REAL;      // الحرارة الحالية
    iProductionCount : DINT;      // عدّاد الإنتاج
    eSystemState     : INT;       // حالة النظام
    sActiveRecipe    : STRING;    // الوصفة الحالية
    bAlarmActive     : BOOL;      // إنذار نشط
END_VAR

// متغيرات يكتبها HMI إلى PLC (أوامر المشغّل)
VAR_GLOBAL
    bHMI_StartCmd    : BOOL;      // أمر تشغيل من الشاشة
    bHMI_StopCmd     : BOOL;      // أمر إيقاف
    rHMI_SpeedSet    : REAL;      // ضبط السرعة
    iHMI_RecipeNum   : INT;       // رقم الوصفة المختارة
    bHMI_ResetAlarm  : BOOL;      // إعادة ضبط الإنذار
END_VAR

نصائح تصميم واجهة HMI

  • الشاشة الرئيسية: نظرة عامة على حالة الخط بألوان واضحة
  • شاشة الإنذارات: قائمة بجميع الإنذارات مع الوقت والوصف
  • شاشة الإنتاج: عدّادات وإحصائيات الوردية
  • شاشة الصيانة: ساعات تشغيل المحركات وتواريخ الصيانة
  • شاشة الإعدادات: محمية بكلمة مرور للمهندسين فقط

مثال عملي: قراءة 10 مستشعرات عبر Modbus RTU

وصف النظام

10 مستشعرات حرارة PT100 موزّعة على خط إنتاج، كل منها متصل بمحوّل RTD-to-Modbus (مثل Novus TxRail). نقرأها دورياً عبر Modbus RTU.

PROGRAM ModbusSensorReader
VAR
    // إدارة الاتصال
    fbModbus       : MB_MASTER;     // كتلة Modbus RTU Master
    iCurrentSensor : INT := 1;      // المستشعر الحالي
    bReadDone      : BOOL;
    bReadError     : BOOL;

    // بيانات المستشعرات
    TYPE ST_TempSensor :
    STRUCT
        iAddress    : INT;      // عنوان Modbus (1-10)
        iRegister   : INT;      // سجل القراءة
        rRawValue   : REAL;     // القيمة الخام
        rTemperature: REAL;     // الحرارة °C
        bOnline     : BOOL;     // متصل
        bAlarm      : BOOL;     // إنذار
        iErrorCount : INT;      // عدد أخطاء الاتصال
    END_STRUCT
    END_TYPE

    astSensors : ARRAY[1..10] OF ST_TempSensor;
    arReadBuffer : ARRAY[0..1] OF WORD;

    // إحصائيات
    iTotalReads   : DINT := 0;
    iTotalErrors  : DINT := 0;
    rScanTime     : REAL;        // زمن مسح جميع المستشعرات
END_VAR

// تهيئة العناوين (تُنفّذ مرة واحدة)
IF bFirstScan THEN
    FOR i := 1 TO 10 DO
        astSensors[i].iAddress := i;
        astSensors[i].iRegister := 0;  // سجل الحرارة
    END_FOR;
    bFirstScan := FALSE;
END_IF;

// قراءة مستشعر واحد في كل دورة (Round-Robin)
fbModbus(
    REQ := TRUE,
    MB_ADDR := INT_TO_BYTE(astSensors[iCurrentSensor].iAddress),
    MB_MODE := 0,                // قراءة
    MB_DATA_ADDR := astSensors[iCurrentSensor].iRegister,
    MB_DATA_LEN := 1,
    MB_DATA_PTR := ADR(arReadBuffer)
);

IF fbModbus.DONE THEN
    // قراءة ناجحة
    astSensors[iCurrentSensor].rRawValue :=
        WORD_TO_REAL(arReadBuffer[0]);
    astSensors[iCurrentSensor].rTemperature :=
        astSensors[iCurrentSensor].rRawValue / 10.0;
    astSensors[iCurrentSensor].bOnline := TRUE;
    astSensors[iCurrentSensor].iErrorCount := 0;
    iTotalReads := iTotalReads + 1;

    // فحص الإنذار
    astSensors[iCurrentSensor].bAlarm :=
        astSensors[iCurrentSensor].rTemperature > 85.0;

    // الانتقال للمستشعر التالي
    iCurrentSensor := iCurrentSensor + 1;
    IF iCurrentSensor > 10 THEN
        iCurrentSensor := 1;
    END_IF;

ELSIF fbModbus.ERROR THEN
    // خطأ في الاتصال
    astSensors[iCurrentSensor].bOnline := FALSE;
    astSensors[iCurrentSensor].iErrorCount :=
        astSensors[iCurrentSensor].iErrorCount + 1;
    iTotalErrors := iTotalErrors + 1;

    // بعد 5 أخطاء متتالية: إنذار فقدان المستشعر
    IF astSensors[iCurrentSensor].iErrorCount >= 5 THEN
        astSensors[iCurrentSensor].bAlarm := TRUE;
    END_IF;

    // انتقل للمستشعر التالي
    iCurrentSensor := iCurrentSensor + 1;
    IF iCurrentSensor > 10 THEN
        iCurrentSensor := 1;
    END_IF;
END_IF;

الخلاصة

بروتوكولات الاتصال الصناعية تربط PLC بعالم المستشعرات والمُشغّلات والشاشات. Modbus RTU يبقى الخيار الأبسط والأرخص للأجهزة البسيطة، بينما Profinet و EtherNet/IP يوفران أداءً أعلى للأنظمة المتقدمة. ربط PLC بشاشة HMI يُتيح للمشغّلين مراقبة العملية والتدخل عند الحاجة. في الدرس القادم سنتعلم أدوات تشخيص الأعطال وحل المشاكل.

Modbus Profinet EthernetIP communication fieldbus protocol الاتصالات موديس بروفينت الشبكة الصناعية البروتوكول تبادل البيانات