اتصالات 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 يُتيح للمشغّلين مراقبة العملية والتدخل عند الحاجة. في الدرس القادم سنتعلم أدوات تشخيص الأعطال وحل المشاكل.