الـ PLC بيفكّر إزاي؟ شرح Ladder Logic من الصفر بمثال حقيقي (دليل عملي)



نقطة البداية اللي بتخلي كل حاجة تتوضح


معظم اللي بيتعلموا PLC بيقعوا في نفس الفخ: بيحفظوا شكل التعليمات من غير ما يفهموا إزاي الجهاز بيفكّر. والنتيجة إنهم بيقدروا ينسخوا برنامج، بس مش بيقدروا يكتبوا واحد من دماغهم ولا يصلّحوا عطل.


عشان كده هنبدأ من نقطة واحدة، ولو فهمتها صح، كل حاجة بعد كده هتبقى تفاصيل:


الـ PLC مش بينفّذ برنامجك مرة واحدة. بينفّذه ملايين المرات، بشكل دائري، وبسرعة رهيبة.


الفكرة دي اسمها دورة المسح (Scan Cycle)، وهي أهم مفهوم في المجال كله.


أولًا: إيه هو الـ PLC أصلاً؟


PLC اختصار لـ Programmable Logic Controller — متحكم منطقي قابل للبرمجة.


بصراحة كده، هو كمبيوتر صناعي متخصص في حاجة واحدة: يقرأ إشارات من العالم الحقيقي، يعمل عليها منطق، ويطلع إشارات تحكم.


ليه مش كمبيوتر عادي؟


الخاصية  •  PLC  •  كمبيوتر عادي

الموثوقية  •  مصمم يشتغل سنين بدون إعادة تشغيل  •  بيحتاج restart

بيئة التشغيل  •  -20° إلى +60°، اهتزاز، غبار، تشويش  •  بيئة مكتبية

زمن الاستجابة  •  حتمي (Deterministic) — دورة ثابتة معروفة  •  متغيّر حسب النظام

الإدخال/الإخراج  •  مصمم لإشارات صناعية 24V، 4-20mA  •  يحتاج كروت إضافية

البرمجة  •  لغات مصممة لمهندسي التحكم  •  لغات مصممة لمبرمجين


الكلمة المفتاحية هي "حتمي (Deterministic)". في نظام يتحكم في مكبس صناعي، إنت محتاج تعرف بالمللي ثانية إن الأمر هيوصل إمتى. الويندوز مش بيقدر يوعدك بده. الـ PLC بيقدر.


المفهوم المحوري: دورة المسح (Scan Cycle)


كل PLC في الدنيا بيعمل نفس الأربع خطوات دي، في حلقة لا تنتهي:


        ┌──────────────────────────────────┐

        │                                  │

        ↓                                  │

┌────────────────┐                         │

│ 1. قراءة       │  بيصوّر حالة كل         │

│   المدخلات     │  المدخلات ويخزنها       │

│ (Input Scan)   │  في ذاكرة الصورة        │

└───────┬────────┘                         │

        ↓                                  │

┌────────────────┐                         │

│ 2. تنفيذ       │  بينفّذ البرنامج        │

│   البرنامج     │  من فوق لتحت،           │

│(Program Exec)  │  ومن الشمال لليمين      │

└───────┬────────┘                         │

        ↓                                  │

┌────────────────┐                         │

│ 3. كتابة       │  بيحدّث المخارج         │

│   المخارج      │  الفعلية مرة واحدة      │

│ (Output Scan)  │                         │

└───────┬────────┘                         │

        ↓                                  │

┌────────────────┐                         │

│ 4. مهام النظام │  اتصالات، تشخيص،        │

│ (Housekeeping) │  مراقبة ذاتية           │

└───────┬────────┘                         │

        └──────────────────────────────────┘


     زمن الدورة الكامل: 1 – 50 مللي ثانية


النتيجة العملية اللي لازم تستوعبها


الـ PLC مش بيقرأ المدخلات لحظة بلحظة أثناء تنفيذ البرنامج. هو بياخد "صورة فوتوغرافية" (Process Image) في بداية الدورة، والبرنامج كله بيشتغل على الصورة دي.


مثال بيوضح الخطورة:


السطر 1: IF زرار_البدء ضاغط  → شغّل الموتور

...

السطر 40: IF زرار_البدء ضاغط  → شغّل اللمبة


لو المستخدم رفع صباعه عن الزرار في اللحظة اللي كان البرنامج فيها عند السطر 20، البرنامج مش هياخد باله. السطر 40 هيشوف الزرار لسه مضغوط، لأنه بيقرأ من الصورة المخزنة مش من الزرار الحقيقي.


وده تصرف مقصود ومفيد، لأنه بيضمن الاتساق المنطقي — نفس المدخل بيدي نفس القيمة في كل مكان في الدورة الواحدة.


النقطة الثانية الحرجة: الترتيب مهم جدًا


المخارج بتتكتب في نهاية الدورة. فلو كتبت:


السطر 5:  Motor = ON

السطر 20: Motor = OFF


الموتور مش هيشتغل أبدًا. لأن السطر 20 بيدوس على السطر 5 في نفس الدورة، والقيمة اللي هتتكتب على المخرج الفعلي هي آخر قيمة في الذاكرة.


قاعدة: في Ladder، آخر سطر بيكتب على مخرج هو اللي بيكسب.

ودي سبب رقم واحد في أخطاء المبتدئين — متكتبش على نفس المخرج في أكتر من مكان (المشكلة دي اسمها Double Coil).


ثانيًا: ليه اسمها "Ladder" (سُلَّم)؟


اللغة دي مش اختراع عشوائي. هي محاكاة رقمية للوحات التحكم بالريلايات اللي كانت بتتعمل قبل الـ PLC.


في الأربعينيات والخمسينيات، كان التحكم الصناعي بيتعمل بريلايات وأسلاك، وكان بيترسم في مخططات اسمها Ladder Diagrams — خطين رأسيين (السكة اليمين والشمال) وبينهم "درجات سلم" أفقية.


لما اخترع Dick Morley الـ PLC سنة 1968، كان لازم فنيي المصانع يقدروا يستخدموه من غير ما يتعلموا برمجة. فالحل كان: خلي البرمجة تبان زي المخطط الكهربائي اللي هم فاهمينه أصلاً.


   L1 (سكة الجهد)                        L2 (سكة الحياد)

    │                                          │

    │──┤ ├──────────┤/├──────────( )──────────│  ← درجة 1

    │  زرار البدء   زرار الإيقاف   الموتور      │

    │                                          │

    │──┤ ├──────────────────────( )───────────│  ← درجة 2

    │  حساس            لمبة تنبيه              │

    │                                          │


الفكرة البصرية: تخيّل إن "طاقة وهمية" بتحاول تمشي من السكة الشمال للسكة اليمين. لو لاقت طريق مفتوح، بتوصل للمخرج وبتشغّله.


ثالثًا: المكونات الأساسية


اللغة كلها مبنية على 3 عناصر بس (والباقي تفاصيل).


1. التلامس المفتوح عادةً — Normally Open (NO)


──┤ ├──


بيوصّل الطاقة لما تكون قيمة المتغير = 1 (True).


فكّر فيه كـسؤال: "هل ده شغال؟" لو آه، عدّي.


2. التلامس المغلق عادةً — Normally Closed (NC)


──┤/├──


بيوصّل الطاقة لما تكون قيمة المتغير = 0 (False).


فكّر فيه كـسؤال: "هل ده مطفي؟" لو آه، عدّي.


3. الملف — Coil


──( )──


بياخد الطاقة الواصلة له وبيحطها في متغير الخرج.


التركيب المنطقي


التركيب  •  الشكل  •  المعنى

AND  •  تلامسات على التوالي  •  ──┤ ├──┤ ├──( ) → الاتنين لازم يكونوا شغالين

OR  •  تلامسات على التوازي  •  فرعين لنفس النقطة → واحد منهم كفاية

NOT  •  تلامس NC  •  عكس القيمة


المفهوم اللي بيتلخبط فيه الكل: NC في البرنامج ≠ NC في الواقع


دي أهم فقرة في المقال، وأكتر حاجة بتضيّع وقت المبتدئين.


فيه فرق جذري بين:

• الاتصال المادي للجهاز في الواقع (سلك مربوط إزاي)

• رمز التلامس في برنامج الـ Ladder


المثال الحاسم: زرار الطوارئ (Emergency Stop)


في الواقع: زرار الطوارئ لازم يكون Normally Closed (NC) من ناحية التوصيل الكهربائي.


ليه؟ لأنه لو كان NO، وحصل قطع في السلك، المكنة مش هتقف — والأسوأ إن حد لما يضغط الطوارئ مش هيحصل حاجة. أما لو كان NC، أي قطع في السلك = المكنة بتقف فورًا.


ده مبدأ هندسي أساسي اسمه: Fail-Safe (الفشل الآمن).


النتيجة على مستوى الإشارة:


حالة الزرار  •  التوصيل  •  الإشارة الواصلة للـ PLC

طبيعي (مش مضغوط)  •  الدائرة مقفولة  •  1 (فيه 24 فولت)

مضغوط (طوارئ!)  •  الدائرة مفتوحة  •  0 (مفيش جهد)


وبالتالي في البرنامج:


لازم تكتب:   ──┤ ├──    (تلامس مفتوح NO)

                E_Stop


المعنى: "لو الإشارة = 1 (الزرار طبيعي)، اسمح بالتشغيل"


الغلط الشائع الخطير: المبتدئ بيقول "الزرار NC في الواقع، يبقى أكتبه NC في البرنامج" → وده بيعكس المنطق تمامًا، والنتيجة إن المكنة بتشتغل لما تضغط الطوارئ. وده مش خطأ برمجي — ده خطر على حياة الناس.


القاعدة الذهبية: في البرنامج، إنت بتتعامل مع قيمة الإشارة (1 أو 0)، مش مع نوع التلامس المادي. اسأل نفسك دايمًا: "في الحالة الطبيعية، هل الـ PLC شايف 1 ولا 0؟"


المثال الأول: مشكلة الزرار اللحظي وحلها (Latching)


المحاولة الأولى — البرنامج الساذج


    │──┤ ├──────────┤/├──────────( )──────│

    │ Start_PB      Stop_PB       Motor    │


المشكلة: الموتور بيشتغل وإنت ضاغط الزرار بس، وبيقف لما ترفع صباعك.


ده منطقي: زرار الضغط اللحظي (Momentary Push Button) بيرجع لوضعه لما تسيبه، فالإشارة بترجع صفر، والموتور بيقف.


الحل: دائرة التثبيت (Seal-In / Latch)


    │──┬─┤ ├───┬───┤/├──────────( )──────│

    │  │Start  │  Stop_PB       Motor    │

    │  │       │                         │

    │  └─┤ ├───┘                         │

    │    Motor                            │

    │  (تلامس التثبيت)                     │


إزاي بتشتغل؟


1. قبل الضغط: Start = 0, Motor = 0 → مفيش طاقة → الموتور واقف

2. لحظة الضغط: Start = 1 → الطاقة بتعدي من الفرع العلوي → Motor = 1

3. الدورة اللي بعدها فورًا: Motor بقى = 1، فتلامس التثبيت في الفرع السفلي بقى موصّل

4. لما ترفع صباعك: Start = 0، لكن الفرع السفلي (Motor) لسه موصّل → الطاقة بتفضل ماشية → الموتور فاضل شغال ✓

5. الإيقاف: ضغط Stop_PB → التلامس NC بيتفتح → الطاقة بتنقطع → Motor = 0 → التثبيت بيتكسر


الفكرة الجوهرية: الملف بيغذّي تلامسه بنفسه. دي أساس الذاكرة في الـ Ladder.


ملاحظة أمان مهمة جدًا


زرار الإيقاف Stop_PB لازم يكون:

• NC في التوصيل المادي

• NO في البرنامج (تلامس مفتوح ──┤ ├──)


لكن في الرسمة فوق كتبناه NC في البرنامج (──┤/├──). ليه؟


لأن في المثال ده افترضنا زرار Stop موصّل NO ماديًا (تبسيط تعليمي). في التطبيق الصناعي الحقيقي:


    │──┬─┤ ├───┬───┤ ├──────────( )──────│

    │  │Start  │  Stop (NO في البرنامج)   │

    │  │       │   لأنه NC ماديًا         │

    │  └─┤ ├───┘                          │

    │    Motor                             │


دايمًا اسأل: الإشارة الواصلة للـ PLC قيمتها كام في الوضع الطبيعي؟


المؤقتات (Timers) — إضافة البُعد الزمني


الوظيفة الأشهر بعد المنطق الأساسي.


النوع 1: TON — On-Delay Timer (تأخير التشغيل)


        ┌──────────────┐

────────┤ IN       Q   ├────────

        │              │

   T#5s ┤ PT       ET  ├─── (الزمن المنقضي)

        └──────────────┘

              TON


السلوك: لما IN تبقى 1، المؤقت بيبدأ يعدّ. لما العد يوصل PT (Preset Time)، الخرج Q بيبقى 1.


لو IN رجعت 0 قبل انتهاء العد، المؤقت بيتصفّر بالكامل (مش بيكمل من حيث وقف).


استخدام نموذجي: "شغّل المروحة، وبعد 5 ثواني شغّل السخان" (عشان تضمن إن الهوا بيتحرك قبل التسخين).


النوع 2: TOF — Off-Delay Timer (تأخير الإيقاف)


السلوك: الخرج بيشتغل فورًا مع الدخل، لكن لما الدخل يقف، الخرج بيفضل شغال لمدة PT قبل ما يقف.


استخدام نموذجي: "لما الموتور يقف، سيب مروحة التبريد شغالة 3 دقايق" (تبريد ما بعد التشغيل).


النوع 3: TP — Pulse Timer (نبضة)


السلوك: أي إشارة على الدخل بتطلّع نبضة بطول ثابت على الخرج، بغض النظر عن طول الدخل.


استخدام نموذجي: "أي ضغطة على الزرار = صافرة لمدة ثانيتين بالظبط".


المشروع الكامل: التحكم في سير ناقل بمحطة تعبئة


دلوقتي هنبني نظام كامل من الصفر.


وصف المطلوب


سير ناقل بينقل صناديق. عند وصول الصندوق لحساس التعبئة، السير بيقف، ماكينة التعبئة بتشتغل لمدة 4 ثواني، وبعدين السير بيكمل. لازم يكون فيه زرار بدء وإيقاف وطوارئ، ولمبة تنبيه.


جدول المدخلات والمخارج (I/O List)


دي أول حاجة بتتعمل في أي مشروع PLC. مش الكود.


العنوان  •  الاسم الرمزي  •  النوع  •  الوصف  •  التوصيل المادي

I0.0  •  Start_PB  •  DI  •  زرار البدء  •  NO

I0.1  •  Stop_PB  •  DI  •  زرار الإيقاف  •  NC

I0.2  •  E_Stop  •  DI  •  مفتاح الطوارئ  •  NC

I0.3  •  Box_Sensor  •  DI  •  حساس وجود صندوق  •  NO (PNP)

I0.4  •  Motor_Fault  •  DI  •  إشارة عطل من الأوفرلود  •  NC

Q0.0  •  Conveyor_Motor  •  DO  •  كونتاكتور السير  •  

Q0.1  •  Filler_Valve  •  DO  •  صمام التعبئة  •  

Q0.2  •  Running_Lamp  •  DO  •  لمبة "النظام شغال" (أخضر)  •  

Q0.3  •  Fault_Lamp  •  DO  •  لمبة عطل (أحمر)  •  


لاحظ: Stop_PB و E_Stop و Motor_Fault كلهم NC ماديًا — تطبيق مبدأ الفشل الآمن.


المتغيرات الداخلية (Memory Bits)


العنوان  •  الاسم  •  الوصف

M0.0  •  System_Running  •  النظام في وضع التشغيل

M0.1  •  Filling_Active  •  عملية تعبئة جارية

T1  •  Fill_Timer  •  مؤقت التعبئة (4 ثواني)


البرنامج


الدرجة 1: منطق التشغيل والإيقاف الرئيسي


    │──┬─┤ ├────┬──┤ ├────┤ ├────┤ ├────( )──│

    │  │Start_PB│ Stop_PB E_Stop Motor  System│

    │  │        │                Fault  Running│

    │  │        │                              │

    │  └─┤ ├────┘                              │

    │  System_Running                          │


الشرح:

• الفرع العلوي: Start_PB بيبدأ

• الفرع السفلي: System_Running بيثبّت نفسه

• التلامسات الثلاثة الباقية كلها NO في البرنامج لأنها NC ماديًا — يعني في الوضع الطبيعي كلها = 1 والطاقة بتعدي

• أي مشكلة (ضغط Stop، ضغط طوارئ، عطل موتور، أو حتى قطع سلك) → الإشارة تبقى 0 → النظام يقف ✓


الدرجة 2: التحكم في موتور السير


    │──┤ ├──────────┤/├──────────( )──────────│

    │ System_Running Filling_    Conveyor_     │

    │                Active      Motor         │


الشرح: السير يشتغل لو النظام شغال و مفيش عملية تعبئة جارية.


الدرجة 3: بدء عملية التعبئة


    │──┬─┤ ├────┬──┤ ├──────┤/├────────( )────│

    │  │Box_    │ System_   Fill_      Filling_│

    │  │Sensor  │ Running   Timer.Q    Active  │

    │  │        │                             │

    │  └─┤ ├────┘                             │

    │  Filling_Active                          │


الشرح:

• الصندوق وصل الحساس و النظام شغال → التعبئة تبدأ

• التثبيت بيخلي التعبئة مستمرة حتى لو الحساس اتغيّرت حالته

• لما المؤقت يخلص (Fill_Timer.Q = 1)، التلامس NC بيتفتح → التثبيت بينكسر → التعبئة بتنتهي ✓


الدرجة 4: المؤقت وصمام التعبئة


    │              ┌──────────────┐            │

    │──┤ ├─────────┤ IN        Q  ├────────────│

    │ Filling_     │              │  Fill_     │

    │ Active  T#4s ┤ PT       ET  ├  Timer     │

    │              └──────────────┘            │

    │                   TON                    │

    │                                          │

    │──┤ ├────────────────────────────( )──────│

    │ Filling_Active                  Filler_  │

    │                                 Valve    │


الدرجة 5: لمبات التنبيه


    │──┤ ├──────────────────────────()────────│

    │ System_Running                Running_   │

    │                               Lamp       │

    │                                          │

    │──┬─┤/├────┬─────────────────()──────────│

    │  │E_Stop  │                  Fault_Lamp  │

    │  │        │                              │

    │  └─┤/├────┘                              │

    │  Motor_Fault                             │


الشرح: لمبة العطل بتنوّر لو الطوارئ مضغوط أو فيه عطل موتور (تلامسات NC في البرنامج لأن الإشارة بتبقى 0 عند المشكلة).


تسلسل التشغيل الكامل


1. المشغّل يضغط Start

   → System_Running = 1

   → Conveyor_Motor = 1 (السير بيمشي)

   → Running_Lamp = 1


2. الصندوق يوصل الحساس

   → Box_Sensor = 1

   → Filling_Active = 1

   → Conveyor_Motor = 0 (السير يقف) ✓

   → Filler_Valve = 1 (التعبئة بدأت)

   → Fill_Timer بيعد


3. بعد 4 ثواني

   → Fill_Timer.Q = 1

   → Filling_Active = 0

   → Filler_Valve = 0 (التعبئة خلصت)

   → Conveyor_Motor = 1 (السير يكمل) ✓


4. الصندوق يمشي من على الحساس، والدورة بتتكرر


7 أخطاء بيقع فيها كل مبتدئ


1. الملف المكرر (Double Coil).

كتابة نفس المخرج في أكتر من درجة. النتيجة: آخر واحد بيكسب، والباقي بيتجاهل. ده أكتر خطأ شيوعًا على الإطلاق.


2. عكس منطق الطوارئ.

تم شرحه بالتفصيل فوق. ده خطأ سلامة، مش خطأ برمجة.


3. نسيان دائرة التثبيت.

والنتيجة إن كل حاجة بتشتغل بس وإنت ضاغط.


4. الاعتماد على الـ PLC وحده في السلامة.

دي أخطر واحدة. دائرة الطوارئ الحقيقية لازم يكون ليها مسار سلكي مباشر لفصل القدرة (Safety Relay)، مش عن طريق منطق الـ PLC. البرنامج ممكن يقع أو يتعطّل. الأسلاك مبتقعش.


المعيار الحاكم هنا: ISO 13849 و IEC 62061 لسلامة المكن.


5. تجاهل الارتداد الميكانيكي (Bouncing).

التلامسات الميكانيكية بترتد لملي ثواني عند الضغط. الـ PLC السريع ممكن يقرأ ده كذا ضغطة. الحل: فلتر إدخال (موجود في إعدادات معظم الـ PLCs) أو مؤقت TON قصير (20–50 ms).


6. عدم استخدام أسماء رمزية.

برنامج مكتوب بـ I0.0 و M12.3 بيبقى مستحيل صيانته بعد 6 شهور. استخدم أسماء واضحة دايمًا.


7. عدم اختبار حالات الحدود.

إيه اللي هيحصل لو الكهرباء رجعت فجأة؟ لو حساسين اتفعّلوا في نفس اللحظة؟ لو الصندوق وقف على الحساس بالظبط؟ الاختبار الحقيقي بيبدأ من الحالات الشاذة.


لغات IEC 61131-3 الخمسة — نظرة سريعة


Ladder مش اللغة الوحيدة. المعيار IEC 61131-3 بيعرّف خمس لغات:


اللغة  •  الاختصار  •  النوع  •  أفضل استخدام

Ladder Diagram  •  LD  •  رسومي  •  المنطق الثنائي، الصيانة، فرق الفنيين

Function Block Diagram  •  FBD  •  رسومي  •  تدفق الإشارات، PID، معالجة تناظرية

Structured Text  •  ST  •  نصي  •  الحسابات المعقدة، الحلقات، الخوارزميات

Instruction List  •  IL  •  نصي  •  لغة تجميع منخفضة (ملغاة في الإصدار الثالث)

Sequential Function Chart  •  SFC  •  رسومي  •  العمليات التتابعية والخطوات المرحلية


النصيحة العملية: ابدأ بـ Ladder (لأنه لغة الصيانة والسوق)، وبعدين اتعلم Structured Text (لأنه بيوفّر عليك وقت رهيب في الحسابات). الاتنين دول بيغطوا 90% من الشغل الحقيقي.


أسئلة شائعة


أبدأ بأنهي PLC؟

Siemens S7-1200 مع TIA Portal لو في أوروبا والشرق الأوسط (الحصة السوقية الأكبر هنا). Allen-Bradley (Rockwell) لو مستهدف أمريكا أو شركات النفط. للتعلم المجاني: استخدم محاكي زي PLCSim أو Factory IO أو OpenPLC.


محتاج أشتري PLC عشان أتعلم؟

لأ في البداية. المحاكيات بتغطي 80% من التعلم النظري. بس — التعلم الحقيقي بيحصل لما توصّل حساس حقيقي وتشوفه بيشتغل. بعد 3 شهور محاكاة، اشتري كِت تعليمي صغير.


Ladder ولا Structured Text؟

Ladder للمنطق الثنائي والصيانة (لأن الفني في المصنع بيقرأه). ST للحسابات والخوارزميات. المهندس الشاطر بيستخدم الاتنين في نفس المشروع — كل جزء باللغة المناسبة له.


زمن الدورة (Scan Time) بيبقى كام؟

عادة بين 1 و 20 مللي ثانية لبرنامج متوسط. قاعدة مهمة: أي إشارة أقصر من زمن الدورة ممكن تضيع تمامًا — عشان كده الحساسات السريعة بتتوصل على مداخل خاصة اسمها High-Speed Counters أو Interrupt Inputs.


الـ PLC بيتبرمج بلغة C؟

بعض الـ PLCs الحديثة بتدعم C أو حتى Python (خصوصًا PACs و Edge Controllers). لكن الشغل الصناعي الأساسي لسه على IEC 61131-3، والسبب: قابلية الصيانة. الفني في المصنع الساعة 3 الفجر لازم يفهم البرنامج.


الخلاصة


الـ PLC مش صعب. اللي بيخليه يبان صعب إن الناس بتبدأ من التعليمات بدل ما تبدأ من طريقة التفكير.


التلات مفاهيم اللي لو فهمتهم فهمت كل حاجة:


1. دورة المسح: البرنامج بيتنفّذ في حلقة، بيقرأ صورة ثابتة للمدخلات، وبيكتب المخارج في النهاية.

2. الفشل الآمن: أي عطل أو قطع في السلك لازم يوصّل النظام لحالة آمنة، مش لحالة خطرة.

3. التثبيت (Latching): الملف اللي بيغذّي تلامسه بنفسه = ذاكرة.


وأهم نصيحة عملية: متبدأش بالكود. ابدأ بـجدول الـ I/O، وبعدين اكتب تسلسل التشغيل بالكلام العربي، وبعدين ترجمه لـ Ladder. اللي بيبدأ بالكود مباشرة بيقع في الفوضى دايمًا.