24برامج منظمة
المراجع والمؤشرات: REF_TO و POINTER TO ولماذا تتجنبها
ما يعنيه REF_TO و POINTER TO و ADR وفك المؤشر، وما هو التسمية المزدوجة (Aliasing)، ولماذا لا مكان لهذا في كود مصنع يعمل.
العنوان بدل القيمة
كل ما تعلمته حتى الآن يتعامل مع قيم: تنسخ رقماً إلى متغير. المؤشر والمرجع يتعاملان مع عنوان: متغير يحمل مكان متغير آخر في الذاكرة.
REF_TO
الإصدار الثالث من المعيار أضاف المرجع، وهو مؤشر مُحكم النوع:
VAR
pTank : REF_TO T_Analog;
LT101 : T_Analog;
END_VAR
pTank := REF(LT101);
IF pTank <> NULL THEN
pTank^.Value := 42.0;
END_IF;REF(x)يأخذ مرجعاً إلىx.^يفك المرجع، أي «المتغير الذي يشير إليه هذا».- المقارنة بـ
NULLقبل أي استخدام ليست اختيارية.
POINTER TO و ADR
الشكل الأقدم، وهو موجود في أدوات مثل CODESYS و TwinCAT، وأخطر لأنه بلا تحقق من النوع:
VAR
p : POINTER TO REAL;
x : REAL;
END_VAR
p := ADR(x);
p^ := 3.14;ADR تعطي العنوان الخام. لا شيء يمنعك من إسناد عنوان INT إلى مؤشر REAL وقراءة بايتات لا معنى لها، أو من الكتابة بعد نهاية مصفوفة وتخريب متغير مجاور.
التسمية المزدوجة Aliasing
هذه هي المشكلة الحقيقية: أن يكون لنفس موضع الذاكرة اسمان.
p := ADR(Setpoint);
p^ := 80.0; (* Setpoint صار 80، ولا يوجد سطر فيه كلمة Setpoint *)تبحث في البرنامج كله عن Setpoint := فلا تجد شيئاً، والقيمة تتغير. أدوات البحث لا تنفع، ومراجعة الكود لا تنفع، وجدول المراقبة يخبرك أن القيمة تغيّرت ولا يخبرك من غيّرها. ساعات من التشخيص في مصنع متوقف.
ثلاثة أسباب لتجنبها في كود المصنع
- تُلغي القراءة. قوة ST أن السطر يقول ما يفعله. المؤشر يكسر هذا: لا تعرف ما سيتغير إلا بمتابعة العنوان في وقت التشغيل.
- تُعطّل الفحص. المترجم يحميك من إسناد
INTإلىBOOLومن فهرس خارج المدى. المؤشر الخام يطلب منك التنازل عن هذه الحماية طوعاً. - تُعطّل المتحكم. مؤشر غير مهيأ، أو مرجع لمتغير محلي انتهت حياته، أو عنوان خارج المنطقة المسموحة: النتيجة إما توقف المتحكم بخطأ Access Violation، أو فساد صامت في بيانات أخرى. والثاني أسوأ.
وأضف أن المؤشرات لا تنتقل بين الشركات: الصياغة والدلالات تختلف، فالكود المليء بالمؤشرات يصبح محبوساً في منصة واحدة.
متى يكون لها مكان
- داخل مكتبة تكتبها مرة، تُختبر جيداً، ويستخدمها الناس من واجهة نظيفة.
- في معالجة كتلة بيانات كبيرة من اتصال، حيث النسخ مكلف فعلاً، وبعد أن تقيس أن النسخ هو المشكلة.
- للتعامل مع أجهزة أو بروتوكولات تفرض تخطيطاً للذاكرة.
في منطق المحطة، في برنامج المحرك، في التسلسل، في معالجة الإنذارات: لا.
البدائل التي تحل نفس المشكلة
VAR_IN_OUTعندما تحتاج كتلة أن تحدّث بياناً كبيراً يملكه البرنامج. النية واضحة، والمترجم يبقى معك.- كتلة وظيفية بنسخ عندما تريد «نفس المنطق على بيانات مختلفة».
- مصفوفة وفهرس عندما تريد اختيار عنصر من مجموعة في وقت التشغيل. الفهرس يُحصر ويُفحص، والعنوان لا.
القاعدة
إن وجدت نفسك تحتاج مؤشراً في منطق عملية، فالأغلب أن التصميم هو ما يحتاج تعديلاً، لا الذاكرة.
جرّبه في المختبر
المختبر يعمل في متصفحك: محرر ST، وعملية افتراضية تناسب الدرس، ونفس البرنامج كمخطط Ladder حي، وجدول مراقبة، وتصدير إلى Siemens SCL.
ماذا تجرّب
- شغّل البرنامج وارفع S4: يضيء L1 لأن Index يساوي 0.
- ارفع S1 ثم S2 وراقب Index: الأمر ينتقل إلى L2 ثم L4.
- هذا ما يفعله مؤشر يُحسب عنوانه، لكن CASE لا يمكنه أبداً أن يكتب خارج المصابيح الأربعة.
يبحث الناس عن هذا الدرس بـ
REF_TO في STPOINTER TO PLCADR operatorمؤشرات في برمجة PLCdereference structured textaliasingpointer safety PLC code
محتوى الدورة
- 01ما هي لغة ST؟ ومتى تستخدمها بدل Ladder
- 02كيف يشتغل الـ PLC: دورة المسح وصورة المداخل والمخارج
- 03هيكل البرنامج: POU و PROGRAM و FUNCTION و FUNCTION_BLOCK
- 04أول برنامج: تشغيل مضخة بالإمساك الذاتي (Seal-in)
- 05أنواع البيانات: BOOL و INT و REAL و TIME وغيرها
- 06التصريح عن المتغيرات: VAR و VAR_INPUT و RETAIN
- 07القيم الحرفية والثوابت: 16#FF و 2#1010 و T#5s
- 08التحويل بين الأنواع وتحجيم إشارة 4-20 مللي أمبير
- 09الإسناد والحساب في ST: := وأولوية العمليات
- 10المنطق البولياني والمقارنات وعمليات البتات
- 11الدوال القياسية: ABS و SQRT و MIN و MAX و LIMIT و SEL و MUX
- 12الشرط IF و ELSIF و ELSE: القواعد ومتى تتجنبه
- 13التعليمة CASE وأول آلة حالات
- 14حلقة FOR والحارس Watchdog
- 15WHILE و REPEAT و EXIT و CONTINUE و RETURN
- 16كشف الحافة: R_TRIG و F_TRIG ومشكلة «نفّذ في كل مسح»
- 17المؤقتات: TON و TOF و TP
- 18العدّادات: CTU و CTD و CTUD
- 19القلّابات: SR و RS ومن يغلب عند التعارض
- 20اكتب دالتك: FUNCTION وقيمة الإرجاع
- 21اكتب كتلتك الوظيفية: FUNCTION_BLOCK لمحرك
- 22المصفوفات: ARRAY وفلتر المتوسط المتحرك
- 23الأنواع المركّبة: STRUCT والتعدادات
- 24المراجع والمؤشرات: REF_TO و POINTER TO ولماذا تتجنبها
- 25آلة الحالات: تسلسل دفعة كامل بـ CASE لا يعلق أبداً
- 26إدارة الإنذارات على أصول ISA-18.2: تأخير، نطاق ميت، إقرار، وأول خروج
- 27معالجة الإشارة التناظرية: من العدّات إلى وحدة هندسية، و NE43، وفلتر EMA
- 28التحكم المغلق في ST: من التشغيل والإيقاف بفجوة إلى PID عملي
- 29تشغيل المحركات والصمامات: سماحيات، تشابيك، رجع تشغيل، وزمن حركة
- 30نفس الكود عند كل شركة: SCL و Studio 5000 و CODESYS و TwinCAT
- 31الاختبار وتصحيح الأخطاء: جدول المراقبة والفرض والمحاكاة
- 32دليل أسلوب ST: التسمية والتعليقات والثوابت وإدارة النسخ
- 33المشروع الختامي: محطة خزان كاملة بآلة حالات وإنذار وعدّ دفعات
- 3420 سؤال مقابلة في ST وبرمجة PLC بإجابات قصيرة